ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:296.20KB ,
资源ID:3731990      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3731990.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机课程设计数据采集系统的设计与实现.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

单片机课程设计数据采集系统的设计与实现.docx

1、单片机课程设计数据采集系统的设计与实现数据采集系统的设计与实现1 设计目的和要求分析设计一个数据采集系统,系统要采集10路模拟量(10位精度),20路开关量,采集的数据每隔1秒,通过串行通讯方式RS485向一台工控机传送。要求:1 选择合适的芯片;2 设计原理电路(包含译码电路);3 编制数据采集的程序段;4 编制数据通信程序段;本次任务是设计一个数据采集系统,系统要采集10路模拟量(10位精度),20路开关量,采集的数据每隔1秒,通过串行通讯方式RS485向一台工控机传送。由以上要求可知该系统设计可分为四个部分:模拟量采集电路、开光量采集电路、单片机与PC机的串口通讯电路及程序设计部分。下面

2、分别做详细的介绍。2 模拟量采集电路设计摸拟量的采集要用到A/D转换芯片,而且要求精度为10位,这里选择TLC1543A/D转换器。同时TLC1543有11路模拟通道输入满足采集10路模拟量的要求。TLC1543是一种低功耗、低电压的10位开关电容逐次逼近模数转换器,最大非线性误差小于1LSB,TLC1543A/D转换芯片有三个输入端和一个3态输出端片选CS、输入/输出时钟(I/O CLOCK)地址输入(ADDRESS) 和数据输出DATA OUT,这样就和主处理器的串行口有一个直接的4线接口。除了高速的转换器和通用的控制能力外, 这些器件有一个片内的14通道多路器可以选择11个输入中的任何一

3、个或 3 个内部自测试(self-test)电压中的一个。采样-保持是自动的。在转换结束时,“转换结束”(EOC)输出端变高以指示转换的完成。开关电容的设计可以使在整个温度范围内有较小的转换误差。TLC1543详细资料如下:(1) TLC1543引脚如下图1所示:图1 TLC1543引脚图(2)TLC1543工作时序图如下图所示: 图2 TLC1543工作时序图(3)TLC1543A/D芯片的数据读取程序设计A/D芯片的数据读取程序是根据TLC1543的工作时序来进行设计的。TLC1543工作时序如图2所示,其工作过程分为两个周期:访问周期和采样周期。工作状态由CS使能或禁止,工作时CS必须置

4、低电平。CS为高电平时,I/OCLOCK、ADDRESS被禁止,同时DATA OUT为高阻状态。当CPU使CS变低时,TLC1543开始数据转换,I/O CLOCK、ADDRESS使能,DATA OUT脱离高阻状态。随后,CPU向ADDRESS端提供4位通道地址,控制14个模拟通道选择器从11个外部模拟输入和3个内部自测电压中选通1路送到采样保持电路。同时,I/O CLOCK端输入时钟时序,CPU从DATA OUT 端接收前一次A/D转换结果。I/O CLOCK从CPU 接受10个时钟长度的时钟序列。前4个时钟用4位地址从ADDRESS端装载地址寄存器,选择所需的模拟通道,后6个时钟对模拟输入

5、的采样提供控制时序。模拟输入的采样起始于第4个I/O CLOCK的下降沿,而采样一直持续6个I/O CLOCK周期,并一直保持到第10个I/O CLOCK的下降沿。转换过程中,CS的下降沿使DATA OUT引脚脱离高阻状态并起动一次I/O CLOCK的工作过程。CS的上升沿终止这个过程并在规定的延迟时间内使DATA OUT引脚返回到高阻状态,经过两个系统时钟周期后禁止I/O CLOCK和ADDRESS端。TLC1543数据采集子程序流程图如图3所示。该程序通过CPU通道地址的写操作,发出A/D转换启动脉冲,启动以后CPU查询A/D转换是否结束,一旦结束CPU通过对通道地址的读操作读取数值,值得

6、注意的是在TLC1543启动后,从A/D转换时序可知EOC约在启动脉冲之后300ns才变为高电平。(4)模拟量通过TLC1543AD转换芯片与Atmega16单片机的接口电路TLC1543的三个控制输入端/CS、I/O CLK、ADDRESS和一个数据输出端DATA OUT遵循串行外设接口SPI协议,要求微处理器具有SPI接口。TLC1543芯片的三个输入端和一个输出端与单片机的I/O口直接连接。将放大后的模拟电压通过TLC1543与单片机的接口电路输出数字信号。其接口电路如图4所示。图4 TLC1543AD转换芯片与Atmega16单片机的接口电路图3 开关量采集电路设计系统要求实时采集20

7、路开关量,由于单片机I/O接口有限,故采用两片74LS165芯片16路并行输入转换成串行输入,剩余的4路开关量直接由单片机I/O进行采样。74LS165芯片介绍如下:(1)74LS165引脚如下图5所示: 图5 74LS165引脚图(2)74LS165引脚功能表如表1所示:表1 74LS165引脚功能表74LS165芯片是8位并行输入串行输出移位寄存器, 其中AH就是8位并行数据的输入端。Qh 和/Qh 是串行数据的输出端,SER是串行数据的输入端,CLK是时钟端,SH/LD是移位和锁存并行数据端。(3)74LS165时序功能图如图6所示: 图6 74LS165时序功能图(4)开关量通过74L

8、S165芯片与Atmega16单片机的接口电路开关量输入信号如下图所示:图7 开关量输入信号图当开关闭合时,经过非门作用开关量输入高电平“1”; 当开关断开时,经过非门作用开关量输入低电平“0”;20路开关量采集电路图如下所示,16路开关量通过74LS165芯片将并行输入转换成串行输入(PC0和PC1进行16路开关量采样),剩余的4路开关量直接由单片机I/O(PB0PB3)进行采样。图8 开关量接口电路4 单片机与PC机的串口通讯电路设计MAX487接口芯片是Maxim公司的一种RS485芯片。采用单一电源+5 V工作,额定电流为120 uA,采用半双工通讯方式。它完成将TTL电平转换为RS4

9、85电平的功能。其引脚结构图如图9所示。 图9 MAX487引脚图从图9中可以看出,MAX487芯片的结构和引脚都非常简单,内部含有一个驱动器和接收器。RO和DI端分别为接收器的输出和驱动器的输入端,与单片机连接时只需分别与单片机的PD0/RXD和PD1/TXD相连即可;/RE和DE端分别为接收和发送的使能端,当/RE为逻辑0时,器件处于接收状态;当DE为逻辑1时,器件处于发送状态。因为MAX487工作在半双工状态,所以只需用单片机的一个管脚控制这两个引脚即可;A端和B端分别为接收和发送的差分信号端,当A引脚的电平高于B时,代表发送的数据为1;当A的电平低于B端时,代表发送的数据为0。在与单片

10、机连接时只需要一个信号控制MAX487的接收和发送即可。单片机实现与PC机之间的通讯时,必须使用电平转换接口芯片,因为单片机输出的是TTL电平,必须经过电平转换才能和PC机的一致。本文中采用的是RS485协议,所以单片机需要采用RS485接口;而在PC机侧使用的是RS232与RS485的电平转换接口。单片机与PC机的串口通讯电路如下图所示: 图10 单片机与PC机的串口通讯电路RS485网络和普通的RS232网络从程序上来讲,维一的区别是就是有方向控制。 数据发送时芯片需要工作在输出方式,这样数据才能被有效发出。 不发送数据时一定要把RS485芯片设置为输入状态,否则会影响网络上其它设备。硬件

11、连接如上图,程序如下:/*串口初始化函数*/void uart_init(void) UCSRA = 0x02; /*倍速*/ UCSRB = 0x18; /*允许接收和发送*/ UCSRC = 0x06; /*8位数据*/ UBRRH = 0x00; UBRRL = 12; /*9600*/ DDRD=DDRA|BIT(2); /*设置方向为输出*/ PORTD&= PORTA|BIT(2) /*设置RS485为输入状态*/*数据发送,查询方式*/void uart_transmit(unsigned char i) PORTD&= PORTA|BIT(2) /*设置RS485为输入状态*/

12、 UDR = i; /* 发送数据*/ while (!(UCSRA & (1TXC); /* 等待发送缓冲器为空*/ UCSRA |= (1 TXC); /*清除发送标志*/PORTD&= PORTA|BIT(2) /*设置RS485为输入状态*/*数据接收,查询方式*/unsigned char uart_receive( void ) while (!(UCSRA & (1RXC); /* 等待接收数据*/ return UDR; /* 获取并返回数据*/5 程序设计及说明(1)模拟量采集程序设计系统要采集10路模拟量(10位精度),单片机与TLC1543接口如下:引脚PA0连接TLC1

13、543的SDO口接收转换后的数据传入,引脚PA1连接TLC1543的ADDR口用来选择通道数,引脚PA2连接TLC1543的_CS用来控制片选,引脚PA3连接TLC1543的CLK以控制时序。如下图所示: 图11 TLC1543与Atmega16引脚接口图A/D芯片的数据读取程序是根据TLC1543的工作时序来进行设计的。TLC1543工作时序如图2所示,其工作过程分为两个周期:访问周期和采样周期。读CLK有10个周期,前4个周期进行采样通道号的选择,后6个周期进行模拟量的采集,采集子程序是通过CPU通道地址的写操作,发出A/D转换启动脉冲,启动以后单片机查询A/D转换是否结束,一旦结束CPU

14、通过对通道地址的读操作读取数值。10路模拟量采集程序流程图如下: (2)开关量采集程序设计20路开关量采集电路如图8所示,16路开关量通过74LS165芯片将并行输入转换成串行输入(PC0和PC1进行16路开关量采样),剩余的4路开关量直接由单片机I/O(PB0PB3)进行采样。20路开关量采集程序流程图如下:(3)上位机程序设计本文中采用的是RS485协议,所以单片机需要采用RS485接口;而在PC机侧使用的是RS232与RS485的电平转换接口。此次可以采用单片机内部的USART,因此实现串口通讯十分容易,只需要设置适当的寄存器就可以使串口工作起来,串口通讯采用中断机制。上位机程序负责对数

15、据进行收集和处理,由于是下位机是被动传输,和下位机传输是遵循一定的通讯协议,协议已经在下位机中进行了定义。 当上位机发送一个控制字0x78给下位机时,下位机将会返回所有的数据采集量。上位机流程图如下:(3) 上位机主程序:#include #include #include void Init_COM(int ComPortAddr,unsigned char IntVectNum,im Baud,unsigned char Data,unsigned char Stop,unsigned char Parity) / 串口初始化int ReceiveChar(int port) / / 接收

16、字符main() int i; char a500;void Init_COM(03F8H, 0X0b,9600,8,1,0); / 定义串口端口地址为COM1口,中断处理号为0X0b,波特率为9600,数据位为8,停止位为1,奇偶校验位为0 for(i=0;i500;i+) ai=ReceiveChar();/每隔一秒接收一个字节 6 设计小结与体会这次计算机控制课程设计,让我们有机会将课堂上所学的理论知识运用到实际中。并通过对知识的综合利用,进行必要的分析,比较。从而进一步验证了所学的理论知识。同时,这次课程设计也为我们以后的学习打下基础。指导我们在以后的学习,多动脑的同时,要善于自己去发

17、现并解决问题。这次的课程设计,还让我知道了最重要的是心态,在你拿到题目时会觉得困难,但是只要充满信心,就肯定会完成的。通过这次计算机课程设计,我加深了对课本专业知识的理解,平常都是理论知识的学习,在此次课程设计中,真正做到了自己查阅资料、完成一个基本汇编程序的设计。在此次的设计过程中,我更进一步地熟悉了RS-485通信原理。当然,在这个过程中我也遇到了困难,通过查阅资料,相互讨论,我准确地找出错误所在并及时纠正了,这也是我最大的收获,使自己的实践能力有了进一步的提高,让我对以后的工作学习有了更大的信心。回顾起此次计算机控制课程设计,至今我仍感慨颇多。的确,从选题到定稿,从理论到实践,可以说得是

18、苦多于甜,但是可以学到很多很多的的东西,同时不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计,把以前所学过的知识重新温故,巩固了所学的知识。7 参考文献1秦龙.MSP430单片机应用系统开发典型实例.中国电力出版社,20052于海生.微型计算机控制技术.清华大学出版社,1999

19、3姚四改Protel 99 SE电子线路设计教程.上海交通大学出版社,20034朱定华编著.微机原理、汇编与接口技术学习指导清华大学出版社,20045侯玉宝.基于Proteus的51系列单片机设计与仿真.电子工业出版社,2008附录 程序代码(1) 10路模拟量采集程序如下:/TLC1543 端口定义#define TLC1543 _SDO PA0 /数据输入#define TLC1543 _ADDR PA1 /数据输出#define TLC1543 _/CS PA2 /使能端#define TLC1543 _CLK PA3 / 时钟端/read1543() 返回10位AD芯片TLC1543的

20、port通道采样值。uint read1543(uchar port) /从TLC1543读取采样值,形参port是采样的通道号uint data ad;uint data i;uchar data al=0,ah=0;CLK=0;for (i=0;i4;i+) /把通道号打入1543ADDR=(bit)(port&0x80);CLK =1;CLK=0;port=1;for (i=0;i6;i+) /填充6个CLK CLK=1;CLK=0; /CS=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()

21、;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_CS=0; /等待AD转换_nop_();_nop_();_nop_();for (i=0;i2;i+) /取D9,D8 D_OUT=1; CLK=1; Ah=1; if (D_OUT) ah|=0x01; CLK=0; for (i=0;i8;i+) /取D7-D0 D_OUT=1; CLK=1; al=1; if (D_OUT) al|=0x01; CLK=0; /CS=1;ad=(uint)ah

22、;ad=8;ad|=(uint)al; /得到AD值return (ad);(2) 开关量数据采集程序#define SINPUT_PORT PORTA#define SINPUT_DDR DDRA#define SINPUT_PIN PINA#define DIG_PL PD6 / PL脚#define DIG_CLK PD5 / 时钟脚#define DIG_CE1 PB1 / 片选#define DIG_OUT1 PC0 / 串行输出#define DIG_OUT2 PC1 / 串行输出#define S_PL() CONTROL_PORT|=BIT(DIG_PL) / 置1#defin

23、e C_PL() CONTROL_PORT&=BIT(DIG_PL) / 置0#define S_CLK() CONTROL_PORT|=BIT(DIG_CLK) / 置1#define C_CLK() CONTROL_PORT&=BIT(DIG_CLK) / 置0#define S_CE1() CONTROL_PORT|=BIT(DIG_CE1) / /置1#define C_CE1() CONTROL_PORT&=BIT(DIG_CE1) /置0#define S_CE2() CONTROL_PORT|=BIT(DIG_CE2) /置1#define C_CE2() CONTROL_POR

24、T&=BIT(DIG_CE2) /置0#define DB_INPUT1 (SINPUT_PIN&BIT(DIG_OUT1) /数据输入电平#define DB_INPUT2 (SINPUT_PIN&BIT(DIG_OUT2) void InitDigCap(void) /初始化开关量采集 CONTROL_DDR|=BIT(DIG_PL)+BIT(DIG_CLK)+BIT(DIG_CE1)+BIT(DIG_CE2); / 置为输出 SINPUT_DDR&=(BIT(DIG_OUT1)+BIT(DIG_OUT2)+); / 置为输入 S_PL(); S_CE1(); S_CE2();void L

25、ockData(void) /锁定数据 将数据全部锁入到寄存器中 S_PL(); /高电平 Delay_Bus(1); /延时一个总线周期 C_PL(); /低电平 Delay_Bus(1); /延时一个总线周期 S_PL(); /高电平 完成锁存void GetAllDigCap(void) /获取所有通道的开关量 unsigned char i,temp=0; LockData(); /锁定所有数据 C_CLK(); Delay_Bus(1); S_CLK(); /读取第一片里的数据 C_CE1(); /使能片1 for(i=0;i8;i+) C_CLK(); Delay_Bus(1);

26、S_CLK(); /上升沿脉冲 Delay_Bus(1); if(DB_INPUT1) temp|=0x01; temp=1; else temp=1; g_DigCap0=temp; S_CE1(); /关闭使能 (3) 定时中断模块 void InitTimer(void) /初始化计数器,使用Timer0 产生1KHz的中断 TCCR0=0x00; TCNT0=0x84; TCCR1B|=BIT(CS02);/64分频 TIMSK|=BIT(TOIE0);/timer0溢出中断开ISR(TIMER0_OVF_vect) /Timer0溢出中断服务程序 TCNT0=0x84; g_Time

27、rFlag=1; /设置标志 (4) 主程序:int main(void) InitDevices(); /初始化所有的设备 sei(); /开总中断 程序开始起跑 while(1) /死循环 if(g_TimerFlag=1) /如果时间标记为1 GetAllDigCap(); /获取所有开关量 TLC1543_GetAllValue(); /获取所有模拟量 PutAllDataToBuf(); /将所有数据送入发送缓冲区 if(g_RecFlag=0x78) /如果收到接收标志 SendAllData(); /发送所有数据 g_RecFlag=0; /置零 g_TimerFlag=0; /置零

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1