STC15F104W单片机测量外部脉冲输入PWM高电平时间代码
时间: 2024-05-04 22:18:11 浏览: 91
以下是STC15F104W单片机测量外部脉冲输入PWM高电平时间的代码:
```c
#include <reg52.h>
#define FOSC 11059200L
#define BAUD 9600
unsigned char Timer0_Reload = 0;
unsigned char Timer1_Reload = 0;
unsigned char Counter = 0;
unsigned int H_Time = 0;
bit Flag = 0;
void Timer0_Init(void); // 定时器0初始化函数
void Timer1_Init(void); // 定时器1初始化函数
void UART_Init(void); // 串口初始化函数
void main()
{
EA = 1; // 开启总中断
Timer0_Init(); // 定时器0初始化
Timer1_Init(); // 定时器1初始化
UART_Init(); // 串口初始化
while (1)
{
if (Flag) // 如果高电平时间已经测量完成
{
Flag = 0;
H_Time = TH1 * 256 + TL1; // 计算高电平时间
printf("High level time: %dus\r\n", H_Time); // 打印高电平时间
TH1 = 0; // 定时器1计数值清零
TL1 = 0; // 定时器1计数值清零
}
}
}
void Timer0_Init(void)
{
TMOD &= 0xF0; // 清除定时器0模式位
TMOD |= 0x01; // 定时器0为模式1,13位定时器
TH0 = (65536 - FOSC / 1000 / 12); // 定时器0初值,1ms
TL0 = (65536 - FOSC / 1000 / 12); // 定时器0初值,1ms
ET0 = 1; // 定时器0中断允许
TR0 = 1; // 定时器0启动
}
void Timer1_Init(void)
{
TMOD &= 0x0F; // 清除定时器1模式位
TMOD |= 0x10; // 定时器1为模式1,16位定时器
TH1 = 0; // 定时器1初值
TL1 = 0; // 定时器1初值
ET1 = 1; // 定时器1中断允许
}
void UART_Init(void)
{
SCON = 0x50; // 串口工作方式1,允许接收
TMOD &= 0x0F; // 清除定时器1模式位
TMOD |= 0x20; // 定时器1为模式2,8位自动重装定时器
TH1 = TL1 = 256 - FOSC / 12 / 32 / BAUD; // 定时器1初值
TR1 = 1; // 定时器1启动
}
void Timer0_ISR(void) interrupt 1
{
TH0 = (65536 - FOSC / 1000 / 12); // 重置定时器0计数值
TL0 = (65536 - FOSC / 1000 / 12); // 重置定时器0计数值
Counter++; // 计数器自增
if (Counter >= 10) // 如果计数器计数到10次
{
Flag = 1; // 标志位设为1,表示高电平时间已经测量完成
Counter = 0; // 计数器清零
}
}
void Timer1_ISR(void) interrupt 3
{
TH1 = Timer1_Reload / 256; // 定时器1重装初值
TL1 = Timer1_Reload % 256; // 定时器1重装初值
Timer1_Reload = 0; // 定时器1重载值清零
}
void UART_ISR(void) interrupt 4
{
if (RI) // 如果收到数据
{
RI = 0; // 接收中断标志位清零
Timer1_Reload = TH1 = TL1 = 0; // 定时器1重载初值清零
}
if (TI) // 如果发送数据
{
TI = 0; // 发送中断标志位清零
}
}
```
在上面的代码中,我们通过定时器0来控制计数器的计数,每次计数到10次时,就表示外部脉冲输入高电平时间已经测量完成,定时器1的计数值就是测量的高电平时间。定时器1的计数值通过串口发送出来。
阅读全文