您现在的位置是:首页 >技术教程 >51单片机四路开关电路+限位开关网站首页技术教程
51单片机四路开关电路+限位开关
#include <reg51.h>
#include <intrins.h>
unsigned char tmp;
void send_char(unsigned char txd);
void delay(unsigned int k);
sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;
sbit key21 = P2^1; // 限位开关1 zgf
sbit key22 = P2^2; // 限位开关2 zgf
四路继电器分别在P10,P11,P12,P13口
限位开关接P21,P22口,另一头接GND
初始化
void uart_init(){
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1 IE = 0x0;// 禁止任何中断
ES = 1; //打开接收中断
EA = 1; //打开总中断
}
原先IE=0x0仅四路开关,禁止中断
主程序
main(){
uart_init();
P1 = 0xFF; //P1口8个口线全为1也就是高电平,P10 P11 P12 P13 P14 P15 P16 P17
while(1){
if(key21 == 0){ //zgf
delay(20); //延时20ms 消除抖动
if(key21 == 0){ //第二次判断
key3 = 1;
tmp = 3;
}else {
key3 = 0;
} //while(!key21); //当按键未松开时,key21为0,执行该死循环。
}
if(key22 == 0){ //zgf
delay(20); //延时20ms 消除抖动
if(key22 == 0){ //第二次判断
key4 = 1;
tmp = 'a';
}else {
key4 = 0;
}
//while(!key22); //当按键未松开时,key22为0,执行该死循环。
}
P0 = tmp; // 数据传送到P0口 zgf
send_char(tmp); // 回传接收到的数据 zgf
}
}
检测限位开关信息,发送到寄存器
void send_char(unsigned char txd){// 传送一个字符
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
void SendString(unsigned char String[]){
unsigned char *p = String;
while(*p){ //若指针指向的地址为空,则跳出循环
send_char(*p); //指针第一次默认指向首地址
delay(2); //延时,作用为提高发送准确度
p++;
}
}
延时消振
void delay(unsigned int k){ //zgf
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
中断函数
void Uart() interrupt 4 { //中断函数
//unsigned char strRx;
if(RI){ // 是否有数据到来
RI = 0;
tmp = SBUF; // 暂存接收到的数据
switch(tmp) {
case 0x01 : //P1 = P1 ^ (0x01<<0) ;0x01 00000001 //左移0位
if(key1==1){// P1 = 0x01,表示P1.7~P.1=0,P1.0=1
key1 = 0; //低电平继电器开启
}
break;
case 0x02 : //P1 = P1 ^ (0x01<<1) ;break;
if(key1==0){
key1 = 1;
}
break;
case 0x03 :
if(key2==1){
key2 = 0;
}
break;
case 0x04 :
if(key2==0){
key2 = 1;
}
break;
case 0x05 :
if(key3==1){
key3 = 0;
}
break;
case 0x06 :
if(key3==0){
key3 = 1;
}
break;
case 0x07 :
if(key4==1){
key4 = 0;
}
break;
case 0x08 :
if(key4==0){
key4 = 1;
}
break;
default:
break;
}
}
//strRx = SBUF; //取出接受到的数据
//RI=0; //清除接受中断标志位
//if(TI) {
// TI = 0;
// }
}