NE555定时器概述
在NE555内部,有3个5K的电阻分压,故称555定时器。
555定时器的基本原理:.
1.低电平触发端TRIG和高电平触发端THR: .
2.两者电压均小于各自的参考电压时,U_0=1, 放电管截至。
3.两者电压均大于各自的参考电压时,U_0=0, 放电管导通。
NE555是一个纯硬件的设计,一旦硬件电路确定了,其功能也确定了,没有可编程的部分。
在蓝桥杯的板子上,555定时器是一个信号发生电路,通过电位器Rb3可改变输出信号的频率。
二、测量NE555的信号频率
在CT107D单片机综合实训平台,上,利用NE555产生方波信号并测量其频率,具体功能要求如下:
1.上电开机运行时,关闭蜂鸣器、继电器和8个LED指示灯。
2.用短路环将J3中的NAL与P34短接,NE555发生的信号输入到单片机的P34引脚。
3.单片机测:量信号频率,并显示在数码管中,频率数据显示用5位数码管,单位是Hz,当显示长度不足5位时,未使用到的数码管熄灭,在最左边的1位数码管用“F"作为提示符。
三、设计思路
两个Timer
1.计数T0
2.定时T1(定时1秒)
四、一些参考
五、代码展示
#include <reg52.h> typedef unsigned int uint; typedef unsigned char uchar; uint count_f = 0; //计算频率 uint dat_f = 0; //缓存上一秒频率 uchar count_t = 0; //计算时间 uchar code SMG_duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x80,0xc6,0xc0,0x86,0x8e, 0xbf,0x7f};//分别是0-9(对应下标),A-F,“-”,“.” //配置HC138 void SelectHC138(uchar channel) { switch(channel) { case 4: //LED P2 = (P2 & 0X1F) | 0X80; break; case 5: //蜂鸣器和继电器 P2 = (P2 & 0X1F) | 0Xa0; break; case 6: //位码 P2 = (P2 & 0X1F) | 0Xc0; break; case 7: //段码 P2 = (P2 & 0X1F) | 0Xe0; break; case 0: //锁住所有寄存器 P2 = (P2 & 0X1F) | 0X00; break; } } void Initsys() { SelectHC138(5); P0 = 0X00;//关闭蜂鸣器和继电器 SelectHC138(4); P0 = 0XFF;//关闭LED } void Delay_SMG(uint t) { while(t--); } //在pos位码上,显示value段码 void DisplaySMG_Bit(uchar pos, uchar value) { SelectHC138(6); P0 = 0X01 << pos; SelectHC138(7); P0 = value; } void Init_Timer() { //定时器0用作计数,8位重装 TH0 = 0XFF; TL0 = 0XFF; //定时器1用作定时,定时时间50ms TH1 = (65535 - 50000 + 1) / 256; TL1 = (65535 - 50000 + 1) % 256; TMOD = 0X16;//0001 0110 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 Display_SMG_F() { DisplaySMG_Bit(0, SMG_duanma[15]); Delay_SMG(100); DisplaySMG_Bit(1, 0XFF); Delay_SMG(100); DisplaySMG_Bit(2, 0XFF); Delay_SMG(100); if(dat_f > 9999) { DisplaySMG_Bit(3, SMG_duanma[dat_f / 10000]); Delay_SMG(100); } if(dat_f > 999) { DisplaySMG_Bit(4, SMG_duanma[(dat_f / 1000) % 10]); Delay_SMG(100); } if(dat_f > 99) { DisplaySMG_Bit(5, SMG_duanma[(dat_f / 100) % 10]); Delay_SMG(100); } if(dat_f > 9) { DisplaySMG_Bit(6, SMG_duanma[(dat_f / 10) % 10]); Delay_SMG(100); } DisplaySMG_Bit(7, SMG_duanma[dat_f % 10]); Delay_SMG(100); SelectHC138(6); P0 = 0XFF; SelectHC138(7); P0 = 0XFF; } void main() { Initsys(); Init_Timer(); while(1) { Display_SMG_F(); } }