初学者为什么不能用T0中断切换LED点灯数呢!(问题解决)
初学者疑问,为什么不能用T0中断切换LED点灯数呢!
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar T0_namber;
uint num;
uchar code namber[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void init(void);
//--------------
void main()
{
init();
while(1)
{
P0=namber[num];
}
}
///////////////////
void init(void)
{
TMOD=0x01;
TH0=(65536-15536)/256;
TL0=(65536-15536)%256;
EA=1;
ET0=1;
TR0=1;
}
////////////////////
void T0_time()interrupt 1
{
TH0=(65536-15536)/256;
TL0=(65536-15536)%256;
T0_namber++;
if(T0_namber==50)
{
T0_namber=0;
num++;
}
}
在编译上是没有问题的,但是实际没有效果!
num不清0可以吗?你的段码早就找不到啦
应该有初值0,然后大于9时清0
需要隔1小时后才能回复,慢了点
我是单步运行仿真的,按理说前9步亮灯没问题,但实际不行!
终于通过认证了!不受限于是1小时发回贴
仿真进去的时候num是等于0吗?你可确定
num要设置范围 否则程序运行会出错
按上面的提示做了些修改,但是还不行!各位再看一下,谢了!
#include<reg51.h>#define uchar unsigned char
#define uint unsigned int
uchar code dx516[3] _at_ 0x003b;//仿真语句
sbit led=P0^0;
uchar T0_number,num;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void init();
//--------------
void main()
{
init();
while(1)
{
if(num==9)
{
num=0;
}
P0=table[num];
}
}
///////////////////
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
T0_number=0;//初始0
num=0;//初始0
}
////////////////////
void T0_time()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
T0_number++;
if(T0_number==20)
{
T0_number=0;
num++;
led=~led;//1S闪烁
}
}
运行的结果是卡在P0=0X3f这个状态,LED灯高2位长亮!
刚在keil 51软件上仿真,是可以运行的,是不是用89C516硬件仿真出问题了,写一片IC试一下!
烧写OK了,试了一下,程序达到要求了,看来是硬件仿真出的问题!
呵呵 同时新手 学习了
好!
