《中原工学院单片机课程设计-数据采集系统.docx》由会员分享,可在线阅读,更多相关《中原工学院单片机课程设计-数据采集系统.docx(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、20180825目 录一设计要求1二相关技术22.1 51单片机简介22.2 A/D转换器芯片ADC0809简介42.3 D/A转换器芯片DAC0832简介6三. 系统设计83.1硬件设计83.2软件设计14四. 硬件实际调试及操作说明154.1 程序下载调试154.2 操作说明15五体会及总结15六附录17一设计要求1.数据采集系统从键盘中任意选出6个键作为系统的功能键和LED数码显示一起组成一个单片机键盘显示系统(小的监控程序),并通过实验箱上的接口芯片实现相应的功能(注:这些硬件电路全在实验箱上,但自己要能设计)。要求设计相应的硬件电路,并画出实现题目要求功能的流程图,编写、调试相应的程
2、序。编程要求:设定加一开机后显示班级号(4位),学号(2位)(复位状态),然后通过功能键设置参数,而后运行主程序。6个功能键为:运行减一换位确定设置参数步骤:复位状态下,按下“设定”键后6位显示的状态为:显示设定值显示参数行号888801四位设定值中的某一位小数点亮(或者整个值闪烁),表示对该位进行设置。用“加一”、“减一”键改变该位的值,用“换位”键改变设置位(由左到右),用“确定”键保存设定的值。本次设计要求能设置四行(路)参数即可,每行(路)参数在09999之间,当连续按“确定”键时,对应的行(路)号(上图)从0104循环变化。按下“运行”键,执行不同的程序,共有三种要求,每位同学只需完
3、成其中一种要求即可或自愿全做:1、执行数据采集程序(参考硬件实验十四,但要求不同),采集模拟量05V,显示对应的物理量在00001000之间变化。5V对应的显示值是多少可以在设定时通过参数设置选择(选择其中一路作为5V对应值)。2、执行数据采集程序,采集模拟量05V,显示对应的物理量在000500变化,当采集值大于设定值的10%时,声光报警(自定方式),设定值在200400之间任意确定,运行前通过键盘给定,采集值恢复正常时,报警自动解除。3、执行温度采集程序,显示温度值(参考实验二十三),当温度大于设定值(2535之间)时,让直流电机转动,温度越高,转速越快,转速不做具体要求,只要能用肉眼看出
4、变化即可。温度设定值通过键盘给定。二相关技术单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。单片机由运算器、控制器、存储器、输入输出设备构成,相当于一个微型的计算机(最小系统),和计算机相比,单片机缺少了外围设备等。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。它最早是被用在工业控制领域。由于单片机在工业控制领域的广泛应用,单片机由仅有CPU的专用处理器芯片发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。本
5、次课称设计采用的单片机是51系列单片机,试验箱上的单片机是用FPGA模拟的。2.1 51单片机简介51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。89C52内置8位中央处理单元、512字节内部数据存储器ROM、8k片内程序存储器(R
6、AM)32个双向输入/输出(I/O)口、2个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。此外,89C51还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。图2-1 51单片机引脚图管脚说明:VCC:供电电压。 GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8个TTL门电流。当P0口的管脚第一次写“1”时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8
7、位双向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”时,它利用内部上拉优势,当对外部八位地址
8、数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口作为AT89C51的一些特殊功能口,管脚备选功能。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的底位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在
9、平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA / VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-
10、FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。2.2 A/D转换器芯片ADC0809简介ADC0809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。目前仅在单片机初学应用设计中较为常见。图2-2 ADC0809管脚图IN0IN7
11、:8个通道的模拟量输入端。可输入05V待转换的模拟电压。各引脚的功能如下:D0D7:8位转换结果输出端。三态输出,D7是最高位,D0是最低位。A、B、C:通道选择端。当CBA=000时,IN0输入;当CBA=111时,IN7输入。ALE:地址锁存信号输入端。该信号在上升沿处把A、B、C的状态锁存到内部的多路开关的地址锁存器中,从而选通8路模拟信号中的某一路。START:启动转换信号输入端。从START端输入一个正脉冲,其下降沿启动ADC0809开始转换。脉冲宽度应不小于100200ns。EOC:转换结束信号输出端。启动A/D转换时它自动变为低电平。OE:输出允许端。CLK:时钟输入端。ADC0
12、809的典型时钟频率为640kHz,转换时间约为100s。REF(-)、REF(+):参考电压输入端。ADC0809的参考电压为5V。VCC、GND:供电电源端。ADC0809使用5V单一电源供电。当ALE为高电平时,通道地址输入到地址锁存器中,下降沿将地址锁存,并译码。在START上升沿时,所有的内部寄存器清零,在下降沿时,开始进行A/D转换,此期间START应保持低电平。在START下降沿后10us左右,转换结束信号变为低电平,EOC为低电平时,表示正在转换,为高电平时,表示转换结束。OE为低电平时,D0D7为高阻状态,OE为高电平时,允许转换结果输出。2.3 D/A转换器芯片DAC083
13、2简介DAC0832是8分辨率的D/A转换集成芯片。与微处理器完全兼容。这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。图2-3 DAC0832管脚图* D0D7:8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错);* ILE:数据锁存允许控制信号输入线,高电平有效;* CS:片选信号输入线(选通数据锁存器),低电平有效;* WR1:数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。由ILE、CS、WR1的逻辑组合产生LE1,当LE
14、1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;* XFER:数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;* WR2:DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。由WR2、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。* IOUT1:电流输出端1,其值随DAC寄存器的内容线性变化;* IOUT2:电流输出端2,其值与IOUT1值之和为一常数;* Rfb:反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度
15、;* Vcc:电源输入端,Vcc的范围为+5V+15V;* VREF:基准电压输入线,VREF的范围为-10V+10V;* AGND:模拟信号地;* DGND:数字信号地。三. 系统设计3.1硬件设计本次的课程设计的所需的设备是:伟福系列单片机仿真的试箱,PC机。在搭建硬件电路时是以试验箱为设计平台,试验箱各部分电路由74HC138译码选通,使用时将相应的芯片端口以、信号采集端口以及必要的端口用导线正确连接即可。图3-1 试验箱面板图3-2 片选译码电路1. ADC0809部分电路 ADC0809与8051单片机的硬件接口有3种形式,分别是查询方式、中断方式和延时等待方式,本题中选用延时等待方
16、式。由于ADC0809无片内时钟,时钟信号可由单片机的ALE信号经D触发器二分频后获得。ALE引脚得脉冲频率是8051时钟频率的1/6。该题目中单片机时钟频率采用12MHz,则ALE输出的频率是2MHz,二分频后为1MHz,符合ADC0809对频率的要求。图3-3 ADC0809电路由试验箱硬件可知:(1)CS0809芯片的片选端口接在CS1上,此时芯片地址为9000H,数码管显示口接在CS0上面,对应数码管段选地址为8002H,位选地址为8002H,电位器的输出口接在CS0809 的IN0通道上。所选用的按键为试验箱上面4*6按键中最下面的四个按键以及A、B按键。其功能依次是:“设定”键、“
17、加一”键、“减一”键、“换位”键、“确定”键、“运行”键。2. 温度传感器电路图3-3 温度传感器电路上图是一个较常用的温度测量电路,大致分成电源,电阻电桥,运放,输出四部分。电源由R4、R6、C1、U1B 组成,R4、R6 为分压电路,C1 主要滤除VCC 中纹波,U1B 为LM324 运算放大器,工作于电压跟随器方式,其特点是具有高输入阻抗低输出阻抗,为后级电桥提供较稳定的电流。电桥由R1、R2、R3、R13 及热敏电阻组成,通过调节R13 使电桥平衡,当温度发生变化时,热敏电阻阻变化,电桥产生电压差。运放电路由R7、R8、R9、R10 及U1A 组成,这是一种灵敏度较高的电桥放大电路,放
18、大倍数由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. 键盘显示电路显示电路和键盘电路工作在内
19、驱方式:内驱是用CPU 总线方式驱动,通过总线读写外部设备的地址来控制显示和读入键盘码;外部驱动方式是直接用IO 方式驱动八段显示的段码、位码和键盘按键信息,这里的IO 控制可以用CPU 的IO 口来实现控制,也可通过8255等IO 扩展电路来控制。内驱、外驱由板上的拨动开关控制。图3-5 键盘接口电路图3-6 键盘显示总线电路将拨动开关拨到“内驱”位置,显示和键盘工作于内驱方式 ,显示控制的位码通过总线由74HC374 输出,经ULN2003 反向驱动后,做LED 数码管的位选通信号。位选通信号也可做为键盘列扫描码,键盘扫描的行数据从74HC245 读回,374 输出的列扫描码经245 读入
20、后,用来判断是否有键被按下,以及按下的是什么键。如果没有键按下,由于上拉电阻的作用,经245 读回的值为高,如果有键按下,374 输出的低电平经过按键被接到245 的端口上,这样从245 读回的数据就会有低位,根据374 输出的列信号和245 读回的行信号,就可以判断哪个键被按下。LED 数码管显示的段码由另一个74HC374 输出。键盘和LED 数码管显示电路的地址译码见下图,做键盘和LED 实验时,需将KEY/LED CS 接到相应的地址译码上。位码输出地址为0X002H,段码输出地址为0X004H,键盘行码读回地址为0X001H,此处X 是地址高四位,由KEY/LED CS 决定。将KE
21、Y/LED CS 接到地址译码的CS0上,那么位码输出地址就为08002H,段码输出地址就是08004H,键盘行码读回地址为08001H。3.2软件设计本次设计使用C语言,流程图如下:软件代码部分见附录。四. 硬件实际调试及操作说明4.1 程序下载调试(1)首先按照硬件设计要求的说明将伟福实验箱上所需要的相应的导线进行连接。确保连接无误(2)将在电脑上仿真过的程序用伟福集成调试软件(WAVE8000集成调试软件)进行编译调试。(如出现问题及时在上面进行改正,直到编译无错误出现为止)(3)在(2)完成后,点击运行(软件自动将编译好的程序下载到实验箱上面)数码管会出现相应的相应。4.2 操作说明编
22、写程序时所选用的按键为试验箱上面4*6按键中最下面的四个按键以及A、B按键。其功能从左至右一次是:“设定”键、“加一”键、“减一”键、“换位”键、“确定”键、“运行”键。1.在程序下载到实验箱上后,六个八段会显示:0132252.在按下设定键时:前四位数码管是显示8888,后两位显示01。3.第一路参数为AD转换最大值,第二路为AD设定值,第三路为温度采集系数,第四路为温度设定值。4.此时按下加一或者减一键数码管数值将发生相应的增减。按下换位键小数点右移以为,此时可以对其进行操作(加减运算)。5.按下确定键会将调整好的数值进行保存。此数值就是在下面执行运行键后。AD转换能显示的最大值。6.按下
23、运行键,调节滑动变阻器,数码管上面的数字会及时发生相应的变化。从而达到数据采集的要求。当数据显示超过设定值的10%时,数码管最右端显示- -,表示报警。五体会及总结接到设计任务,经过分析后。最终选择了单片机数据采集的设计任务。首先是对设计任务的分解,该任务用到了本学期学到的A/D转换、A/D转换、数码管显示、键盘等基本模块。因为这是一次比较综合性的设计,所以对各个模块代码间的调用要求比较高。开始我并不会用键盘检测,只能用拨码开关代替独立按键,非常不方便。后来请教了彭老师并参考了例程才渐渐学会了矩阵键盘的使用。调试代码是非常辛苦的,往往编译出来的都是很多的错误,非常头疼。经过我不懈的努力,编译终
24、于通过了。经过调试,程序基本符合设计要求。此次的设计,其实也是我们所学知识的一次综合运用,让我深深的认识到了学习单片机要有一定的基础,要有电子技术方面的数字电路和模拟电路等方面的理论基础,特别是数字电路;也要有编程语言的汇编语言或C语言。要想成为单片机高手,我们首先要学好汇编语言,然后转入C语言学习,所以我们不能学到后面就忘了前面的知识,更应该将所学的知识紧紧的结合在一起,综合运用,所谓设计,就是要求创新,只有将知识综合运用起来才能真正的设计好。六附录1课程设计源程序#include#define uchar unsigned char#define uint unsigned int#def
25、ine LowTemp (-99) / A/D 0#define HighTemp 99 / A/D 255/*端口定义*/xdata uchar OUT_SEG _at_ 0x8004;xdata uchar OUT_BIT _at_ 0x8002;xdata uchar KEY_IN _at_ 0x8001;xdata uchar IN0 _at_ 0x9000;xdata uchar IN1 _at_ 0x9001;xdata uchar IN2 _at_ 0x0A000;#define k_seting 0x00#define k_inc 0x0f#define k_dec 0x0e#
26、define k_shift 0x0d#define k_ok 0x0a#define k_run 0x0b#define f_row1 1#define f_row2 2#define f_row3 3#define f_row4 4/*全局变量定义*/signed char CurTemp;uchar led_buf6 = 0,1,3,2,2,5;/显示值缓存uchar seg_buf6 = 0,0,0,0,0,0;/段码值缓存uchar v_bit6 = 0x20,0x10,0x08,0x04,0x02,0x01;/位码缓存/*段码(共阴极)*/uchar v_seg19 = 0x3f,
27、 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, /0-70x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, /8-150x40,0x64,0x00 ;/自定义1,自定义2,灭uchar row1_buf6 = 8,8,8,8,0,1;/第1行显示值缓存uchar row2_buf6 = 0,0,0,0,0,2;/第2行显示值缓存uchar row3_buf6 = 0,0,0,0,0,3;/第3行显示值缓存uchar row4_buf6 = 0,0,0,0,0,4;/第4行显示值缓存uchar flag_key=0
28、, flag_row=f_row4, flag_shift=0 ,flag_tem=0;uchar k_AD;/AD值放大倍数uint v_AD=0 ;/读取的AD值uint max_AD ;/AD的设定最大值uint set_AD ;uint max_tem ;uint set_tem ;/*延时*/void delay(uchar ms) uchar i,j; for(i=0;ims;i+) for(j=0;j= 1; k = KEY_IN & 0x0f; while (-i != 0) & (k = 0); / 键值 = 列 x 4 + 行 if (k != 0) i *= 4; if
29、(k & 2) i += 1; else if (k & 4) i += 2; else if (k & 8) i += 3; OUT_BIT = 0; do delay(10); while (TestKey(); / 等键释放 return(KeyTablei); / 取出键码 else return(0xff);unsigned char ReadAD() unsigned int i; / 启动A/D变换 IN1 = 0; /延时100us, for (i=0; i0; i+); /得到A/D采样值 return (0xff - IN1);void ReadTemp() unsigne
30、d char i; signed int Temp; Temp = 0; /采样16次,取平均数 for (i=0; i 4) * (HighTemp-LowTemp) / 256 + LowTemp;/*读ADC0809*/uchar read_ad()static uchar v_AD=0;IN0=0 ;/启动ADdelay(1);v_AD=IN0 ;/读ADreturn v_AD ;/*DAC0832*/void start_da(uchar tmp)/static uchar v_tmp=0;IN2=tmp ;/启动ADdelay(1);/v_tmp=tmp ;/读AD/return
31、v_tmp ;/* 显示值缓存段码值缓存 */void value2seg(uchar v_buf6) uchar i; for(i=0;i6;i+) seg_bufi=v_seg v_bufi ;/*数码管显示*/void display_led()uchar i;for(i=0;i set_AD*0.1)led_buf4=16;led_buf5=16;value2seg(led_buf);if(flag_tem) signed char T; ReadTemp(); T = CurTemp; /v_AD=(unsigned long)v_AD*max_AD/255; /led_buf0=18; led_buf1=18; /led_buf2=v_AD%100/10; /led_buf3=v_AD%100%10; led_buf2=T / 10; led_buf3=T % 10; led_buf4=18; led_buf5=18; value2seg(led_buf);