蓝桥杯51单片机设计
·
#NE555方波发生器#
①认识NE555方波发生器
纯硬件设计,不需底层操控
计算一秒钟之内有多少个频率响应(计数器计数时溢出的个数)
在开发板上,时信号发生电器,通过滑动变阻器Rb3可以改变输出信号的频率不受程序控制

②注意点
1.用到NE555,跳线帽将J3的SIGNAL与P34短接,将NE555发生的信号输入到单片机P34引脚
2.NE555电路是信号发生电路,信号输入接到单片机P34引脚,即单片机T0引脚
3.该信号的频率大小可以通过Rb3可调电位器改变
③NE555频率测量方波原理
1.测量原理:计算一秒钟信号有多少个上升沿
eg.若一秒内只有一个上升沿,则周期为一秒,频率为1hz
同理:一秒内有x个上升沿,则周期为1/x秒,频率xhz
如何实现?
2.定时器中断不仅有定时功能,还有计数功能(功能二选一)
用俩个中断,一个计时(定时器1),一个计数(定时器0)
④NE555程序设计
1.原理设计
定时器0模式:计数器
C/T=1(计数)
GAME=0
M1M2选择八位自动重装模式10,TL0初值255(最大值为255),检测到一个上升沿,就会溢出标志位触发中断服务函数(八位自动归0),count++,自动将TH0值重新装入TL0(TH0初值位255)
定时器1模式:计时器
C/T=0(计时)
GAME=0
M1M2选择十六位自动重装模式,初值为50ms(有加减法)

2.题目要求
单片机测量信号频率,并显示在数码管中,频率数据显示用5位数码管,单位hz,当显示长度不足5位数,未使用到的数码管熄灭
若数字23456
个位:23456%10=6
十位:23456%100/10=5
百位:23456/100%10=4
千位:23456/1000%10=3
万位:23456/10000=2
3.程序编程
#include <reg52.h>
//初定义
sbit LSA=P2^5;
sbit LSB=P2^6;
sbit LSC=P2^7;
sfr AUXR=0x8e;//记住
//后定义
code unsigned int smg_num[]={0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 0x80 , 0x90 , 0x88 , 0x80 , 0xc6 , 0xc0 , 0x86 , 0x8e ,0xbf , 0x7f };
//unsigned int count1;//记录频率
unsigned int count2;//记录定时器中断服务函数1秒钟
unsigned int frequent ;//在数码管上显示频率
//hc573定义
void hc573(unsigned int channel)
{
switch(channel)
{
case 4:LSA=0;LSB=1;LSC=1;break;
case 5:LSA=1;LSB=0;LSC=1;break;
case 6:LSA=0;LSB=1;LSC=1;break;
case 7:LSA=1;LSB=1;LSC=1;break;
}
}
//初始化
void init_sys()
{
hc573(4);
P0=0XFF;
hc573(5);
P0=0X00;
}
//方法一
//定时器初始化
void init_timer()
{
TMOD=0X05;//TMOD=0X06;
TH0=0x00;//TH0=0xff
TL0=0x00;//定时器0为计数器//TL0=0xff
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;//定时器1为计时器
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
定时器0中断服务函数//定时器0为计数器
void timer0() interrupt 1
{
count1++;//上升沿记录
}
//定时器中断服务函数//定时器1为计时器
void timer1() interrupt 3
{
count2++;
if(count2==20)//计时1秒钟
{
//上升沿个数在数码管上显示出来
frequent=TL0+TH0*256;//frequent=count1 ;
//count1=0;
TL0=0x00;
TH0=0X00;
count2=0;
}
}
//延时函数
void delay_ms(unsigned int xms)
{
for( ;xms>0;xms--)
{
unsigned char data i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
//数码管显示与消隐
void smg(unsigned int pos,unsigned int num)
{
hc573(7);
P0=0Xff;
hc573(6);
P0= 0x01<<(pos-1);
hc573(7);
P0=smg_num[num];
delay_ms(1);
}
//数码管显示
void display()
{
if(frequent>9999)//五位数
smg(4,frequent/10000);
if(frequent>999)//四位数
smg(5,frequent/1000%10);
if(frequent >99)//三位数
smg(6,frequent/1000%10);
if(frequent>9)//俩位数
smg(7,frequent%100/10);
smg(8,frequent%10);
}
//主函数
void main()
{
init_sys();
init_timer();
while(1)
{
display();
}
}
3.1方法二编写
原理设计
TH0和TL0初始化为0x00,检测到一个上升沿就加一
void TimerInit()
{
TMOD=0x05;
TL0=0x00;
TH0=0x00;
TL1=(65536-50000)%256;
TH1=(65536-50000)/256;
EA=1;
ET0=ET1=1;
TR0=TR1=1;
}
void timer1() interrupt 3
{
count2++;
if(count2==20)
{
Fre=TL0+TH0*256;
TL0=0;
TH0=0;
count2=0;
}
}
更多推荐
所有评论(0)