参考教材改了一下,添加了显示程序,数码管只能显示4为,理论最高可显示9999us的脉宽。有兴趣的同学可以扩展一下,添加数码管,算法可以改进,多次求平均值等等。仿真出来还算可以。测量脉宽原理很简单,教材和百度上都有。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
直接上代码 上图 看一下 下面的代码 我仿真里面设置的脉冲周期是2ms 占空比是50% 由这个代码得到的高电平的时间 理论值是1000us 测得位1000us正确。
单片机源程序如下:
- #include<regx51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- ////////////////////
- sbit p=P3^3; //信号输入端口
- sbit w1=P2^4; //数码管的四个位
- sbit w2=P2^5;
- sbit w3=P2^6;
- sbit w4=P2^7;
- unsigned high;
- unsigned low;
- void read_count();
- uchar table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
- void delay(uint ms) //延时函数
- {
- uchar x;
- for(ms;ms>0;ms--)
- for(x=10;x>0;x--);
- }
- void display(disnum)//显示函数
- {
- w1=0;P0=table[disnum/1000];delay(10); //第1位
- P0=0x00;w1=1;delay(1);
-
- w2=0;P0=table[disnum%1000/100];delay(10);//第2位
- P0=0x00;w2=1;delay(1);
- w3=0;P0=table[disnum%100/10]; delay(10);//第3位
- P0=0x00;w3=1;delay(1);
- w4=0;P0=table[disnum%10];delay(10);//第4位
- P0=0x00;w4=1;delay(1);
- }
- void main() //主函数
- {
- TMOD=0x90;
- TH1=0;
- TL1=0;
- TR1=1;
-
- while(p==1);
- TR1=1;
- while(p==0);
- while(p==1);
- TR1=0;
- read_count();
-
- while(1)
- {
- display(high*256+low);
- }
-
-
- }
- void read_count()
- {
- do
- {
- high=TH1;
- low=TL1;
- //num=(high*256+low);
-
- }
- while(high!=TH1);
- }
复制代码
全部资料51hei下载地址:
脉宽测量.zip
(72.22 KB, 下载次数: 80)
|