基本原理:
低电平触发端:TRIG 高电平触发端:THR
两者的电压值小于参考电压时,即U。=1 放电管截止
两者的电压值大于参考电压时,即U。=1 放电管导通
蓝桥杯板子上是一个信号发生电路 通过继电器RB3来改变输入信号的频率
蓝桥杯555定时器的考核:测量它产生的一个频率:
测量原理: 将输出端与定时器T0的中断的引脚进行了短接,那么我们便可已利用来一个信号产生一次中断,那么测量1Hz,就是一秒钟产生了多少个信号,那么我可以用一个定时器来收集产生的信号,设置好初值,来一个信号我就进行一次中断,进行一次中断我就让一个变量进行累加,然后用另外一个定时器来产生一个一秒的数值,一秒产生完后记录下变量累加了多少次,就可以计算出出频率了
注意的小地方:
定时器0是8位自动重装载,不用赋初值,采用的是计数模式
定时器1是16位的装载模式,需要赋初值,然后就是换算数值的时候
采用的是多个并列的条件判断 例如一个5位数 首先/10000%10获得第五位 然后再除以1000%10获得第4,然后以此类推
#include <STC15F2K60S2.H>unsigned int date=0;
unsigned char count=0;
unsigned int date_p=0; code SMG_NoDot[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};void inint()
{ TMOD=0x16;TH0=0xff;TL0=0xff;TH1=(65535-50000+1)/256;TL1=(65535-50000+1)%256;EA=1;ET0=1;ET1=1;TR1=1;TR0=1;}
void service () interrupt 1
{date++;}void service1() interrupt 3
{TH1=(65535-50000+1)/256;TL1=(65535-50000+1)%256;count++;if(count==20){date_p=date;count=0;date=0;}}void smgdelay(unsigned int i)
{while(i--);}
void select138(unsigned char n)
{switch(n){case 4:P2=(0x1f&P2)|0x80;break;case 5:P2=(0x1f&P2)|0xa0;break;case 6:P2=(0x1f&P2)|0xc0;break;case 7:P2=(0x1f&P2)|0xe0;break;case 0:P2=(0x1f&P2)|0x00;break;}
}
void smgshow_bite(unsigned char date,unsigned char pos)
{ select138(6);P0=0x01<<pos;select138(7);P0=date;}
void smgshowall()
{ select138(6);P0=0xff;select138(7);P0=0xff;}
void smgshow()
{smgshow_bite(0x8e ,0);smgdelay(500);smgshow_bite(0xff ,1);smgdelay(500);smgshow_bite(0xff ,2);smgdelay(500);if(date_p>9999){smgshow_bite(SMG_NoDot[(date_p/10000)%10] ,3);smgdelay(500);}if(date_p>999){smgshow_bite(SMG_NoDot[(date_p/1000)%10] ,4);smgdelay(500);}if(date_p>99){smgshow_bite(SMG_NoDot[(date_p/100)%10] ,5);smgdelay(500);}if(date_p>9){smgshow_bite(SMG_NoDot[(date_p/10)%10] ,6);smgdelay(500);}if(date_p>0){smgshow_bite(SMG_NoDot[date_p%10] ,7);smgdelay(500);}smgshowall();
}void main()
{inint();while(1){smgshow();}}