单片机原理及系统课程设计专业:自动化班级:动xxx姓名:xxxxxx学号:200908xxx指导教师:xxxxxx兰州交通大学自动化与电气工程学院2012年7月1日评语:平时(40)修改(30)报告(30)总成绩单片机原理及系统课程设计报告11引言在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。数字电压表是诸多数字化仪表的核心与基础。以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。最近的几十年来,随着半导体技术、集成电路(IC)和微处理器技术的发展,数字电路和数字化测量技术也有了巨大的进步,从而促使了数字电压表的快速发展,并不断出现新的类型。目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面。本次设计是以ADC0808作为A/D转换模块,以AT89C51为核心控制器件,以LED作为输出显示的简易数据采集器,主要功能是检测电压的大小。2设计方案及原理2.1设计要求可以检测一路电压信号,电压信号量程0~5V,AD转换精度8位;用LED数码管显示测量值。给出系统硬件电路原理图(用proteus或其它电路图软件画出);给出系统程序流程图、程序清单(加注释);以论文格式给出设计报告。2.2设计方案选择AT89C51单片机为核心控制器件;A/D转换则采用ADC0808实现;与单片机的接口为P1口和P2口的高四位引脚,电压显示采用4位一体的LED数码单片机原理及系统课程设计报告2管,LED数码的段码输入,由并行端口P0产生:位码输入,用并行端口P2低四位产生。硬件电路设计由6个部分组成:A/D转换电路,AT89C51单片机系统,LED显示系统、时钟电路、复位电路以及测量电压输入电路。硬件电路设计框图如图1所示。图1数字电压表系统硬件设计框图3硬件设计图2数据采集系统的硬件电路AT89C51显示系统A/D转换电路复位电路时钟电路测量电压输入单片机原理及系统课程设计报告34程序设计4.1程序设计总方案根据模块的划分原则,将该程序划分初始化模块,A/D转换子程序模块,数值转换模块和显示子程序模块,这四个程序模块构成了整个系统软件的主程序,如图12所示。否是图3单片机数据采集系统主程序框图4.2系统子程序设计(1)初始化对将要用到的MCS_51系列单片机内部部件或扩展芯片进行初始工作状态设定,初始化子程序的主要工作是设置定时器的工作模式,初值预置,开中断和打开定时器等。初始化开始数值转换数值转换显示显示A/D转换A/D转换显示是否结束?结束单片机原理及系统课程设计报告4(2)A/D转换子程序A/D转换子程序用来控制对输入的模块电压信号的采集测量,并将对应的数值存入相应的内存单元,其转换流程图如图13所示。图4模数转换结构图(3)显示子程序显示子程序采用动态扫描实现四位数码管的数值显示,在采用动态扫描显示方式时,要使得LED显示的比较均匀,又有足够的亮度,需要设置适当的扫描频率,当扫描频率在70HZ左右时,能够产生比较好的显示效果,一般可以采用间隔10ms对LED进行动态扫描一次,每一位LED的显示时间为1ms[10]。在本设计中,为了简化硬件设计,主要采用软件定时的方式,即用定时器0溢出中断功能实现11μs定时,通过软件延时程序来实现5ms的延时。5总结这次单片机课程设计有很多的收获,锻炼了自己的实践动手能力,温习了单片机编程知识,很有意义!在这过程中遇到了很多很多的问题:1、硬件电路的搭建问题。找到了ADC0809,AT89C51,但是显示器不知道用哪个好,前面两个都是自己熟悉的芯片,显示器很陌生,这是遇到的第一个问题,最后想了想,上网查了些资料,学习了显示的芯片,最终解决问题。2、芯片选择好了后发现屏幕不数据采集启动转换开始开始启动转换启动转换结束启动转换输出数据启动转换否是A/D转换结束?单片机原理及系统课程设计报告5会亮,很纠结,刚开始想着是程序出了问题,但是最终没能找出错误,又再看了显示器芯片的介绍,最终发现是没接显示亮度的端口。总的来说,这次能够独立的做一个单输入的电压器,培养和锻炼了自己,很有意义,以后要多做这样的练习!6参考文献[1]张金敏.单片机原理与应用系统设计[M].成都:西南交通大学出版社2011:233-250[2]李华.计算机控制系统[M].北京:机械工业出版社,2011:151-158[3]李华.单片机原理及应用[M].兰州:兰州大学出版社,2001:190-198单片机原理及系统课程设计报告67附录#includereg51.h#includeintrins.h#defineucharunsignedchar/*定义uchar为无符号字符型*/sbitP2_3=P2^3;/*定义p2_3为P2口的第四位*/sbitOE=P3^0;/*定义OE为p3口的第一位*/sbitEOC=P3^1;/*定义EOC为P3口的第二位*/sbitP2_1=P2^1;/*定义P2_1为P2口的第二位*/sbitP2_2=P2^2;/*定义P2_2为P2口的第三位*/sbitST=P3^2;sbitP3_4=P3^4;sbitP3_5=P3^5;sbitP3_6=P3^6;ucharcodeleddata_dot[]={0x40,0x79,0x24,0x30,0x19,0x12};ucharcodeleddata[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};voiddelay(ucharn)/*延时函数delay*/{uchari,j;for(i=0;in;i++)for(j=0;j125;j++);}voidconvert(ucharvolt_data)/*转换函数*/{uchartemp;P0=leddata_dot[volt_data/51];P2_1=1;delay(3);/*启动延时函数delay*/P2_1=0;if((volt_data%51)0x19){P0=leddata[(volt_data%51)*10/51];P2_2=1;/*P2.2被赋值为1*/delay(3);P2_2=0;/*P2.2被清零*/}else{P0=leddata[(volt_data%51)*10/51+5];/*定义p0口*/P2_2=1;delay(3);P2_2=0;}temp=(((volt_data%51)*10)/51)*10%51;if(temp0x19){P0=leddata[temp*10/51];/*重新定义P0口*/单片机原理及系统课程设计报告7P2_3=1;delay(3);P2_3=0;}else{P0=leddata[temp*10/51+5];/*定义P0口*/P2_3=1;delay(3);P2_3=0;}}voidmain()/*主函数*/{ucharvolt_data;/*定义volt_data为无符号字符型*/P3_4=1;/*置位p3.4*/P3_5=1;/*置位p3.5*/P3_6=0;/*把p3.6清零*/while(1)/*无限循环*/{ST=0;_nop_();ST=1;_nop_();ST=0;if(EOC==0)/*当AD转换结束时,就进入到延时程序*/delay(100);while(EOC==0);OE=1;/*输出使能为1时,能输出已转换的数字量*/volt_data=P1;OE=0;/*输出使能为0,AD转换器不输出数据*/convert(volt_data);}}