中原工学院单片机课程设计-数据采集系统_第1页
中原工学院单片机课程设计-数据采集系统_第2页
中原工学院单片机课程设计-数据采集系统_第3页
中原工学院单片机课程设计-数据采集系统_第4页
中原工学院单片机课程设计-数据采集系统_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中原工学院课程设计报告专用纸目录一.设计要求 一.设计要求1.数据采集系统从键盘中任意选出6个键作为系统的功能键和LED数码显示一起组成一个单片机键盘显示系统(小的监控程序),并通过实验箱上的接口芯片实现相应的功能(注:这些硬件电路全在实验箱上,但自己要能设计)。要求设计相应的硬件电路,并画出实现题目要求功能的流程图,编写、调试相应的程序。编程要求:设定加一开机后显示班级号(4位),学号(2位)(复位状态),然后通过功能键设置参数,而后运行主程序。6个功能键为:运行减一换位确定设置参数步骤:复位状态下,按下“设定”键后6位显示的状态为:显示设定值显示参数行号888801四位设定值中的某一位小数点亮(或者整个值闪烁),表示对该位进行设置。用“加一”、“减一”键改变该位的值,用“换位”键改变设置位(由左到右),用“确定”键保存设定的值。本次设计要求能设置四行(路)参数即可,每行(路)参数在0-9999之间,当连续按“确定”键时,对应的行(路)号(上图)从01-04循环变化。按下“运行”键,执行不同的程序,共有三种要求,每位同学只需完成其中一种要求即可或自愿全做:1、执行数据采集程序(参考硬件实验十四,但要求不同),采集模拟量0-5V,显示对应的物理量在0000-1000之间变化。5V对应的显示值是多少可以在设定时通过参数设置选择(选择其中一路作为5V对应值)。2、执行数据采集程序,采集模拟量0-5V,显示对应的物理量在000-500变化,当采集值大于设定值的10%时,声光报警(自定方式),设定值在200-400之间任意确定,运行前通过键盘给定,采集值恢复正常时,报警自动解除。3、执行温度采集程序,显示温度值(参考实验二十三),当温度大于设定值(25℃-35二.相关技术单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。单片机由运算器、控制器、存储器、输入输出设备构成,相当于一个微型的计算机(最小系统),和计算机相比,单片机缺少了外围设备等。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。它最早是被用在工业控制领域。由于单片机在工业控制领域的广泛应用,单片机由仅有CPU的专用处理器芯片发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。本次课称设计采用的单片机是51系列单片机,试验箱上的单片机是用FPGA模拟的。2.151单片机简介51单片机是对所有兼容Intel8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flashrom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。89C52内置8位中央处理单元、512字节内部数据存储器ROM、8k片内程序存储器(RAM)32个双向输入/输出(I/O)口、2个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。此外,89C51还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。图2-151单片机引脚图管脚说明:VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8个TTL门电流。当P0口的管脚第一次写“1”时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4个TTL门电流。P1口管脚写入“1”后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口作为AT89C51的一些特殊功能口,管脚备选功能。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的底位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALE才起用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。2.2A/D转换器芯片ADC0809简介ADC0809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。目前仅在单片机初学应用设计中较为常见。图2-2ADC0809管脚图IN0~IN7:8个通道的模拟量输入端。可输入0~5V待转换的模拟电压。各引脚的功能如下:D0~D7:8位转换结果输出端。三态输出,D7是最高位,D0是最低位。A、B、C:通道选择端。当CBA=000时,IN0输入;当CBA=111时,IN7输入。ALE:地址锁存信号输入端。该信号在上升沿处把A、B、C的状态锁存到内部的多路开关的地址锁存器中,从而选通8路模拟信号中的某一路。START:启动转换信号输入端。从START端输入一个正脉冲,其下降沿启动ADC0809开始转换。脉冲宽度应不小于100~200ns。EOC:转换结束信号输出端。启动A/D转换时它自动变为低电平。OE:输出允许端。CLK:时钟输入端。ADC0809的典型时钟频率为640kHz,转换时间约为100μs。REF(-)、REF(+):参考电压输入端。ADC0809的参考电压为+5V。VCC、GND:供电电源端。ADC0809使用+5V单一电源供电。当ALE为高电平时,通道地址输入到地址锁存器中,下降沿将地址锁存,并译码。在START上升沿时,所有的内部寄存器清零,在下降沿时,开始进行A/D转换,此期间START应保持低电平。在START下降沿后10us左右,转换结束信号变为低电平,EOC为低电平时,表示正在转换,为高电平时,表示转换结束。OE为低电平时,D0~D7为高阻状态,OE为高电平时,允许转换结果输出。2.3D/A转换器芯片DAC0832简介DAC0832是8分辨率的D/A转换集成芯片。与微处理器完全兼容。这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。图2-3DAC0832管脚图*D0~D7:8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错);*ILE:数据锁存允许控制信号输入线,高电平有效;*CS:片选信号输入线(选通数据锁存器),低电平有效;*WR1:数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;*XFER:数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;*WR2:DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。由WR2、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。*IOUT1:电流输出端1,其值随DAC寄存器的内容线性变化;*IOUT2:电流输出端2,其值与IOUT1值之和为一常数;*Rfb:反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;*Vcc:电源输入端,Vcc的范围为+5V~+15V;*VREF:基准电压输入线,VREF的范围为-10V~+10V;*AGND:模拟信号地;*DGND:数字信号地。三.系统设计3.1硬件设计本次的课程设计的所需的设备是:伟福系列单片机仿真的试箱,PC机。在搭建硬件电路时是以试验箱为设计平台,试验箱各部分电路由74HC138译码选通,使用时将相应的芯片端口以、信号采集端口以及必要的端口用导线正确连接即可。图3-1试验箱面板图3-2片选译码电路1.ADC0809部分电路ADC0809与8051单片机的硬件接口有3种形式,分别是查询方式、中断方式和延时等待方式,本题中选用延时等待方式。由于ADC0809无片内时钟,时钟信号可由单片机的ALE信号经D触发器二分频后获得。ALE引脚得脉冲频率是8051时钟频率的1/6。该题目中单片机时钟频率采用12MHz,则ALE输出的频率是2MHz,二分频后为1MHz,符合ADC0809对频率的要求。图3-3ADC0809电路由试验箱硬件可知:(1)CS0809芯片的片选端口接在CS1上,此时芯片地址为9000H,数码管显示口接在CS0上面,对应数码管段选地址为8002H,位选地址为8002H,电位器的输出口接在CS0809的IN0通道上。所选用的按键为试验箱上面4*6按键中最下面的四个按键以及A、B按键。其功能依次是:“设定”键、“加一”键、“减一”键、“换位”键、“确定”键、“运行”键。2.温度传感器电路图3-3温度传感器电路上图是一个较常用的温度测量电路,大致分成电源,电阻电桥,运放,输出四部分。电源由R4、R6、C1、U1B组成,R4、R6为分压电路,C1主要滤除VCC中纹波,U1B为LM324运算放大器,工作于电压跟随器方式,其特点是具有高输入阻抗低输出阻抗,为后级电桥提供较稳定的电流。电桥由R1、R2、R3、R13及热敏电阻组成,通过调节R13使电桥平衡,当温度发生变化时,热敏电阻阻变化,电桥产生电压差。运放电路由R7、R8、R9、R10及U1A组成,这是一种灵敏度较高的电桥放大电路,放大倍数由R9/R8得到。输出电路由R4、R12、R14、D1组成,调节R14可以调整输出电压幅度。D1主要用于防止输出负电压,保护后级A/D电路。温度传感器电路的输出口接在CS0809的IN1通道上,此时其地址为9001H。3.DAC0832电路实验箱上提供了D/A转换电路如下图所示。我们可以通过软件编程控制D/A转换芯片DAC0832,输出相应电流值,经过采样电路取出模拟量电压值,用电压表测量电压输出端子,读出电压值。DA/CS接CS2,此时DAC0832的地址为0A000H。DAC0832输出接电机输入。图3-4温度传感器电路4.键盘显示电路显示电路和键盘电路工作在内驱方式:内驱是用CPU总线方式驱动,通过总线读写外部设备的地址来控制显示和读入键盘码;外部驱动方式是直接用IO方式驱动八段显示的段码、位码和键盘按键信息,这里的IO控制可以用CPU的IO口来实现控制,也可通过8255等IO扩展电路来控制。内驱、外驱由板上的拨动开关控制。图3-5键盘接口电路图3-6键盘显示总线电路将拨动开关拨到“内驱”位置,显示和键盘工作于内驱方式,显示控制的位码通过总线由74HC374输出,经ULN2003反向驱动后,做LED数码管的位选通信号。位选通信号也可做为键盘列扫描码,键盘扫描的行数据从74HC245读回,374输出的列扫描码经245读入后,用来判断是否有键被按下,以及按下的是什么键。如果没有键按下,由于上拉电阻的作用,经245读回的值为高,如果有键按下,374输出的低电平经过按键被接到245的端口上,这样从245读回的数据就会有低位,根据374输出的列信号和245读回的行信号,就可以判断哪个键被按下。LED数码管显示的段码由另一个74HC374输出。键盘和LED数码管显示电路的地址译码见下图,做键盘和LED实验时,需将KEY/LEDCS接到相应的地址译码上。位码输出地址为0X002H,段码输出地址为0X004H,键盘行码读回地址为0X001H,此处X是地址高四位,由KEY/LEDCS决定。将KEY/LEDCS接到地址译码的CS0上,那么位码输出地址就为08002H,段码输出地址就是08004H,键盘行码读回地址为08001H。3.2软件设计本次设计使用C语言,流程图如下:软件代码部分见附录。

四.硬件实际调试及操作说明4.1程序下载调试(1)首先按照硬件设计要求的说明将伟福实验箱上所需要的相应的导线进行连接。确保连接无误(2)将在电脑上仿真过的程序用伟福集成调试软件(WAVE8000集成调试软件)进行编译调试。(如出现问题及时在上面进行改正,直到编译无错误出现为止)(3)在(2)完成后,点击运行(软件自动将编译好的程序下载到实验箱上面)数码管会出现相应的相应。4.2操作说明编写程序时所选用的按键为试验箱上面4*6按键中最下面的四个按键以及A、B按键。其功能从左至右一次是:“设定”键、“加一”键、“减一”键、“换位”键、“确定”键、“运行”键。1.在程序下载到实验箱上后,六个八段会显示:0132252.在按下设定键时:前四位数码管是显示8888,后两位显示01。3.第一路参数为AD转换最大值,第二路为AD设定值,第三路为温度采集系数,第四路为温度设定值。4.此时按下加一或者减一键数码管数值将发生相应的增减。按下换位键小数点右移以为,此时可以对其进行操作(加减运算)。5.按下确定键会将调整好的数值进行保存。此数值就是在下面执行运行键后。AD转换能显示的最大值。6.按下运行键,调节滑动变阻器,数码管上面的数字会及时发生相应的变化。从而达到数据采集的要求。当数据显示超过设定值的10%时,数码管最右端显示--,表示报警。

五.体会及总结接到设计任务,经过分析后。最终选择了单片机数据采集的设计任务。首先是对设计任务的分解,该任务用到了本学期学到的A/D转换、A/D转换、数码管显示、键盘等基本模块。因为这是一次比较综合性的设计,所以对各个模块代码间的调用要求比较高。开始我并不会用键盘检测,只能用拨码开关代替独立按键,非常不方便。后来请教了彭老师并参考了例程才渐渐学会了矩阵键盘的使用。调试代码是非常辛苦的,往往编译出来的都是很多的错误,非常头疼。经过我不懈的努力,编译终于通过了。经过调试,程序基本符合设计要求。此次的设计,其实也是我们所学知识的一次综合运用,让我深深的认识到了学习单片机要有一定的基础,要有电子技术方面的数字电路和模拟电路等方面的理论基础,特别是数字电路;也要有编程语言的汇编语言或C语言。要想成为单片机高手,我们首先要学好汇编语言,然后转入C语言学习,所以我们不能学到后面就忘了前面的知识,更应该将所学的知识紧紧的结合在一起,综合运用,所谓设计,就是要求创新,只有将知识综合运用起来才能真正的设计好。

六.附录1.课程设计源程序#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint#defineLowTemp(-99)//A/D0#defineHighTemp99//A/D255/*****************************************端口定义*****************************************/xdataucharOUT_SEG_at_0x8004;xdataucharOUT_BIT_at_0x8002;xdataucharKEY_IN_at_0x8001;xdataucharIN0_at_0x9000;xdataucharIN1_at_0x9001;xdataucharIN2_at_0x0A000;#definek_seting0x00#definek_inc0x0f#definek_dec0x0e#definek_shift0x0d#definek_ok0x0a#definek_run0x0b#definef_row11#definef_row22#definef_row33#definef_row44/*****************************************全局变量定义*****************************************/signedcharCurTemp;ucharled_buf[6]={0,1,3,2,2,5}; //显示值缓存ucharseg_buf[6]={0,0,0,0,0,0}; //段码值缓存ucharv_bit[6]={0x20,0x10,0x08,0x04,0x02,0x01};//位码缓存/*段码(共阴极)*/ucharv_seg[19]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//0--70x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,//8--15 0x40,0x64,0x00}; //自定义1,自定义2,灭ucharrow1_buf[6]={8,8,8,8,0,1}; //第1行显示值缓存ucharrow2_buf[6]={0,0,0,0,0,2}; //第2行显示值缓存ucharrow3_buf[6]={0,0,0,0,0,3}; //第3行显示值缓存ucharrow4_buf[6]={0,0,0,0,0,4}; //第4行显示值缓存ucharflag_key=0,flag_row=f_row4,flag_shift=0,flag_tem=0;uchark_AD; //AD值放大倍数uintv_AD=0; //读取的AD值uintmax_AD; //AD的设定最大值uintset_AD;uintmax_tem;uintset_tem;/****延时******/voiddelay(ucharms){uchari,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}codeunsignedcharKeyTable[]={//键码定义0x16,0x15,0x14,0xff,0x13,0x12,0x11,0x10,0x0d,0x0c,0x0b,0x0a,0x0e,0x03,0x06,0x09,0x0f,0x02,0x05,0x08,0x00,0x01,0x04,0x07};unsignedcharTestKey(){OUT_BIT=0;//输出线置为0return(~KEY_IN&0x0f);//读入键状态(高四位不用)}unsignedcharGetKey(){unsignedcharPos;unsignedchari;unsignedchark;i=6;Pos=0x20;//找出键所在列do{OUT_BIT=~Pos;Pos>>=1;k=~KEY_IN&0x0f;}while((--i!=0)&&(k==0));//键值=列x4+行if(k!=0){i*=4;if(k&2)i+=1;elseif(k&4)i+=2;elseif(k&8)i+=3;OUT_BIT=0;dodelay(10);while(TestKey());//等键释放return(KeyTable[i]);//取出键码}elsereturn(0xff);}unsignedcharReadAD(){unsignedinti;//启动A/D变换IN1=0;//延时100us,for(i=0;i<0;i++);//得到A/D采样值return(0xff-IN1);}voidReadTemp(){unsignedchari;signedintTemp;Temp=0;//采样16次,取平均数for(i=0;i<16;i++){Temp+=ReadAD();};//AD采样值转换为实际温度CurTemp=(Temp>>4)*(HighTemp-LowTemp)/256+LowTemp;}/****读ADC0809******/ucharread_ad(){ staticucharv_AD=0; IN0=0; //启动AD delay(1); v_AD=IN0; //读AD returnv_AD;}/****DAC0832******/voidstart_da(uchartmp){ //staticucharv_tmp=0; IN2=tmp; //启动AD delay(1); //v_tmp=tmp; //读AD //returnv_tmp;}/****显示值缓存>>>段码值缓存******/voidvalue2seg(ucharv_buf[6]){uchari;for(i=0;i<6;i++)seg_buf[i]=v_seg[v_buf[i]];}/****数码管显示******/voiddisplay_led(){ uchari; for(i=0;i<6;i++) { OUT_BIT=0x00; OUT_SEG=seg_buf[i]; OUT_BIT=v_bit[i]; delay(1); }}/****设置******/voidkeyscan(){if(TestKey())//if(P1!=0XFF) //有键按下 { delay(5);if(TestKey()) // if(P1!=0XFF) //真的按下 { flag_key=0;flag_tem=0; switch(GetKey()) { casek_seting:/*设定键*/ {if(++flag_row==5)flag_row=f_row1;//行号01-04循环变化 if(flag_row==f_row1) { value2seg(row1_buf); } elseif(flag_row==f_row2) { value2seg(row2_buf); } elseif(flag_row==f_row3) { value2seg(row3_buf); } else { value2seg(row4_buf); } seg_buf[flag_shift]|=0x80;//点亮设定位的小数点 }break; casek_inc:/*加号键*/ { if(flag_row==f_row1) { row1_buf[flag_shift]=(row1_buf[flag_shift]+1)%10; value2seg(row1_buf); } elseif(flag_row==f_row2) { row2_buf[flag_shift]=(row2_buf[flag_shift]+1)%10; value2seg(row2_buf); } elseif(flag_row==f_row3) { row3_buf[flag_shift]=(row3_buf[flag_shift]+1)%10; value2seg(row3_buf); } else { row4_buf[flag_shift]=(row4_buf[flag_shift]+1)%10; value2seg(row4_buf); } seg_buf[flag_shift]|=0x80;//点亮设定位的小数点 }break; casek_dec:/*减号键*/ { if(flag_row==f_row1) { if(--row1_buf[flag_shift]==255)row1_buf[flag_shift]=9; value2seg(row1_buf); } elseif(flag_row==f_row2) { if(--row2_buf[flag_shift]==255)row2_buf[flag_shift]=9; value2seg(row2_buf); } elseif(flag_row==f_row3) { if(--row3_buf[flag_shift]==255)row3_buf[flag_shift]=9; value2seg(row3_buf); } else { if(--row4_buf[flag_shift]==255)row4_buf[flag_shift]=9; value2seg(row4_buf); } seg_buf[flag_shift]|=0x80;//点亮设定位的小数点 }break; casek_shift: { seg_buf[flag_shift]&=0x7f; flag_shift=(flag_shift+1)%4; seg_buf[

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论