使用方法
触发引脚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