以下程序可供参考
//用一个定时器定时100US产生PWM波
//周期200100us=20ms
//改变b的值可改变占空比 b=10对应高电平时间1ms
#include<STC12C5AH>
#define uchar unsigned char
#define uint unsigned int
sbit PWM=P2^0;
uchar a=200,b=15;//b=15对应舵机0度
void Delay1ms(uint i) //1ms延时程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void main()
{
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
ET0=1;
EA=1;
TR0=1;
P1M0=0X0F; //低4位推挽输出 控制两个电机正反转
P1M1=0X00;
P2M0=0X01; //最低位推挽输出 控制舵机
P2M1=0X00;
while(1)
{
P1=0;
b=15;Delay1ms(2000);//直行
b=10;Delay1ms(1000);//左转
b=15;Delay1ms(2000);//直行
b=20;Delay1ms(1000);//右转
b=15;Delay1ms(2000);//直行
P1=0x05;
b=15;Delay1ms(2000);//后退
b=10;Delay1ms(1000);//后左转
b=15;Delay1ms(2000);//后退
b=20;Delay1ms(1000);//后右转
b=15;Delay1ms(2000);//后退
}
}
void timer0()interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
a++;
if(a<=b) PWM=1;
else PWM=0;
if(a==200){a=0;PWM=1;}
}
根据你所说的延时方法,应该是用定时器中断里面设定标志位来产生延时的方法。
比如你可以把定时器设定为每1ms进一次中断,在中断里面把一个标志位(如flag)置一
当你需要1ms延时的时候你可以先初始化定时器,然后查询标志位是否置一,置一则执行if后面的语句,即if(flag){};
当你需要10ms延时时,你可以把flag设置为uchar,中断里面flag++;外面查询用if(10==flag){};
以此类推
很简单的
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
sbit fengmingqi=P0^0; //声明IO口
void delay(uint x)//延时子函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=50;j>0;j--);
}
void main(void)
{
while(1) //循环
{
fengmingqi=1; //p00口高电平,蜂鸣器发声
delay(500); //延时
fengmingqi=0; //p00口低电平,蜂鸣器不发声
delay(500); //延时
}
}
DEL1S:MOV R7,#10\x0d\D1: MOV R6,#200\x0d\D2: MOV R5,#250\x0d\ DJNZ R5,$\x0d\ DJNZ R6,D2\x0d\ DJNZ R7,D1\x0d\ RET\x0d\\x0d\说明:1、如果不使用R5、R6、R7可以用别的单元替换,比如换成30H、31H、32H等等\x0d\ 2、这个程序是12M时钟,如果时钟不同,要修改数值。如6M时钟,要把MOV R7,#10 修改成:MOV R7,#5
多简单的小程序呀:
time1ms:
mov
r6,
#2
time1:
;延时498us
mov
r7,
#248
djnz
r7,
$
;r7的为0时,程序向下运行,否则继续减
;
djnz
r6,
time1
;加上此命令后,每个小周期时间为500us
;运行两周为1ms,再加上最前面的mov
r6那条指令,就是1002ms
ret
此程序实现的是1002ms的定时,当然这当中不算主程序调用此延时程序时现场保护的时间,即压栈和出栈的时间
以上就是关于51单片机控制舵机左转90然后延时2秒再右转180,延时两秒回到中间,怎么做全部的内容,包括:51单片机控制舵机左转90然后延时2秒再右转180,延时两秒回到中间,怎么做、求C51单片机延时程序…要求是用查询法的…且要用if语句的。、51单片机,编写延时程序,控制蜂鸣器发声;等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)