您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机课程设计对2路电压表进行循环数据采集
单片机原理课程结业报告题目(14):数字电压表设计学号:姓名:一、设计要求(1)以单片机为核心,设计一个数字电压表。(2)采用中断方式,对2路0~5V的模拟电压进行循环采集。(3)采集的数据送LED显示,并存入内存。(4)超过界线1.25V和2.5V警戒值时指示灯闪烁。二、设计原理(1)根据设计要求,选择AT89C51单片机为核心控制器件。(2)A/D转换采用ADC0808,与单片机的接口为P1口。(3)电压显示采用4位一体的LED数码管。(4)LED数码的段码输入,由并行端口P2产生:位码输入,用并行端P3低四位产生。以单片机为控制器,ADC0809为ADC器件的AD转换电路,设计要求的电压显示,是对ADC采集所得信号的进一步处理。为得到可读的电压值,需根据ADC的原理,对采集所得的68信号进行计算,并显示在LED上。本项目中ADC0808的参考电压为+5V,根据定义,采集所得的二进制信号addata所指代的电压值为:V5256addata而若将其显示到小数点后两位,不考虑小数点的存在(将其乘以100),其计算的数值为:VV96.1addata5256100addata将小数点显示在第二位数码管上,即为实际的电压。本设计程序将1.25V和2.5V作为两路输入的报警值,反映在二进制数字上,分别为0x40和0x80。当AD结果超过这一数值时,将会出现二极管闪烁和蜂鸣器发声。三、设计电路图3.1硬件电路设计硬件电路设计由6个部分组成:A/D转换电路、AT89C51单片机系统、LED显示系统、时钟电路、复位电路以及测量电压输入电路。硬件电路设计框图如图一所示。时钟电路复位电路AT89C51P0P3P2P1P2A/D转换测量电压显示系统图一数字电压表设计框图3.2总的设计电路根据以上的的硬件电路框图可以设计出以单片机为核心的数字电压表硬件电路原理图如图二所示。图二数字电压表电路图此电路的工作原理是:+5V模拟电压信号通过变阻器VR1分压后ADC0804的VIN+,VIN通道进入,经过模/数转换后,产生相应的数字量经过其输出通道DB0-DB,传送给AT89C51芯片的Pl口,AT89C51负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码传送给四LED,同时它还通过其四位I/O口P2.0、P2.1、P2.2、P23产生位选信号控制数码管的亮灭。四、核心代码设计思路及程序流程图4.1程序设计总方案根据模块的划分原则,该程序划分初始化模块、A/D模块子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图三所示。开开开开开开开A/D开开开开开开开开开开开开开开图三数字电压表主程序图4.2系统子程序设计4.2.1初始化程序所谓初始化,是对将要用到的C-51系列单片机内部部件或扩展芯片进行初始工作状态设定,初始化子程序的主要工作是设置定时器的工作模式,初值预置,开中断和打开定时器等。4.2.2A/D转换子程序A/D转换子程序用来控制对输入的模块电压信号的采集测量,并将对应的数值存入相应的内存单元,其转换流程图如图四所示。开开开开开开开A/D开开开开开开开开开开开开开开图四A/D转换流程图4.2.3显示子程序显示子程序采用动态扫描实现四位数码管的数值显示,在采用动态扫描显示方式时,要使得LED显示的比较均匀,又足够的亮度,需要设置适当的扫描频率,当扫描频率在70Hz左右时,能够产生比较好的显示效果,一般采用间隔10ms对LED进行动态扫描一次,没一位LED的显示时间为1ms。在本设计中,采用定时器0溢出中断功能实现定时,通过延时程序来实现5ms的延时。五、Proteus仿真图通过Keil生成.hex文件,然后将.hex文件导入AT89C51中,通过Proteus进行仿真,仿真结果如下:1.当输入电压为2.21V时,LED灯不亮,仿真显示结果如下:2.当输入电压为2.80V时,LED灯亮,蜂鸣器发出声音,仿真结果如下:六、Keil核心源代码主程序:#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsbitST=P2^4;sbitOE=P2^6;sbitALE=P2^4;sbitEOC=P2^5;sbitBUZZER=P2^3;sbitD1=P2^7;longintdatas,bai,she,ge;ucharduan;ucharcodenum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};ucharcodenum_dot[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed};ucharcodewei[]={0x0d,0x0b,0x07};voiddelay(uintz){uchari;while(z--)for(i=0;i120;i++);}voiddisplay(){uchari=0;bai=(datas*500/255)/100;she=(datas*500/255)/10%10;ge=(datas*500/255)%10;for(i=0;i3;i++){P1=wei[i];if(i==0){duan=num_dot[bai];}elseif(i==1){duan=num[she];}elseif(i==2){duan=num[ge];}P3=duan;delay(2);}}voidmian(void){if(P10x40||P00x80){BUZZER=1;D1=1;}else{BUZZER=0;D1=0;}}voidmain(){TMOD=0x02;TH0=0x216;TL0=0x216;EA=1;ET0=1;TR0=1;while(1){ST=OE=0;ALE=1;ST=1;ALE=0;ST=0;while(!EOC);OE=1;datas=P0;display();}}voidinter_1()interrupt1{TH1=(65536-200)/256;TL1=(65536-200)%256;CLK=~CLK;}参考文献[1]宋雪松、李冬明、崔长胜.手把手教你学51单片机.北京:清华大学出版社,2014年5月.[2]叶斌.C语言程序设计.北京:科学出版社,2012年6月.
本文标题:单片机课程设计对2路电压表进行循环数据采集
链接地址:https://www.777doc.com/doc-1842259 .html