1、在發(fā)送端proteus圖紙中, 按下按鍵K1和K2,可以改變要發(fā)送的數據num(數值范圍0~9),按下K3通過串口發(fā)送num數據到接收端。
接收端能夠接受數據,并在數碼管上顯示接受的數字。
2、接收端也可以進行數據的發(fā)送,也可以發(fā)送數據到發(fā)送端,同時發(fā)送端也能顯示接收到的數據。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
keil程序編寫:
/*
串口發(fā)送與接受一體的控制代碼
*/
#include <REGX51.H>
#include <intrins.h>
//共陽0-F dp-a
unsigned char code tab[16]=
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
#define uchar unsigned char
sbit K1=P1^0;//ADD 遞增
sbit K2=P1^1;//DEC 遞減
sbit K3=P1^2;//DEC 遞減
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位數據,可變波特率
TMOD = 0x20; //設定定時器1為8位自動重裝方式
TL1 = 0xFD; //設定定時初值
TH1 = 0xFD; //設定定時器重裝值
ET1 = 0; //禁止定時器1中斷
TR1 = 1; //啟動定時器1
ES=1;//開串口中斷
EA=1;//開總中斷
}
char putchar (uchar ch)//向串口發(fā)送數據
{
SBUF=ch;
while(!TI);//查詢發(fā)生是否完畢
TI=0;//發(fā)送完畢,TI由軟件清零
return ch;
}
/********************************************************
函數功能: 延時c ms
參 數: c
返回 值: 無
*********************************************************/
void delayms( unsigned int ms) //@11.0592MHz
{
unsigned char i, j;
for(;ms>0;ms--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
uchar Receive_nums=0;//接收到的 字符
void Uart1() interrupt 4
{
if (RI)
{
RI=0; //清除RI位
Receive_nums=SBUF;
}
}
void main(void)
{
uchar Transmit_nums=0;//發(fā)送給乙機的數字
UartInit();
while(1)
{
P0=~tab[Receive_nums];//在數碼管上顯示數字
if(K1==0)//遞增按鍵
{
delayms(10);//消抖
if(K1==0)
{
Transmit_nums++;
if(Transmit_nums>9)
Transmit_nums=9;
}
while(K1==0);//等待按鍵K1松開
}
if(K2==0)//遞減按鍵
{
delayms(10);//消抖
if(K2==0)
{
Transmit_nums--;
if(Transmit_nums<1)
Transmit_nums=0;
}
while(K2==0);//等待按鍵K2松開
}
if(K3==0)//發(fā)送按鍵
{
delayms(10);//消抖
if(K3==0)
{
putchar(Transmit_nums);
}
while(K3==0);//等待按鍵K3松開
}
}
}
需要先從百度下載 VSPD虛擬串口調試軟件
Keil代碼與Proteus7.5仿真dsn文件下載:
雙機通信dsn文件.7z
(32.58 KB, 下載次數: 19)
2023-6-16 14:32 上傳
點擊文件名下載附件
|