51单片机定时器延时

我想让8个led轮流每隔1s点亮一个灯 同时 我希望8个数码管的0246位每隔2秒取变化一个数 下面是我的程序 麻烦帮忙看看问题在那
#include<reg52.h>
#include<intrins.H>
typedef unsigned char uchar ;
typedef unsigned int uint ;
uchar table[]={
0X3F,0X06,0X5B,0X4F,
0X66,0X6D,0X7D,0X07,0X7F,0X6F};//数码管花样
uchar temp;
uint num,i,num1;
void delay(uint z);
void main()
{
num=0;
i=0;
TMOD=0X01; //定时器0工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
temp=0xfe;
P1=temp; //LED初始化
while(1)
{
delay(1000); //延时1s
temp=_crol_(temp,1); //LED左移
P1=temp;

}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
P2=0;P0=table[i]; /*数码管0246位按显示花样 */
P2=2;P0=table[i]; /*数码管0246位按显示花样 */
P2=4;P0=table[i]; /*数码管0246位按显示花样 */
P2=6;P0=table[i]; /*数码管0246位按显示花样 */
if(num==40) //定时器的延时2s
{
i++;
num=0;
if(i==10)
i=0;
}
}

第1个回答  2013-11-26
我在开发板里运行了下,发现了几个问题。现象就是发光二极管正常工作,数码管只是显示P2=6的花样。这样问题就很明显了,程序本身没有问题啊,只是P2=0到P2=6,时间太短了,以12M晶振为例,每条指令4us,只是执行了32us,停留的时间太短导致肉眼是看不见的。至于P2=6为什么会显示,那是因为你主程序里延时了1S左右。
既然你能想到num==40,那为什么想不到num==20呢?在if前面再加个if(num==20),就是1S,然后把流水灯放到if里面就行了。这样延时函数都不需要了。
至于你要显示的是第0246位的数码管,你可以再定义一个num2=0,再num2++;
switch(num2)
{
case 1: P2=1;.....;break;
case 2: P2=2...
case 3: P2=4...
case 4: P2=6...num2=0;break
}

就是不知道50ms显示一次会不会闪烁。
第2个回答  2011-08-20
8个数码管的0246位每隔2秒取变化一个数...
-------------
这8个数码管,应该是动态显示吧?
是不是,同时显示出来8位?
还是仅仅显示一位,隔2秒钟,换下一位?本回答被提问者采纳
第3个回答  2011-08-19
P2=0;P0=table[i]; /*数码管0246位按显示花样 */
P2=2;P0=table[i]; /*数码管0246位按显示花样 */
P2=4;P0=table[i]; /*数码管0246位按显示花样 */
P2=6;P0=table[i]; /*数码管0246位按显示花样 */

这4个中间没有延时,就相当于只执行了最后一个
第4个回答  2011-08-19
你的编程很不合理,看得我费尽。你首先判断是不是1秒定时和2s的延时准确不,数码显示不能放在定时里显示,直接到wile循环里,要有一个循环扫描而且还得准确延时。
第5个回答  2011-08-19
你的灯在主程序while里只能执行一次啊,挪到头了就不会在亮了,你加个判断程序吧。数码管好像没什么问题。
相似回答