单片机-模拟舵机按键控制
功能:按键控制模拟舵机角度
目录结构:
程序:
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