将信号源的信号输入到单片机,经过处理将信号的频率在液晶上显示出来!
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #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)
|