❶ 关于51单片机做数码电压表时有段程序始终看不懂,请各位单片机高手们指点迷津
void也可以看成是数据类型,只是他是特殊的数据类型,这个类型就是“没有东西”。
比如一个函数
int a(int b){ }
表示函数的参数是int类型的,返回值是int类型的。如果没有返回值,也没有参数,就都把类型名称写成void,既然没有了,那么也就没有名称了,所以b也可以省了,便成了 void a(void) { }。
函数的定义是很基本的c语言知识,这个说起来很啰嗦,随便看书就能明白了。
void delay(void) 这个函数没什么特别意义,只是一个延时而已。因为单片机运行速度很快,数码管也不是恒定的点亮一个,而是动态扫描的,就是说,先点亮一个位,然后关闭,点亮另一个位。这个过程很快,由于视觉暂留作用,人眼只能看到所有的位都是同时亮的,这个原理和放电影一样,不过,如果点亮一个后,立即点亮另一个,会因为点亮时间太短,灯还没全亮就灭了(本人估计的,但应该也是这样),造成灯光太暗。所以要延时一下。
单片机的电源电压是5V,那么所有端口的承受电压就一定是5V,如果是3.3V单片机,就一定只能承受3.3V,所以测量量程一定是0 至 5V。如果实际测量量程远远小于这个范围,必须用放大器放大。如果量程大于这个范围,必须分压。
void convdata(unsigned char i)
这个 i 明显就是数模转换得到的结果,作为参数传递给这个函数处理。void以及函数参数等名词术语,说起来就是一本教科书的量,请自行看书,这是很基本的。
dis[0] = i/51 以及后面的两句,是一个数学问题。(dis[i]就是一个数组,这个不用多言)。
为什么是51呢?看他的注释“将0-255级换算成0.00-5.00的电压数值”。
也就是说,如果测得的电压是5V,那么数模转换的结果就是255,这是一个8位数的最大值,这个数模转换器的最大值就是8位,所以5V的电压转换得到就是255.
然后就可以照推了,如果测得的值是2.5V,那么得到的值就是255 / 2 = 127.5。也就是说,实际测得的值和这个转换值的关系是正比的,他们的比值就是 255 / 5 = 51 ,所以用测到的值去除以51,就得到实际值。明白了吗?如果这样说还不明白,那就没办法了~
然后,为什么后面又要搞那两条式子呢?这是因为,要把一个数值在数码管上显示出来,必须把一个数值上每一个位的数字单独处理给数码管显示。比如,上面除以51后,得到的数可能会有小数,比如1.45,那么要把这个数用数码管显示出来,就必须把 1、4、5和小数点都单独取出来。
以这个(i%51)*10/51*2为例:
i%51 , 是 i 除以 51 后的余数。这个数再除以51,再乘以10,再取整,就是第一个小数了。他这个式子把"乘以10"放在前面,是因为如果先除以51,那么因为i 和 51 都是int类型,结果也必将是int类型,没有小数,再乘以10也没意义了。至于后面为什么还要乘以2,这个还真不清楚,不过他这个dis数组是用来查表的,就是后面的tab[],要看他的表是怎么定义的。他第一个数没有乘以2,但是这个数和小数点的显示有关,可能不显示小数点的就要乘以2。
后面的求第二个小数,参照这个解释自己理解一下。
❷ 基于51单片机的数字电压表总结与体会
通过与同学的讨论与认真计算设计分析所完成的,课程设计的任务是设计、组装并调试一个数字电压表测量系统。需要我们综合运用单片机等课程的知识,通过查阅资料、方案论证与选定;设计和选取电路和元器件;分析指标及讨论,完成设计任务。
在这次课程设计中,我学会了怎样去根据课题的要求去设计电路和调试电路。动手能力得到很大的提高。从中我发现自己并不能很好的熟练去使用我所学到的高频电路知识。在以后学习中我要加强对使用电路的设计和选用能力。但由于电路比较简单、定型,而不是真实的生产、科研任务,所以我们基本上能有章可循,完成起来并不困难。把过去熟悉的定型分析、定量计算逐步,元器件选择等手段结合起来,掌握工程设计的步骤和方法,了解科学实验的程序和实施方法。这对今后从事技术工作无疑是个很好的训练。通过这种综合训练,我们可以掌握电路设计的基本方法,提高动手组织实验的基本技能,培养分析解决电路问题的实际本领,为以后毕业设计和从事电子实验实际工作打下基础。
还有就是每次在组团做试验都会感觉特别的充实,我们可以按照自己设计的电路去完成,老师也不是死板的要求我们怎么怎么,而是给了我们尽可能大的自己决定的余地,这次的元器件都是按照我们设计出来的电路参数给定的,而且每位老师都很耐心的为我们解决试验中所出现的问题,最后真心的感谢老师对我们课程设计的建议和帮助,我们才得以圆满的完成这次课程设计!
❸ 关于用51单片机和ADC0809做电压表的问题
我觉得是读回数据时出错,问题在这段:::
ch0=0;
Delay(128);
while(E==0);
v=ch0;
问题:
1:Delay(128);试试加长延时。12M晶振下(128)相当于128uS,0809转换时间为100uS,要是你用24M晶振就会出问题,为了保险加大到1000左右
2:不要用等待中断,(while(E==0); 用法不太对),加大延时后直接读回数据就行了
❹ 用单片机制作数字电压表,待测电压经A/D转换器得到的8位数字量进入51单片机后怎样转换成实际的电压数值
假设ADC的参考电压是Vref,ADC转换结果是X所示实际电压V是:
V=Vref×X÷256
要得到两位小数?如果使用C语言编写那就没有问题了。但是还有一种方法,假设Vref=2.56V,即2560mV,所以V=2560×X÷256=10×X,单位是mV,只要自己加小数点就行了,比如X=65H=101,则V=1010mV=1.01V。
❺ 基于51单片机的数字电压表设计
没有汇编
只有仿真图和C,用的是0808