标题:
以两片单片机为例简述单片机的串口通信的仿真与源码
[打印本页]
作者:
云之凡
时间:
2018-7-27 07:21
标题:
以两片单片机为例简述单片机的串口通信的仿真与源码
以两片单片机为例简述单片机的串口通信 程序+仿真+详细注释
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(43.85 KB, 下载次数: 65)
下载附件
2018-7-27 23:47 上传
0.png
(52.87 KB, 下载次数: 61)
下载附件
2018-7-27 23:47 上传
单片机源程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar i=1,ACK=1;
void delay(uint i) //延时函数
{
uchar j;
while(i--)
for(j=110;j>0;j--);
}
uchar kbscan() //键盘扫描函数
{
uchar sccode,recode; //定义行、列
P1=0xf0; //高四位作为输入先写1
if((P1&0xf0)!=0xf0) //判断是否按键按下
{
delay(10); //延时消抖
if((P1&0xf0)!=0xf0) //再次判断判断有没有按键按下
{
sccode=0xfe;
while((sccode&0x10)!=0)
{
P1=sccode;
if((P1&0xf0)!=0xf0) //判断当前行是否有按键按下
{
recode=P1&0xf0; //保留高四位输入值
sccode=sccode&0x0f; //保留第低四位的值
return(recode+sccode);
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0;
}
send()interrupt 4 //串行口通信中断
{
if(TI==1&&ACK==1)
{
TI=0;
if(i==0|i==0x22|i==0x44|i==0x66|i==0x88|i==0xaa|i==0xcc|i==0xdd|i==0xee) //有按键按下,需要修改波特率
{
ACK=0;
SBUF=i; //修改波特率
}
else if(i==11) //循环发送,发了十一个字符后重新发
{
i=1;
SBUF=1;
}
else
{
i++;
SBUF=i; //正常发送数据
}
}
else if(RI==1) //接收回应的信号
{
RI=0;
ACK=SBUF; //接收回应信号 修改初值 触发串口通信中断
TI=1;
TH1=TL1=i;
i=1;
}
}
void main()
{
TMOD=0x20; //定时器1 工作方式2
TH1=0x00;
TL1=0x00; //置初值
TR1=1;
EA=1;
ES=1; //使T1开始工作;开总中断、串行中断
SCON=0x50; //计数器1 工作方式1
SBUF=i;
while(1)
{
while(kbscan())
{
switch(kbscan()) //不同的按键对应不同的波特率
{
case 0xeb:i=0x00;break; // 1
case 0xdb:i=0x22;break; // 2
case 0xbb:i=0x44;break; // 3
case 0xed:i=0x66;break; // 4
case 0xdd:i=0x88;break; // 5
case 0xbd:i=0xaa;break; // 6
case 0xee:i=0xcc;break; // 7
case 0xde:i=0xdd;break; // 8
case 0xbe:i=0xee;break; // 9
}
}
}
}
复制代码
所有资料51hei提供下载:
20161111144-李作鑫-串口通信.rar
(100.45 KB, 下载次数: 45)
2018-7-27 07:21 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
cs999
时间:
2019-8-4 07:07
这个正是我在网上苦苦搜寻的关于单片机串口仿真的帖子,今天我必须把它拿走,楼主好人呐,谢谢了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1