标题:
单片机双机串口通信原理图,proteus仿真以及程序
[打印本页]
作者:
51hei学习技术中
时间:
2017-4-5 01:33
标题:
单片机双机串口通信原理图,proteus仿真以及程序
给大家分享一个51单片机双机通信,用串口实现,有单片机主机程序和丛机程序的源代码。
下面是proteus仿真原理图:
0.png
(36.08 KB, 下载次数: 140)
下载附件
2017-4-5 01:07 上传
主机程序:
#include<reg51.h>
unsigned char i=1;
unsigned char ACK=1;
void delay() //延时函数
{
unsigned char i,j;
for(i=255;i>0;i--)
for(j=100;j>0;j--){}
}
unsigned char kbscan() //键盘扫描函数
{
unsigned char sccode,recode; //定义行、列
P1=0xf0; //高四位作为输入先写1
if((P1&0xf0)!=0xf0) //判断是否按键按下
{
delay(); //延时消抖
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;
TH1=0x00;TL1=0x00; //置初值
TR1=1;EA=1;ES=1; //使T1开始工作;开总中断、串行中断
SCON=0x50; //使T1工作在工作方式1
SBUF=i;
while(1)
{
while(kbscan())
{
switch(kbscan()) //不同的按键对应不同的波特率
{
case 0xeb:i=0x00;break;
case 0xdb:i=0x22;break;
case 0xbb:i=0x44;break;
case 0xed:i=0x66;break;
case 0xdd:i=0x88;break;
case 0xbd:i=0xaa;break;
case 0xee:i=0xcc;break;
case 0xde:i=0xdd;break;
case 0xbe:i=0xee;break;
}
}
}
}
复制代码
丛机程序:
#include<reg51.h>
#define LCD_DATA P0
sbit LCD_BUSY=LCD_DATA^7;
sbit LCD_RW=P3^3;
sbit LCD_RS=P3^2;
sbit LCD_EN=P3^4;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit P30=P3^0;
sbit P31=P3^1;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
unsigned char i=0;
void LCD_check_busy(void) //检测LCD状态
{
while(1)
{
LCD_RS=0;
LCD_RW=1;
LCD_EN=0;
LCD_DATA=0xff;
LCD_EN=1;
if(!LCD_BUSY)break;
LCD_EN=0;
}
}
void LCD_cls(void) //LCD清屏
{
LCD_check_busy();
LCD_EN=0;
LCD_RS=0;
LCD_RW=0;
LCD_DATA=0x01;
LCD_EN=1;
LCD_EN=0;
}
void LCD_write_instruction(unsigned char LCD_instruction)//写指令到LCD
{
LCD_check_busy();
LCD_EN=0;
LCD_RS=0;
LCD_RW=0;
LCD_DATA=LCD_instruction;
LCD_EN=1;
LCD_EN=0;
}
void LCD_write_data(unsigned char LCD_data)//输出一个字节数据到LCD
{
LCD_check_busy();
LCD_EN=0;
LCD_RS=1;
LCD_RW=0;
LCD_DATA=LCD_data;
LCD_EN=1;
LCD_EN=0;
}
void LCD_initial()
{
LCD_write_instruction(0x38); //两行显示
LCD_write_instruction(0x0C); //显示开
LCD_write_instruction(0x06); //光标加1
LCD_write_instruction(0x01); //清屏
}
re() interrupt 4 //串行口通信中断
{
if(RI==1)
{
RI=0;
i=SBUF; // 接收数据
if(i==0||i==0x22||i==0x44||i==0x66||i==0x88||i==0xaa||i==0xcc||i==0xdd||i==0xee)
{
SBUF=1; //接收发过来 要修改的初值
}
else //接收正常通信的数据
{
LCD_write_instruction(0x80+i);
LCD_write_data('0'+i);
if(i==11)LCD_initial();
}
}
else if(TI==1)
{
TI=0;
TH1=i;TL1=i; //发送确认信号后 修改初值
}
}
void main()
{
TMOD=0x20;
TH1=0x00;TL1=0x00; //置初值
TR1=1;EA=1;ES=1; //使T1开始工作;开总中断、串行中断
SCON=0x50; //使T1工作在工作方式1
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
(70.42 KB, 下载次数: 171)
下载附件
2017-4-5 01:08 上传
下载:
串口通信仿真.zip
(90.41 KB, 下载次数: 363)
2017-4-5 01:10 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
ljn123123
时间:
2017-11-22 23:12
大牛,没毛病,太感谢了。
单片机I/O口不过够用了,正好用这个程序。
作者:
51黑mmp
时间:
2018-1-2 15:59
太厉害了,我这两天做这个就卡住了
作者:
唯一的依旧
时间:
2018-1-10 10:40
厉害啊,楼主无敌
作者:
等待爆发
时间:
2018-6-9 21:24
好厉害
作者:
单片机987
时间:
2018-11-5 16:41
非常好,解决了学校的单片机作业问题
作者:
dulandom
时间:
2020-5-13 22:28
不知为何LCD没反应
作者:
dulandom
时间:
2020-5-13 22:29
不知为何LCD没反应
作者:
珠峰有多高
时间:
2020-5-14 09:50
很有用,谢谢分享。
作者:
Jeff_BlindCat
时间:
2020-5-14 10:59
谢谢楼主指点分享。
作者:
氧化铝
时间:
2020-6-13 09:00
有点小好奇,为什么按动加减乘除键对数字的显示速度没有改变
作者:
青栀子
时间:
2020-6-27 15:35
楼主厉害
作者:
Jeff_BlindCat
时间:
2020-7-26 22:42
串口双线连两片,
主从耐心等中断;
扫描按键得指令,
BUF承担来回链,
再看仿真电路线,
两片共用接地源?
作者:
845414442
时间:
2020-11-15 11:40
大佬,是全双工的吗
作者:
不续年华
时间:
2021-3-19 12:36
这个仿真好
作者:
usaboy
时间:
2021-3-20 04:36
实在是感激不尽,谢谢啦!
作者:
aacaca
时间:
2021-6-16 11:47
真的很好,看了之后收获很多!
作者:
aacaca
时间:
2021-6-16 11:48
太好了太好了,看了之后有好像知道该怎么做了
作者:
浩然兄
时间:
2021-12-22 22:54
学习了大佬的程序,真的受益匪浅。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1