這是我們的實(shí)驗(yàn)要求:
效果1 : 單片機(jī)發(fā)送數(shù)據(jù)給PC機(jī),PC機(jī)利用串口調(diào)試助手將數(shù)據(jù)顯示出來(lái)。(40分)
效果2 : PC機(jī)發(fā)送數(shù)據(jù)給單片機(jī),單片機(jī)將收到的數(shù)據(jù)返回給PC機(jī),并通過(guò)串口調(diào)試助手顯示出來(lái)。(50分)
01電路圖
這個(gè)圖的最小系統(tǒng)的電路是有問(wèn)題的。【就是單片機(jī)左邊的電路,參考時(shí)要慎重】
虛擬串口:
然后是單片機(jī)的串口設(shè)置
我們把虛擬串口com2給了MCU,那么我們把com3給PC端
02寫(xiě)代碼前的一些設(shè)置
1.晶振設(shè)置為11.0592MHz
2.我們的波特率為9600
SCON = 0X50; //SM0=0,SM1 =1【方式一】,REN =1【允許串口接收】
PCON = 0X80; //控制波特率的倍速提高一倍:SMOD = 1
TMOD |= 0X20; //使用的是定時(shí)器T1
TH1 = 0XFA; //波特率為9600
TL1 = 0XFA;
TR1 = 1;
IE = 0X90; // 1001 0000 EA 置為1 ES 置為1
//EA 中斷總允許位 ES 串行中斷允許位
【注意】 定時(shí)器T1作為默認(rèn)的波特率發(fā)生器,要記得禁止T1中斷。
接下來(lái)說(shuō)說(shuō)我們的TH1和TL1怎么計(jì)算的
TL1 = TH1 = 256-(2^SMOD * f_osc )/ 32 * 12 * 波特率
f_osc:晶振頻率 (單位:MHz) 計(jì)算時(shí),記得乘以10^6
例如我們本次實(shí)驗(yàn)使用的是提高一倍的波特率的倍速
PCON = 0X80; //控制波特率的倍速提高一倍:SMOD = 1
波特率為9600,晶振為11.0592MHz
那么我們的TH1 = 256-(211.059210^6)/(32129600)=250
打開(kāi)電腦的計(jì)算器:將十進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù),在DEC那里輸入250,我們要獲取的就是HEX的值
最后TH1=TL1 = 0XFA;
這里也要設(shè)置哦
這個(gè)是串口助手的設(shè)置
03代碼
代碼很短小哦
#include < reg51.h >
#define u8 unsigned char
#define u16 unsigned int
u8 data_r;
void init()
{
SCON = 0X50;
PCON = 0X80;
TMOD |= 0X20;
TH1 = 0XFA;
TL1 = 0XFA;
TR1 = 1;
IE = 0X90;
}
void putchar(u8 n)
{
SBUF = n;
while(TI == 0);
TI = 0;
}
void main(){
init();
putchar('H');
putchar('E');
putchar('L');
putchar('L');
putchar('O');
while(1)
{
}
}
void Usart () interrupt 4
{
if(RI == 1)
{
data_r = SBUF ;
putchar(data_r);
RI = 0;
}
}
04分塊來(lái)講
//串口、定時(shí)器T1的初始化
void init()
{
SCON = 0X50;
PCON = 0X80;
TMOD |= 0X20;
TH1 = 0XFA;
TL1 = 0XFA;
TR1 = 1;
IE = 0X90;
}
這個(gè)初始化就不多說(shuō)了,我們的“02”部分,要點(diǎn)已經(jīng)講完了。
void putchar(u8 n)
{
SBUF = n;
while(TI == 0);
TI = 0;
}
這一部分也沒(méi)啥好講的,就是一個(gè)發(fā)送字符的函數(shù),我們將要發(fā)送的字符,放進(jìn)我們的發(fā)送寄存器SBUF中,TI是系統(tǒng)自動(dòng)產(chǎn)生的中斷信號(hào),最后記得T1手動(dòng)清零哦。
TI = 0;
這個(gè)是串口中斷函數(shù):
void Usart () interrupt 4
{
if(RI == 1)
{
data_r = SBUF ;
putchar(data_r); //寫(xiě)了這句話(huà),是為了在串口助手看到你發(fā)過(guò)去的數(shù)據(jù)
RI = 0;
}
}
這個(gè)SBUF是接收寄存器SBUF
data_r = SBUF ;
將接收到的字符存入我們的data_r中,再通過(guò)這句代碼,就可以在串口助手上,看到我們發(fā)送給單片機(jī)的數(shù)據(jù)
putchar(data_r); //寫(xiě)了這句話(huà),是為了在串口助手看到你發(fā)過(guò)去的數(shù)據(jù)
最后是我們的主函數(shù)
void main(){
init();
putchar('H');
putchar('E');
putchar('L');
putchar('L');
putchar('O');
while(1)
{
}
}
這塊代碼的效果:串口助手顯示:HELLO【可以自己去試一試昂】
putchar('H');
putchar('E');
putchar('L');
putchar('L');
putchar('O');
-
電路圖
+關(guān)注
關(guān)注
10306文章
10715瀏覽量
525996 -
單片機(jī)
+關(guān)注
關(guān)注
6026文章
44455瀏覽量
630942 -
PC機(jī)
+關(guān)注
關(guān)注
2文章
201瀏覽量
28468 -
串口通信
+關(guān)注
關(guān)注
34文章
1604瀏覽量
55325
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論