使用时要短接
但是以上的关闭蜂鸣器和数码管只能在mm模式,存储器地址模式,我们一般用的事io模式,所以并不适用,关闭蜂鸣器的话,可以在上电时打开register_r(5),然后把p0口赋值0x00.
这里的TMOD要设为0x16,具体为什么看上图
T0用做计数器,也就是频率计数,要设为8位自动重装模式,TH0和TL0要设为0xff,来一个频率就进入中断,实现频率计数
T1用作计时器,也就没有什么特别的
中断函数具体代码如下,要看
void Timer0_service() interrupt 1 //频率计数
{
T0_frequency++;
}
void Timer1_service() interrupt 3 //计时
{
TL1 = 0x66;
TH1 = 0xFC;
T1_count++;
if(T1_count>=1000)
{
T1_count=0;
temp=T0_frequency;
T0_frequency=0;
}
}
在处理555定时器的数码管部分时,使用延时消影时,把握不好时间,但是消影应该20ms就够了,
下面为全部代码,
#include <REGX52.H>
#include "nixietube.h"
#include "absacc.h"
#include "delay.h"
unsigned long T0_frequency;
unsigned int T1_count;
unsigned long temp;
//首先要初始化两个定时器T0计数,T1计时
void timer_Init()
{
//T0计数 八位自动重装
TH0=0xff;
TL0=0xff;
//T1计时
TL1 = 0x66;
TH1 = 0xFC;
TMOD=0x16;
//SCON 中断有关寄存器
ET0=1;
ET1=1;
EA=1;
TR0=1;
TR1=1;
}
void main()
{
timer_Init();
while(1)
{
if(temp>9999)
{
nixietube(4,temp/10000);
}
if(temp>999)
{
nixietube(5,(temp/1000)%10);
}
if(temp>99)
{
nixietube(6,(temp/100)%10);
}
if(temp>9)
{
nixietube(7,(temp/10)%10);
}
nixietube(8,temp%10);
}
}
void Timer0_service() interrupt 1 //频率计数
{
T0_frequency++;
}
void Timer1_service() interrupt 3 //计时
{
TL1 = 0x66;
TH1 = 0xFC;
T1_count++;
if(T1_count>=1000)
{
T1_count=0;
temp=T0_frequency;
T0_frequency=0;
}
}