51單片機第12步_使用stdio.h庫函數仿真串口通訊

本章介紹如何使用stdio.h庫函數仿真串口通訊,學會使用view下面的“serial window #1”,實現模擬串口通訊。

Keil C51中有一些關鍵字,需要牢記:

interrupt0:指定當前函數為外部中斷0

interrupt1:指定當前函數為定時器0中斷

interrupt2:指定當前函數為外部中斷1;

interrupt3:指定當前函數為定時器1中斷

interrupt4:指定當前函數為串口中斷;

?using 0表示當前函數使用第0組寄存器;

using 1表示當前函數使用第1組寄存器;

using 2 表示當前函數使用第2組寄存器

using 3 表示當前函數使用第3組寄存器;

51單片機內有4個工作組寄存器,每個工作組的寄存器是R0--R7

R0-R7在數據存儲器里的實際地址是由特殊功能寄存器PSW里的RS1、RS0位決定的。

using 0表示設置 RS1=0,RS0 =0,用第0組寄存器,R0--R7的在數據存儲區里的實際地址是00H-07H。R0(00H)....R7(07H);

using 1表示設置 RS1=0,RS0 =1,用第1組寄存器,R0--R7的在數據存儲區里的實際地址是00H-07H。R0(08H)....R7(0FH);

using 2表示設置 RS1=1,RS0 =0,用第2組寄存器,R0--R7的在數據存儲區里的實際地址是08H-0FH。R0(10H)....R7(17H);

using 3表示設置 RS1=1,RS0 =1,用第3組寄存器,R0--R7的在數據存儲區里的實際地址是00H-07H。R0(18H)....R7(1FH);

#include <REG51.h> ???//包含頭文件REG51.h,使能51內部寄存器;

#include <intrins.h> ?//包含頭文件intrins.h,要放在stdio.h的頭文件之前;

//使能函數: _nop_(); ?相當于匯編的NOP指令;

//使能函數: bit ?_testbit_( bit bit_value ); 對bit_value進行測試,若bit_value=1,返回1,否則返回0;

//使能函數: _cror_( unsigned char x, unsigned char n ); 將字節型變量x的值,向右循環移動n位,然后將其

//值返回;

//使能函數: _iror_( unsigned int x, ?unsigned char n ); 將雙字節型變量x的值,向右循環移動n位,然后將

//其值返回;

//使能函數: _lror_( unsigned long x, unsigned char n ); 將4字節型變量x的值,向右循環移動n位,然后將

//其值返回;

//使能函數: _crol_( unsigned char x, unsigned char n ); 將字節型變量x的值,向左循環移動n位,然后將其

//值返回;

//使能函數: _irol_( unsigned int x, ?unsigned char n ); 將雙字節型變量x的值,向左循環移動n位,然后將

//其值返回;

//使能函數: _lrol_( unsigned long x, unsigned char n ); 將4字節型變量x的值,向左循環移動n位,然后將

//其值返回;

//以上的循環左移和循環右移,同C語言的左移和右移是不同的,使用時要小心;

#include <stdio.h> ?//包含頭文件stdio.h

????//_getkey();從串口讀入一個字符;

???//putchar();向串口發送一個字節;

???//printf();向串口發送一串字節;

#define OSC_FREQ ????11059200L

#define BAUD_Time 1

#if(BAUD_Time==1)

//若波特率加倍,則使用下面參數;

#define BAUD_57600 ??256 - (OSC_FREQ/192L)/57600L ???//255

#define BAUD_28800 ??256 - (OSC_FREQ/192L)/28800L ???//254

#define BAUD_19200 ??256 - (OSC_FREQ/192L)/19200L ???//253

#define BAUD_14400 ??256 - (OSC_FREQ/192L)/14400L ???//252

#define BAUD_9600 ???256 - (OSC_FREQ/192L)/9600L ????//250

#define BAUD_4800 ???256 - (OSC_FREQ/192L)/4800L ?//244

#define BAUD_2400 ???256 - (OSC_FREQ/192L)/2400L ?//232

#define BAUD_1200 ???256 - (OSC_FREQ/192L)/1200L ?//208

#else

//若波特率不加倍,則使用下面參數;

#define BAUD_9600 ???256 - (OSC_FREQ/384L)/9600L

#define BAUD_4800 ???256 - (OSC_FREQ/384L)/4800L

#define BAUD_1200 ???256 - (OSC_FREQ/384L)/1200L

#endif

#define receive_buffer_size ?40

unsigned char receive_buffer[receive_buffer_size];

unsigned char next_in,next_out;

//函數功能:接收和發送中斷服務函數;

void isr_UART(void) interrupt 4 using 1

{ unsigned char temp;

??if(RI)?//處理接收數據;

????{ temp=_getkey(); //從串口接收一個字節;?

??receive_buffer[next_in++]=temp;

??????if(next_in==receive_buffer_size) next_in=0;

}

}

//函數功能:初始化串口,設置波特率為9600bps@11.0592MHz,使能接收,使用8位UART,開中斷允許;

void Serial_Port_Initialization()

{ PCON = 0x80;

??SCON=0x50; //串行控制寄存器: SM0,SM1,SM2,REN,TB8,RB8,TI,RI

?????????????//SM1:SM0=01,選擇方式1,SM2=0,表示非多機通訊,8-bit UART;

?????//REN=1,使能接收;

??TMOD&=0x0f;

??TMOD|= 0x20;

//定時器方式控制寄存器:GATE1,C/T1,M11,M10,GATE0,C/T0,M01,M00

????????//GATE=0,TR置1便可以啟動Timer;GATE=1,TR置1,且INT腳輸入高電平,才可以啟動Timer;

???//M11:M10=10,選擇方式2,8位自動重裝載;

??TH1=BAUD_9600; ?//TH1: ?reload value for 9600 baud @11.0592MHz;

??TL1=TH1;

??TR1=1; ??//啟動Timer1;

??//TI=1; ???//發送UART的第一個字節,為下次發送做準備;

??TI=0; ???//為下次發送做準備;

??RI=0;

??next_in=0;

??next_out=0;

??ES=1; //使能串口接收和發送中斷;

??EA=1; //開總中斷

}

//函數功能: 將接收到的數據返回給PC;

void send_data_to_pc()

{ while(next_out!=next_in) ?//將接收到的數據返回給PC;

?????{ TI=1; //為調用printf()和putchar()內部函數做準備;

???printf("receive_buffer[%bd]=%c\n",next_out,receive_buffer[next_out]);

???TI=0; //結束調用printf()和putchar()內部函數

????next_out++;

?}

}

//函數功能: Delay 50us

void delay_50us(unsigned char _50us)

{ while(_50us--)

{ _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

??_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

??_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

??_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

??_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

??_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

??_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

??_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

????}

}

void main(void)

{ Serial_Port_Initialization();

??//初始化串口,設置波特率為9600bps@11.0592MHz,使能接收,使用8位UART,開中斷允許;

??TI=1;?//為調用printf()和putchar()內部函數做準備;

??printf("Start:\n");

??TI=0;?//結束調用printf()和putchar()內部函數

??for(;;)

????{ _getkey();?//打開view下面的serial window #1,用鍵盤輸入一個字符;

??send_data_to_pc(); //將接收到的數據返回給PC;

??delay_50us(20); ???//延時1ms;

??TI=0;?//結束調用printf()和putchar()內部函數

}

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38687.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38687.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38687.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MAC下的PDM工具

還在為MAC電腦下數據庫設計發愁嗎&#xff1f;從Windows切換到MAC&#xff0c;除了因為做蘋果開發以外&#xff0c;更大的一個理由是不想被工具束縛&#xff0c;使用習慣不一樣&#xff0c;不要緊。就像錢一樣&#xff0c;當我們成為錢的習慣就成為錢的奴隸了。但是用MAC一年多…

Java程序設計課后習題(答案版) 期末復習

第一章 Java語言概述 一、選擇題 下面哪種類型的文件可以在Java虛擬機中運行?( A ) A. class B. Java C. jre D. exe 如果JDK 的安裝路徑為“d:\jdk”&#xff0c;若想在命令窗口中任何當前路徑下&#xff0c;都可以直接使用javac和java命令&#xff0c;需要將環境變量path設…

攜手共筑愛的橋梁:引導接納自閉癥同學

在孩子的班級中&#xff0c;當自閉癥兒童成為我們共同的一員時&#xff0c;作為老師和家長&#xff0c;我們肩負著特別的責任——引導孩子們以開放的心態接納、善待并關愛他們。 首先&#xff0c;我們要以身作則&#xff0c;展現接納與尊重。無論是老師還是家長&#xff0c;都…

筆記:Git學習之應用場景和使用經驗

目標&#xff1a;整理Git工具的應用場景和使用經驗 一、開發環境 Git是代碼版本控制工具&#xff1b;Github是代碼托管平臺。 工具組合&#xff1a;VSCode Git 需要安裝的軟件&#xff1a;vscode、Git 其中vscode需要安裝的插件&#xff1a;GitLens、Git History 二、應用…

沒有析構函數的子類

在C中&#xff0c;如果一個類沒有定義析構函數&#xff0c;編譯器會為其生成一個默認的析構函數。這個默認析構函數會按照以下方式工作&#xff1a; 析構基類&#xff1a;如果類是從一個基類繼承而來的&#xff0c;默認析構函數會調用基類的析構函數。 析構成員&#xff1a;默…

倉庫貨物管理系統

摘 要 隨著信息技術的迅猛發展&#xff0c;大數據已經成為推動各行各業變革的重要力量。特別是在物流倉儲領域&#xff0c;大數據技術的應用不僅能夠顯著提升倉庫貨物管理的效率&#xff0c;還能夠優化庫存管理、減少成本、提高客戶滿意度。因此&#xff0c;基于大數據的倉庫貨…

webstorm 高效查看不同分支差異 摒棄你的git diff手動操作

背景 每次代碼沖突或者版本發生異常時&#xff0c;排查不同版本時就是一個頭大的問題&#xff0c;頭大的點在于用 vscode 的 git diff 一點點地排查和比較&#xff0c;耗時耗力&#xff0c;版面展不開&#xff0c;commit 差異看不出來&#xff0c;每個頁面的代碼不同也不能快速…

2007-2023年36家商業銀行綠色信貸、期末貸款總額、銀行總資產等相關指標數據(2023年無缺失)

2007-2023年36家商業銀行綠色信貸數據&#xff08;2023年無缺失&#xff09; 1.時間&#xff1a;2007-2023年&#xff0c;2023年無缺失 2.來源&#xff1a;銀行年報和社會責任報告 3.指標:綠色信貸余額、期末貸款總額、綠色信貸比率、總資產收益率、流動性比率、撥備覆蓋率、…

使用Linux的openssl生成https的ssl密鑰,然后自己簽名

新建一個文件夾 mkdir all_https_ssl cd all_https_ssl第一步&#xff1a; 生成一個密鑰&#xff0c;長度自定&#xff0c;比如2048&#xff08;防止有些應用要求密鑰長度不能太短&#xff09; openssl genrsa -out key.pem 2048第二步&#xff1a; 使用私鑰來生成證書請求…

最優化方法Python計算:標準型線性規劃的輔助問題

對標準型線性規劃 { minimize c ? x s.t. A x b x ≥ o ( 1 ) \begin{cases} \text{minimize}\quad\quad\boldsymbol{c}^\top\boldsymbol{x}\\ \text{s.t.\ \ \ \ }\quad\quad\quad\boldsymbol{Ax}\boldsymbol{b}\\ \quad\quad\quad\quad\quad\quad\boldsymbol{x}\geq\b…

軟件資產管理系統:提升企業透明度與合規性的終極解決方案!

在當今數字化時代&#xff0c;企業軟件資產的管理變得愈發復雜和重要。為了幫助企業更好地管理軟件資產、提升透明度和確保合規性&#xff0c;smartlic軟件資產管理系統應運而生。本文將深入探討smartlic系統的核心功能、實施案例及未來展望&#xff0c;為您揭示這一系統如何成…

Linux Ubuntu 20.04.06 安裝Onboard虛擬鍵盤教程

目錄 一、在線安裝 二、源碼安裝 三、包安裝 四、設置 五、禁用系統鍵盤 一、在線安裝 sudo apt-get update #更新軟件源 sudo apt-get install onboard #安裝Onboard sudo apt-get purge onboard # 卸載 安裝后&#xff0c;如果在終端使用命令&#xff1a;onboard 啟…

fio作圖

fio --filenametest_file --direct1 --rwrandwrite --numjobs1 --iodepth16 \ --ioenginelibaio --bs4k --group_reporting --namezhangyi --log_avg_msec500 \ --write_bw_logtest-fio --write_lat_logtest-fio --write_iops_logtest-fio --size1G 結果如下有&#xff1a; …

2002-2022年各省老年人口撫養比(人口抽樣調查)數據

2002-2022年各省老年人口撫養比(人口抽樣調查)數據 1、時間&#xff1a;2002-2022年 2、指標&#xff1a;老年人口撫養比 3、來源&#xff1a;國家統計局、統計年鑒 4、范圍&#xff1a;31省&#xff0c; 5、缺失情況&#xff1a;無缺失&#xff0c;其中2010年的值取2009、…

華為 eNSP 模擬器 配置RIP實例 動態路由協議

1 實驗拓撲 2 配置路由器 #R1 Huawei>sys [Huawei]sysname R1 [R1]interface GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 255.255.255.0 [R1-GigabitEthernet0/0/0]qu [R1]rip [R1-rip-1]network 192.168.1.0 [R1-rip-1]version 2 [R1-rip-…

ffmpeg在powershell和ubuntu終端下的不同格式

在win10下的powershell中&#xff0c;如果想運行一個exe文件&#xff0c;就不能再像cmd命令行一樣用名字來直接運行了&#xff0c;否則會提示格式不對。 正確的做法是&#xff1a; . \ffmpeg.exe -re -i video-test.mpr -rtsp_transport tcp -vcodec h264 -f rtsp rtsp://您的…

C語言中static關鍵字的作用與用法解析

C語言中static關鍵字的作用與用法解析 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; C語言中static關鍵字的作用與用法解析 1. static關鍵字的基本概念 在…

C# 特性 Attribute 反射 Reflection 元數據 Metadata

在C#中&#xff0c;元數據&#xff08;Metadata&#xff09;是指與程序代碼本身相關的數據&#xff0c;這些數據提供了代碼的額外信息&#xff0c;但并不直接影響代碼的執行。元數據在.NET框架中扮演著重要的角色&#xff0c;以下是一些常見的元數據類型和它們的用途&#xff1…

MySQL 9.0 發布了!

從昨晚開始&#xff0c;在DBA群里大家就在討論MySQL 9.0發布的事情&#xff0c;但是Release Note和官方文檔都沒有更新&#xff0c;所以今天早上一上班就趕緊瞅了下具體更新了哪些內容&#xff1f; 整體看來&#xff0c;基本沒什么創新。下面是9.0新增或廢棄的一些特性。 &…

(linux系統服務)Linux高級命令用戶管理

一、Linux用戶管理 1、用戶概念以及基本作用 用戶&#xff1a;指的是Linux操作系統中用于管理系統或者服務的人 一問&#xff1a;管理系統到底在管理什么&#xff1f; 答&#xff1a;Linux下一切皆文件&#xff0c;所以用戶管理的是相應的文件 二問&#xff1a;如何管理文…