日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

STC89C52单片机 串口通信

發(fā)布時(shí)間:2025/5/22 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STC89C52单片机 串口通信 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
串口初始化
void UARTInit() {EA = 1; //打開(kāi)總中斷ES = 1; //打開(kāi)串口中斷SM0 = 0; SM1 = 1;//串口工作方式1,8位UART波特率可變REN = 1;//串口允許接收TR1 = 1;//啟動(dòng)定時(shí)器1TMOD |= 0x20;//定時(shí)器1,工作模式2 8位自動(dòng)重裝TH1 = 0xfd; // 根據(jù)下面的公式計(jì)算得到TL1 = 0xfd; //設(shè)置比特率9600 }


例如:計(jì)算9600的波特率

SMOD在沒(méi)有設(shè)置的情況下,默認(rèn)為0.
SMOD = 0
所以2的0次方為1
2^0 = 1

晶震頻率計(jì)算:fosc = 11.0592 兆赫茲 = 11.0592 x 1000000 = 11059200赫茲

11059200 ÷ 9600 = 1152 得到波特率公式的被除數(shù)

根據(jù)公式
1152 ÷ 32 = 36

36 ÷ 12 = 3

256 - T初 = 256 - 3 = 253

將 253 轉(zhuǎn)換為16進(jìn)制得到 0xFD

TH1 = 0xFD;
TL1 = 0xFD; 設(shè)置波特率9600

串口中斷
void UART() interrupt 4 {if(RI)//判斷接收是否完成{num = SBUF;//讀SBUF,讀出串口接收到的數(shù)據(jù)RI = 0;//軟件清零接收標(biāo)志位 }if(TI)//判斷是否發(fā)送完成TI = 0;//清零發(fā)送完成標(biāo)志位 }

串口工作方式1,8位UART比特率9600

#include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned charsbit DU = P2^6;//數(shù)碼管段選 sbit WE = P2^7;//數(shù)碼管段選 uchar num;//數(shù)碼管顯示的值//共陰數(shù)碼管段選表0-9 uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,}; //數(shù)碼管位選碼 uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};/*==================================== 函數(shù) :display(uchar i) 參數(shù) :i 顯示數(shù)值,取值范圍0-255 返回值 :無(wú) 描述 :三位共陰數(shù)碼管動(dòng)態(tài)顯示 ====================================*/ void display(uchar i) {static uchar wei; P0 = 0XFF;//清除斷碼WE = 1;//打開(kāi)位選鎖存器P0 = SMGwei[wei];WE = 0;//鎖存位選數(shù)據(jù)switch(wei){case 0: DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;case 1: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0; break; case 2: DU = 1; P0 = SMGduan[i % 10]; DU = 0; break; }wei++;if(wei == 3)wei = 0; } //定時(shí)器0初始化 void timer0Init() {EA = 1; //打開(kāi)總中斷ET0 = 1;//打開(kāi)定時(shí)器0中斷TR0 = 1; //啟動(dòng)定時(shí)器0REN = 1;//允許串口接收TMOD |= 0X01; //定時(shí)器工作模式1,16位定時(shí)模式TH0 = 0xED;TL0 = 0xFF; //定時(shí)5ms } //串口初始化 void UARTInit() {EA = 1; //打開(kāi)總中斷ES = 1; //打開(kāi)串口中斷SM0 = 0; SM1 = 1;//串口工作方式1,8位UART波特率可變REN = 1;//串口允許接收TR1 = 1;//啟動(dòng)定時(shí)器1TMOD |= 0x20;//定時(shí)器1,工作模式2 8位自動(dòng)重裝TH1 = 0xfd;TL1 = 0xfd;//設(shè)置比特率9600 } void main()//main函數(shù)自身會(huì)循環(huán) { timer0Init();//定時(shí)器0初始化UARTInit();//串口初始化while(1); } //定時(shí)器0中斷函數(shù) void timer0() interrupt 1 {TH0 = 0xED;TL0 = 0xFF; //定時(shí)5msdisplay(num); //數(shù)碼管顯示函數(shù) } //串口中斷函數(shù) void UART() interrupt 4 {if(RI)//判斷接收是否完成{num = SBUF;//讀SBUF,讀出串口接收到的數(shù)據(jù)RI = 0;//軟件清零接收標(biāo)志位 }if(TI)//判斷是否發(fā)送完成TI = 0;//清零發(fā)送完成標(biāo)志位 }

通過(guò)串口發(fā)送數(shù)據(jù)前需要進(jìn)行的設(shè)置
在右邊的菜單欄找到串口助手然后

  • 第一步讓COM號(hào)保持一致
  • 第二步波特率設(shè)置為9600
  • 第三步打開(kāi)串口
  • 第四步發(fā)送和接收格式選擇HEX格式

修改串口中斷中的函數(shù),實(shí)現(xiàn)接收緩沖區(qū)數(shù)據(jù)
//串口中斷函數(shù) void UART() interrupt 4 {uchar temp;if(RI)//判斷接收是否完成{num = SBUF;//讀SBUF,讀出串口接收到的數(shù)據(jù)RI = 0;//軟件清零接收標(biāo)志位 temp = num;//SBUF = temp;//寫(xiě)SBUF,把要發(fā)送的數(shù)據(jù)送給發(fā)送緩存器}if(TI)//判斷是否發(fā)送完成TI = 0;//清零發(fā)送完成標(biāo)志位 }

對(duì)代碼修改后可以通過(guò)

串口助手選擇文本模式接收和發(fā)送數(shù)據(jù)


ASCII碼規(guī)定了不同字符是用哪個(gè)整數(shù)去表示,所以其它字母或數(shù)字對(duì)應(yīng)的值可以通過(guò)ASCII表查看。


通過(guò)串口發(fā)送字符串

puts()函數(shù)和printf()函數(shù)
void main() {UARTInit(); //串口初始化while(1){TI = 1;puts("Hello Wolrd!"); // 使用puts函數(shù)while(!TI);TI = 0;delay(1000);} } void main() {UARTInit(); //串口初始化while(1){TI = 1;printf("Hello Wolrd!"); // 使用printf函數(shù)while(!TI);TI = 0;delay(1000);} }

注:puts()函數(shù)和printf()函數(shù)區(qū)別是

  • puts函數(shù)會(huì)執(zhí)行換行操作
  • printf函數(shù)不會(huì)執(zhí)行換行操作

打開(kāi)串口助手選擇對(duì)應(yīng)COM號(hào),設(shè)置波特率9600接收格式選擇【文本格式】。

#include <reg52.h> #include <stdio.h> // 打印字符串需要調(diào)用 stdio.h 庫(kù)#define uint unsigned int #define uchar unsigned char//毫秒級(jí)延時(shí)函數(shù)定義 void delay(uint z) {uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); } //串口初始化 void UARTInit() {SM0 = 0; SM1 = 1;//串口工作方式1,8位UART波特率可變TR1 = 1;//啟動(dòng)定時(shí)器1TMOD |= 0x20;//定時(shí)器1,工作模式2 8位自動(dòng)重裝TH1 = 0xfd;TL1 = 0xfd;//設(shè)置比特率9600 }void main() {UARTInit(); //串口初始化while(1){TI = 1;puts("Hello Wolrd!"); // 每次打印都會(huì)換行 支持中文打印 while(!TI);TI = 0;delay(1000);} }

注:

  • 使用printf()函數(shù)或puts()函數(shù)需要引入頭文件#include <stdio.h>
  • 使用printf()函數(shù)或puts()函數(shù)前都應(yīng)軟件置位TI = 1;
    如果沒(méi)有軟件置位TI = 1,則會(huì)一直處于等待狀態(tài),while(!TI)一直在循環(huán)中。

總結(jié)

以上是生活随笔為你收集整理的STC89C52单片机 串口通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。