51小项目——使用proteus搭建简易的光照度计-(2)

时间:2024-02-20 08:54:32

此篇博客承接上一篇:51小项目——使用proteus搭建简易的光照度计-(1)

AD信号处理模块

主要内容为51单片机最小系统的构建

硬件

主控

复位按键

晶振电路

串口下载模块

软件

原理叙述

单片机将采集到的adc值进行处理,根据adc转换公式

\[U_{out}=\frac{U_{in}}{5V} * 2^8 \]

可得

\[U_{in}=\frac{U_{out}*5V}{2^8} \]

数码管显示位数为两位,adc采集电压范围为0-5V,数码管显示范围为0-99,等比例的将0-5V的电压值扩散到0-99中,

\[value=\frac{U_{in}}{5V}*99=\frac{U_{out}}{2^8} *99 \]

蜂鸣器使用51单片机输出的不同占空比的PWM波来控制,PWM波占空比0-99,故此值同样可以用于蜂鸣器的PWM控制。

数码管模块

LED模块从上一个项目继承而来,可作为8位数码管的驱动,本项目在硬件上只连接了2位数码管,此程序仍然可以使用,但,P3.0-P3.5口被占用

硬件方面

软件方面

程序通过取余得到传入值的每一位,然后送入PrintBit函数处理显示
Codevalue数组和chipcode数组分别存储字形码和位选码

PrintBit函数将选中的字形码和位选码送入相应的端口,并延时

蜂鸣器模块

51单片机的IO口驱动能力较差,不能为蜂鸣器提供大电流,三极管S8550最大驱动电流为1A,可以为蜂鸣器提供较大的电流当NPN管基极为高电平时,NPN管导通,为蜂鸣器提供较大的电流,实际使用中会在各个极之间,加上限流电阻,避免电流过大,超过NPN管的耗散功率

硬件方面

软件方面

在主函数中调用ChangeBuzzer来实现对蜂鸣器PWM波占空比的调节,

ChangeBuzzer函数将得到的参数传递给key,在蜂鸣器驱动程序中我们使用定时器来控制蜂鸣器,

在InitBuzzer函数中为蜂鸣器分配定时器0并赋值TMOD指定定时器为16位模式,TH0,TL0,为定时器赋初值,初值的大小是根据蜂鸣器发声来调整的,尽量将初值设计的比较小,使计时间隔增大,以便能清晰的感觉到蜂鸣器发声的间隔,EA是中断总开关,使能中断,ET0,打开定时器0中断,在这里,同时为定时器1做了相同的配置,是因为在设计时adc芯片需要单片机提供时钟信号,这里使用定时器1来为adc提供一个脉冲信号。

TimerBreaker是定时器0的中断响应函数,当系统发生中断事件后,CPU将程序压栈后,进入中断处理函数,每次中断后Count和Flag都会加一,Count记录发生的中断次数,Flag为标志,如果Flag小于预设值CarrentBuzzer,输出端口Pwm_Port输出高电平,否则输出低电平,当Count和Flag都大于预设值时,清零,重新开始计数,这样设计后,在Pwm_Port端口就会输出占空比为\(\frac{CurrentBuzzer}{Cycle}\) 的PWM方波信号。即可实现对蜂鸣器的控制

供电模块

供电模块使用L7805模块完成12V到5V的转换,供电电路按照L7805手册中的经典电路进行连接