分享分享
数字频率计电路原理图如下:
Altium Designer画的数字频率计原理图和PCB图如下:(51hei附件中可下载工程文件)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
论文目录:
目录
前 言 1
第一章 总体设计方案 2
1.1 总设计框图 2
1.2 硬件设计分析 2
1.2.1 电源的设计 2
(4):LCD1602的指令说明及时序 10
(5): LCD1602的RAM地址映射及标准字库表 13
第二章 软件设计与分析 15
2.1 软件设计的组成 15
2.2 各部分软件分析 15
2.2.1 定时器0中断子函数 15
2.2.2 定时器1中断子函数 15
2.2.3 主函数 16
2.3 总源程序 18
第三章 软件介绍 28
3.1 PROTEUS简介 28
3.2 PROTEL 99 SE简介 29
3.2.1 电路工程设计部分 29
3.2.2 电路仿真与PLD部分 30
3.3 Protel 99 SE的功能特性 30
3.4 Protel99SE快捷键大全 30
3.6仿真图 36
3.7原理图 37
第四章 减小误差措施及扩展方面 39
4.1减小误差措施 39
4.2扩展方面 39
(1)预处理电路部分 39
(2)增加电源部分 39
4.3 功能上的完善 40
4.3.1 增加键盘控制 40
4.3.2 实现自动量程转换 40
4.3.3 液晶显示器(LCD)进行数据的显示 41
总结 42
致谢词 43
参考文献 44
单片机数字频率计源程序如下:
- #include<reg51.h>
- #include<stdio.h>
- #include<intrins.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit RS=P2^5;
- sbit RW=P2^6;
- sbit E=P2^7;
- sbit CLK=P2^0;
- sbit DO=P2^1;
- sbit DI=P2^1;
- sbit CS=P2^2;
- sbit CLR=P3^0;
- sbit GATE=P3^1;
- sbit K1=P3^7;
- uint num=0;
- uint c=0;
- float d=0;
- uchar e=1,f=1;
- unsigned long int aaa=0,bbb=0;
- uchar LCD_wait()//LCD1602内部等待函数
- {
- RS=0;
- RW=1;
- _nop_();
- E=1;
- _nop_();
- E=0;
- return P0;
- }
- void LCD_write(bit aa,uchar bb)//向LCD写入命令或数据
- {
- E=0;
- RS=aa;
- RW=0;
- _nop_();
- P0=bb;
- _nop_();//注意顺序
- E=1;
- _nop_();//注意顺序
- E=0;
- _nop_();
- LCD_wait();//LCD1602内部等待函数
- }
- void LCD_display(uchar temp)
- {
- LCD_write(0,0x08|temp);
- }
- void LCD_input(uchar cc)
- {
- LCD_write(0,0x04|cc);
- }
- void LCD_init()//初始化LCD
- {
- //RW=0;
- LCD_write(0,0x38);//8位数据端口,2行显示,5*7点阵
- LCD_write(0,0x38);
-
- LCD_write(0,0x0C);//开启显示, 无光标
- LCD_write(0,0x01);//清屏
- LCD_write(0,0x0C);//AC递增,画面不动
-
- }
- void LCD_sfj1(uchar x,uchar y)
- {
- if(y==0)
- LCD_write(0,0x80|x);
- if(y==1)
- LCD_write(0,0x80|(x-0x40));
- }
- void LCD_print(uchar *p)
- {
- while(*p!='\0')
- {
- LCD_write(1,*p);
- p++;
- }
- }
- void delay1(uchar x)//ms延时子函数
- {
- uchar i;
- for(i=0;i<x;i++); //延时,脉冲一位持续的时间
- }
- uchar start(bit temp) //把模拟电压值转换成8位二进制数并返回,dat为通道选择。
- {
- uchar i,aa=0;
- CS=0;
- DO=0;//片选,DO为高阻态
- delay1(10);
- CLK=0;
- delay1(2);
- DI=1;
- CLK=1;
- delay1(2);//第一个脉冲,起始位
- CLK=0;
- delay1(2);
- DI=1;
- CLK=1;
- delay1(2);//第二个脉冲,DI=1表示双通道单极性输入
- CLK=0;
- delay1(2);
- DI=temp; /*******************************/
- CLK=1;
- delay1(2);//第三个脉冲,DI=1表示选择通道1(CH2)
- DI=0;
- DO=1;//DI转为高阻态,DO脱离高阻态为输出数据作准备
- CLK=1;
- delay1(2);
- CLK=0;
- delay1(2);//经实验,这里加一个脉冲AD便能正确读出数据,
- //不加的话读出的数据少一位(最低位d0读不出)
- for(i=0;i<8;i++)
- {
- CLK=1;
- delay1(2);
- CLK=0;
- delay1(2);
- aa=(aa<<1)|DO;//在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数
- }
- CS=1;//取消片选,一个转换周期结束
- return(aa);//把转换结果返回
- }
- uint fenjie(bit cc)
- {
- uchar dd;
- uint ee;
- dd=start(cc);
- ee=(uint)dd*100/51; //51是由5/255的倒数得来的,5是5V,255是8位AD。
- return(ee);
- }
- void delay2(uint z)//按键消抖
- {
- uint x;
- uchar y;
- for(x=0;x<z;x++)
- for(y=0;y<110;y++);
- }
- void delay3()//1s延时子函数
- {
- uchar h,i,j,k;
- for(h=5;h>0;h--)
- for(i=4;i>0;i--)
- for(j=116;j>0;j--)
- for(k=214;k>0;k--);
- }
- //定时计数初始化
- void init()
- {
- TMOD=0x25; // T0计数,T1定时
- TH0=0x00;
- TL0=0x00;
- TH1=0x06;
- TL1=0x06;
- CLR=1;
- CLR=0;
- GATE=0;
- GATE=1;
- ET0=1;
- ET1=1;
- EA=1;
- TR0=1;
- TR1=1;
- }
- void main()//主函数
- {
- unsigned long a=0;
- bit b=0;
- uchar tab[10];
- uint temp=0;
- LCD_init();
- init();
- LCD_sfj1(0,0);
- LCD_print("Welcome to use ");
- LCD_sfj1(0,1);
- LCD_print("Please Wating...");
- delay3();
- LCD_write(0,0x01);
- while(1)
- {
- if(K1==0)
- {
- delay2(10);
- if(K1==0)
- {
- while(K1==0);
- b=~b;
- LCD_write(0,0x01);
- }
- }
- temp=fenjie(0);
- if(temp>c)
- c=temp;
- if(temp>c>>3&&temp<c>>1)
- f=0;
- if(b==0)
- {
- a=(aaa*256)+bbb;
- if(a==0)
- {
- LCD_sfj1(0,0);
- LCD_print("F= 0000000000 Hz");
- LCD_sfj1(0,1);
- LCD_print("F= 0000000000 Hz");
- }
- else
- {
- LCD_sfj1(0,0);
- LCD_print("F= Hz");
- sprintf(tab,"%ld",a);
- LCD_sfj1(2,0);
- LCD_print(tab);
- LCD_sfj1(0,1);
- LCD_print("P= ms");
- sprintf(tab,"%0.6f",1000.0/a);
- LCD_sfj1(2,1);
- LCD_print(tab);
- }
- }
- else
- {
- sprintf(tab,"%bd",e);
- LCD_sfj1(0,0);
- LCD_print(tab);
- sprintf(tab,"Upp=%0.3fV",d);
- LCD_sfj1(0,1);
- LCD_print(tab);
- }
- }
- }
- void t0() interrupt 1 using 1
- {
- }
- void t1() interrupt 3 using 3//定时器T1中断服务程序
- {
- if(num==3999)
- {
- GATE=0;
- TR0=0;
- TR1=0;
- aaa=TH0*256+TL0;
- bbb=P1;
- d=c/100.0;
- c=0;
- e=f;
- f=1;
- CLR=1;
- CLR=0;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
数字频率计.zip
(984.6 KB, 下载次数: 221)
|