付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、技术文件完成时间: 2012.6.10信 息 处 理 系 统 水 温 子 系 统: 13 项 目 名 称 :设 计 大 组设 计 小 组 名 称 : 温 度 测 控 子 系 统设 计 小 组: 沈 笠 ( 组 长 )男 , 杨 箫科技创新 4A温度测控子系统小组设计地址:东川路 800 号编:200240邮班级学号具体负责的工作沈 笠F09030345090309771硬件设计、焊接电路男F09030355090309792设计、系统调试杨 箫F09030135090309369焊接电路、撰写摘要:本文主要介绍了一种利用单片机控制水温的电路系统。系统共分三个模块:温度测量部分、温度控制电路部分
2、与单片机控制部分。数字温度计直接将水温值读入单片机来完成检测水温,并实现实时显示温度,通过比较当前温度与目标温度,来输出控制信号控制继电器通断从而控制电热杯电源通断,以实现温度调节和保温功能。:数字温度计、继电器、51 单片机ABSTRACT:This report is designed to serve as a discusand illustration about the theory, design,realization and manipulation of a circuit system, which is used to control the temperature o
3、f the water inheater by a SCM. The system is comed of three sections: the module of measuring temperature system,the module of controlling temperature system and the module of software. The digital thermometer givesthe temperature value of the water to the SCM, which displays the current temperature
4、 even and again.Through the comparison of thetemperature and the current temperature, the SCM export a controlsignal to control the heaters condition (on/off)byrelay,torealizethefunctionofcontrollingthetemperature and keng the temperature.KEYWORDS:digital thermometer,relay地址:东川路 800 号编:200240邮目录概述1编
5、写说明1名词定义1相关文档12.系统总述2系统功能描述2系统组成结构2系统子模块2温度测量模块2温度控制模块2通信模块2硬件设计3温度测量模块硬件设计3电路设计图3数字温度计 DS18B20 介绍3电路设计原理3温度控制模块硬件设计53.温度控制设计电路图5设计原理5继电器工作方式53.2.13.2.23.2.34.系统各部分设计74.1 单片机简介74.2 单片机子系统设计7水温测量8水温控制8通信8程序描述105.1 程序框架和重要全局变量101 页5.程序框架10重要全局变量10水温测量10温度控制11按键功能模块12按键功能12代码实现如下12数码管显示模块13测量方法和结果分析14测
6、温部分测试方法14控温部分测试方法14单机操作测试方法14分析146.47. 学习心得体会和建议158. 致谢16参考文献17附录 A开发环境18硬件开发工具1810.2开发工具18使用说明19附录 B附录 C.20程序2 页1. 概述1.1 编写说明主要内容:了水温控制系统的主要设计方案和调试过程。本文将系统分为两个模块,分别介绍温度测量系统与温度控制系统的模块功能,工作原理境、使用说明和单片机程序。编写目的:过程等情况。附录中给出了系统的开发环本文档的写作为了简述小组这次实验的过程,下系统的功能结构,各模块的工作原理和设计思路。提供软硬件的设计方案,调试过程及结果,给有这方面的读者一些启示
7、和借鉴,同时也为电子设计者提供参考。适读对象:了解电子技术基础知识,对单片机的应用有所了解的电子技术员。者、在校师生或工程技术人1.2 名词定义继电器:以电压为参考量,控制一个或数个独立电路通断的设备。动态误差:温度计和系统中温度传感器显示的反应时间不同,所反映的温度有时差。因为反应时间造成的误差便叫做动态误差。静态误差:因测量的电路和温度计的测量精度问题所造成的误差。过冲:对水进行加热时,停止加热后温度并不会马上停止上升,而是会再上升一段再下降,这就叫做水温的过冲。中断:CPU 对系统发生的某个事件做出的一种反应,CPU 暂停正在执行的程序,保留现场后自动转去执行相应的处理程序,处理完该事件
8、后再返回断点继续执行被打断的程序的过程。1.3 相关文档科技创新 4A-第 13 大组-总体概要设计 科技创新 4A-第 13 大组-全局主系统设计科技创新 4A-第 13 大组-本系统设计科技创新 4A-第 13 大组-超声子系统设计科技创新 4A-第 13 大组-电机子系统设计1 页2. 系统总述2.1 系统功能描述该系统对室温(约 20)至 99的水温进行实时测量,对温度的测量精度可达到 0.1。可通过控制模块将水温控制在上述范围内的任意温度。该系统可实现与本成相应操作。机的串口通受温度查询和温度设定、升降执行,并在短时间内完2.2 系统组成结构系统整体组成结构图如图 2.1 所示。系统
9、整体组成结构图1图 2.1系统子模块水温子系统主要包含了三个模块:温度测量模块、温度控制模块和通信模块。主要实现了对当前温度的测量和控制温度使水温达到所设置的目标温度。温度测量模块水温可通过数字温度计 DS18B20 进行温度测量。DS18B20 的详细介绍见 3.1.2。温度控制模块输入信号传给单片机后,单片机经过运算,获得当前温度,之后与目标温度数值比较,然后输出相应的高低电平,控制继电器的闭合或断开,从而控制电热杯中水的加热或保温。2.3.3 通信模块利用单片机串口与计算机实现通信,通过串口接收并计算机发送令完成温度的反馈、设定、升降,并且通过串口将单片机测得的目前水温发送给计算机。2
10、页3. 硬件设计3.1 温度测量模块硬件设计3.1.1 电路设计图图 3.1 DS18B20供电电路33.1.2 数字温度计 DS18B20 介绍DS18B20 数字温度计提供 9 位温度读数,指示器件的温度。信息经过单线接口送入 DS18B20 或从 DS18B20 送出因此从处理器到 DS18B20 仅需连接一条线和地读写和完成温度变换所需的电源可以由数据线本身提供而不需要外部电源。因为每一个 DS18B20 有唯一的系列号(silicon serial number)。因此多个 DS18B20 可以存在于同一条单线总线上这允许在许多不同的地方放置温度灵敏器件。此特性的应用范围包括 HVA
11、C 环境控制建筑物设备或机械内的温度检测以及过程监视和控制中的温度检测。图 3.2 DS18B20 器件图3DS18B20 有三个主要的数据:(1) 64 位激光(lasered) ROM;(2) 温度灵敏元件;(3) 非易失性温度告警触发器 TH 和 TL 。器件从单线的通信线取得其电源,在信号线为的时间周期内把能量在的电容器中在单信号线为低电平的时间期内断开此电源,直到信号线变为重新接上寄生电容电源为止,作为另一种可供选择的方案,DS18B20 也可用外部 5V 电源供电。3.1.3 电路设计原理3 页DS18B20所示。通过使用在板 on-board温度测量专利技术来测量温度的温度测量电
12、路方框图如图 3.3图 3.3 DS18B2 温度测量电路3DS18B20通过门开通期间内低温度系数振荡器经历的时钟周期个数计数来测量温度,而门开通期由高温度系数振荡器决定。计数器预置对应于-55的基数,如果在门开通期结束前计数器达到零,那么温度寄存器(它也被预置到-55的数值)的增量,指示温度高于-55。同时计数器用斜率累加器电路所决定的值进行预置。为了对遵循抛物线规律的振荡器温度特性进行补偿,这种电路是必需的。时钟再次使计数器计值至它达到。如果门开通时间仍未结束,那么此过程再次重复。斜率累加器用于补偿振荡器温度特性的非线性,以产生高分辨率的温度测量。通过改变温度每升高一度,计数器必须经历的
13、计数个数来实行补偿。因此为了获得所需的分辨率,计数器的数值以及在给定温度处每一摄氏度的计数个数(斜率累加器的值)二者都必须知。温度读数以 16 位符号扩展的二进制补码读数形式提。表 3.1 说明输出数据对测量温度的关。数据在单线接口上串行发。DS18B20 可以在 0.5至+125的范围内测量温度。对于应用华氏温度的场合,必须使用查找表或变换系数。注意在 DS18B20 中,温度是以 1/2 LSB(最低有效位)形式表示时产生以下 9 位格式:最高有效(符号)位被到器内两字节的温度寄存器中较高 MSB 的所有位,这种“符号扩展”产生了如表 1 所示的 16 位温度读数。以下的过程可以获得较高的
14、分辨率。首先,读温度并从读得的值截去 0.5位(最低有效位)。这4 页个值便是TEMP_REA。然后可以读留在计数器内的。此值是门开通期停止之后计数剩余所需的最后一个数值是在该温度处每一摄氏度的计数个数(COUNT_PER_C)。于是用户可以使用下式计算实际温度:表 3.1 温度/数据关系33.2 温度控制模块硬件设计3.2.1 温度控制设计电路图温度控制模块设计电路图如图 3.4 所示。图 3.4 温度控制模块的硬件电路图13.2.2 设计原理三极管开关电路可以起到控制电路通断的作用,电路导通时在可变电阻 R3 上的电压较大,而断开时压降大多在三极管上。这部分控温电路由 2 个部分组成:开关
15、三极管部分,继电器部分。 本实验考虑到安全性将继电器集成在一个接线板中,将电热杯再接到这个接线板上,接线板则接 220V 交流电压。通过继电器的通断控制电热杯加热,从而控制水温。3.2.3 继电器工作方式继电器 G2R2S 的基本结构如图 3.5 所示:5 页图 3.5 继电器管脚图G2R2S 型继电器为 DIP16 的标准封装,但因只用到其中 8 个脚,所以其他脚空缺。其中 8和 1 是控制线圈的引脚,加电有极性,1 接+12V。(2,3,4)和(4,5,6)各为一组触点。2,3 间,6,7 间,是常闭接点;3,4 间,5,6 间,是常开接点。应有消反向电势的二极管。继电器的 1 端接 12
16、V 的直流电源,8 端接单片机控制信号放大后的信号。将交流电线的火线剪断,两端接在继电器的 2,3 两个接口上。同理,将零线的两端接在端口 6,7 上。6 页4. 系统各部分设计4.1 单片机简介ATmega16 是基于增强的 AVR RISC 结构的低功耗 8 位CMOS 为控制器。由于其先进的指令集以及单时钟周期指令执行时间,ATmega16 的数据吞吐率高达 1MIPS/MHz,从而可以减缓系统在功耗和处理速度之间的。它还包含了 AD 转换功能。ATmega16 的引脚图如图 4.1 所示。图 4.1 ATmega16 引脚图44.2 单片机子系统设计单片机子系统主要完成以下四种功能:测
17、温,控温,通信,本地水温控制。测温环节,单片机的作用在于实现与 DS18B20 数字温度传感器的串口通信,驱动 DS18B20 并正确 当前温度。之后,将当前温度经过四舍五入处理后,精确到十分位,在七段数码管上实时显示。温控环节,单片机将当前温度与设定温度进行比较,并根据比较的结果发出控制信号(波形式)以控制继电器的通断。由于继电器的通断与热水杯的加热与否等价,故达到了控制水温的目的。系统设计总体框图如图 4.2 所示。图 4.2 系统设计总体框图7 页4.2.1 水温测量水温测量模块以对 DS18B20 数字温度传感器的控制为主,其难点在于根据 DS18B20 独特的通信协议进行驱动程序的编
18、写。正确驱动 DS18B20 后,即可用单片机来度。水温测量功能的程序流程图如图 4.3 所示。收到的数据,获得当前温图 4.3 水温测量功能程序流程图值得一提的是,在 AVR 与 DS18B20 进行通信时,为保证通信不出错,要关闭全局中断。但由于DS18B20 温度转换的时间通常要大于 750 毫秒,因此这段时期不能始终关闭中断来等待转换完毕,否则显示模块以及与主机通信的模块均要首受到影响。因此,温控部分的程序中,要经常开、局中断,以把和 DS18B20 的通信对于系统其他部分的影响降到最低。4.2.2 水温控制本功能的主要原理就是通过测量值和设定值的比较,控制单片机的输出,并以单片机的信
19、号控制加热开关的通断,从而达到控制水温的目的。在实际的设计中,当单片机输出断开,停止加热;当单片机输出低电平时,继电器闭合,开始加热。水温控制功能的程序流程图如图 4.4 所示。时,继电器图 4.4 水温控制功能程序流程图4.2.3 通信本模块主要实现单片机子系统和本系统计算机之间的通信。本功能由三个子模块实现:接收命令帧、命令、发送响应帧。单片机子系统接收到命令帧,对命令帧做出判断,符合条件则开始接收,接收完之后根据所接收到令实行相应操作,并返回给本系统对应的响应帧。8 页通信功能的程序流程图如图 4.5 所示。图 4.5通信功能程序流程图9 页5. 程序描述5.1 程序框架和重要全局变量5
20、.1.1 程序框架为方便模块化开发,增强可读性,本 AVR studio 工程共包含 5 个.h 文件和 5 个相应的.c 文件。.h、库的包含关系、函数等,.c 文件中是各函数的具体实现。文件中含有全局变量的图 5.1 工程框架图文件名与相应模块的功能相对应,在此不再赘述。5.1.2 重要全局变量(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)温度、低位:unsigned char Temp_H,Temp_LDS18B20 复位成功标志:unsigned char OK_Flag数码管位和指示灯显示数据变量:unsigned char output_se
21、l数码管段显示数据变量:unsigned char output_8seg指示灯驱动信号输出缓存:unsigned char led1,led2,led3,led4数码管扫描驱动指针:unsigned char digi_scaner5ms 中断计时器(用于控制控温波输出周期恒定):volatile ContrFlagContrCount控温占空比标识:volatile设定温度:volatile当前温度:volatileSetTemCurrTem温差:volatiledelta接受帧的数组:unsigned char tx_bufferTX_BUFFER_SIZE返回帧的数组:unsigned
22、 char rx_bufferRX_BUFFER_SIZE5.2 水温测量该部分程序主要实现对于 DS18B20 的驱动,以及对于返回数据的主要实现以下函数:void Port_DS18b20(void); / 管脚驱动unsigned char DS18B20_Init(void); / 元件驱动。10 页unsigned char Read_18b20(void); / 读数据void Write_18b20(unsigned char dat); / 写指令Main 函数中相应的cli();和程序块如下:/关中断DS18B20_Init();Write_18b20(0Xcc); Writ
23、e_18b20(0X44);/初始化 DS18B20/发送 ROM 指令,跳过 ROM 匹配/发送温度转换命令sei();_delay_ms(750); cli(); DS18B20_Init();/开中断/转换需要时间/关中断/初始化 DS18B20Write_18b20(0Xcc); Write_18b20(0Xbe);/发送 ROM 指令,跳过 ROM 匹配/发送暂存器指令Temp_L = Read_18b20(); /获得温度的低位 Temp_H = Read_18b20(); /获得温度的sei();/开中断temp temp temp= (Temp_H 4); /获得温度的整数位3
24、 = temp4 = temp% 100 / 10;% 10;/十位/个位temppo temppo= Temp_L & 0 x0f;/取出温度的小数位/小数位乘以 0.0625 得出温度的小数位值,在此= (temppo* 625);扩大 10000/倍,得出温度的 4 位小数位/千位temppo temppo1 = temppo2 = temppo/ 1000;% 1000 / 100; /百位if(temppo24)temppo2=0;temppo1+=1;if(temppo1=10)temppo1=0;temp4+=1;if(temp4=10)temp4=0;temp3+=1;po1=
25、temppo1;CurrTem= temp3*10+temp4;/现在温度用于比较5.3 温度控制该模块在单片机实现测温的基础之上,对水温进行控制。主要函数有两个:11 页void CompTem(); void ContrTem();/根据当前温度和设定温度的差来确定 ContrFlag 的值/根据 ContrFlag 的值来控制继电器通断ContrTem () 实现如下:void ContrTem()if(ContrFlagContrFlag)SET_C1;/在 ContrFlag 到 400 之间,继电器断CompTem() 实现如下:void CompTem() delta=SetTe
26、m-CurrTem; if(delta1) ContrFlag=0;/根据当前温度和设定温度的差来确定 ContrFlag 的值else if(delta2)ContrFlag=80;else if(delta10)ContrFlag=160; else if(delta99)SetTem=99;break;case 0 xd0:if(!StartFlag)SetTem=SetTem-10;if (SetTem99)SetTem=99;break;case 0 x70:if(!StartFlag)SetTem-; if(SetTemT0,T0 为当前水温),本模块开始加热直至停止。待温度计示数
27、稳定后(3)(4)(5)(6)并其值(精确到度),计算该值和 T1 之间的误差。改变温度控制命令,重复步骤(2)(3)两次,再测量两组数据并计算误差。计算平均误差。验证子系统是否有保温功能:当系统加热到指定温度后,在自然冷却过程中,当温度差低于阈值(本系统设定大于等于 1C),系统自动重新加热,直至到达指定温度。6.3 单机操作测试方法(1)连接好电路,注水至水壶里水位达 0.75L 刻度线,将温度计和数字温度计 DS18B20 从壶口水中,固定位置,接通电源。(2)操作单片机,发送温度控制命令(如将水温加热到 T1,要求 T1T0,T0 为当前水温),本模块开始加热直至停止。加热模式中,可以
28、在当前温度和设定温度来回切换,并可以采取紧急制动。验证子系统是否具有保温功能,方法同 6.2 节。(3)(4)6.4分析显示,数字温度计测温精确,与实际(煤油温度计)温度误差控制在1C 内。与主机通信时,能够正确接收主机发送令,并能进行正确的反馈。单机操作功能良好,能完成与主机通信时完全相同的功能:开启/暂停加热,设定温度,实时监测温度等。温度控制方面,小组通过单片机程序改变继电器开关的占空比,从而改变温度加热功率,能有效防止温度过冲现象。并具有保温功能:当加热完毕一定时间后,水温下降超过 1C 后,系统会自动重新启动,加热至温度再次达到设定值。14 页7. 学习心得体会和建议这次科技创新,是
29、第一次由大组完成的活动。涵盖的内容十分丰富,主要大收获又一下几点:首先是对测温电路比较深入的了解,不再只是停留在书本中,这一大大的拓展了对于数字和模拟这两个领域的认识和感觉,并且帮助加深了对信号系统,模拟电路等已学课程的实践和深入理解。其次,本次科技创新不再像上次那样只是一个单一的小系统,而是由很多个子系统组成的一个大系统,它要求掌握模块化开发设计电路系统的能力,现分后合,这不仅体现在电路板上是分开的制作,更重要的是一种。今后的系统设计也必然是要走模块化,自系统化的方向。它要求有宏观的计划,又有细致的设计。这次科技创新,老师的指导和提示没有上次那么详细,给了足够的发挥空间。确实靠有些同学的特长
30、和之前的基础,做出了一些内容。负责的水温部分相对来说比较简单,并且因为使用了 DS18B20 器件,大大简化了测温过程,没有像其它组一样需要烦琐的温度标定,同时方便了开发者和使用者。虽然最后检测的过程中出现了一些小小的,导致测量结果并不十分满意,但不拘于课堂上的实现方法,善于利用器件简化实验过程的精神还是可取的。由于这次实验做的内容比较多,所以合作分工的团队精神就显得十分的必要。在实验时保持组内与组间的有效沟通,保证有足够的时间进行实验和做到最大效率的完成的实验进度。这样子就避免了由于分工不当会者分工不明确而导致实验进度停滞不前的现象。虽然很辛苦,但换来的收获是受用的,科技创新课程为学生专业技
31、能的培养提供了一个很好的,能够把平时所学的理论知识同实践结合起来,并且培养了学生自己研究问题,解决问题的能力,团队合作的精神,感受激励竞争的压力,这可能是整个大学课程中最能培养能力的了。最后再次感谢学院为提供了这么好的学习机会。15 页8. 致谢感谢老师的讲座帮迈出了实验的第一步,同时他的认真负责的工作使有了清晰的活动流程、时间表、项目规则以及良好的组织,才知道了什么时间应该完成什么工序,什么时间可以做什么工作。解除了许多疑虑,节省了反复询问的时间。对此,非常感激。感谢谷老师、龙老师等各位老师在实验和检测时给宝贵意见。感谢科创的助教老师给登记、借器材;在几十个小组频繁借还器件之下,他们依然能够
32、耐心的处理每一件事情。感谢大组同学共同努力,尤其是大组长的统筹协调,以及全局组在小组合作之间发挥的重要作用,一定程度上使得本次科创任务完成得更顺利、更。也感谢其他组的同学的帮助,在实验过程中的交流促进了这次设计的更好完成。16 页9. 参考文献1234交通大学电子工程系.交通大学电子工程系.DS18B20 Datasheet. ATmega16 Datasheet.科技创新与工程实践4A课程讲座. 若干局部电路方案科技创新与工程实践4A .ATmega16 小系统板简介17 页10. 附录 A开发环境10.1 硬件开发工具电烙铁,吸焊枪,螺丝刀,镊子,直流稳压电源,万用表,示波器钳等10.2开
33、发工具AVRStudio Isplay18 页11. 附录 B使用说明(1) 按键功能:KEY1&KEY2:同时长按,在控温和显示温度模式之间切换 KEY1:控温模式下,增加目标温度 10 度KEY2: 控温模式下,减少目标温度 10 度KEY3: 控温模式下,增加目标温度 1 度KEY4:控温模式下,减少目标温度 1 度;显示温度模式下,切换显示当前温度和目标温度当检测到按键被按下(0)时,相应的指示灯亮(0)(2) 数码管显示:第一个数码管显示字母 h(代表加热模式)或字母 C(设定温度模式)或字母 H(显示设定温度);第二、三、四个数码管显示当前温度或设定温度,分别为温度的十位、个位、小
34、数位。图 11.1 水温测控子系统实物图19 页12. 附录 C程序“Contr.h”volatile volatile volatile volatileContrCount;ContrFlag; SetTem; CurrTem;volatile double delta;/控温输出/控温输出低电平#defiT_C1 (PORTC) |= (1 (PC1)#define CLR_C1 (PORTC) &=(1 (PC1)void ContrTem();void CompTem();“Contr.c”#include contr.h #include #include main.h/根据 Co
35、ntrFlag 的值来控制继电器通断void ContrTem()if(ContrFlagContrFlag) SET_C1;/根据当前温度和设定温度的差来确定 ContrFlag 的值void CompTem()delta=SetTem-CurrTem-temppo1*0.1;if(delta0.5) ContrFlag=0; else if(delta3)ContrFlag=80;else if(delta5)ContrFlag=160; else if(delta10)ContrFlag=240; else if(delta15)ContrFlag=300; else ContrFlag
36、=400;20 页“ds18b20.h”void Port_DS18b20(void); unsigned char DS18B20_Init(void); unsigned char Read_18b20(void);void Write_18b20(unsigned char dat);“ds18b20.c”#include #include #include main.h/引脚宏定义/18B20 定义#defiT_DQ (PORTC) |= (1 (PC0)/18b20/18b20 低电平/18b20 信号输入#define CLR_DQ (PORTC) &=(1 (PC0)#defin
37、e DQ_IN(PINC) & (1(PC0)/PC0 定义成输出/PC0 定义成输入#defi#defiT_OUT (DDRC)|= (1(PC0)T_IN(DDRC)&=(1(PC0)void Port_DS18b20(void)DDRC &= (1 PC0);/ 输入模式(因上拉电阻,上电时为PORTC &= (1 PC0);/ 输出锁存器写 0,以后不再更改)/DS18B20 初始化unsigned char DS18B20_Init(void)/PC0 设置为输出口(相当于拉低数据线上的电平)SET_OUT;_delay_us(490);/延时大于 480us/输入数据线(相当于拉高
38、数据线上的电平)SET_IN;_delay_us(68);/延时大于 60US,/可以用两个 while()死循环来判断复位是否成功,当数据线被拉低,说/while(DQ_IN);明while(!(DQ_IN);/18b20 开始复位应答,当数据线变高,说明应答完毕/if(DQ_IN)/判断 DS18B20 是否拉低数据线OK_Flag = 0;/数据线是高?复位失败elseOK_Flag = 1;/数据线是低?复位成功/有复位应答信号后,应当再延时一段时间(480-68),以等待应答完_delay_us(422);毕21 页return OK_Flag;/返回复位标志/从 DS18B20一个
39、字节数据unsigned char Read_18b20(void)unsigned char i;unsigned char dat = 0;/dat 用于读到的数据,先清零/共读 8 位数据,一个字节for(i = 0;i 1; if(DQ_IN)dat |= 0 x80;_delay_us(62);return dat;/定义为输出(拉低数据线)/拉低 2 微秒/定义成输入,读入数据(同时也相当于拉高数据线)/延时/数据右移,读顺序:先低后高/读数据,/如果是高,置 1,右移数据/延时大于 60us/返回读到的 1 字节数据/向 DS18B20 写 1 字节数据void Write_18
40、b20(unsigned char dat)unsigned char i;for(i = 0;i 1;/数据右移 1 位,先写低位/延时大于 60us/拉高数据线/写两位数据的时间间隔_delay_us(62);SET_IN;_delay_us(2);22 页“leddisplay.h”/ 数码管位和指示灯显示数据变量unsigned char output_sel;/ 数码管段显示数据变量unsigned char output_8seg;/ 指示灯驱动信号输出缓存unsigned char led1,led2,led3,led4;/ 数码管扫描驱动指针unsigned char digi
41、_scaner;/ 测试用计数器unsignedtest_counter;/ 测试用计数值十进制表示unsigned char volatile digi4;/7 段数码显示译码/参数:/DATA: 需要显示的数字或符号;/返回值: 7 段译码结果 ( D70 = PGFEDCBA )unsigned char NUMTOSEG7(unsigned char DATA);void display_led(unsigned char seg,unsigned char sel);void timer0_init(void);ISR(TIMER0_OVF_vect);/定时器 0 5ms 溢出中断
42、“leddisplay.c”#include #include #include #include leddisplay.h #include main.h #include contr.h/7 段数码显示译码/参数:/DATA: 需要显示的数字或符号;/返回值: 7 段译码结果 ( D70 = PGFEDCBA )unsigned char NUMTOSEG7(unsigned char DATA) unsigned char AA; switch (DATA)23 页 case 0: AA=0 xc0;break;case 1: AA=0 xf9;break;case 2: AA=0 xa
43、4;break;case 3: AA=0 xb0;break;case 4: AA=0 x99;break;case 5: AA=0 x92;break;case 6: AA=0 x82;break;case 7: AA=0 xf8;break;case 8: AA=0 x80;break;case 9: AA=0 x90;break;/ 0/ 1/ 2/ 3/ 4/ 5/ 6/ 7/ 8/ 9case 10: AA=0 x88;break; / Acase 11: AA=0 x83;break; / B case 12: AA=0 xc6;break; / C case 13: AA=0 x
44、a1;break; / D case 14: AA=0 x86;break; / E case 15: AA=0 x8e;break; / F case -:AA=0 xdf;break; / 破折号 case _:AA=0 xf7;break; / 下划线reak; / 消隐case :AA=0 xcase 16: AA=0 x89;break; /Hcase 17: AA=0 x8b;break; /h default: AA=0 xff;case 20: AA=0 x40;break;case 21: AA=0 x79;break;case 22: AA=0 x24;break;case
45、 23: AA=0 x30;break;case 24: AA=0 x19;break;case 25: AA=0 x12;break;case 26: AA=0 x02;break;case 27: AA=0 x78;break;case 28: AA=0 x00;break;case 29: AA=0 x10;break;/ 0/ 1/ 2/ 3/ 4/ 5/ 6/ 7/ 8/ 9return(AA);/TIMER0 initialize - prescale:256/ WGM: Normal/ desired value: 200Hz/ actual value: 200.321Hz (
46、0.2%) void timer0_init(void)TCCR0 = 0 x00; /stop TCNT0 = 0 x64; /set countOCR0= 0 x9C;/set compare TCCR0 = 0 x04; /start timervoid display_led(unsigned char seg,unsigned char sel)unsigned char i;24 页/先将 sel 数据送 74hc595 PORTA &= (1PA7);for (i=0;i8;i+)if (sel & 0 x80) = 0)/最 PORTA &= (1PA5);elsePORTA
47、|= (1PA5);/ PA7=0; rclk=0送 U2 SER 端/ PA5=0/PA5=1PORTA &= (1PA6);PORTA |= (1PA6);/PA6=0/PA6=1srclk=1,产生移位时钟信号一位sel = 1;/sel/再将 seg 数据送 74hc595 for (i=0;i8;i+)if (seg & 0 x80) = 0)/最 PORTA &= (1PA5);else送 U2 SER 端/PA5=0PORTA |= (1PA5);/PA5=1PORTA &= (1PA6);PORTA |= (1PA6);/PA6=0/PA6=1srclk=1,产生移位时钟信号一
48、位seg = 1;/segPORTA |= (1PA7); PORTA &= (1PA7);/PA7=1; rclk=1PA7=0; rclk=0,产生锁存输出信号/定时器 0 5ms 溢出中断ISR(TIMER0_OVF_vect)TCNT0 = 0 x64; /重置计数器的值 if(StartFlag)CompTem(); /温度比较,设置 ContrFlagContrTem(ContrFlag);/控温 ContrCount+;输出elseContrTem(0);/ * 检测到按键被按下(0)时,相应的指示灯亮(输出信号 0 使灯亮)*/检测 SW1if (PINC&(1PC4)=0)
49、/PC4,C 口第 4 位led1 = 0;else25 页led1 = 1;/检测 SW2if (PINC&(1PC5)=0) /PC5,C 口第 5 位led2 = 0;elseled2 = 1;/检测 SW3if (PINC&(1PC6)=0) /PC6,C 口第 6 位led3 = 0;elseled3 = 1;/检测 SW4if (PINC&(1=5) digi_scaner = 1;output_sel=led1*16+led2*32+led3*64+led4*128; /四个发光管送高四位 switch (digi_scaner)case 1: / 取第一个数码管显示数据outp
50、ut_sel += 1;output_8seg = NUMTOSEG7(digi0); break;取第二个数码管显示数据output_sel += 2;output_8seg = NUMTOSEG7(digi1); break;case 2: /取第三个数码管显示数据output_sel += 4;output_8seg = NUMTOSEG7(digi2+20); break;case 3: /取第四个数码管显示数据output_sel += 8;output_8seg = NUMTOSEG7(digi3); break;case 4: /display_led(output_8seg,o
51、utput_sel);/串转并输出26 页“slave.h”#include #include #include contr.h #include main.h/用于测试 USART 误码率#define DEBUG/从机 1 超声,从机 2 水温,从机 3 电机,使用时把对应的 define 前的/去掉,把其余的 define注释掉/#define SLAVE_ONE #define SLAVE_TWO/#define SLAVE_THREE#define TX_BUFFER_SIZE 18unsigned char tx_bufferTX_BUFFER_SIZE; unsigned cha
52、r tx_wr_index,tx_rd_index,tx_counter;#define RX_BUFFER_SIZE 18unsigned char rx_bufferRX_BUFFER_SIZE;unsigned char rx_counter,Uart_RecvFlag,rx_sus,rx_data;ISR(USART_TXC_vect);ISR(USART_RXC_vect);void tx_phar(unsigned char c);void Respond_Frame(unsigned char RSPD, unsigned char RTN, unsigned char INFO
53、1, unsignedchar INFO2);void USART_Init();“slave.c”#include #include #include slave.h #include leddisplay.h/#include #define BAUD 9600ISR(USART_TXC_vect)if(tx_counter)-tx_counter; UDR=tx_buffertx_rd_index;if(+tx_rd_index=TX_BUFFER_SIZE) tx_rd_index=0;27 页void tx_phar(unsigned char c)while(tx_counter=
54、TX_BUFFER_SIZE);cli();if(tx_counter|(UCSRA & (15) =0)tx_buffertx_wr_index=c; if(+tx_wr_index=TX_BUFFER_SIZE) tx_wr_index=0;+tx_counter;else UDR=c; sei();/RSPD, RTN, INFO1, INFO2 使用 ASCII 码表示/函数将 RSPD,RTN,INFO1, INFO2 转换成对应的 0 x 数void Respond_Frame(unsigned char RSPD,unsigned char RTN, unsigned char
55、INFO1, unsigned char INFO2)unsignedSUM=0;unsigned char CHKSUM;SUM = 0 x11+0 x00+RSPD+RTN+0 x02+INFO1+INFO2;CHKSUM=(unsigned char)(SUM%256); CHKSUM=CHKSUM+1;har(0 x7E);/回送数据包 har(0 x31);har(0 x31); har(0 x30); har(0 x30);har(RSPD/16 + 0 x30); har(RSPD%16 + 0 x30); har(RTN/16 + 0 x30); har(RTN%16 + 0
56、x30);har(0 x30); har(0 x32);har(INFO1 / 10 + 0 x30);/十进制发送 har(INFO1 % 10 + 0 x30);har(INFO2 / 10 + 0 x30); har(INFO2 % 10 + 0 x30);tx_ptx_p tx_p tx_p tx_p tx_p tx_p tx_p tx_p tx_p tx_p tx_p tx_p tx_p tx_p/CHESUMtx_ptx_p tx_phar(CHKSUM/16+0 x30);har(CHKSUM%16+0 x30);har(0 x0D);/接受部分需要进行 DEBUG 部分的考虑#
57、ifdef DEBUGunsigned char rx_error_bit_num=0;28 页unsigned char rx_error_frame_num=0;unsigned char rx_tx_time_scope=0;/距离收到第一个命令帧到发送第一个响应帧的相应时间 #endif/unsigned char Uart_RecvCmdReadyFlag;/如果中断处理时间太长,那么就在 main 函数的 while 循环中进行 tx_p ISR(USART_RXC_vect)/如果是脱机模式,则忽略har 发送数据/*if(StartFlag=0)Uart_RecvFlag=0;
58、 return;*/非脱机模式:unsigned char i,CMD1,CMD2,INFO1,INFO2,RTN; unsigned char SUM;unsigned char CHKSUM; rx_sus=UCSRA; rx_data=UDR; if(!Uart_RecvFlag)if(rx_sus&(14)|(12)|(13)=0)rx_bufferrx_counter=rx_data; rx_counter+; switch(rx_counter)case 1:if(rx_data!=0 x7E) rx_counter=0; break;/*case 3:if(!(rx_data=0
59、 x31)&(rx_buffer1=0 x31) rx_counter=0;#ifdefDEBUGrx_error_bit_num+;#endif break;*/case 11:if(!(rx_buffer9=0 x30)&(rx_data=0 x32) rx_counter=0;#ifdefDEBUGrx_error_bit_num+;#endif break;case 17:CHKSUM=0; SUM=0;/*/for(i=1;i15;i+) CHKSUM=(CHKSUM+(rx_bufferi-0 x30)(4*(i%2)%256;for(i=1;i15;i+) SUM+=(rx_bu
60、fferi-0 x30)(4*(i%2); CHKSUM = 256-SUM%256;if(CHKSUM)!=(rx_buffer15-0 x30)4)+rx_buffer16-0 x30) rx_counter=0;#ifdefDEBUG29 页rx_error_frame_num+;#endif break;*/case 18:rx_counter=0;if(rx_data=0 x0D) Uart_RecvFlag=1;/成功接收 break;if(Uart_RecvFlag)if(rx_buffer3=0 x46)&(rx_buffer4=0 x46)CMD1=(rx_buffer5-0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 烟草薄片涂布加工技师(初级)考试试卷及答案
- 2026年四川省峨眉山市高二生物下册期末考试考试卷(考点梳理)附答案
- 2026年辽宁省凤城市高二生物下册期末考试检测卷及答案【名师系列】
- 2026年河北省安国市高二生物下册期末考试测试卷及答案一套
- 2026年广东省陆丰市高二生物下册期末考试考试卷带答案(轻巧夺冠)
- 2026年广东省信宜市高二生物下册期末考试试卷带答案AB卷
- 2025年辽宁省开原市高二生物下册期末考试检测卷附完整答案(名师系列)
- 2026年广东省雷州市高二生物下册期末考试检测卷及完整答案【网校专用】
- 2026年湖北省潜江市高二生物下册期末考试检测卷带答案(黄金题型)
- 2026年云南省个旧市高二生物下册期末考试试卷(培优)附答案
- 江苏高科技投资集团有限公司招聘笔试题库2026
- 第13课 每个人都有梦想 第一课时 课件(内置视频)-2025-2026学年道德与法治二年级下册统编版
- 2025一2026学年度上期高2028届期末考试物理
- 初中必背古诗文完整带注音版
- 肥料安全生产制度
- 小学信息技术教师讲座
- GB/T 3871.9-2025农业拖拉机试验规程第9部分:牵引功率试验
- 车载冰箱项目可行性研究报告(总投资14000万元)(58亩)
- 电缆厂员工环境保护培训
- 医疗机构环境表面清洁与消毒管理标准
- 市政有限空间培训
评论
0/150
提交评论