#include <system.h> #include <LCD1602.h> #include <INTRINS.H> #include <stdio.h> sbit T2Pin=P3^5; unsigned char a[16]="H: T: "; unsigned char b[10]; unsigned char *p; unsigned char n,k=0; //k 计数器1的中断次数 unsigned long count; //555 输出频率 unsigned char i=0; #define th0 (15536>>8) #define tl0 ((unsigned char)(15536)) unsigned int th,tl; void counter1(void) interrupt 3 { k++; } main() { //delay(5000); TMOD=0x51; ET0=0; ET1=1;EA=1; LCDInit(); while(1) { //delay(20000); TH0=th0;TL0=tl0; TH1=TL1=0;k=0; TR0=TR1=1; for(n=0;n<20;n++) //定时1S { while(!TF0); TF0=0; TH0=th0;TL0=tl0; } TR0=TR1=0; count=TH1; count<<=8; count+=TL1; count+=(((unsigned long)k)<<16); sprintf(&a[0],"%ldHz",count); SetCurPos(1,1); LCDPrint(&a[0]); TH0=TL0=0; while(T2Pin); while(!T2Pin);TR0=1; while(T2Pin);TR0=0;//高电平时间 th=(TH0<<8)+TL0; TH0=TL0=0; while(!T2Pin); while(T2Pin);TR0=1; while(!T2Pin);TR0=0;//高电平时间 tl=(TH0<<8)+TL0; sprintf(&a[0],"%4.1f",th*100.0/(th+tl)); SetCurPos(2,1); LCDPrint(&a[0]); } }请逐段分析此段代码
时间: 2023-10-24 21:08:42 浏览: 143
这段代码是用于在单片机上实现一个测量频率和占空比的功能。下面是代码的具体分析:
```c
#include <system.h> // 引入系统头文件
#include <LCD1602.h> // 引入LCD显示头文件
#include <INTRINS.H> // 引入INTRINS.h头文件
#include <stdio.h> // 引入标准输入输出头文件
sbit T2Pin=P3^5; // 定义T2Pin为P3.5口,用于测量占空比
unsigned char a[16]="H: T: "; // 定义一个16字节的字符数组a,用于存放显示的字符串
unsigned char b[10]; // 定义一个10字节的字符数组b
unsigned char *p; // 定义一个指向字符类型的指针变量p
unsigned char n,k=0; // 定义两个字符类型的变量n和k,k用于计数器1的中断次数
unsigned long count; // 定义一个长整型变量count,用于存放测量的频率值
unsigned char i=0; // 定义一个字符类型的变量i
#define th0 (15536>>8) // 定义一个宏,表示TH0初值的高8位
#define tl0 ((unsigned char)(15536)) // 定义一个宏,表示TH0初值的低8位
unsigned int th,tl; // 定义两个整型变量th和tl,用于存放测量的高电平和低电平时间
void counter1(void) interrupt 3 // 定义计数器1的中断函数
{
k++; // 中断次数加1
}
main() // 程序入口
{
TMOD=0x51; // 初始化计时器0和计数器1
ET0=0;
ET1=1;
EA=1;
LCDInit(); // 初始化LCD
while(1) // 主循环
{
TH0=th0; // 设置TH0的初值
TL0=tl0; // 设置TL0的初值
TH1=TL1=0;
k=0;
TR0=TR1=1;
for(n=0;n<20;n++) // 定时1S
{
while(!TF0); // 等待计时器0溢出
TF0=0;
TH0=th0; // 重新设置TH0的初值
TL0=tl0; // 重新设置TL0的初值
}
TR0=TR1=0;
count=TH1; // 将TH1的值存入count的高16位
count<<=8;
count+=TL1; // 将TL1的值存入count的低16位
count+=(((unsigned long)k)<<16); // 将计数器1的中断次数左移16位后存入count的高32位
sprintf(&a[0],"%ldHz",count); // 将count的值以字符串的形式存入字符数组a
SetCurPos(1,1); // 设置光标位置
LCDPrint(&a[0]); // 在LCD上显示字符串a
TH0=TL0=0;
while(T2Pin); // 等待T2Pin为高电平
while(!T2Pin); // 等待T2Pin为低电平
TR0=1; // 启动计时器0
while(T2Pin); // 等待T2Pin为高电平
TR0=0; // 停止计时器0
th=(TH0<<8)+TL0; // 计算高电平时间
TH0=TL0=0;
while(!T2Pin); // 等待T2Pin为低电平
while(T2Pin); // 等待T2Pin为高电平
TR0=1; // 启动计时器0
while(!T2Pin); // 等待T2Pin为低电平
TR0=0; // 停止计时器0
tl=(TH0<<8)+TL0; // 计算低电平时间
sprintf(&a[0],"%4.1f",th*100.0/(th+tl)); // 计算占空比并将其以字符串的形式存入字符数组a
SetCurPos(2,1); // 设置光标位置
LCDPrint(&a[0]); // 在LCD上显示字符串a
}
}
```
在该程序中,使用了单片机中的计时器0、计数器1和P3.5口来实现频率和占空比的测量。程序的核心部分是在主循环中不断地测量频率和占空比,并将其显示在LCD上。
首先,程序初始化计时器0和计数器1,并初始化LCD。然后,在主循环中,程序先使用计时器0来测量频率,计算得到频率后,将其以字符串的形式存入字符数组a,并在LCD上显示出来。接着,程序使用P3.5口来测量占空比,计算得到占空比后,将其以字符串的形式存入字符数组a,并在LCD上显示出来。这样就实现了频率和占空比的测量功能。
需要注意的是,在测量占空比时,程序需要先等待P3.5口的电平变化,然后启动计时器0开始计时,等待P3.5口的电平再次变化,停止计时器0,并计算高电平和低电平的时间来求得占空比。
阅读全文