数字电压表.docx
- 文档编号:9722277
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:13
- 大小:172.22KB
数字电压表.docx
《数字电压表.docx》由会员分享,可在线阅读,更多相关《数字电压表.docx(13页珍藏版)》请在冰豆网上搜索。
数字电压表
数字电压表
摘要:
本文运用AT89S52和ADC0832进行A/D转换,根据数据采集的工作原理,设计实现数字电压表,最后完成单片机的LCD数据显示,显示所测量的电压值。
本系统用精度高,稳定性好等特性。
关键字:
数字电压表AT89S52ADC0832LCD1602
一、方案论证及选择
1、主控芯片
方案1:
选用专用电压转换芯片INC7107实现电压的测量和现实。
缺点是精度比较低,且内部电压转换和控制部分不可控制。
优点是价格低廉。
方案2:
选用单片机AT89S52和A/D转换芯片ADC0832实现电压的转换和控制,用LCD1602显示出最后的转换电压结果。
缺点是价格稍贵。
优点是转换精度高,且转换的过程和控制、显示部分可以控制。
基于课程设计的要求,我们优先选用了:
方案2。
2、显示部分
方案1:
选用4个单体的共阳数码管,将a—h全部连接起来,然后接到单片机口的I/O上进行控制。
缺点是焊接时比较麻烦,容易出错。
优点是价格比较便宜。
方案2用一个LCD1602显示结果,1602可以显示数字和字符显示内容十分的丰富。
基于以上方案和课程设计的要求,我们优先选用了:
方案2。
二、硬件设计
这个电路主要芯片有ADC0832、单片机AT89S52和LCD1602组成,下面分别介绍一下它们的功能:
ADC0832
1.主要特性
1)2路8位A/D转换器,即分辨率8位。
2)具有转换起停控制端。
3)转换时间为100μs
4)单个+5V电源供电
5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
6)工作温度范围为-40~+85摄氏度
2.内部结构
ADC0832内部结构框图
图1ADC0832引脚图
3.外部特性(读写时序)
ADC0832时序
正常情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、
DO、DI。
但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双
向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。
(见图3)
当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和
DO/DI的电平可任意。
当要进行A/D转换时,须先将CS使能端置于低电平并
且保持低电平直到转换完全结束。
此时芯片开始转换工作,同时由处理器向芯
片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的
数据信号。
在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。
在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能,其功能项
见下表。
如上表所示,当此2位数据为“1”、“0”时,只对CH0进行单通道转换。
当2位数据为“1”、“1”时,只对CH1进行单通道转换。
当2位数据为“0”、
“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。
当2位
数据为“0”、“1”时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行输入。
到第3个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。
从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。
直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。
也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATD0。
随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束。
最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。
AT89S52
1、AT89S52是一种低功耗、高性能CMOS8位微控制器,具有
8K在系统可编程Flash存储器,32位I/O口线,三个16位定时器/计数器,另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
2、引脚结构及作用
AT89S52管脚图
三、软件设计
#include
#include
#include
sbitdc=P3^0;/*LCD的RS*/
sbitrw=P3^1;/*LCD的R/W*/
sbitcs=P3^2;/*LCD的E*/
sbitADC_CS=P3^4;
sbitADC_CLK=P3^5;
sbitADC_DO=P3^7;
sbitADC_DI=P3^6;
sfrlcdbus=0xa0;/*p0LCD数据D0=P2*/
/*写LCD命令*/
voidlcd_wrcmd(unsignedcharlcdcmd)
{
//8lcdusing1=1;
while(lcd_checkbusy());
lcdbus=lcdcmd;
dc=0;/*dc=1为数据,=0为命令.*/
rw=0;/*rw=1为读,=0为写.*/
cs=1;/*cs=1选通.*/
//soft_nop();
cs=0;
lcdbus=0xff;
//8lcdusing1=0;
}
/*在当前显示位置显示数据*/
voidlcd_wrdata(charlcddata)
{
/*chari;
lcdusing2=1;
while(lcd_checkbusy());
if(lcdcounter==20)
{
lcd_moveto(20);
while(lcd_checkbusy());
}
if(lcdcounter==40)
{
lcd_moveto(40);
while(lcd_checkbusy());
}
if(lcdcounter==60)
{
lcd_moveto(60);
while(lcd_checkbusy());
}
if(lcdcounter==80)
{
lcd_moveto(0);
while(lcd_checkbusy());
lcdcounter=0;
}//*为通用而如此
lcdcounter++;
*/
lcdbus=lcddata;
dc=1;/*dc=1为数据,=0为命令.*/
rw=0;/*rw=1为读,=0为写.*/
cs=1;/*cs=1选通.*/
//soft_nop();
cs=0;
//lcdbus=0xff;
//lcdusing2=0;
}
//***********************************************
//***设置显示字符的位置
//***X为列坐标,Y为行坐标
//***********************************************
voidlcd_set_xy(charx,chary)//x=0~15y=0~1
{
charxy;
xy=(x+0x80)+y*0x40;
lcd_wrcmd(xy);
//delayNms(10);
}
/*在指定显示位置显示LCD字符串*/
//***********************************************
//***显示字符串
//***在adr坐标处显示一个字符
//***********************************************
voidlcd_string(unsignedcharadr,unsignedchar*strpoint)
{
//registeri=0;
unsignedchari=0;
unsignedcharrow,colum;
while(strpoint[i]!
=0)
{
row=adr/16;
colum=adr%16;
lcd_set_xy(colum,row);
lcd_wrdata(strpoint[i]);
adr++;
i++;
}
}
//***********************************************
//***显示单字符
//***在address坐标处显示一个字符aa
//***********************************************
voidlcd_char(unsignedcharaddress,unsignedcharaa)//address=0~31
{
unsignedcharrow,colum;
row=address/16;
colum=address%16;
lcd_set_xy(colum,row);
lcd_wrdata(aa);
//cs=0;
}
voidlcd_init()/*初始化*/
{
lcd_wrcmd(0x38);/*设置8位格式,2行,5*7*/
lcd_wrcmd(0x0c);/*整体显示,关光标,不闪烁*/
lcd_wrcmd(0x06);/*设定输入方式,增量不移位*/
lcd_wrcmd(0x01);/*清除显示*/
//lcdcounter=0;
}
voidDelay(unsignedcharx)
{
unsignedchari;
for(i=0;i } unsignedcharReadADC(void)//把模拟电压值转换成8位二进制数并返回 { unsignedchari,ch; ch=0; ADC_CS=0; ADC_DO=0;//片选,DO为高阻态 for(i=0;i<10;i++) {;} ADC_CLK=0; Delay (2); ADC_DI=1; ADC_CLK=1; Delay (2);//第一个脉冲,起始位 ADC_CLK=0; Delay (2); ADC_DI=1; ADC_CLK=1; Delay (2);//第二个脉冲,DI=1表示双通道单极性输入 ADC_CLK=0; Delay (2); ADC_DI=1; ADC_CLK=1; Delay (2);//第三个脉冲,DI=1表示选择通道1(CH2) ADC_DI=0; ADC_DO=1;//DI转为高阻态,DO脱离高阻态为输出数据作准备 ADC_CLK=1; Delay (2); ADC_CLK=0; Delay (2); for(i=0;i<8;i++) { ADC_CLK=1; Delay (2); ADC_CLK=0; Delay (2); ch=(ch<<1)|ADC_DO;//在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数 } ADC_CS=1;//取消片选,一个转换周期结束 return(ch);//把转换结果返回 } voidmain() { unsignedchari,j; unsignedintjiang; unsignedcharhong=0x00; unsignedcharjj[3]; lcd_init(); while (1) { hong=ReadADC(); jiang=((unsignedint)hong*50)/(unsignedint)255; jj[0]=jiang/10; jj[2]=jiang%10; lcd_string(0,0,jj); } } 六、总结 本次课程设计对点阵显示电路认真的学习以及对单片机技术有了更进一步的熟悉,实际操作和课本上的知识有很大联系,但又高于课本,一个看似很简单的电路,要动手把它设计出来就比较困难了,因为是设计要求我们在以后的学习中注意这一点,要把课本上所学到的知识和实际联系起来,同时通过本次电路的设计,不但巩固了所学知识,也使我们把理论与实践从真正意义上结合起来,增强了学习的兴趣,考验了我们借助互联网络搜集、查阅相关文献资料,和组织材料的综合能力。 通过这次设计不仅锻炼了我们的团队协作精神,而且提高了创新能力。 在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高,而且在与老师和同学的交流过程中,互动学习,将知识融会贯通。 更重要的是我们学会了很多学习的方法。 而这是日后最实用的,真的是受益匪浅。 要面对社会的挑战,只有不断的学习、实践,再学习、再实践。 不管怎样,这些都是一种锻炼,一种知识的积完全可以把这个当作基础东西,只有掌握了这些最基础的,才可以更进一步,取得更好的成绩。 九、参考文献 1、单片机原理及应用张毅刚、刘杰《哈尔宾工业大学》 2、单片机基础第三版李广弟、朱月秀、冷祖祁《人民邮电》 3、单片机的C语言应用程序设计马忠梅、张凯《北航大学》 4、51系列单片机楼然苗、李光飞《北京航空航天大学》
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 电压表
![提示](https://static.bdocx.com/images/bang_tan.gif)