#include
unsigned char count; //0.5ms次数标识
sbit pwm =P1^0 ; //PWM信号输出
sbit jia =P2^4; //角度增加按键检测IO口
sbit jian =P2^5; //角度减少按键检测IO口
unsigned char jd; //角度标识
sbit pwm1 =P0^0 ; //PWM信号输出给示波器,检测PWM波用
void delay(unsigned char i)//延时
{
unsigned char j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void Time0_Init() //定时器0初始化
{
//定时器0装初值 用示波器检测后,11.0592MHZ晶振 定时0.5ms进入中断 装初值如下
TH0 = (65536-445)/256;
TL0 = (65536-445)%256;
TMOD = 0x01; //定时器0工作在方式1
IE = 0x82; //IE=0x82=1000 0010 等价于 EA=1 开总中断 ET0=1 开定时器0中断
TR0=1; //开定时器0
}
void Time0_Int() interrupt 1 //中断程序
{
//重装初值
TH0 = (65536-445)/256;
TL0 = (65536-445)%256;
if(count< jd)
{
pwm=1; //确实小于,PWM输出高电平
pwm1=pwm; //接示波器用的io口,观测PWM波形用 } //判断0.5ms次数是否小于角度标识
//pwm=1; //确实小于,PWM输出高电平
else
{
pwm=0; //确实小于,PWM输出高电平
pwm1=pwm; //接示波器用的io口,观测PWM波形用 }
// pwm=0; //大于则输出低电平
count=(count+1); //0.5ms次数加1
count=count%40; //次数始终保持为40 即保持周期为20ms
}
//此注销掉部分为通过按键控制舵机转动的程序,功能为通过jia按键控制正转,
//通过jian按键控制反转
/*void keyscan() //按键扫描
{
if(jia==0) //角度增加按键是否按下
{
delay(10); //按下延时,消抖
if(jia==0) //确实按下
{
jd++; //角度标识加1
count=0; //按键按下 则20ms周期从新开始
if(jd==6)
jd=5; //已经是180度,则保持
while(jia==0); //等待按键放开
}
}
if(jian==0) //角度减小按键是否按下
{
delay(10);
if(jian==0)
{
jd--; //角度标识减1
count=0;
if(jd==0)
jd=1; //已经是0度,则保持
while(jan==0);
}
}
}*/
void main()
{
//上电,舵机自动正反转
//应注意每次步进是延时函数delay参数的设置,此处延时函数参数设置的并不理想
while(1)
{
for(jd=1;jd<6;jd++)
{
count=0;
Time0_Init();
delay(50000000);
}
delay(50000000);
for(jd=6;jd>0;jd--)
{
count=0;
Time0_Init();
delay(50000000);
}