单片机
返回首页

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);
}
 
 
}
 
 
}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • PIC单片机控制的遥控防盗报警器电路

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 如何构建一个触摸传感器电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章