C51语言检测脉冲个数,利用51单片机统计脉冲个数,即时输出显示
时间: 2023-08-16 19:07:32 浏览: 185
以下是利用C51语言编写的程序,可以实现检测脉冲个数并即时输出显示:
```C
#include <reg52.h>
#define FREQ_OSC 12000000UL // 定义晶振频率为12MHz
#define BAUD_RATE 9600 // 定义波特率为9600
sbit pulse_input = P3^2; // 脉冲输入端口
unsigned long pulse_count = 0; // 脉冲计数器
// 定时器0中断服务程序
void timer0_isr() interrupt 1
{
TH0 = (65536 - (FREQ_OSC/12/1000)); // 重新赋初值,实现1ms定时
TL0 = (65536 - (FREQ_OSC/12/1000));
pulse_count++; // 脉冲计数器加1
}
// 串口初始化函数
void uart_init()
{
TMOD = 0x20; // 定时器1工作在模式2,8位自动重载定时器
SCON = 0x50; // 串口工作在模式1,允许接收
TH1 = 256 - (FREQ_OSC/12/16/BAUD_RATE); // 设置波特率
TL1 = TH1;
TR1 = 1; // 启动定时器1
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1,16位定时器
TH0 = (65536 - (FREQ_OSC/12/1000)); // 设置初值,实现1ms定时
TL0 = (65536 - (FREQ_OSC/12/1000));
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许中断总开关
TR0 = 1; // 启动定时器0
uart_init(); // 串口初始化
while (1)
{
if (pulse_input == 1) // 检测到脉冲信号
{
pulse_count++; // 脉冲计数器加1
while (pulse_input == 1); // 等待脉冲结束
}
if (pulse_count % 10 == 0) // 每10个脉冲输出一次计数结果
{
SBUF = pulse_count/10; // 通过串口发送计数结果
while (!TI);
TI = 0;
}
}
}
```
该程序使用定时器0实现1ms的定时,并在定时器0的中断服务程序中实现脉冲计数器的加1操作。在主函数中,通过检测脉冲输入端口的状态来实现对脉冲信号的检测和计数,并且每当计数器达到10的倍数时,通过串口输出计数结果。需要注意的是,由于波特率的设置可能会受到各种因素的影响,因此在实际使用中需要根据实际情况进行微调。
阅读全文