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

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

目录结构:

 

程序:

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

 

posted on 2018-01-09 18:15  王雪皓  阅读(1508)  评论(0编辑  收藏  举报