本设计提出了一种基于AT89C51单片机开发的数字频率计测量仪的设计。系统以单片机AT89C51为核心,构成了完备的测量系统。可以对信号进行频率的精确测量,测频在1KHz到100KHz。采用液晶LCD1602显示被测信号的频率。与传统的电路系统相比,其有处理速度快、稳定性高、性价比高、硬件结构简单的优点。 (1)能测量频率范围为10HZ-100KHZ,,要求用液晶显示器显示测量结果。 (2)被测信号可以是正弦波、三角波、方波,幅值300mV-3V。 (3)具有超量程警告(可以是LED灯显示,也可以用蜂鸣器报警)。 (4)当测量脉冲信号时,能显示其占空比
单片机课设频率计的仿真图
程序源码如下:
- #include<reg51.h>
- #include<math.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar m=0;
- uchar u;
- uint i;
- uint x;
- uint c; //相位数据结果保存
- float t0,f;
- uint a[]={70,61,48,48,48,48,48,46,48,48,72,90}; //频率数据结果保存
- //F,=,0,0,0,0,0,.,0,0,H,Z
- sbit lcdrw=P2^1;
- sbit lcdrs=P2^0;
- sbit lcden=P2^2;
- /////////////////LCD1602的设置//////////////////////////////////
- void delay(uint s)//延时1MS
- {
- uint r,g;
- for(r=s;r>0;r--)
- for(g=110;g>0;g--);
- }
- void write_com(uchar com) // 写指令
- {
- lcdrs=0;
- P0=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_data(uchar date) // 写数据
- {
- lcdrs=1;
- P0=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void initlcd()//初始化
- {
- lcdrw=0;
- lcden=0;
- //write_com(0x01);//显示清屏
- write_com(0x38);//显示模式设置
- write_com(0x0c); //显示开,开游标,不闪烁
- write_com(0x06); // 字符时整体不移动
- }
- ////////////LCD1602设置///////////////
- ///////////定时器的设置//////////////
- void CT_init() //定时计数器初始化
- { TMOD=0x99; //GATE=1,T1、T0工作在方式1,定时方式
- TH0=0; //定时计数器初值清零
- TL0=0;
- // TH1=0;
- // TL1=0;
- TR0=1; //TR0,TR1置位,此时定时计数器的启动有INT0,INT1引脚电平决定
- // TR1=1;
- ET0=1; //开中断
- // ET1=1;
- }
- void ITC0() interrupt 0 //外部中断0服务程序
- {
- u=m; //读定时计数器0溢出次数
- m=0; //溢出次数清零
- x=TH0*256+TL0; //读定时计数器0当前值
- TH0=0; //定时计数器0清零
- TL0=0;
- }
- void TIME0() interrupt 1 //定时计数器0溢出中断
- {
- m++; //溢出次数加1
- }
- ////////////定时器的设置//////////////
- void main()
- {
- initlcd(); //液晶显示初始化
- CT_init(); //定时计数器初始化
- EA=1; //开总中断
- EX0=1; //允许外部中断
- // EX1=1;
- IT0=1; //设置外部中断方式为下降沿触发
- // IT1=1;
- P3=0xff;
- while(1)
- {
- t0=u*65536+x; //计算脉冲时间宽度
- f=1000000/(2*t0); //计算频率
- c=f*100; //计算结果逐位保存
- a[9]=c%10+48;
- a[8]=(c/10)%10+48;
- c=f;
- a[6]=c%10+48;
- a[5]=(c/10)%10+48;
- a[4]=(c/100)%10+48;
- a[3]=(c/1000)%10+48;
- a[2]=(c/10000)%10+48;
- write_com(0x80);
- for(i=0;i<=11;i++)
- {
- write_data(a[i]);
- delay(10);
- }
- }
- }
复制代码
课程设计的所有资料打包下载:
频率计.zip
(6.57 MB, 下载次数: 289)
|