NE555是一种时钟芯片,输出一定频率的脉冲信号。就其模块特性,简单点来说,该模块会根据Rb3电位器的阻值,在SIG脚输出相应的频率的脉冲信号。
第十届竞赛中对该模块设置了考点,要求测量其脉冲信号的频率,测量周期小于1秒。
赛方要求将该模块的输出脚SIGNAL与P34,用一块与比赛无关的短接片接起来(如红外/超声波的)如下图。通过查阅芯片手册,可知P34也是T0计数器的管脚
单片机源程序如下:
#include<STC15F2K60S2.H>
typedef unsigned char u8;
typedef unsigned int u16;
u8 code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
u16 count_t=0,count_f=0,F_Hz=0;
void Smg_Display(u8 wei,u8 duan);
void Delayms(u16 ms);
void Timer0Init();
void Timer1Init();
void Init()
{
P2 = (P2 & 0X1f) | 0x80;//打开LED锁存
P0 = 0xff; //初始化
P2 = P2 & 0X1f; //恢复锁存,避免影响其他位
P2 = (P2 & 0X1f) | 0xa0;//打开蜂鸣器、继电器锁存
P0 = 0x00;
P2 = P2 & 0X1f;////恢复锁存,避免影响其他位
P2 = (P2 & 0X1f) | 0xc0;//打开位选锁存
P0 = 0x00;
P2 = P2 & 0X1f;//恢复锁存,避免影响其他位
P2 = (P2 & 0X1f) | 0xe0;//打开段选锁存
P0 = 0xff;
P2 = P2 & 0X1f;//恢复锁存,避免影响其他位
}
void main()
{
Init();
Timer0Init();
Timer1Init();
while(1)
{
Smg_Display(3,F_Hz/10000);
Smg_Display(4,F_Hz%10000/1000);
Smg_Display(5,F_Hz%1000/100);
Smg_Display(6,F_Hz%100/10);
Smg_Display(7,F_Hz%10);
}
}
void Smg_Display(u8 wei,u8 duan)
{
P2 = (P2 & 0X1f) | 0xe0;//消隐
P0=0XFF;
P2 = P2 & 0X1f;
P2 = (P2 & 0X1f) | 0xc0;//位选
P0 = 0x01<<wei;
P2 = P2 & 0X1f;
P2 = (P2 & 0X1f) | 0xe0;//段选
P0=smgduan[duan];
Delayms(1);//
P0=0XFF;
P2 = P2 & 0X1f;
}
void Delayms(u16 ms)
{
int i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j--);
}
void Timer0Init()
{
// AUXR &= 0x7F; //定时器时钟12T模式
TMOD|=0x06;//8位重装载计数模式2
TL0=0xff;
TH0=0xff;//1u中断一次进行计数
ET0=1;
TR0=1;
TF0 = 0; //清除TF0标志
EA=1;
}
void Timer1Init()
{
// AUXR &= 0xBF; //定时器时钟12T模式
TMOD|=0X10;// 16位
TL1=(65536-50000)%256;//给定时器赋初值,定时50ms
TH1=(65536-50000)/256;
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //打开定时器1中断
EA=1;
}
void Timer0() interrupt 1
{
count_f++;//累计NE555输出信号个数
}
void Timer1() interrupt 3
{
TL1=(65536-50000)%256;//给定时器赋初值,定时50ms
TH1=(65536-50000)/256;
count_t++;
if(count_t==20)//每1秒刷新一次频率数据
{
//关闭定时器,取出T0里面的值,再打开进行计数
ET0=0;
TR0=0;
TR1=0;
F_Hz=count_f;//
TR0=1;
TR1=1;
ET0=1;
count_f=0;
count_t=0;
}
}
全部资料51hei下载地址:
NE555.zip
(24.64 KB, 下载次数: 34)
|