当前位置: 首页 > article >正文

51单片机开关电路+限位+舵机

#include <REGX52.H>
#include <intrins.h>

#define FREQ_OSC 11059200UL   // 单片机工作频率
#define PWM_FREQ 50           // PWM信号频率
#define PWM_RESOLUTION 100    // PWM信号分辨率

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
sbit SG_PWM = P2^3;    //信号控制引脚
unsigned char count = 0;//计次  赋初值为0
unsigned int PWM_count = 0;//0.5ms--0度,1.0ms--45度,1.5ms--90度,2.0ms--135度,2.5ms--180度

unsigned char KeyNum;//a
void Servo_Angle(float angle);

void Timer0_Init(){
    //EA = 0;   // 关闭总中断
    TMOD &= 0xF0;        //清除T0控制位
    TMOD |= 0x01;        //设置T0为工作方式1(16位定时器)
   //TH0 = (65536 - (FREQ_OSC / 12 / PWM_FREQ)) / 256;   // 计算并设置初始计数值高8位
   //TL0 = (65536 - (FREQ_OSC / 12 / PWM_FREQ)) % 256;   // 计算并设置初始计数值低8位
    TL0 = 0xD2;        //设置定时初始值0x33 0xD2;
    TH0 = 0xFF;        //设置定时初始值0xFE 0xFF;
    ET0 = 1;      //打开定时器0的中断
    TF0 = 0;            //清除溢出中断标志位
    TR0 = 1;            //定时器0开始计时
    EA = 1;          //开总中断
}

void Uart_Init(){   //9600bps@11.0592MHz  
    PCON |= 0x80;        //使能波特率加倍    
    SCON = 0x50;        //接收8位数据
    TMOD &= 0x0F;        //清除定时器1模式
    TMOD |= 0x20;        //设定定时器8为自动
    TL1 = 0xFA;            //设定初始值
    TH1 = 0xFA;            //设定初始值
    ET1 = 0;        
    TR1 = 1;
    EA = 1;
    ES =1 ;     
}

void delay(unsigned int k){ //zgf   
     unsigned int x,y;
     for(x=0;x<k;x++)
       for(y=0;y<2000;y++);
}

void send_char(unsigned char txd){// 传送一个字符
    SBUF = txd;
    while(!TI);                // 等特数据传送
    TI = 0;                    // 清除数据传送标志
}

void main(){
  Timer0_Init();
  Uart_Init();
  P1 = 0xFF;  //P1口8个口线全为1也就是高电平
  key3 = 0;
  ET0 = 0;

  while(1){      
            if(key21 == 0){ //zgf,限位开关闭合,连通
            delay(20); //延时20ms 消除抖动
            if(key21 == 0){ //第二次判断
              key3 = 0;
              tmp = 'a';
            }
          }
          if(key22 == 0){ //zgf 限位开关闭合,连通
            delay(20); //延时20ms 消除抖动
            if(key22 == 0){ //第二次判断
              key4 = 1;
               tmp = 'b';
            }
          }
        P0 = tmp;                // 数据传送到P0口 zgf
        send_char(tmp);            // 回传接收到的数据     zgf                        
   }
}

void Timer0() interrupt 1{      //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1
    TH0 = 0xFF;        //0.05ms  
    TL0 = 0xD2;
  count++;                    //计次,每500us  count+1
    //count%=40;                //周期为20ms
    count%=400;
    
  if(count<PWM_count){                                    
    SG_PWM = 1;
  }else{  
    SG_PWM = 0;
  }
}

void UART_Routine()  interrupt 4{    //串口中断服务函数
    if(RI){                        // 是否有数据到来        
            RI = 0;
            tmp = SBUF;                // 暂存接收到的数据
            
            switch(tmp)    {
                case 0x01 : //P1 = P1 ^ (0x01<<0) ;0x01 00000001  //左移0位
                  if(key1==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;            
                case 0x09 :
                  delay(20);
                  Servo_Angle(10); //PWM_count=1;
                  break;
                case 0x0a :
                  delay(20);
                  Servo_Angle(20);  //2;
                  break;
                case 0x0b :
                  delay(20);
                  Servo_Angle(30);  //3;
                  break;
                case 0x0c :
                  delay(20);
                  Servo_Angle(40);  //4 EA = 0;
                  break;
                case 0x0d :
                  delay(20);
                  Servo_Angle(50);  //PWM_count=5;
                  break;
                case 0x0e :
                  delay(20);
                  Servo_Angle(60);          
                  break;
                case 0x19 :
                  delay(20);
                  Servo_Angle(70);          
                  break;
                case 0x1a :
                  delay(20);
                  Servo_Angle(80);          
                  break;
                case 0x1b :
                  delay(20);
                  Servo_Angle(90);          
                  break;
                case 0x10 : //T0中断关
                  ET0 = 0;          
                  break;
                case 0x11 :
                  ET0 = 1;          
                  break;
                default:
                  delay(20);
                  Servo_Angle(0);
                  break;
            }            
    }
}

 void Servo_Angle(float angle){//a
    PWM_count = (angle + 48) * 0.167;
}
 


http://www.kler.cn/a/319135.html

相关文章:

  • Axure设计之文本编辑器制作教程
  • 大厂的 404 页面都长啥样?看看你都见过吗~~~
  • 【大数据测试HBase数据库 — 详细教程(含实例与监控调优)】
  • Vue 3 介绍及应用
  • 《DiffusionDet: Diffusion Model for Object Detection》ICCV2023
  • 推荐一款好用的postman替代工具2024
  • 【玉米田】
  • Springboot多种请求参数
  • Cloudera 安装不再难:下载安装全流程指南
  • 数据库基础01
  • 《使用 LangChain 进行大模型应用开发》学习笔记(四)
  • 【图论】最短路应用
  • 封面设计用什么软件最高效?分享5款新手必备工具
  • 数据报文解析
  • 【CSS】变量的声明与使用
  • 水电站/水库大坝安全监测系统完整解决方案
  • 抖音上下边框中间视频效果怎么做
  • 效率提升的秘密武器在快速编程领域的应用与探索
  • GPU架构原理与CUDA编程原理
  • 数据结构 ——— 常见的时间复杂度计算例题(中篇)
  • uniapp 中集成 axios 封装request,实现若依权限认证和若依 api方法共用
  • mysql学习教程,从入门到精通,SQL 联表查询(Join)(21)
  • Apache ZooKeeper 及 Curator 使用总结
  • 谷歌云推出全新区块链RPC服务:简化Web3开发
  • 设置VsCode搜索时排除文件,文件列表中隐藏文件
  • 5 php7.4中开发一个websocket 聊天 好友例表展示