要求
在单片机实训平台上,利用NE555产生方波信号并测量其频率,具体要求如下:
1.上电开机运行时,关闭蜂鸣器、继电器、8个LED指示灯。
2.用短路环将J13中的NAL与P34短接,NE555发生的信号输入到单片机的P34引脚。
3.单片机测量信号频率,并显示在数码管中,频率数据显示用6位数码管,单位是Hz,当显示长度不足6位时,未使用到的数码管熄灭,在最左边的1位数码管用“F”作为提示符。
显示格式如下:
NE555
NE555电路是一个信号发生电路,其信号输出接到单片机的P34引脚,即单片机的T0引脚。
该信号的频率大小可以通过Rb3可调电位器改变。
因为NE555芯片基本上就是一个纯硬件的设计,没有可编程的内容,因此,一点电路确定了,就没有变化了,单片机也不需要对它有任何的配置。所以,在整个单片机测量频率的过程中,跟NE555芯片一点儿关系都没有,实际上考查的是你应用定时/计数器测量信号频率的技术。
代码
要用到定时器0、1 + 数码管显示频率
引入”xmf_smg_ca.c\h“文件
定时器
/*============定时器0、1的设置===========*/
void Init_Timer()
{
//定时器0,用方式2,计数,8位重装模式
TH0 = 0xff;
TL0 = 0xff;
//定时器1,用方式1,定时,50ms
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
TMOD = 0x16; //定时器1用方式1,定时;定时器0用方式2,计数
ET0 = 1;
ET1 = 1;
EA = 1;
TR0 = 1;
TR1 = 1;
}
void Service_T0() interrupt 1
{
count_f++;
}
void Service_T1() interrupt 3
{
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
count_t++;
if(count_t == 20) //1s时间到了
{
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, SMGNoDot_CA[dat_f / 10000]);
DelaySMG(500);
if(dat_f > 999)
DisPlaySMG_Bit(4, SMGNoDot_CA[(dat_f / 1000) % 10]);
DelaySMG(500);
if(dat_f > 99)
DisPlaySMG_Bit(5, SMGNoDot_CA[(dat_f / 100) % 10]);
DelaySMG(500);
if(dat_f > 9)
DisPlaySMG_Bit(6, SMGNoDot_CA[(dat_f / 10) % 10]);
DelaySMG(500);
DisPlaySMG_Bit(7, SMGNoDot_CA[dat_f % 10]);
DelaySMG(500);
DisPlay_All(0xff);
}
完整代码
main
#include "reg52.h"
#include "absacc.h"
#include "xmf_smg_ca.h"
/*要求:
1.上电开机运行时,关闭蜂鸣器、继电器、8个LED指示灯
2.用短路环将J13中的NAL与P34短接,NE555发生的信号输入到单片机的P34引脚。
3.单片机测量信号频率,并显示在数码管中,频率数据显示用6位数码管,当显示长度不足6位时,未使用到的数码管熄灭,在最左边的1位数码管用“F”作为提示符。
*/
unsigned int count_f = 0; //计算频率
unsigned int dat_f = 0;
unsigned char 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, SMGNoDot_CA[dat_f / 10000]);
DelaySMG(500);
if(dat_f > 999)
DisPlaySMG_Bit(4, SMGNoDot_CA[(dat_f / 1000) % 10]);
DelaySMG(500);
if(dat_f > 99)
DisPlaySMG_Bit(5, SMGNoDot_CA[(dat_f / 100) % 10]);
DelaySMG(500);
if(dat_f > 9)
DisPlaySMG_Bit(6, SMGNoDot_CA[(dat_f / 10) % 10]);
DelaySMG(500);
DisPlaySMG_Bit(7, SMGNoDot_CA[dat_f % 10]);
DelaySMG(500);
DisPlay_All(0xff);
}
/*============定时器0、1的设置===========*/
void Init_Timer()
{
//定时器0,用方式2,计数,8位重装模式
TH0 = 0xff;
TL0 = 0xff;
//定时器1,用方式1,定时,50ms
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
TMOD = 0x16; //定时器1用方式1,定时;定时器0用方式2,计数
ET0 = 1;
ET1 = 1;
EA = 1;
TR0 = 1;
TR1 = 1;
}
void Service_T0() interrupt 1
{
count_f++;
}
void Service_T1() interrupt 3
{
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
count_t++;
if(count_t == 20) //1s时间到了
{
dat_f = count_f;
count_f = 0;
count_t = 0;
}
}
/*==================================*/
void main()
{
XBYTE[0x8000] = 0xff;
XBYTE[0xa000] = 0x00;
Init_Timer();
while(1)
{
DisplaySMG_F();
}
}
xmf_smg_ca.c
#include"absacc.h"
void DelaySMG(unsigned int t)
{
while(t--);
}
//数码管显示
void DisPlaySMG_Bit(unsigned char pos,unsigned char dat)
{
XBYTE[0xE000] = 0xff; //数码管关闭
XBYTE[0xC000] = 0x01 << pos; //数码管显示的位
XBYTE[0xE000] = dat;
}
//对所有数码管统一操作的函数
void DisPlay_All(unsigned char dat)
{
XBYTE[0xC000] = 0xff; //数码管显示的位
XBYTE[0xE000] = dat;
}
xmf_smg_ca.h
#ifndef XMF_SMG_CA_H
#define XMF_SMG_CA_H
code unsigned char SMGNoDot_CA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
code unsigned char SMGDot_CA[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
void DelaySMG(unsigned int t);
void DisPlaySMG_Bit(unsigned char pos,unsigned char dat);
void DisPlay_All(unsigned char dat);
#endif
总结
1.遇到555显示频率:定时器0、1 + 数码管显示函数
2.重点是数码管显示函数!