利用单片机实现远程电源控制
山下控制板的程序如下:
#include "atmelAT89X51.H"
#define SYN 0x7E //山顶控制板发来数据帧的同步字符
char countdown; //时钟计数
char TTL; //通信中断的时间门坎值,设置为3秒
bit link_error; //通信中断标志
bit power_on; //山上设备是否加电的标志
bit km; //按键消抖动标志
bit kp; //按键操作已处理标志
char TTW; //发送指令前的时间计数
char TX_buf[3]; //发送缓冲区
char TX_len; //发送指令长度
char TX_num; //当前发送的字符序号
char RX_buf[3]; //接收缓冲区
char RX_len; //接收指令长度
char RX_num; //当前接收的字符序号
char CRC(char *buf,char len) //校验码生成函数
{char i,temp;
temp=0;
for(i=0;ilen;i++) temp=temp^buf[i];
return(temp);
}
void timer0_int() interrupt 1 //定时器0的中断服务函数
{ bit key1,key2;
TL0=0x00; TH0=0x0A6;
countdown--;
if(countdown==0 || countdown==20)
{ P1_6=!P1_6; //CPU运行指示灯秒闪
if(link_error)
P1_5=!P1_5; //通信中断,断电指示灯秒闪
else
{ if(power_on) P1_5=1; //设备加电,断电指示灯灭
else P1_5=0; //设备关电,断电指示灯亮
}
}
if(power_on !link_error) //当设备加电且通信正常
P1_3=0; //关闭蜂鸣器
else //当设备断电或通信中断
{ if(countdown==0) P1_3=0; //蜂鸣器告警
if(countdown==5) P1_3=1;
if(countdown==10) P1_3=0;
if(countdown==15) P1_3=1;
}
key1=P3_4; key2=P3_5;
if(key1==1 key2==1) { km=0;kp=0; } //两个按键均没有按下
else
{ if(km==0) km=1; //设消抖动标志
else
{ if(kp==0)
{ kp=1;
if(key1==0) //按键K1被按下
TTW=(TTW+1)%4; //计算K1连续按下的次数
if(key2==0) //按键K2被按下
{ if(TTW==3) //如果K1已被连续按了三次
{ if(P1_7) TX_buf[1]=0x13; //发加电指令
else TX_buf[1]=0x31; //发关电指令
TX_buf[2]=CRC(TX_buf,2);
TX_num=0; SBUF=TX_buf[0];
}
TTW=0; //不管K1已按下几次,K2按下后复位TTW计数器
}
}
}
}
if(countdown!=0) return;
countdown=40;
if(TTL==0) link_error=1; //TTL减到0,表示通信中断
else TTL--; //每隔1秒对TTL作减1操作
}
void serial_int() interrupt 4 //串口中断服务程序
{ if(TI)
{ TI=0; TX_num++;
if(TX_numTX_len) SBUF=TX_buf[TX_num];
}
else
{ RI=0; RX_buf[RX_num]=SBUF;
if(RX_num==0 RX_buf[RX_num]!=SYN)
return; //在接收到的数据中搜索同步字符
RX_num++;
if(RX_num==RX_len) //接收到一完成指令
{ RX_num=0;
if(RX_buf[RX_len-1]==CRC(RX_buf,RX_len-1)) //检查校验
{ if(RX_buf[1]==0x13) power_on=1; //加电状态
if(RX_buf[1]==0x31) power_on=0; //断电状态
TTL=3; link_error=0; //通信正常,重置TTL值
}
}
}
}
void main()
{ IE=0x92;
TMOD=0x21; //定时器1:模式2,定时器0:模式1
TL1=253; TH1=253; //9600波特率
TR1=1; //启动定时器1
SCON=0x50; //串口:模式1
TL0=0x00; TH0=0x0A6; //定时器0定时0.025秒
TR0=1; //启动定时器0
countdown=40; //1秒=0.025秒*40
TTL=3; //连续3秒收不到报告,表示通信中断
TTW=0;
km=0; kp=0;
link_error=1; power_on=1;
TX_buf[0]='Z'; TX_len=3;
RX_num=0; RX_len=3;
while(1)
{ if(TTW==0) { P3_7=1; P1_0=1; P1_1=1; }
if(TTW==1) P3_7=0;
if(TTW==2) P1_0=0;
if(TTW==3) P1_1=0;
}
}
四、MODEM通信线制作
单片机2051与MODEM之间的串口通信电缆只用RX、TX、GND三根线,其他的握手信号均没有使用,但在制作MODEM一端的接头时应要按下图制作:
- FPGA的DSP性能揭秘(06-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- 分时操作系统思想在单片机中的具体应用 (10-30)
- 基于AT89C51+DSP的双CPU伺服运动控制器的研究(05-26)
- 关于RTX51 TINY的分析与探讨(05-30)
- 基于MC9S12DGl28单片机的智能寻迹车设计(04-03)