c51-c51 间通信控制
2016-10-13 来源:elecfans
/*
进入单片机查看更多内容>>
c51A:键盘控制发送字符串“open','close'等,
c51B:接收字符串,根据字符串发出控制命令。
*/
//c51A程序
/*
发送机程序,程序功能:
1.参数 f=12MHZ,baud=1200
2.串口中断方式:发送字符串存放字符数组tran_buf[]中
2.发送字符串由16位键盘控制。由T2定时中断,每10ms扫描一次键盘。不同按键发送不同字符串。
*/
#include'reg52.h'
#include'string.h'
#define uchar unsigned char
//发送字符串缓存
uchar tran_buf[10];
uchar tnum=0;
//串口初始化
void init();
//发送字符串
void transmit(uchar *str);
//T2 初始化设置,10ms一次中断,扫描键盘。
//t=(2^16-T)*f/12
//t:定时器延时。
//T:时间常数。
//由 f=12MHZ,t=10ms
//得:T=2^16-10^4=55536=0xd8f0;
void init_t2();
//定义全局变量,
uchar kd; //kd=1表示键闭合,并已经过10ms延时去抖动,已处于稳定状态;
uchar kin; //kin=1表示键值已读到kbuf中,等待处理。
uchar kp; //kp=1表示kbuf中的数据已处理。
//存放键值
uchar kbuf;
//
//16位键盘接P0口,判断是否有键按下,
//有键按下返回1,无键按下返回0
uchar keys();
//键号函数,将键转换为对应的0~F的数值。
uchar nkey();
//16位键盘行翻转法对应键值。
uchar code kcode[]={
0x77,0x7b,0x7d,0x7e,
0xb7,0xbb,0xbd,0xbe,
0xd7,0xdb,0xdd,0xde,
0xe7,0xeb,0xed,0xee};
uchar open[]={0x6f,0x70,0x65,0x6e,0x00}; //6f 70 65 6e 00
uchar close[]={0x63,0x6c,0x6f,0x73,0x65,0x00}; //63 6c 6f 73 65 00
void main()
{
uchar i,j,k;
init();
init_t2();
while(1)
{
//如果kbuf中用数据,且未处理。
if((kin==1)& (kp==1))
{
P1=~kbuf; //P1显示键值。
switch(kbuf)
{
case 0 : transmit(open);break;
case 1 : transmit('click 1');break;
case 2 : transmit('click 2');break;
case 3 : transmit('click 3');break;
case 4 : transmit('click 4');break;
case 5 : transmit('click 5');break;
case 6 : transmit('click 6');break;
case 7 : transmit('click 7');break;
case 8 : transmit('click 8');break;
case 9 : transmit('click 9');break;
case 10: transmit('click 10');break;
case 11: transmit('click 11');break;
case 12: transmit('click 12');break;
case 13: transmit('click 13');break;
case 14: transmit('click 14');break;
case 15: transmit(close);break;
default:P1=0;
}
for(i=0;i<3;i++)
{
for(j=0;j<255;j++)
for(k=0;k<255;k++);
}
kd=0;
kin=0;
kp=0;
}
}
}
//T1工作方式2,作波特率发生器,f=12MHZ,baud=1200,TH=0xe6;
void init()
{
//T1方式2作波特率,
TMOD=0x20;
//串口方式1,允许接收设置
SCON=0x50;
//计算常数
TH1=0xe6;
TL1=0xe6;
//启动
TR1=1;
//开中断
EA=1;
ES=1;
}
void serial() interrupt 4
{
if(TI==1)
{
TI=0;
tnum++;
if(tnum>10)
return;
if(tran_buf[tnum]!='\0')
SBUF=tran_buf[tnum];
else
{
ES=0;
SBUF='\0';
while(TI==0);
TI=0;
ES=1;
}
}
}
//
void transmit(uchar *str)
{
strcpy(tran_buf,str);
tnum=0;
//发送tran_buf[]数组第一个字符,触发中断,由中断程序将其他字符发送。
SBUF=tran_buf[tnum];
}
void init_t2()
{
TL2=0xf0; //时间常数
TH2=0xd8;
RCAP2L=0xf0;
RCAP2H=0xd8;
//开中断
EA=1;
ET2=1;
//启动T2
TR2=1;
}
//T2 中断程序,功能将键值存放在kbuf中。
void timer2() interrupt 5
{
//关中断标志
TF2=0;
//
if(keys()==1) //有键按下
{
if(kd==1) //延时去抖动
{
if(kin==0) //新键值未输入,
{
kin=1;
if(kp==0) //kbuf 中的数据已处理,kbuf空。
{
kbuf=nkey(); //键值保存到kbuf中,此时按键处于稳定按下时期。
kp=1;
}
}
}
else
kd=1; //按键未延时去抖动。
}
else
kd=0;
}
uchar keys()
{
//如果设置:char a ,程序始终返回1.
uchar a;
P0=0xf0;
a=P0;
if(a==0xf0)
return 0;
else
return 1;
}
uchar nkey()
{
uchar high,low,key,i;
P0=0xf0;
high=P0;
P0=0x0f;
low=P0;
key=high|low;
for(i=0;i<16;i++)
{
if(key==kcode[i])
return i;
}
}
//c51B程序
/*
接收机功能:
1.参数 f=12MHZ,baud=1200
2.串口中断方式:接收字符串存放字符数组rec_buf[]中。
3.不同的接收字符实现不同的控制功能
4、发送收到的字符串。
*/
#include'reg52.h'
#include'string.h'
#define uchar unsigned char
//接收字符串缓存
uchar rec_buf[10];
//uchar tran_buf[10];
uchar rnum=0;
//uchar tnum=0;
//串口初始化
void init();
//发送字符串
//void transmit(uchar *str);
//uchar open[]={0x6f,0x70,0x65,0x6e,0x00,0x00}; //6f 70 65 6e 00
//uchar close[]={0x63,0x6c,0x6f,0x73,0x65,0x00,0x00}; //63 6c 6f 73 65 00
void main()
{
init();
while(1)
{
//由接收字符串控制单片机
//如果 接收到字符串 open,则P1=0;
//ascii:0x6f,0x70,0x65,0x6e,0x00
if(strcmp(rec_buf,'open')==0)
{
P1=0x00;
}
//如果 接收到字符串 close,则P1=1;
//ascii:0x63,0x6c,0x6f,0x73,0x65,0x00
if(strcmp(rec_buf,'close')==0)
{
P1=0xff;
}
}
}
//T1工作方式2,作波特率发生器,f=12MHZ,baud=1200,TH=0xe6;
void init()
{
//T1方式2作波特率,
TMOD=0x20;
//串口方式1,允许接收设置
SCON=0x50;
//计算常数
TH1=0xe6;
TL1=0xe6;
//启动
TR1=1;
//开中断
EA=1;
ES=1;
}
void serial() interrupt 4
{
if(RI==1)
{
RI=0;
rec_buf[rnum]=SBUF;
if(rec_buf[rnum]!='\0')
rnum++;
else
{
rec_buf[rnum]='\0';
rnum=0;
//transmit(rec_buf);
}
}
}
上一篇:C51:串口程序
相关文章