新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > proteus與keil Cx51的單片機(jī)仿真(串行口單工通信)

proteus與keil Cx51的單片機(jī)仿真(串行口單工通信)

作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò) 收藏
單片機(jī)U1、U2串行口均工作于方式1,其中U1做接收機(jī),U2為發(fā)送機(jī),波特率9600,U1接收U2發(fā)送的數(shù)據(jù)后,依次送P1、P0、P2口進(jìn)行流水燈顯示,試編寫(xiě)程序,并通過(guò)Proteus仿真。

電路圖:

本文引用地址:http://butianyuan.cn/article/201611/320718.htm



U1程序:

#include//包含單片機(jī)寄存器的頭文件
unsigned char receive(void)//接收一個(gè)字節(jié)數(shù)據(jù)
{
unsigned char dat;
while(RI==0);
RI=0;//只要接收中斷標(biāo)志位RI沒(méi)有被置1,等待,直至接收完(RI1)
dat=SBUF;//將接收緩沖器中的數(shù)據(jù)存于dat
return dat;
}
void main(void)
{
unsigned char i;
TMOD=0x20;//定時(shí)器T1工作于方式2
SCON=0x50;//SCON=0101 0000B,串行口工作方式1,允許接收(REN=1)
PCON=0x00;//PCON=0000 0000B,波特率9600
TH1=0xfd;TL1=0xfd;//根據(jù)規(guī)定給定時(shí)器T1賦初值
TR1=1;//啟動(dòng)定時(shí)器T1
REN=1;//允許接收
while(1)
{
for(i=0;i<9;i++)P1=receive();//將數(shù)據(jù)送P1口顯示
for(i=0;i<9;i++)P0=receive();//將數(shù)據(jù)送P0口顯示
for(i=0;i<9;i++)P2=receive();//將數(shù)據(jù)送P2口顯示
}
}

U2程序:

#include//包含單片機(jī)寄存器的頭文件
unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};//流水燈燈控制碼,該數(shù)據(jù)被定義為全局變量
void send(unsigned char dat)//向PC發(fā)一個(gè)字節(jié)數(shù)據(jù)
{
SBUF=dat;
while(TI==0);//發(fā)送等待
TI=0;
}
void delay(void)//延時(shí)約150ms
{
unsigned char m,n;
for(m=0;m<200;m++)for(n=0;n<250;n++);
}
void main(void)
{
unsigned char i;
TMOD=0x20;//TMOD=0010 0000B,定時(shí)器T1工作于方式2
SCON=0x40;//SCON=0100 0000B,串行口工作方式1
PCON=0x00;//PCON=0000 0000B,波特率9600
TH1=0xfd;TL1=0xfd;//給定時(shí)器T1賦初值
TR1=1;//啟動(dòng)定時(shí)器T1
while(1)
{
for(i=0;i<27;i++)//模擬檢測(cè)數(shù)據(jù)
{
send(Tab[i]);//發(fā)送數(shù)據(jù)i
delay();//50ms發(fā)送一次檢測(cè)數(shù)據(jù)
}
}
}




評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉