评语: 考勤10分 守纪10分 过程30分 设计报告30分 答辩20分 总成绩(100) 专 班 姓 学
业: 级:
自动化 ________ 自动化
名: _________ 号: _________
指导教师: __________________
2015年12月29日
基于单片机的多路数据采集
1引言
通过一个学期的学习,我认为要学好单片机这门课程,不仅要认真学习课本知 识,更重要的是要学会通过实践巩固学到的知识, 本次课设中我们设计制作的题 目是基于单片机的多路数据采集系统设计。
1.1设计背景
随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各 个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数据 采集。本设计使用简便,功能丰富。
本设计控制芯片采用的是 STCC51, AD转换采用ADC0809芯片,显示采 用的是四位共阴极数码管。
关键字:STCC51、ADC0809、8路电压采集。
2.1系统设计方案
在电量的测量中,电压、电流和频率是最基本的三个被测量, 其中电压量的 测量最为经常。而且随着电子技术的发展,更是经常需要测量高精度的电压, 所 以数字电压表就成为一种必不可少的测量仪器。
本次设计主要由三个模块组成:A/D转换模块,数据处理模块及显示模块。
A/D转换主要由芯片ADC0809来完成,它负责把采集到的模拟量转换为相应的 数字量在
传送到数据处理模块。数据处理则由芯片STCC51来完成,其负责把
ADC0809传送来的数字量经过一定的数据处理,产生相应的显示码送到显示模 块进行显
示;此外它还控制着 ADC0809芯片工作。
2.2总体设计方案
电压显示 蜂鸣器 8路led
图1系统原理总框图
55单片机 3硬件设计
3.1晶振电路
晶体振荡器,简称晶振,它可以等效成一个电容和一个电阻并联再串联一个 电容的二端网络。晶振有一个重要的参数,那就是负载电容值,选择与负载电容 值相等的并联电容,就可以得到晶振标称的谐振频率。
图2晶振电路
3.2 P0 口上拉电阻
图3九排上拉电阻
本次设计中九位排阻在依次连接单片机 P0 口各引脚的同时并依序连接数码管 各
引脚(上拉电阻VCC端接单片机VCC端)o上拉电阻既能为单片机提供部分电 压能力,同时也能起到预防线路中电流过大的作用。
3.38路电压输入模块
电位器是可变电阻器的一种。通常是由电阻体与转动或滑动系统组成, 即靠 一个动触点在电阻体上移动,获得部分电压输出。电位器的作用即是调节电压(含 直流电压与信号电压和电流的大小)。
¥11
3.4显示模块 四位数码管是一种半导体发光器件, 其基本单元是发光二极管。本次设计用 的是4位共阴数码管,其内部结构如图6。 DSJ 11 Dpy Ambeh-iCC __________________ 7 4 a to 1 2 1 10 5 3 * -1 y 6 30 9 T T 图6四位数码管内部结构图 3.5 AD转换模块 本设计中AD转换采用ADC0809A5片。ADC0809是美国国家半导体公司生产 的 CMOS:艺8通道,8位逐次逼近式A/D模数转换器。其内部有一个 8通道多 路开关, 它可以根据地址码锁存译码后的信号, 只选通8路模拟输入信号中的一 个进行A/D转换。该芯片具有以下特性: 1) 8路输入通道,8位A/D转换器,即分辨率为8位; 2) 具有转换起停控制端; 3) 转换时间为100卩s(时钟为0kHz时),130卩s (时钟为500kHz时); 4) 单个+5V电源供电; 5) 模拟输入电压范围0〜+5V,不需零点和满刻度校准; 飞- 1 3 4 5 6 7'>c ININ1INAL V 9 -工 0E CLK TF VCC \\KEF-b 13 GND -?D6 D5 D4 DO D2 DI Component—1 图7 ADC0809引脚图 ADC0809芯片有2引脚,采用双列直插式封装,其芯片引脚图如图 示。下面 说明各引脚功能。 (1) IN0〜IN7: 8路模拟量输入端。 (2) D0〜D7: 8位数字量输出端。D(〜D7均为三态缓冲输出形式,可以和 单片机的数据线直接相连。D0为最低位,D7为最高位。 (3) A、B、C: 3位地址输入线,A为低地址,C为高地址,用于选通8路 模拟输入中的一路。 (4) ALE地址锁存允许信号,输入高电平有效。对应 ALE上跳沿,A、B、 C地址状态送入地址锁存器中。 (5) START A/D转换启动脉冲输入端,输入一个正脉冲(至少 100ns宽) 使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。 (6) EOC A/D转换结束信号输出,当A/D转换结束时,此端输出一个高电 平,转换期间一直为低电平。 (7) OE数据输出允许信号,输入高电平有效。当 A/D转换结束时,此端 输入一个高电平,才能打开输出三态门,输出数字量。 (8) CLK时钟脉冲输入端,要求时钟频率不高于 0KHZ ADC080啲内部 没有时钟电路,所需时钟信号由外界提供,因此有时钟信号引脚。 (9) VREF( +)、VREF(-):基准电压。用来与输入的模拟信号进行比较, 作为逐次逼近的基准。 A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题 是如 何确认A/D转换的完成,因为只有确认完成后,才能进行传送。为此可采用 如下方式。 A/D转换芯片有表明转换完成的状态信号,ADC0809勺EOC端。因此可以用 查询 方式,查询EOC的状态,可确认转换是否完成,并接着进行数据传送。 3.6八路led灯显示 根据输入通道选择点亮对应的led灯 3.7实物调试图 4.软件设计 4.1 Proteus软件仿真 对抢答器电路图的Proteus软件仿真主要是由我完成的,在实际电路设计中, 需要先通过仿真软件测试电路以及编译的程序, 检查外围电路设计是否合理,软 件编译是否正确,以及软件和硬件电路能否正常配合工作, 能否准确的实现所设 计的功能。如果测试通过,电路仿真没有问题能完全实现功能的话就可以实际的 做板子的焊接工作了。我选择了常用的单片机仿真软件 proteus7.0以及keil进行 仿真。 4.1.1仿真开始 点击开始仿真便出现上图界面,此时数码管上显示的是第一个滑动变阻器上的 电压,对应第一个滑动变阻器下面那个 LED灯也为亮的状态。这时为手动模式, 当按一下按键,检测通道便切换为第二路,同时数码管显示和 相应变化,结果如图8所示。 LED指示都发生 图8仿真开始 图9手动切换输入通道 4.1.2设置自动或者手动采集方式 如图8所示,长按下进入自动采集并显示状态 每隔3s,跳到下一个采集通道。 图10按下开关进入自动采集状态 4.2程序流程图 根据模块的划分原则,将该程序划分初始化模块, 程序,这三个程序模块构成了整个系统软件的主程序。 初始化 调用AD转换程 序 调用数据处理 程序 调用显示程序 图11程序设计流程图 A/D转换流程图,如图12所示。 A/D转换子程序和显示子 程序主框图如图11所示。 按键切换流程图,如图 图12 A/D转换流程图13所示。 Key_press=O 蜂鸣器响延时 Key_press++ TR1取反 采集下一个通道 图13按键切换流程图 总结 在本次设计多路数据采集的课设过程中,我们利用 ATC51单片机及 ADC0809芯片,利用单片机的定时器/计数器定时和计数的原理输出需要的时钟 信 号,利用Proteus和Keil软件设计出实验电路,并且完成了电路板的焊接工作, 将件和硬件结合在一起完成了课设的任务。 在本次课设中,我意识到将理论知识与实践相结合的重要性,对于单片机这 样的课程,仅仅通过了解课本上的知识是远远不够的,我通过查资料和搜集有关 文献,培养了自学能力,通过利用软件仿真和焊接电路, 在很大程度上提高了我 的动手能力。我们在课设的过程中,遇到了很多问题,比如我在硬件电路的搭建 过程中错把共阴极数码管接成了共阳极数码管, 使得数码管无法正常显示,通过 查看数码管的资料,我修改了显示程序,调试出正确的结果,类似的问题出现了 很多,通过一一排查,终于完成了课设任务,结果表明,有付出必有收获,把握 重点、攻克难关,活学活用对于牢固的掌握知识,是非常有用的。 在此次课设中,我学到了很多,也通过不断纠正自己的错误,意识到自身的 不足,我对知识的掌握还没有实现深层次的理解记忆,我相信这些教训都为我以 后的学习奠定了良好的基础,并且在以后的学习中我要有耐心,不能急功近利。 参考文献 [1] 王思明,张金敏,苟军年•单片机原理及应用系统设计 [M].北京:人民邮电出版社,2008. [2] 冯育长,邹小兵.单片机系统设计与实例指导[M].西安:西安电子科技大学出版社 ,2004. 附录A源程序 程序如下: #i nclude #defi ne uchar un sig ned char // 宏定义 #defi ne uint un sig ned int sbit P07=P0A 7; 〃控制数码管 //0809控制端口定义 sbit OE=P3A2; sbit EOC=P3A1; sbit ST=P3A0; sbit CLK=P3A3; // 时钟定义 sbit A_AD=P2A2; sbit B_AD=P2A1; sbit C_AD=P2A0; sbit Wei1=P2A4; sbit Wei2=P2A5; sbit Wei3=P2A6; sbit Wei4=P2A7; sbit Hc138_C=P3A4; sbit Hc138_B=P3A5; sbit Hc138_A=P3A6; sbit Mode_Key=P3A7; sbit Beep=P2A3; //共阴数码管段码定义 0, 1, 2, 3, 4, 5, 6, 7, 8, V uchar code table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3e}; float Ad_Value,V_Value; uchar VOL_Vlaue[3]; uchar ch_change=0xf0; //通道选择变量 0xf0-0xf7,8 路选择 void delayms( uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void Timer」ni t() { _ TMOD=0x11; //T0:16 位计数 T1 : 16 位计数 TH0=(65536-200)/256; //定时器用于输出的时钟 TL0=(65536-200)%256; TH1=(65536-50000)/256; TL1=(65536-50000)%256; 9, EA=1; ET0=1; ET1=1; TR0=1; // TR1=1; } float Get_0809_Ad( uchar CH ) 〃CH:0xf0-0xf7,对应 8 个通道 { ST=0; 〃启动AD转换 OE=0; ST=1; switch (CH) { case 0xf0: C_AD=0;B_AD=0;A_AD=0; break; case 0xf1: C_AD=0;B_AD=0;A_AD=1; break; case 0xf2: C_AD=0;B_AD=1;A_AD=0; break; case 0xf3: C_AD=0;B_AD=1;A_AD=1; break; case 0xf4: C_AD=1;B_AD=0;A_AD=0; break; case 0xf5: C_AD=1;B_AD=0;A_AD=1; break; case 0xf6: C_AD=1;B_AD=1;A_AD=0; break; case 0xf7: C_AD=1;B_AD=1;A_AD=1; break; default: break; } ST=0; while(EOC==0); OE=1; Ad_Value=P1; //从 P1 口读取数据 OE=0; return Ad_Value; } _ void display() { V_Value=(Get_0809_Ad(ch_cha nge)*1.0/255.0)*500.0; VOL_Vlaue[0]=V_Value/100; VOL_Vlaue[1]=(ui nt)V_Value/10%10; VOL_Vlaue[2]=(ui nt)V_Value%10; P0=table[VOL_Vlaue[0]]; P07=1; //显示小数点 delayms(5); Wei 仁1; Wei2=0; P0=table[VOL_Vlaue[1]]; delayms(5); Wei2=1; 〃数据处理Wei3=0; P0=table[VOL_Vlaue[2]]; delayms(5); Wei3=1; Wei4=0; P0=table[10]; 〃最后一个符号‘ V' delayms(5); Wei4=1; } void Key() { uint key_press=0; if(Mode_Key==0) //实现自动循环检测与手动循环检测 { _ Beep=0; delayms(100); Beep=1; while(Mode_Key==0) { _ key_press++; delayms(10); if(key_press>=200) { _ Beep=0; delayms(100); Beep=1; } } if(key_press>=200) //2s { _ TR1=!TR1; } else { ch_change=ch_change+1; if(ch_cha nge==0xf8) ch_cha nge=0xf0; } } void Led_Dis() { _ switch (ch_cha nge) { _ case OxfO: Hc138_C=0;Hc138_B=0;Hc138_A=0; break; case 0xf1: Hc138_C=0;Hc138_B=0;Hc138_A=1; break; case 0xf2: Hc138_C=0;Hc138_B=1;Hc138_A=0; break; case 0xf3: Hc138_C=0;Hc138_B=1;Hc138_A=1; break; case 0xf4: Hc138_C=1;Hc138_B=0;Hc138_A=0; break; case 0xf5: Hc138_C=1;Hc138_B=0;Hc138_A=1; break; case 0xf6: Hc138_C=1;Hc138_B=1;Hc138_A=0; break; case 0xf7: Hc138_C=1;Hc138_B=1;Hc138_A=1; break; default: break; } } void mai n() { Timer」nit(); while(1) { Key(); display(); Led_Dis(); } } /****************************************** *定时器服务函数 ******************************************/ void time0() interrupt 1 { TH0=(65536-200)/256; TL0=(65536-200)%256; CLK=~CLK; } uint t1_flag; void time1() in terrupt 3 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; t1_flag++; if(t1_flag==20*3) //到达 3 秒 { t1_flag=0; ch_cha nge++; Beep=0; delayms(IOO); Beep=1; if(ch_cha nge==0xf8) ch_cha nge=0xf0; //TO中断服务,提供时钟信号 //5k 时钟频率 〃显示数据 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务