一、实验内容
甲乙两个单片机进行串行通信。采用12MHZ时钟频率晶振频率和方式1进行通信。甲机上有4*4键盘、一个七段数码管,乙机上有两个七段数码管;甲机发出按键显示内容,乙机接收后在数码管上交替显示。
二、实验目的
理解单片机串行口实现通信的各种工作方式
掌握单片机串行通信程序设计、调试方法
三、实验设备
DELL台式机 、keilC51版本7、proteus版本6
四、实验电路图
五、程序流程图
查询方式接收流程图
查询方式发送流程图
六、程序源码
//接收程序
#include
#define uchar unsigned char
#define uint unsigned int
uchar old=16;
uchar code DSY_CODE[]=
{ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00 };
//延迟子程序
void DelayMS(uint ms){
uchar t;
while(ms--)
for(t=0;t<120;t++);
}
void main(){
P0=0x00;P2=0x00;
SCON=0x50;//串口模式1,8位异步,允许接受
TMOD=0x20;//T1工作在模式2,8位自动装载
PCON=0x00;//波特率不倍增
TH1=0xfd;//波特率9600
TL1=0xfd;
RI=0;
TR1=1;//启动定时器T1
while(1){
if(RI){
RI=0;
P0=DSY_CODE[old];//显示旧值
P2=DSY_CODE[SBUF];//显示新值
old=SBUF;
}
DelayMS(100);
}
}
//发送程序
#include
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]=
{ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71 };
uchar pre_key=16,key=16;
//延迟子程序
void DelayMS(uint ms){
uchar t;
while(ms--)
for(t=0;t<120;t++);
}
//键盘扫描子程序
void keys_scan(){
uchar temp;
P0=0x0f;
DelayMS(1);
temp=P0^0x0f;
switch(temp){
case 1:key=0;break;
case 2:key=1;break;
case 4:key=2;break;
case 8:key=3;break;
}
P0=0xf0;
DelayMS(1);
temp=P0>>4^0x0f;
switch(temp){
case 1:key+=0;break;
case 2:key+=4;break;
case 4:key+=8;break;
case 8:key+=12;break;
}
}
//发送子程序
void putc_to_SerialPort(uchar c){
SBUF=c;
while(TI==0);
TI=0;
}
void main(){
P1=0x00;
SCON=0x40;//串口工作在方式1(01000000)
TMOD=0x20;//T1工作在模式2,8位自动装载
PCON=0x00;//波特率不倍增
TH1=0xfd;//波特率9600
TL1=0xfd;
TI=0;
TR1=1;//启动定时器T1
while(1){
P0=0xf0;
if(P0!=0xf0)
keys_scan();
if(pre_key!=key){
P1=DSY_CODE[key];
putc_to_SerialPort(key);
pre_key=key;
}
DelayMS(100);
}
}