參考教材改了一下,添加了顯示程序,數碼管只能顯示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, 下載次數: 82)
2019-10-22 01:00 上傳
點擊文件名下載附件
|