单片机温度检测记录系统_第1页
单片机温度检测记录系统_第2页
单片机温度检测记录系统_第3页
单片机温度检测记录系统_第4页
单片机温度检测记录系统_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、物理与电子信息学院题目:单片机温度检测记录系统行政班级:成员分组名单学号:姓名:选课班级:任课教师:成绩:目录1设计任务与要求21.1 设计任务21.2 技术指标21.3 题目评析22方案比较与论证32.1 各种方案比较与选择33系统硬件设计43.1 系统的总体设计4图3-2总体原理图错误!未定义书签。3.2 功能模块设计及工作原理的分析43.2.1 时钟显示模块43.2.2 温度传感器模块错误!未定义书签。3.2.3 LCD显示数据模块53.2.4 串口数据传输显示模块63.3 发挥部分的设计与实现83.3.1 年月日时分秒,温度报警上限设置功能83.3.1.1 硬件按钮部分83.3.1.2

2、 红外遥控设置模块83.3.2 按键传输串口数据94系统软件设计105 测试结果136 系统电路存在的不足和改进的方向147参考文献错误!未定义书签。8附录:错误!未定义书签。1设计任务与要求1.1 设计任务设计制作一台可检测和记录温度的系统。1.2 技术指标(1) LCD显示实时时钟:年、月、日、时、分、秒;(2)每30秒采样温度,LCD更新显示温度值;(3)按键触发存储当前温度和时钟信息(年、月、日、时、分);(4)按键触发串口传输存储的温度和时钟信息;(5)温度测量精度:土1度。1.3题目评析本设计题我们小组摒弃了常规做法,加入了两项独特的创新实现方法:(1)对于数据传送储存显示方面我们

3、不使用24C02存储器,I2C存储器等储存器件,而是直接通过串口将数据传输的电脑中通过VB界面显示数据并将数据记录在电脑硬盘中。(2)在设置时间日期,上限温度上,我们不仅仅采用了硬件按钮控制而且还加入了红外遥控控制。与此同时,我们的温度测量精度在理论上能达到0.0625实际运行时也能达到0.1度,而实验所要求的仅为1摄氏度。另外,在DS1302芯片上加入了一个备用电源,使得主电源掉电时,时钟芯片仍然在随着时间的移动而实时更新。因此主电源再次上电时,时钟依然是准确的,而不必重新调过。2方案比较与论证2.1 各种方案比较与选择2.1.1 温度传感器目前使用接触式比较多,主要有热电式传感器,把温度变

4、化转换为电阻变化的叫热电阻传感器,把温度变化转换为热电势变换的叫热电偶传感器。方案1:热电阻传感器具有高温系数,高电阻率,物理特性稳定,良好的线性输出等优点,常用的有pt100等。方案2:热电偶传感器具有结构简单,测量范围广,热惯性小,准确度高,输出信号远的优点,但价格较高。方案3:新型可编程温度传感器DS18B20,精度高,成本低,易于采集信号。利用热电偶或热敏电阻作为温度传感器,这类传感器至仪表之间通常都要用专用的温度补偿导线,而温度补偿导线的价格很高,并且线路太长,会影响测量精度,这是直接以模拟量形式进行采集的不可避免的问题。采用新型可编程温度传感器DS18B20进行温度检测可以避免热电

5、偶或热敏电阻作为温度传感器所造成的测量精度误差过大等问题,同时DS18B20只需要一个I/O口便可以进行通信,它可以以更低的成本和更高的精确度实现温度检测。所以选择方案3。2.1.2 时钟显示方案1:采用内部时钟计时。方案2:采用外部时钟芯片DS1302。采用内部时钟计时,可以节省IO弓I脚,降低成本,但是内部振荡器使用阻容震荡,其精度不高,如果使用了串口、或者PWM等对时钟比较敏感的功能,会对时钟造成混乱。采用外部时钟芯片DS1302,不仅仅能对时间进行计时还可以对年、月、日、周进行计时,具有闰年补偿功能而且对于使用串口、或者PWM等对时钟比较敏感的功能,不会产生影响。如果接入外置电子电池的

6、话在系统掉电的情况下还可以继续计时。所以选择方案2。2.1.3 时间温度数据显示方案1:采用数码管显示。方案2:米用LCD显木器显布。采用数码管显示时间温度数据操作方便,但需要用到的数码管数量甚多,占用I/O口较多,浪费I/O口的利用率,且只能显示数字。而使用LCD显示虽然在编程上有一定程度比数码管显示的复杂性高,但其占用的I/O资源较少,且能显示的内容比数码管丰富的多,不仅能显示数值还能显示英文。所以使用方案2.2.1.4 数据的串口传送与储存显示方案1:通过串口将数据传送到另一个单片机系统上显示,采用24C02存储器对数据进行储存。方案2:通过串口将数据传送到PC机上并用VB程序编写的界面

7、显示,采用PC机上的“D盘”对数据进行储存。通过串口将数据从一个单片机传送到另一个单片机上设置较为简单,将数据存储到24C02存储器上,不易于对任意时间温度数据进行提取,而将数据传送到PC机上并用VB界面显示出来不仅美观而且信息量丰富,将数据储存在“D:温度.TXT”目录下不仅存储量大,而且便于直观查看。所以使用方案2。3系统硬件设计3.1 系统的总体设计本系统以STM32F103ZET6单片机为核心,采用温度传感器DS18B20进行温度检测,将数字温度信息传输到单片机中,在时钟方面采用外部时钟芯片DS1302,DS1302是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、

8、时、分、秒进行计时。单片机通过采集温度时间信息后将温度时间数据传送到LCD上显示出来,并将数据通过串口通信通过MAX232传送到电脑中,硬件总体框图如下:图3-1硬件总体框图3.2 功能模块设计及工作原理的分析3.2.1 时钟显示模块时钟模块采用外部时钟DS1302进行计时,DS1302是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31X8的用于临时性存放数据的RAM寄存器。DS1302是DS1

9、202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。其管脚图以及此模块仿真图如图3-3(a)及3-3(b)所示。(a)(b)图3-3DS1302管脚图与时钟模块仿真图各引脚的功能为:Vcc1:备用电源;Vcc2:主电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2<Vcc1时,由Vcc1向DS1302供电。在实物中,我们将vccl与一颗3V的钮扣电池相连,从而实现时钟实时更新功能。SCLK:串行时钟,输入,控制数据的输入与输出;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据

10、期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。DS1302有下列几组寄存器:DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h8Dh,写时80h8Ch),存放的数据格式为BCD码形式,如下图3-4所示。读寄存器写寄存器BIT7BIT6BIT5BIT4BIT3BIT20IT1BIT0范围81HsonCH1。秒再00-5983h62h1。分分00-5985tl64h12/2?0IC时时1-12/0-2387h86h00WB日7189hSflh00010月.月1-128Ah00000周日:-7B

11、Dh8Chto年年00-998EhWP0000000图3-4各寄存器详情DS1302的控制字如图3-5所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。DS130

12、2可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录。这种记录对长时间的连续测控系统结果的分析及对异常数据出现的原因的查找具有重要意义。传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此,只能记录数据而无法准确记录其出现的时间;若采用单片机计时,一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且,某些测控系统可能不允许。但是,如果在系统中采用时钟芯片DS1302,则能很好地解决这个问题。3.2.2 dht11温湿感应器DHT1微生温湿度使感鉴是一款含有已校准数字信号输出的温湿度复合传感器,它应用

13、专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测型号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。”技术参数供电电压:3.35.5VDC输出:单总线数字信号测量范围:湿度20-

14、90%RH温度050c测量精度:湿度+-5%RH温度+-2C分辨率:湿度1%RH温度1C互换性:可完全互换,长期稳定性:±1%R#3.2.3 串口数据传输显示模块串行接口SerialInterface是指数据一位位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信,并可以利用电话线,从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。RS-232也称标准串口,最常用的一种串行通讯接口。采取不平衡传输方式,即所谓单端通讯。由于其发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/s

15、。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为37kQ。所以RS-232适合本地设备之间的通信。这里我们通过STM32F103ZET6的串行传输口TXD,RXD,将温度,时间数据通过MAX232传输到PC上并通过VB界面显示时间温度描绘温度/时间曲线。MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。MAX232引脚图如图3-11(a)硬件设置如图3-11(b),VB显示界面如图3-12。司INPUTcsft丫比曲m+nvVOLIAGtWUEUROVOLTAGEWTERHLWQSomisIUCSXTXTIrl

16、DDRR_TcD二1节mm%&M口二TH二.E俣BLUECl-ChT1OUII1INR1NR1OUIT2OU1TilNR2INR2OUT颇VS.HPO.lu(a)(b)图3-11MAX232引脚图及其MAX3防真图单片机温度检测记录系统围口设置I20*二知*«77K*.I(!)qnajiBBirain!IT上次记厚X4EWO假Sff4?JS+)'),;'一/!1!>>,电!,P,!3:!,!*!I范昆|方方1关丽口Iri*KliMtal中.送阻ri,m中si吟石设置整定拉窗附口比总.;:J22+"1Wtrion00电周二|.后插倬电I也出

17、1I>幽皿00电近二J国i*由m*fiaH8m电am1时同闭总L叼”三;:"::I2s工JEm<n电St百1foo:Daoo六J星度;曲|JizoKlj:二二!工胸8厘电后七I幅一I(00:00OOJjgd1n1ian0恭迎使用单片机逞度像,运录系境图3-12单片机温度检测记录系统(vb)如图3-11(a)与3-11(b)所示,其各引脚功能介绍如下:第一部分是电荷泵电路。由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。第二部分是数据转换通道。由7、8、9、10、11、12、13、14脚构成两个数据通道。其中

18、13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。第三部分是供电。15脚GND、16脚VCC(+5v)。3.3 发挥部分的设计与实现发挥部分包含两个部分。首先是年月日时分秒及其温度报警上限功能设置,另外还有串口数据传输部分的实现。3.3.1

19、 年月日时分秒,温度报警上限设置功能年月日时分秒及其温度报警上限功能设置有两种方法,包括硬件按键设置以及红外遥控设置。3.3.1.1 硬件按钮部分硬件按钮部分设置如图3-13所示,keyl:为功能设置进入按钮,key2:为功能切换按钮如图3-14,3-15,3-16,3-17,3-18,3-19,3-20,所示。key3:为加一功能按键。key4:为减一功能按键。在这一部分中,4个按键按下key1即可进入年设置模式,通过key3与key4键进行加一减一操作。设置完年份之后,再按下key2即可进入月份设置操作,继续按下则能相继出现日,时,分,秒及温度上限的设置操作,同理,key3与key4对数值

20、设置进行加减。图3-14设置年份图3-15设置月份图3-13硬件按钮设置图3-16设置日期图3-17设置小时图3-18设置分钟图3-19设置秒图3-20设置温度3.3.1.2 红外遥控设置模块人的眼睛能看到的是可见光,若按波长排列,依次(从长到短)为红、橙、黄、绿、青、蓝、紫,红光的波长范围为0.62科m0.7科m,比红光波长还长的光叫红外线。红外线遥控器就是利用波长0.76科m1.5科m之间的近红外线来传送控制信号的。红外线的特点是不干扰其他电器设备工作,也不会影响周边环境。调试简单,若对发射信号进行编码,可实现多路红外遥控功能。红外线发射和接收:红外遥控发射器由键盘矩阵、遥控专用集成电路、

21、激励器和红外发光二极管组成。遥控专用集成电路(采用AT89S52单片机)是发射系统的核心部分,其内部由振荡电路、定时电路、扫描信号发生器、键输入编码器、指令译码器、用户码转换器、数码调制电路及缓冲放大器等组成。它能产生键位扫描脉冲信号,并能译出按键的键码,再经遥控指令编码器得到某键位的遥控指令(遥控编码脉冲),由38KHZ的载波进行脉冲幅度调制,载有遥控指令的调制信号激励红外二极管发出红外遥控信号。在红外接收器中,采用光电转换器(光电二极管),将接收到的红外光指令信号转换成相应的电信号。由于技术原因与制作成本,红外遥控发射器是利用现成的电视遥控器。接收器将接收到的红外频率数据传输到单片机中,进

22、行处理识别红外控制的按键,从而进行时间温度的设置。3.3.2 按键传输串口数据如下图3-21为串口传输的按键。四个按键分别对应的功能如下:Key3:单次按键传输串口数据,即每触发一次传输一次即时的时间温度数据。Key4:触发一次连续传输即时的串口数据。Key2:停止串口数据传输按钮。图3-21按键传输串口数据功能键4系统软件设计主函数开始先进行LCD初始化,时钟芯片初始化,串口初始化,之后通过时间,温度处理函数读取时间,温度的数值,判断是否有按键被按下,如果没有运行时间显示函数,温度显示函数,温度报警函数;如果按键被按下,则进入功能设置函数调节时间和温度上限。总体程序流程图如图4-1所示。图4

23、-1总体程序流程图主程序可见附录程序1。4.1 温度传感器流程图将dhtll首先要将温度传感器内存初始化,逐字读取传感器RAM中的的温度数据,并将数据转化为十进制的浮点型数据,返回温度值。其流程图如下:图4-2温度传感器流程图温度传感器程序见附录程序2。4.2 时钟芯片流程图判断时间显示是否正确如果不正确外部电路可从新设置时钟之后进入流程(1),如果时间显示正确,(1)读取芯片内部RAM中的提取年、月、日、时、分、秒数据,并将年、月、日、时、分、秒值返回。图4-3时钟芯片流程图时钟芯片程序见附录程序3。4.3 红外控制程序流程图初始化红外接收管,判断是否接收到红外信号,无则结束,有则判断红外信

24、号是否为有用信号,如有有用信号则返回相应的值。图4-4红外控制程序流程图红外控制程序见附录程序4。4测试结果LCD显示时间温度正如上图为我们所搭的实物图,接通电源后,各个模块均正常工作,常。6系统电路存在的不足和改进的方向电路存在不足之处在于时间温度的串口传输是通过有线进行的,灵活性与局限性较大,如果主系统与从系统距离较大,便使用起来更不方便,改进之处在于,不使用有线传输数据,而是使用无线传输数据,使用功率较大的无线接受发器还可以传送百米甚至几百米以上的距离,在软件方面对无线设置协议便可解决因距离过大而产生的数据出错。另外,可以考虑同时实现本地存储与异地存储的结合使用。困为如果要存储在电脑上,

25、虽然美观而且使用方便,但是其功耗及延时将会比存储在本地上要多得多。所以,这也将是一个改进的方向。7技能训练四感想经过这次的测试技术实验,我们小组得到了不少的收获,一方面加深了我对课本理论的认识,另一方面也提高了实验操作能力。在实验的过程中我们要培养自己的独立分析问题,和解决问题的能力。在这学期的实验中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。还有团结协作的精神,而这是日后最实用的,真的是受益匪浅。8附录1)文件主函数

26、intmain(void)(u8t=0;u8temperature;u8humidity;Stm32_Clock_Init(9);TIMER_Init();uart_init(72,9600);delay_init(72);LED_Init();LCD_Init();usmart_dev.init(72);KEY_Init();POINT_COLOR=RED;/while(DHT11_Init()系统时钟设置串口初始化为9600延时初始化初始化与LED连接的硬件接口初始化LCD初始化USMART按键初始化设置字体为红色/DHT11初始化(LCD_ShowString(60,130,200,16

27、,16,"DHT11Error");Delay_ms(200);LCD_Fill(60,130,239,130+16,WHITE);Delay_ms(200);LCD_ShowString(60,130,200,16,16,"DHT11OK");POINT_COLOR=BLUE;/设置字体为蓝色LCD_ShowString(60,150,200,16,16,"Temp:C");LCD_ShowString(121,150,200,16,16,".");LCD_ShowString(60,170,200,16,16,

28、"Humi:%");LCD_ShowString(121,170,200,16,16,".");while(1)(if(t%10=0)/每100ms读取一次(DHT11_Read_Data(&temperature,&humidity);读取温湿度值LCD_ShowNum(60+45,150,temperature,2,16);显示温度LCD_ShowNum(60+45,170,humidity,2,16);显示湿度Delay_ms(10);t+;if(t=20)(/t=0;LED0=!LED0;)if(t=100)(t=calendar

29、.sec;calendar.hour=13;/calendar.min=40;if(calendar.sec%60=0)(calendar.sec=0;calendar.min+;)if(calendar.min%60=0)(calendar.min=0;calendar.hour+;)LCD_ShowNum(60,10,calendar.w_year,4,16);LCD_ShowNum(100,10,calendar.w_month,2,16);LCD_ShowNum(124,10,calendar.w_date,2,16);LCD_ShowNum(60,42,calendar.hour,2

30、,16);LCD_ShowNum(84,42,calendar.min,2,16);LCD_ShowNum(108,42,calendar.sec+,2,16);)Delay_ms(10);)2)dht11温湿感应器函数程序/复位DHT11voidDHT11_Rst(void)(DHT11_IO_OUT();/SETOUTPUTDHT11_DQ_OUT=0;拉低DQDelay_ms(20);拉低至少18msDHT11_DQ_OUT=1;/DQ=1Delay_us(30);主机拉高2040us)/等待/返回/返回DHT11的回应1:未检测到DHT11的存在0:存在u8DHT11_Check(vo

31、id)(u8retry=0;DHT11_IO_IN();/SETINPUTwhile(DHT11_DQ_IN&&retry<100)/DHT11(retry+;Delay_us(1););if(retry>=100&&retry<210)return1;elseretry=0;while(!DHT11_DQ_IN&&retry<100)/DHT11(retry+;Delay_us(1););if(retry>=100)return1;return0;会拉低4080us拉低后会再次拉高40-80us)/从DHT11读取

32、一个位/返回彳1:1/0u8DHT11_Read_Bit(void)(u8retry=0;等待变为低电平等待变高电平while(DHT11_DQ_IN&&retry<100)(retry+;Delay_us(1);)retry=0;while(!DHT11_DQ_IN&&retry<100)/(retry+;delay_us(1);)Delay_us(40);/等待40usif(DHT11_DQ_IN)return1;elsereturn0;)/从DHT11读取一个字节/返回值:读到的数据u8DHT11_Read_Byte(void)(u8i,dat

33、;dat=0;for(i=0;i<8;i+)(dat<<=1;dat|=DHT11_Read_Bit();returndat;/从DHT11读取一次数据/temp:温度值(范围:050°)/humi:湿度值(范围:20%90%)/返回彳1:0,正常;1,读取失败u8DHT11_Read_Data(u8*temp,u8*humi)(u8buf5;u8i;DHT11_Rst();if(DHT11_Check()=0)(for(i=0;i<5;i+)/读取40位数据(bufi=DHT11_Read_Byte();if(buf0+buf1+buf2+buf3)=buf

34、4)(*humi=buf0;*temp=buf2;elsereturn1;return0;初始化DHT11的IO口DQ同时检测DHT11的存在/返回1:不存在/返回0:存在u8DHT11_Init(void)(RCC->APB2ENR|=1<<8;使能PORTG口时钟GPIOG->CRH&=0XFFFF0FFF;PORTG.11推挽输出GPIOG->CRH|=0X00003000;GPIOG->ODR|=1<<11;输出1DHT11_Rst();returnDHT11_Check();)3)延时函数staticu8fac_us=0;/us

35、延时倍乘数staticu16fac_ms=0;/ms延时倍乘数,在ucos下,代表每个节拍的ms数#ifdefOS_CRITICAL_METHOD/如果OS_CRITICAL_METHOD定义了,说明使用ucosII了./systick中断服务函数,使用ucos时用到voidSysTick_Handler(void)(OSIntEnter();/进入中断OSTimeTick();/调用ucos的时钟服务程序OSIntExit();/触发任务切换软中断)#endif初始化延迟函数当使用ucos的时候,此函数会初始化ucos的时钟节拍/SYSTICK的时钟固定为HCLK时钟的1/8/SYSCLK:

36、系统时钟voiddelay_init(u8SYSCLK)(#ifdefOS_CRITICAL_METHOD/如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.u32reload;#endifSysTick->CTRL&=(1<<2);/SYSTICK使用外部时钟源fac_us=SYSCLK/8;/不论是否使用ucos,fac_us都需要使用#ifdefOS_CRITICAL_METHOD/如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.reload=SYSCLK/8;每秒钟的计数次数单位为Kreload*=1000000/

37、OS_TICKS_PER_SEC;/根据OS_TICKS_PER_SEC设定溢出时间/reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右fac_ms=1000/OS_TICKS_PER_SEC;/代表ucos可以延时的最少单位SysTick->CTRL|=1<<1;开启SYSTICK中断SysTick->LOAD=reload;每1/OS_TICKS_PER_SEC秒中断一次SysTick->CTRL|=1<<0;开启SYSTICK#elsefac_ms=(u16)fac_us*1000;/非ucos下,代表每个ms需

38、要的systick时钟数#endif)#ifdefOS_CRITICAL_METHOD/如果OS_CRITICAL_METHOD定义了,说明使用ucosII了./延时nus/nus为要延时的us数.voiddelay_us(u32nus)(u32ticks;u32told,tnow,tcnt=0;u32reload=SysTick->LOAD;/LOAD的值ticks=nus*fac_us;需要的节拍数tcnt=0;OSSchedLock();阻止ucos调度,防止打断us延时told=SysTick->VAL;/刚进入时的计数器值while(1)(tnow=SysTick->

39、;VAL;if(tnow!=told)(if(tnow<told)tcnt+=told-tnow;/这里注意一下SYSTICK是一个递减的计数器就可以了.elsetcnt+=reload-tnow+told;told=tnow;if(tcnt>=ticks)break;/时间超过/等于要延迟的时间,则退出.);OSSchedUnlock();/开启ucos调度)/延时nms/nms:要延日的ms数voiddelay_ms(u16nms)(if(OSRunning=OS_TRUE)/如果os已经在跑了(if(nms>=fac_ms)/延时的时间大于ucos的最少时间周期(OST

40、imeDly(nms/fac_ms);/ucos延时)nms%=fac_ms;/ucos已经无法提供这么小的延时了,采用普通方式延时delay_us(u32)(nms*1000);普通方式延时)#else/不用ucos时/延时nus/nus为要延时的us数.voiddelay_us(u32nus)u32temp;SysTick->LOAD=nus*fac_us;/时间加载SysTick->VAL=0x00;/清空计数器SysTick->CTRL=0x01;开始倒数dotemp=SysTick->CTRL;)while(temp&0x01)&&!(

41、temp&(1<<16);等待时间到达SysTick->CTRL=0x00;关闭计数器SysTick->VAL=0X00;清空计数器)/延时nms/注意nms的范围/SysTick->LOAD为24位寄存器,所以,最大延时为:/nms<=0xffffff*8*1000/SYSCLK/SYSCLK单位为Hz,nms单位为ms对72M条件下,nms<=1864voiddelay_ms(u16nms)u32temp;SysTick->LOAD=(u32)nms*fac_ms;/时间加载(SysTick->LOAD为24bit)SysTic

42、k->VAL=0x00;清空计数器SysTick->CTRL=0x01;开始倒数dotemp=SysTick->CTRL;)while(temp&0x01)&&!(temp&(1<<16);等待时间到达SysTick->CTRL=0x00;关闭计数器SysTick->VAL=0X00;清空计数器)#endifu8cnt1=0,cnt2=0;voidTIMER_Init(void)(RCC->APB1ENR|=RCC_APB1ENR_TIM6EN|RCC_APB1ENR_TIM7EN;)voidDelay_us(u3

43、2uns)(cnt1=0;TIM6->ARR=uns;TIM6->PSC=71;/1MHz=1us;TIM6->CR1|=TIM_CR1_OPM;TIM6->DIER|=TIM_DIER_UIE;TIM6->CR1|=TIM_CR1_CEN;MY_NVIC_Init(0,1,TIM6_IRQn,0);while(!cnt1);cnt1=0;)voidDelay_ms(u16ums)(TIM7->ARR=ums*10;TIM7->PSC=7199;/10KHz=0.1ms;TIM7->CR1|=TIM_CR1_OPM;TIM7->DIER|=

44、TIM_DIER_UIE;TIM7->CR1|=TIM_CR1_CEN;MY_NVIC_Init(0,2,TIM7_IRQn,0);while(!cnt2);cnt2=0;)voidTIM6_IRQHandler(void)(TIM6->SR&=TIM_SR_UIF;cnt1=1;)voidTIM7_IRQHandler(void)(TIM7->SR&=TIM_SR_UIF;cnt2=1;4)RTC初始化函数u8RTC_Init(void)(/检查是不是第一次配置时钟u8temp=0;if(BKP->DR1!=0X5050)/第一次配置RCC->APB1ENR|=1<<28;RCC->APB1ENR|=1<<27;PWR->CR|=1<<8;RCC->BDCR|=1<<16;RCC->BDCR&=(1<<16);RCC->BDCR|=1<<0;使能电源时钟使能备份时钟/取消备份区写保护备份区域软复位备份区域软复位结束开启外部低速振荡器while(!(RCC->BDCR&0X02)

温馨提示

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

评论

0/150

提交评论