ADC0832模数转换之5v内电压测量

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

ADC0832.c/***************************************************************************标题:ADC0832模数转换程序,电压表效果:调节模拟采集量电位器,数码管显示相应的分压。说明:做这个例子的朋友,先看完这段话,一定要看完再做实验。ADC0832模数转换程序,运行程序后,调节电位器,数码管的显示电压从0V-5V变化本程序将模数转换回来的数据,再转换成相应的电压值输出数码管显示调节电位器对5V电压进行分压,就是板上的JIN插针的CH0输入电压,使ADC转换到相应电压值,如果想测外电压,JIN脚输入,但切记,测量电压以板上的公共点不可超过直流5V电压,否则ADC0832将烧毁,切记切记,初学者一定切记,还有电压极性一定不可以搞错,板上JIN插针一脚是公共脚(GND),中间CH0脚是测电压正极,如果要测外电压,就测自身板上的IC各脚电压,因为板子是5V供电,所以都不会超出5V,而且我们还可以测到各IC的各脚工作电压,特别是单片机,还有一点注意的是,不要去测外电源输入电路,及MAX232IC,因为此IC内部有升压电路,有的脚是有12V电压差,所以切记不要去测量******************************************************************************/#includereg52.h#includeintrins.h/********IO引脚定义***********************************************************/sbitSCL=P1^3;//SCL定义为P1口的第3位脚,连接ADC0832SCL脚sbitSDA=P1^4;//SDA定义为P1口的第4位脚,连接ADC0832SDA脚sbitCS=P1^6;//CS定义为P1口的第4位脚,连接ADC0832CS脚sbitRST=P1^5;//DS1302片选,因这两芯片共用据脚和时钟脚(SDA,SCL),所以我们要定义它,将DS1302片选关掉,否则发生冲突/********数据定义*************************************************************/codeunsignedchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40,0x3e,0x00};//共阴数码管显示数的组成,第一行是0-9,第二行是0-9且有小数点的,接下来三行分别是-、U、空unsignedcharl_tmpdate[]={0,0,0,0};//存放显示内容的数组/********函数声明*************************************************************/voiddisplay(unsignedchar*lp,unsignedcharlc);//显示函数voiddelay(unsignedinttimer);//延时子函数unsignedcharad0832read(bitSGL,bitODD);//读模数转换ADC0832的数据,两位参数为ADC0832的DI输入,//选择转换通道,可查看芯片文档了解/***********主函数开始********************************************************/voidmain(void)//入口函数{unsignedchari=0;unsignedinttmp;RST=0;while(1){if(i==0)//这里为循环255个周期读取一次0831,因CPU运行比较快,没必要每次循环都去读取{tmp=ad0832read(1,0)*100;//ad0832read函数里的两个参数代表的意义分别是://若为1,0即表示只用CHO作为正输入端进行单通道转换//若为1,1即表示只用CH1作为正输入端进行单通道转换//若为0,0即表示将CHO作为正输入端IN+,CH1作为负输入端IN-进行转换//若为0,1即表示将CH1作为正输入端IN+,CH0作为负输入端IN-进行转换//这里乘上100的意思是为下面保留两位小数做准备tmp=tmp/51;//这里为什么除以51呢,分析如下:模数转换IC是8位ADC,转换回来的数值是0-255//0V时是0,5V时是255,他相应的倍数就是255/5=51,因此,我们的将转换回来的//数除以51,就得到相应的电压值了,l_tmpdate[0]=tmp/100;//得到百位,因为我们刚才乘上100了l_tmpdate[0]+=10;//这里是加上小数点,带小数点的数在表中是后10位tmp=tmp%100;第1页ADC0832.cl_tmpdate[1]=tmp/10;//十位即小数点后第一位l_tmpdate[2]=tmp%10;//个位即小数点后第二位l_tmpdate[3]=21;//加上单位U,即伏}i++;display(l_tmpdate,4);//输出显示}}/***********读模数转换数据********************************************************///请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的unsignedcharad0832read(bitSGL,bitODD){unsignedchari=0,tmp=0,tmp2=0;SCL=0;_nop_();_nop_();SDA=1;_nop_();_nop_();CS=0;_nop_();_nop_();//开始SCL=1;_nop_();_nop_();//第一个上升沿SCL=0;_nop_();_nop_();SDA=SGL;_nop_();_nop_();//输入数据SGLSCL=1;_nop_();_nop_();//第二个上升沿SCL=0;_nop_();_nop_();SDA=ODD;_nop_();_nop_();//输入数据ODDSCL=1;_nop_();_nop_();//第三个上升沿SCL=0;_nop_();_nop_();//第三个下降沿SDA=1;_nop_();_nop_();//锁定for(i=0;i8;i++)//接收八位数据{SCL=1;_nop_();_nop_();SCL=0;_nop_();_nop_();//开始从第四个下降沿接收数据tmp=1;if(SDA)//如果接收到的数据是1,tem+1tmp++;}for(i=0;i8;i++)//接收校验数据{tmp2=1;if(SDA)tmp2+=0x80;SCL=1;_nop_();_nop_();SCL=0;_nop_();_nop_();}CS=1;_nop_();_nop_();//结束SCL=1;if(tmp==tmp2)//与校验数据比较,正确就返回数据,否则返回0returntmp;return0;}/*************显示函数*******************************************/voiddisplay(unsignedchar*lp,unsignedcharlc){unsignedchari;//定义变量P2=0;//端口2为输出数码管数值的端口P1=P1&0xF8;//将P1口的前3位输出0,对应138译码器的输入脚,全0为第一位数码管显示for(i=0;ilc;i++)//循环显示{P2=table[lp[i]];//查表法得到要显示数字的数码段delay(10);//短延时P2=0;//清0端口,准备显示下位if(i==7)//检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到P13数据break;P1++;//下一位数码管}}/*************延时子函数*******************************************/voiddelay(unsignedinttimer)第2页ADC0832.c{while(timer--);}第3页

1 / 3
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功