手搓51单片机+ADC0808电压表:从焊板子到显示数值全攻略
51单片机和ADC0808数字电压表包括程序源码和protues仿真pcb等程序源码注释详细适合单片机开发人员和新手。最近在工作室翻出几片落灰的ADC0808这老伙计可是当年做课程设计的标配。今天带大家用STC89C52做个真·能用的数字电压表从代码到PCB布局全流程走一遍实测精度能达到0.02V级别拿来测个电池电压绰绰有余。先看硬件怎么搭Proteus里拖元件更爽ADC0808的CLK接单片机P2.0后面代码用定时器0生成500kHz时钟IN0接电位器模拟0-5V输入数据口D0-D7直连P1口EOC转换结束信号接P3.2外部中断0三位共阳数码管段选接P0位选接P2.1-P2.3重点说下ADC的启动时序新手最容易栽跟头的地方void start_convert() { ADC_START 0; // START引脚拉低 delay_us(2); // 保持至少400ns ADC_START 1; // 产生上升沿启动转换 ADC_START 0; // 拉低等待EOC信号 }这个微操相当于给ADC发个醒醒该干活了的信号。注意延时不能省老式ADC对时序要求苛刻实测延时小于1us会导致转换失败。显示部分用了动态扫描这里有个提升显示稳定性的技巧// 数码管位选函数 void digit_select(uchar pos) { P2 (P2 0xF8) | (0x07 ~(1 pos)); // 保留P2高5位操作低3位 }这种位操作比直接赋值更安全避免干扰到P2口其他控制线。当年在实验室因为位选冲突烧过两个ADC芯片的血泪教训...51单片机和ADC0808数字电压表包括程序源码和protues仿真pcb等程序源码注释详细适合单片机开发人员和新手。ADC读取的核心代码长这样float read_voltage() { start_convert(); while(!EOC_FLAG); // 等转换完成中断里置标志位 adc_value P1; // 直接读取整个端口 return (adc_value * 5.0) / 256; // 8位精度计算电压值 }注意那个256而不是255ADC0808是取256个量化电平的实测用255会导致满量程显示4.98V而不是5.00V强迫症患者必改项。PCB布局要命的三个细节模拟地AGND和数字地DGND用0Ω电阻单点连接参考电压Vref接的104电容必须靠近ADC引脚数码管位选线走线等长避免显示闪烁仿真时遇到个玄学问题Proteus里的ADC0808模型EOC信号不会自动拉低得在属性里勾选EOC Active High才能正常触发中断。这个坑足足卡了我两小时翻遍老外的论坛才找到解法。完整工程里还有个自动量程切换的进阶版代码通过检测输入电压自动切分3位/4位数显。比如当电压低于1V时显示小数点后三位核心算法是这种骚操作if(voltage 1.0){ display_mode 3; // 显示XXX.XmV value (int)(voltage * 1000); } else { display_mode 2; // 显示XX.XXV value (int)(voltage * 100); }最后说下校准拿万用表测个标准3.3V如果显示3.28V改代码里的基准电压值。硬件方面可以微调ADC的Vref脚电压不过新手建议直接软件校准更安全。全套资源已打包源码、仿真、Gerber文件拿去焊板子时记得ADC0808别插反了那封装方向反人类程度堪比NE555...
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2408724.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!