使用的是蓝桥杯单片机CT107D实训平台:
555定时器内部,有3个5K的电阻分压。
NE555是一个纯硬件的设计,一旦电路确定了,其功能也就定了。
在蓝桥杯的板子上,555定时器是一个信号发生电路,通过定位器Rb3可改变输出信号的频率。
频率就是信号1s产生的信号或者周期。
1HZ就是1s有一个信号(脉冲)
P34引脚计算外部脉冲的个数,但是有时间要求,1s之内。
我们需要两个定时器,一个用来计数,一个用来定时。
定时器最多能计时间65.355ms 所以需要先50ms 然后✖20就是1s。
计数我们可以选择8位自动重装计数,只要来一个脉冲,他就溢出,溢出就会来到中断函数。
按照上述思路,首先,我们需要三个变量,一个变量count_f用来计数,一个count_t用来作为计时,一个dat_f用来最后显示到数码管上的数。
其次,我们初始化定时器:
void init_Timer()
{
TH0=0xff;
TL0=0xff;
TH1=(65535-50000+1)/256;
TL1=(65535-50000+1)%256;
TMOD=0x16;
ET0=1;
ET1=1;
EA=1;
TR0=1;
TR1=1;
}
定时器0用来计数,定时器1用来计时。
中断服务函数就是这些。
void Service_T0() interrupt 1
{
count_f++;
}
void Service_T1() interrupt 3
{
TH1=(65535-50000+1)/256;
TL1=(65535-50000+1)%256;
count_t++;
if(count_t==20)
{
dat_f=count_f;
count_f=0;
count_t=0;
}
}
大体思路就是上述这些,下面是这些完整代码
首先SMG.h
#ifndef __SMG_H #define __SMG_H #include "reg52.h" void DelaySMG(unsigned char t); void DisPlaySMG_Bit(unsigned char pos,unsigned char dat); void DisPlay_All(unsigned char dat); #endif
SMG.c
#include "SMG.h" #include "reg52.h" void DelaySMG(unsigned char t) { while(t--); } void DisPlaySMG_Bit(unsigned char pos,unsigned char dat) { P0=0xff; P2=P2&0x1f|0xe0; P2=P2&0x1f; P0=0x01<<pos; P2=P2&0x1f|0xc0; P2=P2&0x1f; P0=dat; P2=P2&0x1f|0xe0; P2=P2&0x1f; } void DisPlay_All(unsigned char dat) { P0=0xff; P2=P2&0x1f|0xc0; P2=P2&0x1f; P0=dat; P2=P2&0x1f|0xe0; P2=P2&0x1f; }
最后是主函数:
#include "reg52.h" #include "SMG.h" unsigned char code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x80, 0xc6,0xc0,0x86,0x8e, 0xbf,0x7f}; unsigned int count_f=0; unsigned int dat_f=0; unsigned char count_t=0; void init_Timer() { TH0=0xff; TL0=0xff; TH1=(65535-50000+1)/256; TL1=(65535-50000+1)%256; TMOD=0x16; ET0=1; ET1=1; EA=1; TR0=1; TR1=1; } void Service_T0() interrupt 1 { count_f++; } void Service_T1() interrupt 3 { TH1=(65535-50000+1)/256; TL1=(65535-50000+1)%256; count_t++; if(count_t==20) { dat_f=count_f; count_f=0; count_t=0; } } void DisPlaySMG_F() { DisPlaySMG_Bit(0,0x8e); DelaySMG(100); DisPlaySMG_Bit(1,0xff); DelaySMG(100); DisPlaySMG_Bit(2,0xff); DelaySMG(100); if(dat_f>9999) { DisPlaySMG_Bit(3,SMG_duanma[dat_f/10000]); DelaySMG(100); } if(dat_f>999) { DisPlaySMG_Bit(4,SMG_duanma[(dat_f/1000)%10]); DelaySMG(100); } if(dat_f>99) { DisPlaySMG_Bit(5,SMG_duanma[(dat_f/100)%10]); DelaySMG(100); } if(dat_f>9) { DisPlaySMG_Bit(6,SMG_duanma[(dat_f/10)%10]); DelaySMG(100); } DisPlaySMG_Bit(7,SMG_duanma[dat_f%10]); DelaySMG(100); DisPlay_All(0xff); } void init() { P0=0xff; P2=P2&0x1f|0x80; P2=P2&0x1f; P0=0; P2=P2&0x1f|0xa0; P2=P2&0x1f; } void main() { init_Timer(); init(); while(1) { DisPlaySMG_F(); } }
记得要将J3上SIGNAL与P34连接上。