1、在发送端proteus图纸中, 按下按键K1和K2,可以改变要发送的数据num(数值范围0~9),按下K3通过串口发送num数据到接收端。
接收端能够接受数据,并在数码管上显示接受的数字。
2、接收端也可以进行数据的发送,也可以发送数据到发送端,同时发送端也能显示接收到的数据。
单片机源程序如下:
- /*
- 串口发送与接受一体的控制代码
- */
- #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松开
- }
- }
- }
复制代码 注意需要配合vspd软件是用,百度即可获取
http://www.51hei.com/bbs/dpj-108037-1.html
Keil代码下载与Proteus仿真下载:
05_双机通信.7z
(63.03 KB, 下载次数: 79)
|