《最简单的用单片机+ADC0808protues仿真数字电压表(原创).doc》由会员分享,可在线阅读,更多相关《最简单的用单片机+ADC0808protues仿真数字电压表(原创).doc(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、最简单的用单片机+ADC0808protues仿真数字电压表(原创)在学习单片机AT89S52十天后,老师发给我们的那个板子就基本不够用了,所以数字电压表就只能用protues仿真了,而且之前我在网上找了很多别人做的数字电压表实例,总感觉程序比较复杂,就尝试着自己做了下,没想到很简单的思路竟然就做出来了,当然里面还有很多不足,精度也不是很高,但是做出来的时候自己真的非常高兴!下面给出我写的C程序和仿真图,不足的地方希望可帮我修改下。可以说这个程序是非常简单的了,没有像其他人一样用中断啊,用字符串移动啊,用ABS地址头文件啊都没有,所以很适合新人理解吧。我就只想一个问题,把收到的2进制数字量改成
2、10进制就行了,仅此而已。include include math.h#define unit unsigned intdefine uchar unsigned charsbit ST=P30;sbit OE=P31;sbit EOC=P32;sbit led1=P20;sbit led2=P21;sbit led3=P22;sbit led4=P23;uchar ad_data;uchar data dis5=0x00,0x00,0x00,0x00,0x00;uchar code led_segment =0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D, 0x07,0
3、x7F,0x6F;void data_pro();void delay (k);void display();void main(void) /主程序 ad_data=0; /采样值存储单元初始化为0 while(1) ST=0; ST=1; ST=0; while(EOC=0) OE=1; ad_data=P0; data_pro(); display(); void Delay(int count) /*定义延时子函数 ,利用循环来延时int i,j;for(i=0;icount;i+)for(j=0;j120;j+); void display(void) /LED显示子程序 P1=le
4、d_segmentdis2; /驱动方法 led1=0; /开第一个数码管 delay(1); /动态显示方法 进行一个很小的延时 led1=1; /关第一个数码管 这样进行动态显示 P1=led_segmentdis1; led2=0; delay(1); led2=1; P1=led_segmentdis0; led3=0; delay(1); led3=1;void data_pro(void) /数据处理子程序 dis2=ad_data/51; /取整 dis4=ad_data51; /取余 dis4=dis4*10; dis1=dis4/51; /取第一位小数 dis4=dis451; dis4=dis410; dis0=dis4/51; /取第二位小数/取整 为什么要/51呢?因为接进来的是一个256内的数 /前面可知模拟电压范围为0-5V,所以最小分辨率为5/256=1/51/ 这样就可以将8位二进制数转化为0。005。00内的十进制小数了! 设计缺陷:1。精度不高,在2-5V之间精度才能达到98.2%左右。 2。在02V会出现很明显的失真,这个地方如何解决一直很困扰我,是硬件问题还是程序问题?