基本原理:
低电平触发端: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();
}
}
|