STC15F2K60S2(NE555)

使用方法

触发引脚2接收到触发信号后,输出引脚3改变状态

输出状态保持,直到电容通过电阻放电到特定电压

电容放电完成后,输出恢复原始状态

代码

#include <STC15F2K60S2.H>

unsigned int count_f = 0;		// 测得频率
unsigned int last_count_f = 0;	// 频率传递
unsigned char i = 0;			// 计数值
 
 
// 不加 “code” 会影响单片机运行速度,会改变RAM,加了 code 之后內容就固定不变了,不会占用RAM
unsigned char code SMG_Duanma[19] = 
{
	0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
	0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f,0x00
};	// 0~F - . 全部
 
// 带点显示的
unsigned char code SMG_Dian[10] = 
{
	0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10
};	// 0.~9.
 
 
// 通道选择函数,用于选择HC138译码器的通道
void HC138_Init( unsigned char channel )
{
	switch( channel )
	{
		case 0:
			P2 = (P2 & 0x1f) | 0x00;	// 0
		break;
		case 4:
			P2 = (P2 & 0x1f) | 0x80;	// Y4C
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;	// Y5C
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;	// Y6C
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;	// Y7C
		break;
	}
}
 void Delay_tms( unsigned int t )
{
	int i;
	while( t-- )
	{
		for( i=115 ; i>0 ; i-- )
		{}
	}
}
 
// 初始化系统
void System_Init(void)
{
    // 关闭LED灯
	HC138_Init( 4 );
	P0 = 0xff;
 
    // 关闭蜂鸣器和继电器
	HC138_Init( 5 );
	P0 = 0xaf;		    // 1010 1111
	
    // 关闭通道选择
	HC138_Init( 0 );
}
 
 
// 定时器初始化,初始化定时器,设置定时器0为计数模式,定时器1为定时模式
void Timer_Init(void)
{
	TMOD = 0x16;	// 0001 0110
	ET0 = 1;
	ET1 = 1;
	EA = 1;
	TR0 = 1;
	TR1 = 1;
	
	// 定时器0用作计数,8位自动重装载,只要随机外来一个脉冲信号就溢出
	TH0 = 0xff;
	TL0 = 0xff;
	
	// 定时器1用作定时
	TH1 = ( 65535 - 50000 ) / 256;
	TL1 = ( 65535 - 50000 ) % 256;
}
 
 
// 定时器0中断函数,定时器0和定时器1的中断服务程序,用于测量频率
void Timer0() interrupt 1
{
	count_f++;
}
 
 
// 定时器1中断函数,定时器0和定时器1的中断服务程序,用于测量频率
void Timer1() interrupt 3
{
	TH1 = ( 65535 - 50000 ) / 256;
	TL1 = ( 65535 - 50000 ) % 256;
	i++;
	if( i == 20 )	// 1s时间到
	{
		i = 0;					// 计数清零
		last_count_f = count_f;	// 取出频率
		count_f = 0;			// 下一秒频率又重新测,即清零
	}
}
 
// 数码管显示
void SMG_Light( unsigned char pos , unsigned char dat )
{
	HC138_Init( 6 );
	P0 = 0x01 << pos;
	HC138_Init( 7 );
	P0 = dat;
}
 
// 数码管动态显示
void SMG_Show(void)
{
	SMG_Light( 0 , SMG_Duanma[ 15 ] );	// F
	Delay_tms( 10 );
	SMG_Light( 1 , 0xff );
	Delay_tms( 10 );
	SMG_Light( 2 , 0xff );
	Delay_tms( 10 );
 
	if( last_count_f > 9999 )	// 最高五位数,到了几位就亮几位
	{
		SMG_Light( 3 , SMG_Duanma[ last_count_f / 10000 ] );
		Delay_tms( 10 );
	}
	if( last_count_f > 999 )
	{
		SMG_Light( 4 , SMG_Duanma[ ( last_count_f / 1000 ) % 10 ] );
		Delay_tms( 10 );
	}
	if( last_count_f > 99 )
	{
		SMG_Light( 5 , SMG_Duanma[ ( last_count_f / 100 ) % 10 ] );
		Delay_tms( 10 );
	}
	if( last_count_f > 9 )
	{
		SMG_Light( 6 , SMG_Duanma[ ( last_count_f / 10 ) % 10 ] );
		Delay_tms( 10 );
	}
	if( last_count_f > 0 )
	{
		SMG_Light( 7 , SMG_Duanma[ last_count_f % 10 ] );
		Delay_tms( 10 );
	}
}
 
int main(void)
{
	System_Init();
	Timer_Init();
	while(1)
	{
		SMG_Show();
	}
}

注意事项

        检查引脚是否插上

操作视频

https://www.bilibili.com/video/BV1ksXpYzEqp?vd_source=b10b3445cdc8080c1d316e6f9a6245a0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值