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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值