此篇博客承接上一篇:51小项目——使用proteus搭建简易的光照度计-(1)
AD信号处理模块
主要内容为51单片机最小系统的构建
硬件
主控
复位按键
晶振电路
串口下载模块
软件
原理叙述
单片机将采集到的adc值进行处理,根据adc转换公式
可得
数码管显示位数为两位,adc采集电压范围为0-5V,数码管显示范围为0-99,等比例的将0-5V的电压值扩散到0-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手册中的经典电路进行连接