双机通信代码接收方和发送方.docx
- 文档编号:5747812
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:14
- 大小:17.36KB
双机通信代码接收方和发送方.docx
《双机通信代码接收方和发送方.docx》由会员分享,可在线阅读,更多相关《双机通信代码接收方和发送方.docx(14页珍藏版)》请在冰豆网上搜索。
双机通信代码接收方和发送方
/*按下矩阵键盘第一行时以1200bps发送0,1,2,3;按下第二行时以2400bps发送4,5,6,7;
按下第三行时以4800bps发送8,9,10,11;按下第四行时以9600pbs发送12,13,14,15.
*/
/*接收方在接收到第一行的任意键值时,8个发光二极管形成流水灯;
在接收到第二行的任意键值时,显示在数码管上;
在接收到第三行的任意键值时,给发送方返回信息,将接收到的数值前面加上标号显示在发送方的液晶上;
在接收到第四行的任意键值时,发送方返回信息:
当接收到13时,驱动发送方的蜂鸣器以400ms频率发声;当接收到14时,驱动发送方的蜂鸣器以200ms频率发声;
当接收到15时,驱动发送方的蜂鸣器以100ms频率发声;当接收到15时,关闭蜂鸣器*/
/*发送方程序代码*/
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLCDEN=P3^4;
sbitRS=P3^5;
sbitbeep=P2^3;
sbitWEILA=P2^7;
sbitDULA=P2^6;
ucharnum,temp,a,benum;
voiddelay(uintk)
{
uintj,i;
for(j=k;j>0;j--)
for(i=100;i>0;i--);
}
voidsend(uchar);
voidwrite_comd(uchar);
voidwrite_data(uchar);
voidinit_yj();
voiddisplay_yj(uchar);
voidinit_S_1200()
{
TH1=0xe8;//设置波特率为1200bps
TL1=0xe8;
}
voidinit_S_2400()
{
TH1=0xf4;//设置波特率为2400bps
TL1=0xf4;
}
voidS_4800(ucharnumx)
{
TH1=0xfa;//设置波特率为4800bps
TL1=0xfa;
REN=1;
send(numx);
delay(5);
if(RI==1)
{
RI=0;
a=SBUF;//接收SBUF
display_yj(a);
}
}
voidS_9600(ucharnumy)
{
TH1=0xfd;//设置波特率为9600bps
TL1=0xfd;
REN=1;
send(numy);
delay(5);
if(RI==1)
{
RI=0;
a=SBUF;
TR0=1;
switch(a)
{
case13:
benum=4;
case14:
benum=2;
case15:
benum=1;
case16:
{
TR0=0;
beep=0;
}
}
}
}
voidinit_S()
{
TMOD=0x21;//设置定时器1为方式2,定时器0为方式1
TH0=(65536-45278)/256;
TL0=(65536-45278)%256;
TR1=1;
EA=1;
ET0=1;
ES=1;
/*SMOD=0*/
/*设置SCON寄存器*/
SM0=0;//采用串口方式1进行双机通信
SM1=1;
REN=0;
}
voidkey_scan()//键盘扫描函数
{
P3=0xfe;
/*按键过程*/
temp=P3;
temp=temp&0xf0;//只要temp值的高4位
while(temp!
=0xf0)//检测是否有键按下
{
delay(5);//去抖延时
temp=P3;
switch(temp)
{
case0xee:
num=0;
break;
case0xde:
num=1;
break;
case0xbe:
num=2;
break;
case0x7e:
num=3;
break;
}
while(temp!
=0xf0)//按键释放检测
{
temp=P3;
temp=temp&0xf0;
}
init_S_1200();
send(num);
}
P3=0xfd;
/*按键过程*/
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
num=4;
break;
case0xdd:
num=5;
break;
case0xbd:
num=6;
break;
case0x7d:
num=7;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
init_S_2400();
send(num);
}
P3=0xfb;
/*按键过程*/
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)//表明键被按下
{
temp=P3;
switch(temp)
{
case0xeb:
num=8;
break;
case0xdb:
num=9;
break;
case0xbb:
num=10;
break;
case0x7b:
num=11;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
S_4800(num);
}
P3=0xf7;
/*按键过程*/
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xe7:
num=12;
break;
case0xd7:
num=13;
break;
case0xb7:
num=14;
break;
case0x77:
num=15;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
S_9600(num);
}
}
voidmain()
{
init_S();
while
(1)
{
key_scan();
}
}
voidsend(uchara)//发送函数
{
SBUF=a;
while(!
TI);//检测是否发送完毕
TI=0;
}
voidwrite_comd(ucharcom)
{
RS=0;//数据/命令选择端
P0=com;
delay
(1);//数据建立时间
LCDEN=1;
delay(5);
LCDEN=0;
}
voidwrite_data(uchardatas)
{
RS=1;//数据/命令选择端
P0=datas;
delay
(1);//数据建立时间
LCDEN=1;
delay(5);
LCDEN=0;
}
voidinit_yj()
{
WEILA=0;
DULA=0;
LCDEN=0;
write_comd(0x38);//显示模式设置
write_comd(0x0f);//开显示,显示光标且光标闪烁
write_comd(0x06);//写一个字符后,地址指针加1且光标加1;整屏显示不移动
write_comd(0x01);//显示清屏
}
voiddisplay_yj(ucharax)
{
init_yj();
write_data(ax);
}
voidT0_timer()interrupt1
{
uchart;
t++;
TH0=(65536-45278)/256;
TL0=(65536-45278)%256;
if(t==benum)
{
beep=~beep;
t=0;
}
}
/*按下矩阵键盘第一行时以1200bps发送0,1,2,3;按下第二行时以2400bps发送4,5,6,7;
按下第三行时以4800bps发送8,9,10,11;按下第四行时以9600pbs发送12,13,14,15.
*/
/*接收方在接收到第一行的任意键值时,8个发光二极管形成流水灯;
在接收到第二行的任意键值时,显示在数码管上;
在接收到第三行的任意键值时,给发送方返回信息,将接收到的数值前面加上标号显示在发送方的液晶上;
在接收到第四行的任意键值时,发送方返回信息:
当接收到12时,驱动发送方的蜂鸣器以400ms频率发声;当接收到13时,驱动发送方的蜂鸣器以200ms频率发声;
当接收到14时,驱动发送方的蜂鸣器以100ms频率发声;当接收到15时,关闭蜂鸣器*/
/*接收方程序代码*/
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDULA=P2^6;
sbitWEILA=P2^7;
uchara,flag;
unsignedcharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
voiddelay(uintk)
{
uintj,i;
for(j=k;j>0;j--)
for(i=100;i>0;i--);
}
voidLSD_8()//流水灯函数
{
delay(10);
P1=0xfe;
while
(1)
{
P1<<=1;
P1|=1;//最低位补1
if(P1==0x7f)
P1=0xfe;
}
}
voiddisplay_Smg(ucharnum)//数码管静态显示函数
{
WEILA=1;
P0=0xc0;
WEILA=0;
DULA=1;
P0=table[num];
DULA=0;
delay(5);
}
voidinit_S()
{
TMOD=0x20;//设置定时器1为方式2
TR1=1;
EA=1;
ES=1;
/*SMOD=0*/
/*设置SCON寄存器*/
SM0=0;//采用串口方式1进行双机通信
SM1=1;
REN=0;
}
voidS_1200()
{
TH1=0xe8;//设置波特率为1200bps
TL1=0xe8;
REN=1;
if(RI==1)//接收完毕
{
a=SBUF;//接收SBUF
if(a>=0&&a<=3)
{
LSD_8();
}
RI=0;
}
}
voidS_2400()
{
TH1=0xf4;//设置波特率为2400bps
TL1=0xf4;
REN=1;
if(RI==1)
{
a=SBUF;
if(a>=4&&a<=7)
{
display_Smg(a);
}
RI=0;
}
}
voidS_4800()
{
TH1=0xfa;//设置波特率为4800bps
TL1=0xfa;
REN=1;
if(RI==1)
{
a=SBUF;
if(a>=8&a<=11)
{
flag++;
if(flag==4)
flag=0;
SBUF=flag;
while(!
TI);
TI=0;
SBUF=a;
while(!
TI);
TI=0;
}
RI=0;
}
}
voidS_9600()
{
TH1=0xfd;//设置波特率为9600bps
TL1=0xfd;
REN=1;
if(RI==1)
{
RI=0;
a=SBUF;
if(a>=12&&a<=15)
{
SBUF=a;
while(!
TI);
TI=0;
}
}
}
voidexecute()//执行命令函数
{
S_1200();
S_2400();
S_4800();
S_9600();
}
voidmain()
{
init_S();
while
(1)
{
execute();
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 双机 通信 代码 接收 发送
![提示](https://static.bdocx.com/images/bang_tan.gif)