单片机c51编程,有很多延时语句,严重拖慢整个系统,怎么用中断的方式防止拖慢系统

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-29
单片机C51编程的延时问题(里面详细,欢迎高手)

好像要看转换成汇编会有几条语句吧,机器周期只能计算汇编,C语言没法直接计算啊,你运行,反汇编看看就知道了

C语言的延时时间,本来就不准。
8位的变量,16位的变量,操作的速度,本来就是不一样的。

判断%1秒的逻辑,程序编写的有些失误。
当每一位显示的时间拉长之后,下面的““等于一””的检测,就错过去了。
……
while(1)
{
if(count==1) //应该改为:count >= 1
{
……

不一定要用中断,可以用一些扫描语句代替延时。比如用独立按键控制流水灯状态,流水灯的延时会影响按键扫描使得按键不是很灵敏,每次都要按好长时间才有反应,因为按键只有不断扫描才能实时接收外界脉冲信号。但如果用按键扫描代替延时就不一样了

不要用过多的延时,可以在主函数中设定你在特定时间干的事,然后再在中断中的完成你特定的事,多用定时器

#define Pin0 0x01
#define Pin1 0x02
#define Pin2 0x04
#define Pin3 0x08
#define Pin4 0x10
#define Pin5 0x20
#define Pin6 0x40
#define Pin7 0x80

#define SIZE 3
code u8 P1_low[]={Pin0,Pin2,Pin4};
u16 jsflag=0;//计时标志,倒计时
u8 zt=0xff;//

void start(){//该任务的启动程序
zt=0;
P1=P1|0x1F;
P1=P1&~(P1_low[zt]);
jsflag=300;//从300ms秒开始倒计时
}

void lc(){
if((jsflag==0)&&(zt<SIZE)){//计时到0
switch(zt){
case 0:a1=P12;break;
case 1:a3=P11;break;
case 2:a5=P11;break;
}
zt++;
if(zt<SIZE){
P1=P1|0x1F;
P1=P1&~(P1_low[zt]);
jsflag=300;//重新计时300ms
}else {//一次循环结束

}
}
}



/****************************/
void timer0() interrupt 1//1ms定时器
{   
TH0=(65536-1000)/256;//重载初值
TL0=(65536-1000)%256;
if(jsflag>0){
jsflag--;
}

}


优化程序,或者上os

  • 单片机c51延时
    答:不是 参考代码:void delay_nus(unsigned int i) //延时:i>=12 ,i的最小延时单12 us { i=i/10;while(--i);} void delay_nms(unsigned int n) //延时n ms { n=n+1;while(--n)delay_nus(900); //延时 1ms,同时进行补偿 } ...
  • 求请C51单片机解释该延时函数。
    答:_nop_()大约延迟几个微秒,这里有四个。在乘以250个。那么这个for总共延迟大约几个毫秒,如果要计算具体的,可用编译的仿真。ms取值多少,就相当于有几个for。假如一个for延迟2ms,那么变量ms=2时,就延迟了4ms。
  • 单片机C51写一个延时50ms的函数例题
    答:适合89C52,11.0592M晶振‘void delayms(uint xms){ uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒 for(j=110;j>0;j--);}
  • c51单片机,如何延时?例如我要p2.0高电平5秒钟,怎么做?
    答:给你编制一个延时毫秒的子程序吧,供调用,参数n为几就延时几毫秒。11.0592MHz晶振 void delay(unsigned int n){ unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<110;j++);}
  • 请教c51单片机,c语言编程,关于控制LED灯闪烁频率?
    答:temp = 1000/freq/2; // 延时一半周期,确保闪烁频率正确 while(temp--);} } ```> 其中,通过TMOD、TH0和TL0寄存器设置定时器T0为13位模式,并且设置了计时初值,以启动定时器0。同时开放了定时器中断,并将定时器中断优先级设置为1(即高优先级)。在无限循环中,不断检测K1和K2按键状态,...
  • 关于KEILC51单片机延时问题
    答:执行空语句执行124次,大概就能延时到1秒.不是很准的.经验值。如要算的话:比如51,mdelay函数想延时1ms,而执行for(i=0;i<124;i++),假设4个机器周期,每个机器周期时长为[12*(1/晶振频率)秒],若晶振为6MHz时,每个机器周期为2us,这样124*4*2是992us,加上for(;Delay>0;Delay--)...
  • 求C51单片机延时程序…要求是用查询法的…且要用if语句的。
    答:根据你所说的延时方法,应该是用定时器中断里面设定标志位来产生延时的方法。比如你可以把定时器设定为每1ms进一次中断,在中断里面把一个标志位(如flag)置一 当你需要1ms延时的时候你可以先初始化定时器,然后查询标志位是否置一,置一则执行if后面的语句,即if(flag){};当你需要10ms延时时,你...
  • 关于KeilC51单片机延时的问题
    答:for(i=0;i<124;i++){;} 执行一次循环就一个指令吗?看代码的意思就是 for(i=0;i<124;i++){;} 可以延迟1ms,可以根据CPU的主频估计出需要循环的大概次数,再使用示波器测量波形(可以用一个空管脚拉高拉底)来调整循环的次数,使其精确于1ms ...
  • 单片机C51编程的延时问题(里面详细,欢迎高手)
    答:好像要看转换成汇编会有几条语句吧,机器周期只能计算汇编,C语言没法直接计算啊,你运行,反汇编看看就知道了
  • 单片机C51中 PWM程序中为什么要延时一段时间才可以
    答:那是因为你把定时器设置放在了while()循坏里面,如果不加长时间延时,你就会反复设置定时器。至于输出全部是高电平,那是因为GPIO默认为高电平。不信你可以在while之前让PWMOUT = 0;然后去掉延时,就会出现一直低电平。