标题: 为什么主函数里的循环是空的 [打印本页]
作者: 蓝琪 时间: 2018-10-19 21:28
标题: 为什么主函数里的循环是空的
在网上看到的一个PWM控制双舵机的程序,为什么主函数里的循环是空的?程序是对的吗?求解
sbit SEV_PWM = P0^0; //上下舵机信号位
sbit SEH_PWM = P0^1; //左右舵机信号位
unsigned char count = 0;
unsigned char SEV_count = 15;
unsigned char SEH_count = 15;
/* 串口初始化、定时器T0、T1初始化 */
void Com_Init()
{
IP = 0x08;
PCON &= 0x7F;
TMOD &= 0x00;
TMOD |= 0x21; //定时器0设置为16为定时器方式1,定时器1配置波特率为自动重载方式2
SCON= 0x50; //串口工作在方式1,8位异步通信
TH1 = 0xfd; //定时器1设置为在11.0592下波特率为9600
TL1 = 0xfd;
ES = 1; //打开串口中断
ET1 = 0; //关闭定时器1中断
TR1 = 1; //打开定时器1
TH0 = 0xff; //配置定时器0初值,溢出时间为0.1ms
TL0 = 0xa4;
ET0 = 1; //打开定时器0中断
TR0 = 1; //开启定时器0
}
/* 定时器0中断服务程序 */
void Time0_Int() interrupt 1
{
TR0 = 0; //关闭定时器0
TH0 = 0xff; //重装初值0.1ms
TL0 = 0xa4;
//舵机1
if(count <= SEH_count) //控制占空比左右
{
//如果count的计数小于(5-25)也就是0.5ms-2.5ms则这段小t周期持续高电平。产生方波
SEH_PWM = 1;
}
else
{
SEH_PWM = 0;
}
//舵机2
if(count <= SEV_count) //控制占空比上下
{
SEV_PWM = 1;
}
else
{
SEV_PWM = 0;
}
count++;
if (count >= 200) //T = 20ms则定时器计数变量清0
{
count = 0;
}
TR0 = 1; //开启定时器0
}
void main()
{
Com_Init();
while(1)
{
;
}
}
/* 串口中断函数 */
void uart_ser() interrupt 4
{
if (RI == 0)
{
return;
}
ES = 0;
RI = 0;
command = SBUF; //将接收到的数据传给command
switch(command)
{
case 'f': //舵机向上转
{
SEV_count++;
if(SEV_count >= 25)
{
SEV_count = 25;
}
count = 0; //占空比参数t改变,让定时器重新计数
break;
}
case 'g':
{
SEV_count--;
if(SEV_count <= 5)
{
SEV_count = 5;
}
count = 0;
break;
}
case 'h':
{
SEH_count++;
if(SEH_count >= 25)
{
SEH_count = 25; //保持角度180度。
}
count = 0;
break;
}
case 'i':
{
SEH_count--;
if(SEH_count <= 5) //保持角度0度
{
SEH_count = 5;
}
count = 0;
break;
}
case 'k': //舵机复位
{
SEH_count = 15;
SEV_count = 15;
count = 0;
break;
}
default:
{
break;
}
}
ES = 1; //打开串口
}
作者: sxhwdz 时间: 2018-10-20 08:56
因为主函数只有一个任务就是初始化定时器,完成初始化以后,就把所有的任务派发给定时器中断了,只需悠闲的打空转消磨时间,而定时器中断则会忠诚地按时完成各自的任务。
作者: 虚幻大千 时间: 2018-10-21 16:50
他是起一个控制作用的
作者: 蓝琪 时间: 2018-10-23 10:51
了解,谢谢了
作者: reiquet 时间: 2018-10-24 13:17
初始化
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |