#include <REG51.H>
#define uint unsigned int
#define uchar unsigned char
sbit DJ = P0^0;
sbit KEY1 = P0^1;
sbit KEY2 = P0^2;
sbit KEY3 = P0^3;
sbit KEY4 = P0^4;
void delayms(uint ms)//ms*1毫秒延时函数@11.0592MHz
{
uint msi,msj;
for(msi = 0;msi < ms;msi++)
for(msj = 0;msj < 112;msj++);
}
int jiaodu;
void main()
{
int keynum;
TMOD = 0x01; //设置定时器模式:定时器0,工作方式1,16位定时器
TL0 = 0x33; //设置定时初始值低8位:500us
TH0 = 0xFE; //设置定时初始值高8位
TR0 = 1; //启动定时器0
ET0 = 1; //定时器0中断允许
EA = 1; //中断总允许
jiaodu = 3; //上电复位到0度
while(1)
{
if(KEY1 == 0)//按键1
{
delayms(10);//去抖
if(KEY1 != 0)//松开按键后
{
jiaodu--;//减小高电平占空比,0.5ms每次,角度转动-45度
if(jiaodu < 1) jiaodu=1;//高电平不能小于0.5ms
}
}
if(KEY2 == 0)//按键2
{
delayms(10);//去抖
if(KEY2 != 0)//松开按键后
{
jiaodu++;//增加高电平占空比,0.5ms每次,角度转动+45度
if(jiaodu > 5) jiaodu = 5;//高电平不能大于2.5ms
}
}
if(KEY3 == 0)//按键3
{
delayms(10);//去抖
if(KEY3 != 0)//松开按键后
{
keynum++;//按键次数,用于判断奇偶次
if(keynum%2 == 1)jiaodu = 1;//奇数次,高电平0.5ms,角度转到-90度
if(keynum%2 == 0)jiaodu = 5;//偶数次,高电平2.5ms,角度转到90度
}
}
if(KEY4 == 0)//按键4
{
delayms(10);//去抖
if(KEY4 != 0)//松开按键后
{
jiaodu = 3;//高电平1.5ms,角度转到0度
}
}
}
}
void T0isr() interrupt 1//定时器0中断程序,中断号1,每0.5ms中断1次
{
uint count;
TL0 = 0x33; //设置定时初始值:500us
TH0 = 0xFE; //设置定时初始值
count++;//中断次数,即:多少个0.5ms
if(count <= jiaodu) DJ = 1;//高电平占空比由变量jiaodu控制,jiaodu=1时高电平0.5ms,jiaodu=5时高电平2.5ms
if(count > jiaodu && count <= 40) DJ = 0;//低电平占空比,jiaodu=1时低电平19.5ms,jiaodu=5时低电平17.5ms
if(count > 40) count = 0;//脉宽20ms
}