基于AT89C52的频率计.docx

上传人:b****5 文档编号:12329357 上传时间:2023-04-18 格式:DOCX 页数:16 大小:334.43KB
下载 相关 举报
基于AT89C52的频率计.docx_第1页
第1页 / 共16页
基于AT89C52的频率计.docx_第2页
第2页 / 共16页
基于AT89C52的频率计.docx_第3页
第3页 / 共16页
基于AT89C52的频率计.docx_第4页
第4页 / 共16页
基于AT89C52的频率计.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

基于AT89C52的频率计.docx

《基于AT89C52的频率计.docx》由会员分享,可在线阅读,更多相关《基于AT89C52的频率计.docx(16页珍藏版)》请在冰豆网上搜索。

基于AT89C52的频率计.docx

基于AT89C52的频率计

本产品是一个基于AT89C52的频率测量仪,精度±0.04%,响应时间0.5s,测量信号幅值范围1~5V。

本频率计需要5V电源为其供电,通过在单位时间里将被测信号放大后进行采集计数后,将频率信息用八位共阴数码管显示出来。

设计要求:

(1)用万用板制作出频率计成品。

(2)尽可能提高测量精度、测量范围、响应时间等

材料清单:

AT89C52芯片,74ls00,4个共阴数码管,1个复位开关,1个10uF电容,1个24MHz晶振,1个9014三极管,3个led灯,电阻和导线若干,2个30pF电容,排针一排。

设计说明:

一、总体方案

本频率计是先给该产品供5v稳压电源,然后用信号发生器供给信号,经过放大整形电路的作用后,再输入芯片中,而主控芯片用引脚电平中断变化来计数,用定时器来定出计时单位时间,信号采集后经过处理在数码管上显示出来。

二、硬件分析

系统硬件框图

 

5V电源

AT89c52

数码管显示

信号放大整形

周期信号

 

(1)放大整形电路

 

74ls00及引脚图

三极管9014

由于输入的信号可以是正弦波,三角波。

而后面的闸门或计数电路要求被测信号为矩形波,所以需要设计一个整形电路则在测量的时候,首先通过整形电路将正弦波或者三角波转化成矩形波。

在整形之前由于不清楚被测信号的强弱的情况。

所以在通过整形之前通过放大衰减处理。

当输入信号电压幅度较大时,通过输入衰减电路将电压幅度降低。

当输入信号电压幅度较小时,前级输入衰减为零时若不能驱动后面的整形电路,则调节输入放大的增益,时被测信号得以放大[10]。

根据上述分析,放大电路放大整形电路采用高频晶体管9014与74LS00等组成。

其中9014为NPN型高频小功率三极管,组成放大器将输入频率为fx的周期信号如正弦波、三角波及方波等波形进行放大。

与非门74LS00构成施密特触发器,它对放大器的输出波形信号进行整形,使之成为矩形脉冲

(3)AT89c52芯片

AT89C52是美国Atmel公司生产的低电压、高性能CMOS8位单片机,片内含8KB的可反复檫写的程序存储器和12B的随机存取数据存储器(RAM),器件采用Atmel公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内配置通用8位中央处理器(CPU)和Flash存储单元,功能强大的AT89C52单片机可灵活应用于各种控制领域。

AT89C52单片机属于AT89C51单片机的增强型,与Intel公司的80C52在引脚排列、硬件组成、工作特点和指令系统等方面兼容。

其主要工作特性是:

片内程序存储器内含8KB的Flash程序存储器,可擦写寿命为1000次;

片内数据存储器内含256字节的RAM;

具有32根可编程I/O口线;

具有3个可编程定时器;

中断系统是具有8个中断源、6个中断矢量、2个级优先权的中断结构;

串行口是具有一个全双工的可编程串行通信口;

具有一个数据指针DPTR;

低功耗工作模式有空闲模式和掉电模式;

具有可编程的3级程序锁定位;

AT89C52工作电源电压为5(1+0.2)V,且典型值为5V;

AT89C52最高工作频率为24MHz。

芯片的引脚图

(4)四位共阴数码管

数码管是一类显示屏通过对其不同的管脚输入相对的电流,会使其发亮,从而显示出数字能够显示时间、日期、温度等所有可用数字表示的参数。

由于它的价格便宜使用简单在电器特别是家电领域应用极为广泛,空调、热水器、冰箱等等。

绝大多数热水器用的都是数码管,其他家电也用液晶屏与荧光屏。

由于发光二极管基本上属于电流敏感器件,其正向压降的分散性很大,并且还与温度有关,为了保证数码管具有良好的亮度均匀度,就需要使其具有恒定的工作电流,且不能受温度及其它因素的影响。

另外,当温度变化时驱动芯片还要能够自动调节输出电流的大小以实现色差平衡温度补偿。

 

该频率计的整体仿真图

 

三、编程思路

程序流程图

主程序

设T0,T1工作模式

初始化

赋值中断

启动T0,T1工作

T1定时1s

T1为1s?

停止工作

数码管显示

Y

N

程序代码

include

#defineucharunsignedchar

#defineuintunsignedint

#defineulongunsignedlong

voidinit();

voiddisplay(ucharge,ucharshi,ucharbai,ucharqian);

voiddelay(uintz);

sbitsm1=P2^1;

sbitsm2=P2^2;

sbitsm3=P2^3;

sbitsm4=P2^4;

sbitLED3=P2^5;

sbitLED2=P2^6;

sbitLED1=P2^7;

ulongnum1,num;

bitflag;

uchartt,TC,ge,shi,bai,qian;

ucharcodetable[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f};

/*******************主程序********************/

voidmain()

{

init();/*初始化子程序*/

while

(1)

{

display(ge,shi,bai,qian);/*显示子程序*/

if(flag==1)/*判断如果flag=1则从新打开两个定时器*/

{

TR0=1;

TR1=1;

}

}

}

 

voidt1(void)interrupt3using0/*定时器1子程序*/

{

TH1=0x3C;

TL1=0xB0;

tt++;

if(tt>=40)

{

TR1=0;/*开定时器1*/

TR0=0;/*开计数器0*/

num=TC*65536+TH0*256+TL0;/*求得1秒通过计数器0的下降沿数,即所测的频率*/

num1=TC*65536+TH0*256+TL0;/*赋值给num1,为了正常显示*/

tt=0;/*tt置零*/

TH0=0;/*计数器高八位置0*/

TL0=0;/*计数器低八位置0*/

TC=0;/*计数器TC置0*/

flag=1;/*标志位置1*/

}

}

voidt0(void)interrupt1using0/*计数器0子程序*/

{

TC++;

}

voidinit()/*初始化子程序*/

{

flag=0;

TH0=0;

TL0=0;

TMOD=0x15;/*设置定时器1为定时模式定时器1为计数方式*/

TH1=0x3C;

TL1=0xB0;

EA=1;/*开总中断*/

ET1=1;

TR1=1;

ET0=1;

TR0=1;

}

voiddelay(uintz)/*延时子程序*/

{

z=200;

while(z--);

}

voiddisplay(ucharge,ucharshi,ucharbai,ucharqian)/*显示子程序*/

{

if(num1<=9999)/*如果所测的频率<9999则进入这个语句*/

{

LED3=0;/*开第一档灯*/

LED1=1;LED2=1;/*关其他两档灯*/

qian=num1/1000;/*分别得到各个数码管的数*/

bai=num1%1000/100;

shi=num1%100/10;

ge=num1%10;

if(qian==0)/*判断如果千位为0则千位不显示*/

{

sm1=1;sm2=1;sm3=1;sm4=1;

}

else/*否则显示*/

{

sm1=0;sm2=1;sm3=1;sm4=1;

P0=table[qian];

delay

(2);

P0=0x00;

}

if(qian==0&bai==0)/*判断百位,千位是否为0为0则百位也不显示*/

{

sm1=1;sm2=1;sm3=1;sm4=1;

}

else

{

sm1=1;sm2=0;sm3=1;sm4=1;

P0=table[bai];

delay

(2);

P0=0x00;

}

if(qian==0&&bai==0&&shi==0)/*同理不解释*/

{

sm1=1;sm2=1;sm3=1;sm4=1;

}

else

{

sm1=1;sm2=1;sm3=0;sm4=1;

P0=table[shi];

delay

(2);

P0=0x00;

}

sm1=1;sm2=1;sm3=1;sm4=0;

P0=table[ge];

delay

(2);

P0=0x00;

}

if(num1>9999&&num1<=99999)/*如果所测的频率9999到99999则进入这个语句*/

{

LED2=0;

LED1=1;LED3=1;

num1=num1/10;

qian=num1/1000;

bai=num1%1000/100;

shi=num1%100/10;

ge=num1%10;

sm1=0;sm2=1;sm3=1;sm4=1;

P0=table[qian];

delay

(2);

P0=0x00;

sm1=1;sm2=0;sm3=1;sm4=1;

P0=table[bai]&0x01;

delay

(2);

P0=0x00;

sm1=1;sm2=1;sm3=0;sm4=1;

P0=table[shi];

delay

(2);

P0=0x00;

sm1=1;sm2=1;sm3=1;sm4=0;

P0=table[ge];

delay

(2);

P0=0x00;

num1=num;/*把值赋回给num要不然只能下次只能进入第一句小数点显示不出来*/

}

if(num1>99999&&num1<=999999)/*如果所测的频率99999到999999则进入这个语句*/

{

LED1=0;

LED3=1;LED2=1;

num1=num1/100;

qian=num1/1000;

bai=num1%1000/100;

shi=num1%100/10;

ge=num1%10;

sm1=1;sm2=1;sm3=1;sm4=1;

P0=table[qian];

delay

(2);

P0=0x00;

sm1=1;sm2=0;sm3=1;sm4=1;

P0=table[bai];

delay

(2);

P0=0x00;

sm1=1;sm2=1;sm3=0;sm4=1;

P0=table[shi]&0x01;

delay

(2);

P0=0x00;

sm1=1;sm2=1;sm3=1;sm4=0;

P0=table[ge];

delay

(2);

P0=0x00;

num1=num;/*把值赋回给num要不然只能下次只能进入第一句小数点显示不出来*/

}

}

四Pouteus软件调试

根据系统设计要求,进行Keil和Proteus系统仿真,不断调试程序,直到符合功能要求

待测值(Hz)

10

100

500

1005

5555

8555

10546

测量值(Hz)

10

100

500

1006

5557

8559

10556

五.性能评估

本频率计由于采用引脚电平变化中断来计数,所以大大减少了单位测量时间,其响应时间为0.5s;由于被测信号通过比较器放大,所以初步调试出其测量信号的电压幅值为1~5V;从测试的数据可以看出此频率计的误差在万分之三到万分之四左右,产生误差的原因可能是但T1定时器计数溢出中断,申请标志TF1并向CPU提出中断申请时存在时间延迟。

六.设计心得

经过我们组一个星期日以继夜的艰苦奋战后,最后我们最终还是将产品做出来,但产品还是有地方需要改进。

在这次课程设计中我们发现了两个问题,一,仿真一个电路出来很容易,但是真正动手去焊,才发先真实的电路是很难焊的,需要我们认真的思考后在下手,这样焊出来的电路才不容易出错。

二,数码管需要加驱动电路才能够显示得比较亮,不加驱动电路的话就可能会导致某些位码显示不出来或者显示得很暗。

最后要谢谢老师的指导跟各个同学相互间的合作。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1