元器件
元器件 | 名稱 |
---|---|
電阻 | RES |
51單片機(jī) | AT89C51 |
電容 | CAP |
晶振 | CRYSTAL |
BCD數(shù)碼管 | 7SEG-BCD |
原理圖部分
串口初始化:
首先根據(jù)相關(guān)的串口寄存器編寫對(duì)應(yīng)的初始化代碼:
STC89C51單片機(jī)設(shè)有兩個(gè)定時(shí)器/計(jì)數(shù)器,因定時(shí)器1有4種工作方式,而常選用定時(shí)器1的工作方式2(8位自動(dòng)重裝)作為波特率的溢出率。
串口寄存器主要配置SCON寄存器。
本次采用8為可變,所以SM0=1;SM1=0;REN=1;
然后通過波特率的計(jì)算,可以計(jì)算出波特率和定時(shí)器初值的關(guān)系,然后編寫定時(shí)器初始化和串口初始化。
void initUart(unsigned int baud)
{
SM0=1;SM1=0;REN=1;//8位波特率可變,允許串口接受信號(hào)
TMOD|=0X20;//定時(shí)器1為8位自動(dòng)重裝載
PCON=0X00;//讓SMOD==0
TR1=1;//打開定時(shí)器1
EA=1;ET1=1;//打開串口中斷
TH1=256-11059200/12/32/baud;//設(shè)置定時(shí)器初值
TL1=256-11059200/12/32/baud;//設(shè)置定時(shí)器初值
}
代碼
本次實(shí)驗(yàn)由雙機(jī)進(jìn)行串口通訊,來核對(duì)雙方的數(shù)據(jù)是否是一樣的,如果一樣的就顯示在數(shù)碼管。
單片機(jī)1main.c
代碼如下:
#include "reg51.h"
//宏定義
#define uchar unsigned char
#define uint unsigned int
//延時(shí)函數(shù)
void time(uint ucMs);
//串口初始化
void initUart(unsigned int baud);
//參數(shù)定義
uchar ucCounter;
void main(void)
{
uchar counter=0;
time(1);
initUart(9600);//串口進(jìn)行初始化
while(1)
{
SBUF=counter;//將參數(shù)給寄存器
while(TI==0);//發(fā)送中斷,發(fā)送8位時(shí)為1
TI=0;//軟件置0
while(RI==0);//接受中斷,接受8位時(shí)為1
RI=0;//軟件置0
if(SBUF==counter)//如果接受到的等于counter
{
P2=counter;//數(shù)碼管顯示counter
if(++counter>15)counter=0;//大于15清零
time(500);//延時(shí)
}
}
}
void initUart(unsigned int baud)
{
SM0=1;SM1=0;REN=1;//8位波特率可變,允許串口接受信號(hào)
TMOD|=0X20;//定時(shí)器1為8位自動(dòng)重裝載
PCON=0X00;//讓SMOD==0
TR1=1;//打開定時(shí)器1
EA=1;ET1=1;//打開串口中斷
TH1=256-11059200/12/32/baud;//設(shè)置定時(shí)器初值
TL1=256-11059200/12/32/baud;//設(shè)置定時(shí)器初值
}
//延時(shí)函數(shù)
void time(uint ucMs)
{
while(ucMs!=0)
{
for(ucCounter=0;ucCounter<239;ucCounter++);
ucMs-=1;
}
}
單片機(jī)2main.c
#include "reg51.h"
//宏定義
#define uchar unsigned char
#define uint unsigned int
//延時(shí)函數(shù)
void time(uint ucMs);
//串口初始化
void initUart(unsigned int baud);
//參數(shù)定義
uchar ucCounter;
void main(void)
{
uchar receive;
time(1);
initUart(9600);//串口初始化
while(1)
{
while(RI==0);//接受8為置1
RI=0;
receive=SBUF; //接受信號(hào)
SBUF=receive;//將接受的發(fā)出去
while(TI==0);//發(fā)送8位置1
TI=0;
P2=receive;//數(shù)碼管顯示信號(hào)
}
}
//串口初始化
void initUart(unsigned int baud)
{
SM0=1;SM1=0;REN=1;//8位波特率可變,允許串口接受信號(hào)
TMOD|=0X20;//定時(shí)器1為8位自動(dòng)重裝載
PCON=0X00;//讓SMOD==0
TR1=1;//打開定時(shí)器1
EA=1;ET1=1;//打開串口中斷
TH1=256-11059200/12/32/baud;//設(shè)置定時(shí)器初值
TL1=256-11059200/12/32/baud;//設(shè)置定時(shí)器初值
}
//延時(shí)函數(shù)
void time(uint ucMs)
{
while(ucMs!=0)
{
for(ucCounter=0;ucCounter<239;ucCounter++);
ucMs-=1;
}
}
運(yùn)行效果如圖:文章來源:http://www.zghlxwxcb.cn/news/detail-757971.html
工程文件
工程文件文章來源地址http://www.zghlxwxcb.cn/news/detail-757971.html
到了這里,關(guān)于Proteus8仿真:51單片機(jī)使用串口進(jìn)行雙機(jī)通訊的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!