单片机课程设计姓名:学号:班级:成绩:指导老师:设计时间:目录第0章前言摘要……………………………………..3第一章设计方案1.1设计内容及步骤…………………………………………..31.2设计方案…………………………………………..4第二章系统框图2.1硬件框图……………………………………..4第三章硬件设计3.1A/D转换器电路模块........................................53.2数码管显示电路模块........................................73.3单片机电路模块............................................8第四章软件设计4.1主程序…………………………………………114.2显示子程序……………………………………12第五章设计心得………………………………………….14第六章元器件清单………………………………………….15第七章参考文献………………………………………….15第八章附录………………………………………………16摘要:本次设计了一个多路数字电压表,该电压表测量范围在0—5V之间。它主要利用A/D转换器,对多路电压值进行采样,得到相应的数字量,然后按照数字量与模拟量的比例关系得到对应的模拟电压值,通过显示设备显示出来。系统过程就是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示。由于采用高性能的单片机芯片为核心,同时利用LED数码管为显示设备,这样就使显示清晰直观、读数准确,大大地减少了因人为因素所造成的测量误差事件,大大的提高了测量的精确度。0.前言单片机是一种集成电路芯片,采用超大规模技术把具有数据处理能力(如算术运算,逻辑运算、数据传送、中断处理)的微处理器(CPU)。随着单片机技术的飞速发展,各种单片机蜂拥而至,单片机技术已成为一个国家现代化科技水平的重要标志。单片机可单独地完成现代工业控制所要求的智能化控制功能,这是单片机最大的特征。单片机控制系统能够取代以前利用复杂电子线路或数字电路构成的控制系统,可以软件控制来实现,并能够实现智能化。现在单片机控制范畴无所不在,例如通信产品、家用电器、智能仪器仪表、过程控制和专用控制装置等等,单片机的应用领域越来越广泛。本次课程设计的课题是“基于单片机的多路数字电压表的设计”。主要考核我们对单片机技术,编程能力等方面的情况。观察独立分析、设计单片机的能力,以及实际编程技能。传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字电压表,由精度高、抗干扰能力强,可扩展性强、集成方便。通过单片机,采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表,使测得的结果更为精准。本课题主要解决A/D转换、数据处理及显示控制等三个模块。控制系统采用STC89S52单片机,A/D转换采用ADC0809。第一章1.1设计内容及步骤1、设计和调试一种基于单片机的数字直流电压表。要求具有如下功能:(1)测量范围:直流电压0~5V。(2)显示:用四位LED数码管显示。(3)测量最小分辨率:0.02V。1.2设计方案基于单片机的多路数字电压表电路的基本组成如图1所示。图1基于单片机的多路数字电压表电路的原理框图根据设计要求,采用的方案如下。硬件部分实现数据的采集、编译,A/D转换以及显示的功能,包括单片机电路模块、A/D转换器模块、数码管显示电路模块、按键处理电路模块;软件部分实现控制芯片,使各部件能够正常的运行,同时实现仿真的功能,主要设计思想是利用软件进行仿真,通过仿真得到实验的结果。多路数字式电压表应用系统主要利用A/D转换器,先用A/D转换器对各路电压值进行采样,得到相应的数字量,再按数字量与模拟量成正比关系运算得到对应的模拟电压值,然后把模拟值通过显示器显示出来。根据系统功能要求,控制系统采用AT89C52单片机,A/D转换器采用ADC0809。ADC0809是8位的A/D转换器。当输入电压为5.00v时,输出的数据值为255(0FFH),因此最大的分辨率为0.0196v(5/255)。ADC0809具有8路模拟输入端,通过3位地址输入端的地址,就能依次对8路中选择一路进行转换。如每隔一段时间依次轮流改变3位地址输入端的地址,就能依次对8路输入电压进行测量。LED数码管显示采用软件译码动态显示。通过按键选择可8路循环显示,也可单路显示,单路显示可通过按键选择显示通道数。第二章2.1硬件电路图输入电路A/D转换器单片机89C52LED数码显示第三章3.1A/D转换器电路模块:ADC0809:(1)IN0~IN7——8路模拟输入,通过3根地址译码线ADDA、ADDB、ADDC来选通一路。(2)D7~D0——A/D转换后的数据输出端,为三态可控输出,故可直接和微处理器数据线连接。8位排列顺序是D7为最高位,D0为最低位。(3)ADDA、ADDB、ADDC——模拟通道选择地址信号,ADDA为低位,ADDC为高位。地址信号与选中通道对应关系如表11.3所示。(4)VR(+)、VR(-)——正、负参考电压输入端,用于提供片内DAC电阻网络的基准电压。在单极性输入时,VR(+)=5V,VR(-)=0V;双极性输入时,VR(+)、VR(-)分别接正、负极性的参考电压。(5)ALE——地址锁存允许信号,高电平有效。当此信号有效时,A、B、C三位地址信号被锁存,译码选通对应模拟通道。在使用时,该信号常和START信号连在一起,以便同时锁存通道地址和启动A/D转换。(6)START——A/D转换启动信号,正脉冲有效。加于该端的脉冲的上升沿使逐次逼近寄存器清零,下降沿开始A/D转换。如正在进行转换时又接到新的启动脉冲,则原来的转换进程被中止,重新从头开始转换。(7)EOC——转换结束信号,高电平有效。该信号在A/D转换过程中为低电平,其余时间为高电平。该信号可作为被CPU查询的状态信号,也可作为对CPU的中断请求信号。在需要对某个模拟量不断采样、转换的情况下,EOC也可作为启动信号反馈接到START端,但在刚加电时需由外电路第一次启动。(8)OE——输出允许信号,高电平有效。当微处理器送出该信号时,ADC0808/0809的输出三态门被打开,使转换结果通过数据总线被读走。在中断工作方式下,该信号往往是CPU发出的中断请求响应信号。3)工作时序与使用说明ADC0808/0809的工作时序如图11.21所示。当通道选择地址有效时,ALE信号一出现,地址便马上被锁存,这时转换启动信号紧随ALE之后(或与ALE同时)出现。START的上升沿将逐次逼近寄存器SAR复位,在该上升沿之后的2μs加8个时钟周期内(不定),EOC信号将变低电平,以指示转换操作正在进行中,直到转换完成后EOC再变高电平。微处理器收到变为高电平的EOC信号后,便立即送出OE信号,打开三态门,读取转换结果。表11.3地址信号与选中通道的关系地址选中通道ADDCADDBADDA000011110011001101010101IN0IN1IN2IN3IN4IN5IN6IN73.2数码管显示电路模块:LED数码管采用动态扫描方式连接,通过89C52的P1口和P3.0—P3.3口控制。P1口为LED数码管的字段码输出端,P3.0—P3.3口为LED数码管的位选码输出端,通过三极管驱动并反相共阳极数码管引脚图:PNP型三极管引脚图:MC14024分频芯片3.3单片机电路模块:STC89C52单片机·P2口:P2是一个带内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。·XTAL1:振荡器反相放大器及内部时钟放大器的输入端。74ls24474LS244为3态8位缓冲器,一般用作总线驱动器。74LS244没有锁存的功能。地址锁存器就是一个暂存器,它根据控制信号的状态,将总线上地址代码暂存起来。8086/8088数据和地址总线采用分时复用操作方法,即用同一总线既传输数据又传输地址。第四章4.1程序编写//测量电压最大值为5V,显示最大值为5.00V//使用STC89C52单片机,12MHz晶振,P0口读入A/D值,P2口为A/D转换控制口//数码管为共阳极连接,P1口为字段码口,P3口为位选口//KEY1(P3.5)为单路/循环显示转换按键//KEY2(P3.6)为单路显示时当前通道选择按键//FLAG为单路/循环显示控制位,当为0时循环显示,为1时单路显示//主函数#includereg52.hexterntest();externscan();main(){P0=0xff;//初始化端口P2=0x00;P1=0xff;//初始化为0通道P3=0xff;while(1){test();//测量转换数据scan();//显示数据}}//1ms延时子函数#defineuintunsignedintvoiddelay1ms(uintt){uinti,j;for(i=0;it;i++)for(j=0;j120;j++);}//检测按键子函数#includereg52.h#defineucharunsignedcharsbitKEY1=P3^5;//循环或单路显示选择按键sbitKEY2=P3^6;//通道选择按键sbitFLAG=PSW^0;//循环或单路显示标志位externucharnumber;//存放单通道显示时的当前通道数keytest(){if(KEY1==0)//检测循环或淡路选择按键是否按下?{FLAG=~FLAG;//标志位取反,循环、淡路显示间切换while(KEY1==0);}if(FLAG==1)//单路显示方式,检测通道选择按键是否按下?{if(KEY2==0){number++;//通道数+1if(number==8){number=0;}while(KEY2==0);}}}//显示扫描子函数#includereg52.h#definedisdataP1//数码管的字段码输出口#defineucharunsignedchar#defineuintunsignedintvoiddelay1ms(uintt);ucharnumber=0x00;sbitDISX=disdata^7;//小数点位sbitFLAG=PSW^0;//循环或单路显示标志位ucharcodedis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};//LED的七段数码管的字段码(0-9,灭)ucharcodescan_con[4]={0xfe,0xfd,0xfb,0xf7};//LED数码管的位选码uintdatadis[5]={0x00,0x00,0x00,0x00,0x00};//前4个为LED数码管的显示缓冲区,最后一个为暂存单元externuchardataad_data[8];//ADC0809的8个通道转换数据缓冲区externkeytest();scan(){uchark,n;inth;if(FLAG==0)//循环显示子程序{dis[3]=0x00;//通道值清0for(n=0;n8;n++)//8路通道{dis[2]=ad_data[n]/51;//当前通道数据转换为BCD码存入显示缓冲区dis[4]=ad_data[n]%51;//余数(电压小数位)送暂存单元dis[4]=dis[4]*10;//余数×10dis[1]=dis[4]/51;dis[4]=dis[4]%51;dis[4]=dis[4]*10;dis[0]=dis[4]/51;for(h=0;h500;h++)//每个通道显示1s{for(k=0;k4;k++)//4位LED扫描显示{disdata=dis_7[dis[k]];if(k==2){DISX=0;}//点亮小数点P3=scan_con[k];delay1ms(1);P3=0xff;}}dis[3]+