將信號源的信號輸入到單片機,經過處理將信號的頻率在液晶上顯示出來!
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
20190805194129.png (203.13 KB, 下載次數: 64)
下載附件
2019-8-6 00:13 上傳
20190805194031.png (83.65 KB, 下載次數: 87)
下載附件
2019-8-6 00:13 上傳
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- void init_lcd(void);
- void disp_str(uchar x,uchar y,uchar *p);
- sbit FS=P3^5; //被測信號FS輸入端
- bit RDY=0; //測量完成標志
- uint msn; //定時中斷計數
- uint count(void) //測量FS的頻率
- {RDY=0;
- TMOD=0x52; //T0:定時
- TH0=TL0=6;//T0定時時間為250us
- msn=4000; //4000次中斷正好1s
- TH1=TL1=0x00; //T1工作于計數方式,初值為0
- ET0=1; //允許T0中斷
- EA=1; //開中斷
- while(FS==1); //等待被測信號變低
- while(FS==0); //等待被測信號變高
- TR0=1; //T0開始定時
- TR1=1; //T1開始計數
- while(RDY==0); //等待1s
- TR1=0; //關閉T1、T0
- TR0=0;
- return(TH1*256+TL1); //返回計數值
- }
-
- void timer0(void) interrupt 1 using 1
- {msn--;
- if(msn==0) //如果1s已到
- RDY=1; //設置測量完成標志位
- }
- void main()
- {uint f;
- uchar str[9]="f= Hz";
- uchar i;
- init_lcd(); //液晶屏初始化
- while(1)
- {f=count(); //測量頻率
- _nop_();
- for(i=6;i>=2;i--) //測量結果轉換為5位ASCII碼
- {str[i]=f%10+0x30;
- f=f/10;
- }
- disp_str(0,3,str); //顯示測量結果
- }
- }
-
-
復制代碼
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS=P2^6; //數據/命令寄存器選擇控制端
- sbit RW=P2^5; //讀寫控制端
- sbit E=P2^7; //使能控制端
- sfr LCD=0x80; //P1口作為總線端口
- sbit BF=LCD^7; //就緒線BF,低電平有效
- void lcd_cmd(uchar cmd)
- { LCD=cmd;
- RS=0;//選擇命令寄存器
- RW=0;//執行寫數據操作
- E=1;
- _nop_();//延時
- E=0; //使能信號有效
- while(1)
- {LCD=0xff;//總線變高
- RS=0; //選擇命令寄存器
- RW=1;//讀操作
- E=0; //使能信號有效
- _nop_();
- E=1; //撤銷使能信號
- if(BF==0)break; //如果就緒,返回
- }
- }
-
- void lcd_dat(uchar dat)
- {
- LCD=dat;//顯示數據總線
- RS=1;//選擇數據寄存器
- RW=0;//執行寫數據操作
- E=1;
- _nop_();//延時
- E=0; //使能信號有效
- while(1)
- {LCD=0xff;//總線變高
- RS=0; //選擇命令寄存器
- RW=1;//讀操作
- E=0; //使能信號有效
- _nop_();
- E=1; //撤銷使能信號
- if(BF==0)break; //如果就緒,返回
- dat=LCD;
- }
- }
- void init_lcd(void)//初始化液晶屏
- {
- lcd_cmd(0x01); //清屏幕
- lcd_cmd(0x3c); //設置雙行顯示,5*10點陣
- lcd_cmd(0x0c); //開顯示,關閉光標
- }
- void disp_str(uchar x,uchar y,uchar *p) //在x行、y列顯示字符串p
- {
- if(x==0) //如果在第一行顯示
- lcd_cmd(0x80+y); //設置寫入地址
- else //如果在第二行顯示
- lcd_cmd(0xc0+y);//設置寫入地址
- while(*p) //將字符依次發送到液晶屏
- lcd_dat(*p++);
- }
復制代碼
所有資料51hei提供下載:
頻率計液晶顯示.zip
(307.27 KB, 下載次數: 41)
2019-8-5 19:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|