不用定时器呼吸灯c语言程序,呼吸灯延时程序C语言单片机制作呼吸灯的C语言程序怎么写,不要用定时器,用延时程序...

2017-10-29 回答

你的这两个函数void delayms(uint)和void display(uchar,uchar,uchar,uchar)我可以肯定的告诉你,没有问题。你的这个程序其实就是想显示0000~5959之间的数,而且这个数是每20秒+1顺序递增的。之所以没有任何反应,那是你的主程序没有挂起,也就是在while(1)里没有没有大括号,程序执行一次就结束了,所以你什么都看不到。应该这样

while(1)

{//加入的成对大括号

for(thou=0;thou<=5;thou++) //千位

for(hun=0;hun<=9;hun++) //百位

for(ten=0;ten<=5;ten++) //十位

for(one=0;one<=9;one++) //个位

{

while(num!=20) //循环一秒

{

display(thou,hun,ten,one);//数码管显示四个数字

}

num=0;

}

}

这样你就可以看到程序运行的结果了,但结果是这样的:四个led显示管闪得很严重,计划是一亮一灭的,而且0000~5959这个数字几乎显示得不成样子。主要是delayms(5),这个延迟程序你应该尽量控制在20ms之内(主要是人眼残辉的时间极限),短了感觉就全亮,长了就一闪一灭。

不过我很看不惯你的这个程序,我给你一个cpu负担更小,而显示又非常好的程序供你参考:

#include<at89x52.h>

#define uint unsigned int

#define uchar unsigned char

sbit led4=p2^0; //数码管千分位

sbit led3=p2^1; //数码管百分位

sbit led2=p2^2; //数码管十分位

sbit led1=p2^3; //数码管个分位

uchar ms20,s1;//20毫秒和1s变量定义(声明)

//定时器t0初始化,10ms秒初值

void inittimer0(void)

{

tmod=0x01;

th0=0x0d8;

tl0=0x0f0;

ea=1;

et0=1;

tr0=1;

}

void display(uchar dat4,uchar dat3,uchar dat2,uchar dat1)

{

static uchar k;

p2=p2|0xf0;

switch(k++)

{

case 0:

p0=dat4;

led4=1;

break;

case 1:

p0=dat3;

led3=1;

break;

case 2:

p0=dat2;

led2=1;

break;

case 3:

p0=dat1;

led1=1;

break;

default:k=0;return;

}

}

void timer0(void) interrupt 1//1ms中断

{

th0=0x0d8;

tl0=0x0f0;

ms20++;

s1++;

}

void main(void)

{

uchar thou,hun,ten,one;

inittimer0();

while(1)

{

if(s1>=100)//每1秒钟one+1

{

s1=0;

if(one++>=9)

{

one=0;

if(ten++>=5)

{

ten=0;

if(hun++>=9)

{

hun=0;

if(thou++>=5) thou=0

}

}

}

}

if(ms20==2)//每20毫秒调用一次显示函数

{

display(thou,hun,ten,one);

ms20=0;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值