要求:
独立程序的串行接收/发送,两个单片机利用串行口进行方式1的全双工串行通信,两个单片机分别带有键盘和八段码数码管,当A单片机按下键盘上的数字时,该数字传送到B单片机上并显示在B单片机上连接的数码管上,反之亦然。可选的波特率为:1200,2400,4800,9600。
1、CSDN下载:
2、关注微信公众号下载:
① 关注微信公众号:Tech云
②
3、可以关注点赞并在下方评论,我给你邮箱发过去。
/*******************************************************************************
================================================================================
【平 台】STC89C51_sumjess平台
【编 写】sumjess
【E-mail 】[email protected]
【软件版本】V2.0
【最后更新】2019年06月10日
【相关信息参考下列地址】
【网 站】
https://blog.csdn.net/qq_38351824
http://www.51hei.com/bbs/mcu-2-1.html
---------------------------------------------------------------------------------
【dev.env.】MDK4.02及以上版本
【Target 】STC89C51
第一次修订:2019/05/09
第二次修订:2019/05/21
第三次修订:2019/06/10
【problem 】
(1)库内补充的不全面;
(2)库内解释部分不全面;
(3)库内还存在一定的bug;
【direction】
下一步的目标就是把库继续集成!
【explain 】
为了方便使用,我也自己写了很多的库,和优化了算法和表示方式!
【warning】
目前程序中暂无错误 !
---------------------------------------------------------------------------------
没有完美的代码,只有不断的奉献,大家一起努力;
赠人玫瑰手留余香,欢迎大家反馈bug!
================================================================================
********************************************************************************/
/*--------------------------------------------------------------------------------------------------------------------------------
说明: 发送端单片机1程序:
8*8矩阵键盘读取数码管显示,再由串口与单片机2进行通信;
把单片机1读取的按键值发送给单片机2进行显示
MCU: AT89S52
晶振: 11.0592MHZ
---------------------------------------------------------------------------------------------------------------------------------*/
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit D1=P3^6; //数码管十位com1
sbit D2=P3^7; //数码管个位com2
uchar shi,ge,num;
uchar temp;
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void delay(uint z);//延时函数
void display(); //显示函数
void keyscan(); //8*8_64矩阵键盘
void InitUART (void); //串口初始化
/*----------------------------------------------------------------------------------
main()_程序入口
----------------------------------------------------------------------------------*/
void main()
{
InitUART();//串口初始化
SBUF=0;
while(1)
{
display();
keyscan();
}
}
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
/*------------------------------------------------
串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
// unsigned char Temp; //定义临时变量
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
num=SBUF; //读入缓冲区的值
// SBUF=num; //把接收到的值再发回单片机2
}
if(TI) //如果是发送标志位,清零
TI=0;
}
/*----------------------------------------------------------------------------------
延时
----------------------------------------------------------------------------------*/
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=112;j>0;j--);
}
/*----------------------------------------------------------------------------------
显示
----------------------------------------------------------------------------------*/
void display()
{ //num=23;
shi=num/10;
ge=num%10;
P2=table[shi];//显示十位
D1=0;
D2=1;
delay(5);
D1=1;
P2=table[ge];//显示个位
D2=0;
delay(5);
D2=1;
}
/*----------------------------------------------------------------------------------
矩阵键盘
----------------------------------------------------------------------------------*/
void keyscan()
{
uchar temp,n,k;
n=0x7f;
for(k=0;k<8;k++)
{
P0=n;
temp=P1&0xff;
if(temp!=0xff)
{
delay(3);
temp=P1&0xff;
if(temp!=0xff)
{
temp=P1;
if(n==0x7f)
{
switch(temp)
{
case 0xfe:num=1;SBUF=1;break;
case 0xfd:num=9;SBUF=9;break;
case 0xfb:num=17;SBUF=17;break;
case 0xf7:num=25;SBUF=25;break;
case 0xef:num=33;SBUF=33;break;
case 0xdf:num=41;SBUF=41;break;
case 0xbf:num=49;SBUF=49;break;
case 0x7f:num=57;SBUF=57;break;
}
}
if(n==0xbf)
{
switch(temp)
{
case 0xfe:num=2; SBUF=2;break;
case 0xfd:num=10;SBUF=10;break;
case 0xfb:num=18;SBUF=18;break;
case 0xf7:num=26;SBUF=26;break;
case 0xef:num=34;SBUF=34;break;
case 0xdf:num=42;SBUF=42;break;
case 0xbf:num=50;SBUF=50;break;
case 0x7f:num=58;SBUF=58;break;
}
}
if(n==0xdf)
{
switch(temp)
{
case 0xfe:num=3; SBUF=3;break;
case 0xfd:num=11;SBUF=11;break;
case 0xfb:num=19;SBUF=19;break;
case 0xf7:num=27;SBUF=27;break;
case 0xef:num=35;SBUF=35;break;
case 0xdf:num=43;SBUF=43;break;
case 0xbf:num=51;SBUF=51;break;
case 0x7f:num=59;SBUF=59;break;
}
}
if(n==0xef)
{
switch(temp)
{
case 0xfe:num=4; SBUF=4;break;
case 0xfd:num=12;SBUF=12;break;
case 0xfb:num=20;SBUF=20;break;
case 0xf7:num=28;SBUF=28;break;
case 0xef:num=36;SBUF=36;break;
case 0xdf:num=44;SBUF=44;break;
case 0xbf:num=52;SBUF=52;break;
case 0x7f:num=60;SBUF=60;break;
}
}
if(n==0xf7)
{
switch(temp)
{
case 0xfe:num=5;SBUF=5;break;
case 0xfd:num=13;SBUF=13;break;
case 0xfb:num=21;SBUF=21;break;
case 0xf7:num=29;SBUF=29;break;
case 0xef:num=37;SBUF=37;break;
case 0xdf:num=45;SBUF=45;break;
case 0xbf:num=53;SBUF=53;break;
case 0x7f:num=61;SBUF=61;break;
}
}
if(n==0xfb)
{
switch(temp)
{
case 0xfe:num=6;SBUF=6;break;
case 0xfd:num=14;SBUF=14;break;
case 0xfb:num=22;SBUF=22;break;
case 0xf7:num=30;SBUF=30;break;
case 0xef:num=38;SBUF=38;break;
case 0xdf:num=46;SBUF=46;break;
case 0xbf:num=54;SBUF=54;break;
case 0x7f:num=62;SBUF=62;break;
}
}
if(n==0xfd)
{
switch(temp)
{
case 0xfe:num=7;SBUF=7;break;
case 0xfd:num=15;SBUF=15;break;
case 0xfb:num=23;SBUF=23;break;
case 0xf7:num=31;SBUF=31;break;
case 0xef:num=39;SBUF=39;break;
case 0xdf:num=47;SBUF=47;break;
case 0xbf:num=55;SBUF=55;break;
case 0x7f:num=63;SBUF=64;break;
}
}
if(n==0xfe)
{
switch(temp)
{
case 0xfe:num=8; SBUF=8;break;
case 0xfd:num=16;SBUF=16;break;
case 0xfb:num=24;SBUF=24;break;
case 0xf7:num=32;SBUF=32;break;
case 0xef:num=40;SBUF=40;break;
case 0xdf:num=48;SBUF=48;break;
case 0xbf:num=56;SBUF=56;break;
case 0x7f:num=64;SBUF=64;break;
}
}
while(temp!=0xff)
{
temp=P1&0xff;
}
}
}
n=_cror_(n,1);
}
}
/*******************************************************************************
================================================================================
【平 台】STC89C51_sumjess平台
【编 写】sumjess
【E-mail 】[email protected]
【软件版本】V2.0
【最后更新】2019年06月10日
【相关信息参考下列地址】
【网 站】
https://blog.csdn.net/qq_38351824
http://www.51hei.com/bbs/mcu-2-1.html
---------------------------------------------------------------------------------
【dev.env.】MDK4.02及以上版本
【Target 】STC89C51
第一次修订:2019/05/09
第二次修订:2019/05/21
第三次修订:2019/06/10
【problem 】
(1)库内补充的不全面;
(2)库内解释部分不全面;
(3)库内还存在一定的bug;
【direction】
下一步的目标就是把库继续集成!
【explain 】
为了方便使用,我也自己写了很多的库,和优化了算法和表示方式!
【warning】
目前程序中暂无错误 !
---------------------------------------------------------------------------------
没有完美的代码,只有不断的奉献,大家一起努力;
赠人玫瑰手留余香,欢迎大家反馈bug!
================================================================================
********************************************************************************/
/*--------------------------------------------------------------------------------------------------------------------------------
说明: 接收端单片机2程序:
读取数码管显示,由串口与单片机1进行通信;
接收单片机1读取的8*8矩阵键盘按键值并在数码管上进行显示
MCU: AT89S52
晶振: 11.0592MHZ
---------------------------------------------------------------------------------------------------------------------------------*/
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar shi,ge,num;
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void delay(uint z);//延时函数
void display(); //显示函数
void InitUART (void); //串口初始化
/*----------------------------------------------------------------------------------
main()_程序入口
----------------------------------------------------------------------------------*/
void main()
{
InitUART();
SBUF=0;
while(1)
{
display();
}
}
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
/*------------------------------------------------
串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
num=(int)SBUF; //读入缓冲区的值
// SBUF=0; //把接收到的值再发回单片机1
}
if(TI) //如果是发送标志位,清零
TI=0;
}
/*----------------------------------------------------------------------------------
延 时
----------------------------------------------------------------------------------*/
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=112;j>0;j--);
}
/*----------------------------------------------------------------------------------
显示
----------------------------------------------------------------------------------*/
void display()
{// num=23;
shi=num/10;
ge=num%10;
P2=table[shi];//显示十位
delay(5);
P1=table[ge];//显示个位
delay(5);
}