51单片机用定时器来做延迟,数码管仅仅显示0,不跳动
#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义//sbitLED=P1^3;//定义LED端口sbitwela=P1...
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
//sbit LED=P1^3;
//定义LED端口
sbit wela=P1^0;
sbit dula=P1^1;
unsigned char code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned int num,k;
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
/*void delay(unsigned int t)
{
unsigned int i,j;
for(i=t;t>0;t--)
for(j=110;j>0;j--);
}*/
void Init_Timer1(void)
{
TMOD |= 0x10; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH1=(65536-50000)/256; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL1=(65536-50000)%256;
EA=1; //总中断打开
ET1=1; //定时器中断打开
TR1=1; //定时器开关打开
}
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{ num=0;
k=0;
Init_Timer1();
wela=1;
P0=0xaa;
wela=0;
dula=1;
P0=0x3f;
dula=0;
while(1)
{
if(k==20)
{
num++;
k=0;
wela=1;
P0=0xaa;
wela=0;
dula=1;
P0=duan[num];
dula=0;
// delay(1000);
}
}
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
TH1=(65536-50000)/256; //重新赋值 2ms
TL1=(65536-50000)%256;
k++;
}
谁能帮我看看 ,咋回事
我没多少分了 但希望还是帮我看看哦
帮我看看哦 我去吃饭了 拜托了 展开
//sbit LED=P1^3;
//定义LED端口
sbit wela=P1^0;
sbit dula=P1^1;
unsigned char code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned int num,k;
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
/*void delay(unsigned int t)
{
unsigned int i,j;
for(i=t;t>0;t--)
for(j=110;j>0;j--);
}*/
void Init_Timer1(void)
{
TMOD |= 0x10; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH1=(65536-50000)/256; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL1=(65536-50000)%256;
EA=1; //总中断打开
ET1=1; //定时器中断打开
TR1=1; //定时器开关打开
}
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{ num=0;
k=0;
Init_Timer1();
wela=1;
P0=0xaa;
wela=0;
dula=1;
P0=0x3f;
dula=0;
while(1)
{
if(k==20)
{
num++;
k=0;
wela=1;
P0=0xaa;
wela=0;
dula=1;
P0=duan[num];
dula=0;
// delay(1000);
}
}
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
TH1=(65536-50000)/256; //重新赋值 2ms
TL1=(65536-50000)%256;
k++;
}
谁能帮我看看 ,咋回事
我没多少分了 但希望还是帮我看看哦
帮我看看哦 我去吃饭了 拜托了 展开
2个回答
展开全部
TF0最好每次进中断函数就清零。
显示部分只负责显示。感觉NUM累加,显示都放一起有点乱。
if(k==20)
{
num++;
k=0;这部分放到中断里好了,你怎么保证一定是k等于20时就能进行判断,万一是21呢?你用的是两位数码管吧?你这样扫描速度太快,可能看起来都显示8或则都没显示。。每个送了显示数据就要延时一段时间再关闭!!
大概看出这些。。。。。
追问
那个TF1在定时器的情况下,不用人为去清零。
对 这个提议好 谢谢咯
对
这倒没有,用8位数码管,选用四位显示。
谢谢回复,有时间可以再请教你哦
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询