1、在發送端proteus圖紙中, 按下按鍵K1和K2,可以改變要發送的數據num(數值范圍0~9),按下K3通過串口發送num數據到接收端。
接收端能夠接受數據,并在數碼管上顯示接受的數字。
2、接收端也可以進行數據的發送,也可以發送數據到發送端,同時發送端也能顯示接收到的數據。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
仿真演示案例.png (89.71 KB, 下載次數: 29)
下載附件
2023-6-14 15:08 上傳
keil程序編寫:
/*
串口發送與接受一體的控制代碼
*/
#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)//向串口發送數據
{
SBUF=ch;
while(!TI);//查詢發生是否完畢
TI=0;//發送完畢,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;//發送給乙機的數字
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)//發送按鍵
{
delayms(10);//消抖
if(K3==0)
{
putchar(Transmit_nums);
}
while(K3==0);//等待按鍵K3松開
}
}
}
51hei.png (8.63 KB, 下載次數: 31)
下載附件
2023-6-16 14:31 上傳
需要先從百度下載 VSPD虛擬串口調試軟件
Keil代碼與Proteus7.5仿真dsn文件下載:
雙機通信dsn文件.7z
(32.58 KB, 下載次數: 19)
2023-6-16 14:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|