基于单片机的数字电压表制作——ADC0832模数转换应用程序.doc_第1页
基于单片机的数字电压表制作——ADC0832模数转换应用程序.doc_第2页
基于单片机的数字电压表制作——ADC0832模数转换应用程序.doc_第3页
基于单片机的数字电压表制作——ADC0832模数转换应用程序.doc_第4页
基于单片机的数字电压表制作——ADC0832模数转换应用程序.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于单片机的数字电压表制作ADC0832模数转换应用程序(C语言) 2011-02-26 14:32主要部件:AT89S51 ADC0832 八段数码管关键字:ADC0832程序C语言数字电压表本文所描述的数字电压表是利用ADC0832模数转换芯片完成的。该芯片能将05V的模拟电压量转换为0255级的数字量,所以本文描述的数字电压表的量程为05V。说实在话,量程只有5V的电压表没有什么实际的意义,而且也没有人无聊到自己会去做一个没有意义的电压表。但是通过这个简易电压表的制作你可以对模数转换芯片有一定的了解,对以后做真正有用的电路打下基础。而且,对于那些做毕业设计的同学也是一种参考。这也就是本文的意义所在。ADC0832的资料百度一下可以找到一大堆,我就不在这里赘述了。这里只给出连接图。以下是程序部分:该程序是本人自编的,经测试可用,但不保证程序的可靠性及稳定性。若有转载请标明出处。如果有同学将本程序烧写到单片机里却不能正常工作的,请注意以下三点:1、 是否将端口重新定义。每个单片机开发板的引脚连接都是不一样的,若不加修改直接把程序烧写到单片机里,那是绝对不能正常工作的。2、 是否正确选择通道值。ADC0832有两个模拟输入端口(也就是我说的通道),你要先弄清楚你用的是那个通道,并在main函数中设置相应的通道值(以CH命名的那个变量)。本程序默认使用0通道,如果0通道不行就改成1通道,反正不是0通道就是1通道。3、 如果你做的电压表在保证电路连接正确且没有以上两点问题的情况下,还是不能正常工作,请将程序中的“if (adval = test)”这一行删掉。其实这一点我个人也不清楚到底有没有问题。我有两个单片机开发板,其中一个必须要把那一行删掉才能工作。这说明ADC0832读出的前8位与后8位数值不一样(确切的说应该是后8位反转的数值),这有悖于ADC0832的原理。我不知道到底是硬件还是软件出了问题,特此把这种现象标明。若有哪位同学知道其原因的还请多多指教。/*/*简易数字电压表制作ADC0832模数转换应用程序(C语言版)*/*目标器件:AT89S51 */*晶振:12.000MHZ */*编译环境:Keil uVision2 V2.12 */*/*包含头文件*/#include #include /*端口定义*/sbit CS = P35;sbit Clk = P34;sbit DATI = P33;sbit DATO = P33;/*定义全局变量*/unsigned char dat = 0x00; /AD值unsigned char count = 0x00; /定时器计数unsigned char CH; /通道变量unsigned char dis = 0x00, 0x00, 0x00; /显示数值/*共阳LED段码表*/unsigned char code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/*函数功能:AD转换子程序入口参数:CH出口参数:dat*/unsigned char adc0832(unsigned char CH) unsigned char i,test,adval; adval = 0x00; test = 0x00; Clk = 0; /初始化 DATI = 1; _nop_(); CS = 0; _nop_(); Clk = 1; _nop_(); if ( CH = 0x00 ) /通道选择 Clk = 0; DATI = 1; /通道0的第一位 _nop_(); Clk = 1; _nop_(); Clk = 0; DATI = 0; /通道0的第二位 _nop_(); Clk = 1; _nop_(); else Clk = 0; DATI = 1; /通道1的第一位 _nop_(); Clk = 1; _nop_(); Clk = 0; DATI = 1; /通道1的第二位 _nop_(); Clk = 1; _nop_(); Clk = 0; DATI = 1; for( i = 0;i 8;i+ ) /读取前8位的值 _nop_(); adval = 1; Clk = 1; _nop_(); Clk = 0; if (DATO) adval |= 0x01; else adval |= 0x00; for (i = 0; i = 1; if (DATO) test |= 0x80; else test |= 0x00; _nop_(); Clk = 1; _nop_(); Clk = 0; if (adval = test) /比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉 dat = test; _nop_(); CS = 1; /释放ADC0832 DATO = 1; Clk = 1; return dat;/*函数功能:延时子程序入口参数:出口参数:*/void delay(void) int k; for(k=0;k500;k+);/*函数功能:将0-255级换算成0.00-5.00的电压数值入口参数:i出口参数:*/void convdata(unsigned char i) dis0 = i/51; /个位 dis1 = (i%51)*10/51; /小数点后第一位 dis2 = (i%51)*10%51)*10/51; /小数点后第二位/*函数功能:数码管显示子程序入口参数:出口参数:*/void display(void) P2=0xff; P0=tabdis0 & 0x7f; /显示个位和小数点 P2=0xfe; delay(); P2=0xff; P0=tabdis1; /显示小数点后第一位 P2=0xfd; delay(); P2=0xff; P0=tabdis2; /显示小数点后第二位 P2=0xfb; delay();/*函数功能:定时器中断延时程序 这一段的作用时隔一段时间抽样一次 否侧显示的最后一位会不稳定入口参数:出口参数:*/void timer0(void) interrupt 1 TMOD = 0x01; TH0 = 0x00; TL0 = 0x00; IE = 0x82; TR0 = 01; count+; if (count = 0x0A) count = 0x00; dat = adc0832(CH); /*函数功能:主程序入口参数:出口参数:*/void main(void) P2=0xff; /端口初始化 P0=0xff; C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论