您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 基于单片机的数字电压表制作ADC0832模数转换应用程序
基于单片机的数字电压表制作——ADC0832模数转换应用程序(C语言)2011-02-2614:32主要部件:AT89S51ADC0832八段数码管关键字:ADC0832程序C语言数字电压表本文所描述的数字电压表是利用ADC0832模数转换芯片完成的。该芯片能将0~5V的模拟电压量转换为0~255级的数字量,所以本文描述的数字电压表的量程为0~5V。说实在话,量程只有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*//*编译环境:KeiluVision2V2.12*//***********************************************************************************//*********************************包含头文件********************************/#includereg51.h#includeintrins.h/*********************************端口定义**********************************/sbitCS=P3^5;sbitClk=P3^4;sbitDATI=P3^3;sbitDATO=P3^3;/*******************************定义全局变量********************************/unsignedchardat=0x00;//AD值unsignedcharcount=0x00;//定时器计数unsignedcharCH;//通道变量unsignedchardis[]={0x00,0x00,0x00};//显示数值/*******************************共阳LED段码表*******************************/unsignedcharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/****************************************************************************函数功能:AD转换子程序入口参数:CH出口参数:dat****************************************************************************/unsignedcharadc0832(unsignedcharCH){unsignedchari,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;i8;i++)//读取前8位的值{_nop_();adval=1;Clk=1;_nop_();Clk=0;if(DATO)adval|=0x01;elseadval|=0x00;}for(i=0;i8;i++)//读取后8位的值{test=1;if(DATO)test|=0x80;elsetest|=0x00;_nop_();Clk=1;_nop_();Clk=0;}if(adval==test)//比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉dat=test;_nop_();CS=1;//释放ADC0832DATO=1;Clk=1;returndat;}/****************************************************************************函数功能:延时子程序入口参数:出口参数:****************************************************************************/voiddelay(void){intk;for(k=0;k500;k++);}/****************************************************************************函数功能:将0-255级换算成0.00-5.00的电压数值入口参数:i出口参数:****************************************************************************/voidconvdata(unsignedchari){dis[0]=i/51;//个位dis[1]=(i%51)*10/51;//小数点后第一位dis[2]=((i%51)*10%51)*10/51;//小数点后第二位}/****************************************************************************函数功能:数码管显示子程序入口参数:出口参数:****************************************************************************/voiddisplay(void){P2=0xff;P0=tab[dis[0]]&0x7f;//显示个位和小数点P2=0xfe;delay();P2=0xff;P0=tab[dis[1]];//显示小数点后第一位P2=0xfd;delay();P2=0xff;P0=tab[dis[2]];//显示小数点后第二位P2=0xfb;delay();}/****************************************************************************函数功能:定时器中断延时程序这一段的作用时隔一段时间抽样一次否侧显示的最后一位会不稳定入口参数:出口参数:****************************************************************************/voidtimer0(void)interrupt1{TMOD=0x01;TH0=0x00;TL0=0x00;IE=0x82;TR0=01;count++;if(count==0x0A){count=0x00;dat=adc0832(CH);}}/****************************************************************************函数功能:主程序入口参数:出口参数:****************************************************************************/voidmain(void){P2=0xff;//端口初始化P0=0xff;CH=0x00;//在这里选择通道0x00或0x01TMOD=0x01;//设置中断TH0=0x00;TL0=0x00;IE=0x82;TR0=01;while(1)//主循环{convdata(dat);//数据转换display();//显示数值}}
本文标题:基于单片机的数字电压表制作ADC0832模数转换应用程序
链接地址:https://www.777doc.com/doc-2574009 .html