• 单片机-模拟舵机按键控制


    功能:按键控制模拟舵机角度

    目录结构:

    程序:

    main.c

    #include<reg52.h>    
    #include<intrins.h>    
    #include"delay.h"
    #define uchar unsigned char
    #define uint  unsigned int
    sbit KEY1 = P1^7;            //调速按键端口 
    sbit DC = P3^5;             //PWM输出端口 
    uchar CYCLE = 200;          //定义周期 
    uchar PWM;                  //定义低电平时间 
    void Time0Init(void)
    {
            TMOD = 0x02;        //设定定时器0工作在方式2模式
            TH0  = 0x00;        //定时时长为100微秒的初值自动重载
            TL0  = 0x9C;        //定时时长为100微秒的初值
            ET0 = 1;            //打开定时器0中断
            EA = 1;             //打开总中断
            TR0 = 1;            //启动定时器
    }
    void Time0Int(void) interrupt 1 
    {        
            static uchar Count;   //当前处于周期的什么时刻   
            TH0  = 0x00;          //定时时长为100微秒的初值自动重载 
            TL0  = 0x9C;
            if(Count >= PWM){
               DC = 1;              
            }else{
               DC= 0;
            } 
            Count++;
            if(Count == CYCLE){
                Count=0;
                if(PWM != 0){
                    DC = 0;     
                }
            }
    }
    void Key(void)
    {
        static uchar Number = 1;                 //定义档位,初始化为1档
        if(KEY1 == 0){
           delay_1ms(15);   //延时抗干扰信号   
           if(KEY1 == 0){
             Number++;            
             if(Number == 6){
                Number = 1;
             }
             switch(Number){
               case 1:
               {
                P0=0x06;        //数码管显示1        
                PWM=175;    //高电平2.5毫秒,舵机旋转到右极限(为+90度)
                break;        
               }
               case 2:
               {
                P0=0x5B;     //数码管显示2
                PWM=180;     //高电平2毫秒,舵机旋转角度为+45度
                break;
               }
               case 3:
               {
                P0=0x4F;     //数码管显示3
                PWM=185;     //高电平1.5毫秒,舵机旋转角度为0度
                break;
               }
               case 4:
               {
                P0=0x66;    //数码管显示4
                PWM=190;    //高电平1毫秒,舵机旋转角度为-45度
                break;
               }     
               case 5:
               {
                P0=0x6d;        //数码管显示5
                PWM=195;        //高电平0.5毫秒,舵机旋转角度为-90度
                break;
               }
             }
             //等待按键释放 
             while(1)    
             {
                if(KEY1 == 1)   
                {
                    break;
                }
             }
          }
        }
    }
    void Main(void)
    {
        Time0Init();        //定时器0
        while(1)
        {
           Key();        
        }
    }

    delay.c

    #include"delay.h"
    /*********************************
    功能:延时子程序,延时时间为 1ms,使用晶振是12M
    **********************************/
    void delay_1ms(unsigned char c)
    {
        unsigned char a,b;
        for(;c>0;c--)
            for(b=142;b>0;b--)
                for(a=2;a>0;a--);
    }

    delay.h

    #ifndef DELAY_H        
    #define DELAY_H
    /*********************************
    功能:延时子程序,延时时间为 1ms,使用晶振是12M
    **********************************/
    extern void delay_1ms(unsigned char c);
    #endif
  • 相关阅读:
    [SoapUI] 在执行某个TestSuite之前先执行login或者其他什么前置步骤
    [Groovy] How to check if element in groovy array/hash/collection/list?
    [Groovy] List和Map用法搜集
    [Groovy] 实战 Groovy, for each 剖析
    Groovy基本语法
    [BAT] xcopy拷贝远程服务器共享文件到本地
    [BAT] Access Denied in XCopy
    [BAT] 执行xcopy命令后出现Invalid num of parameters错误的解决办法
    [Automation] 自动化测试度量标准
    jsp页面直接编写csss
  • 原文地址:https://www.cnblogs.com/wangxuehao/p/8227801.html
Copyright © 2020-2023  润新知