蓝桥杯NE555模块编程

一、原理图:

                

 

         RB3:滑动变阻器 

        THR:高电平出发端

        TRIG:低电平触发端

        OUT:频率输出口

        其中两者电压均小于各自的参考电压时放电管截至,两者电压均大于各自的参考电压时放电管导通,NE555是纯硬件的设计,当硬件电路确定了,其中的功能也相应确定,不能对其进行编程。

二、设计流程

1. 将蓝桥杯板子的J3中SIGNAL与P34短接。

2.配置定时器0和定时器1(定时器0为计数功能8位自动重装,定时器1为定时功能16位自动重装)

3.设计数码管显示部分(显示的数值位数不固定,但未用到的位熄灭)

三、设计原理

1.将SIGNAL与P34短接是因为T0的外部输入引脚,可用来做计数功能,T1的时钟输出,因此用T0作为NE555的计数器,T1作为的定时功能,根据规定设计定时时间,在T1中将前一秒的数据赋值给显示函数的缓冲区中来显示。

2.显示函数,用定时器1来刷新每一位的,将显示缓冲区的数据显示到数码管中,其中也将数据缓冲区的数据刷新。

四、代码部分

#include <STC15F2K60S2.H>
typedef unsigned char uint8_t;
typedef unsigned int  uint16_t;
/*变量定义*/
uint16_t count_new_f =123;		//当前1s内的频率
uint16_t count_before_f;	//上一个1s的频率
uint8_t count_t;			//定时1s
uint8_t trigger;			//数码管位切换函数
unsigned char code Nixie[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0xff,0x8e};
uint8_t NixieBuf[8] = {11,10,10,10,10,10,10,10};

/*函数声明*/
void TimerInit(void);
void showNixie();
void RefreshBuf();
/*main函数*/
void main()
{
	TimerInit();
	while(1)
	{
		
	}
}

/*函数定义*/
/** 
*File Name: 定时器初始化,定时器0:用作555计数,定时器1:用作555定时功能
*ARguments: 无
*  Reaturn: 无
*   Author: 
*     Date: 
*/
void TimerInit(void)
{
	TMOD &= 0x00;				//将定时器0和定时器1清零 0000 0110
	TMOD |= 0x06;				//配置定时器1为16位自动重装,定时器0为8位自动重装,定时功能,计数功能
	TH1 = (65535 - 5000)/256;	//写入定时器1初值,5ms溢出
	TL1 = (65535 - 5000)%256;
	TH0 = 0xff;					//写入定时器0初值,一个脉冲触发触发中断
	TL0 = 0xff;
	ET1 = 1;					//使能中断
	ET0 = 1;
	TR1 = 1;					//打开定时器
	TR0 = 1;
	EA = 1;						//打开总中断
}
/** 
*File Name: 定时器0服务函数,计算555的脉冲信号
*ARguments: 无
*  Reaturn: 无
*   Author: 
*     Date: 
*/
void Timer0Service() interrupt 1
{
	count_new_f++; 
	
}
/** 
*File Name: 定时器1服务函数,为555定时
*ARguments: 无
*  Reaturn: 无
*   Author: 
*     Date: 
*/
void Timer1Service() interrupt 3
{
	count_t++;
	if(count_t >= 200)
	{
		count_t = 0;
		count_before_f = count_new_f;
		count_new_f = 0;
		RefreshBuf();
		
	}
	showNixie();

}
/** 
*File Name: 数码管显示函数
*ARguments: 无
*  Reaturn: 无
*   Author: 
*     Date: 
*/
void showNixie()
{
	P2 = P2 & 0x1f | 0xe0;
	P0 = 0xff;
	P2 = P2 & 0x1f | 0xc0;
	P0 = 1<<trigger;
	P2 = P2 & 0x1f | 0xe0;
	P0 = Nixie[NixieBuf[trigger]];
	if(++trigger >= 8) trigger = 0;
}

/** 
*File Name: 数码管缓冲区刷新函数,并且最大显示位5位,最小显示位0位,为到达的数码管自动关闭
*ARguments: 无
*  Reaturn: 无
*   Author: 
*     Date: 
*/

void RefreshBuf()
{
	if(count_before_f > 9999)
		NixieBuf[3] = count_before_f / 10000;
	else
		NixieBuf[3] = 10;
	if(count_before_f > 999)
		NixieBuf[4] = (count_before_f % 10000)/1000;
	else
		NixieBuf[4] = 10;
	if(count_before_f > 99)
		NixieBuf[5] = (count_before_f % 1000)/100;
	else
		NixieBuf[5] = 10;
	if(count_before_f > 9)
		NixieBuf[6] = (count_before_f % 100)/10;
	else
		NixieBuf[6] = 10;
	if(count_before_f > 0)
		NixieBuf[7] = (count_before_f % 10);
	else
		NixieBuf[7] = 10;
}



















 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值