温度传感器数码管显示C程序
单片机毕业设计
基于2.4G射频的汽车防盗报警系统设计摘要:汽车成为很多人不可缺少的交通工具,现在汽车被盗的现象很多,盗贼的手法也层出不穷。
为对付不断升级的盗车手段,人们研制出各种方式、各种结构的防盗器,但汽车被盗还是非常严重。
基于此现象,本次设计采用以单片微机8051为核心设计的汽车防盗报警系统,该系统主要使用无线收发一体射频模块nRF24L01、温度传感器、单片机、显示报警电路。
本系统通过温度传感器测量发动机表面温度,然后把信号输入到单片机,单片机根据检测电路输出的温度与设定温度值的比对决定是否启动继电器亮灯,从无线收发模块发射无线电信号,在接收板的显示屏上显示出当前温度,从而判读汽车是否被启动,实现系统的报警功能。
设计了低功耗采集电路,该系统使用方便,扩展十分容易。
关键词:STC89C52 温度传感器 nRF24L01Based on the 2.4 G car security alarm systemdesignAbstract: the become a lot of people do not lack of transportation, now the phenomenon of the car was stolen a lot, rogue technique also emerge in endlessly. To deal with the escalating auto theft means, people developed all kinds of ways, all kinds of structure of the devices, but the car was stolen or very serious. Based on this phenomenon, this design USES the single chip microcomputer 8051 to design as the core of guard against theft alarm system, this system mainly use wireless transceiver module, rf one nRF24L01 temperature sensors, SCM, display alarming circuit. The system through the temperature sensor measuring engine surface temperature, then the signal is input to a single-chip microcomputer, SCM according to the test circuit output temperature and the temperature setting than to decide whether starter relay light, from wireless transceiver module launch radio signals, the receiver display shows that thecurrent temperature, and thereby reading if the car was launched, the system of alarm function. Design the low consumption acquisition circuit, this system is easy to use, expand very easy.Key words: STC89C52 temperature sensor nRF24L01目录1.绪论 (4)1.1课题的背景与意义 (5)1.2系统功能及目的 (5)2.方案论证 (6)2.1 系统总体方案论证 (6)3.元器件选择 (7)3.1温度传感器部分 (7)3.2 单片机的选择 (7)3.3 显示器件的选择 (8)4.系统的硬件电路设计 (10)4.1系统总体电路设计 (10)4.2单片机主控制电路设计 (11)4.2.1 STC89C52简介 (11)4.2.2STC89C52引脚说明 (12)4.3 LCD显示电路设计 (14)4.3.1 字符型液晶显示模块 (14)4.3.2 字符型液晶显示模块引脚 (15)4.3.3 字符型液晶显示模块内部结构 (15)4.4温度传感器DS18B20电路设计 (16)4.4.1 DS18B20简介 (16)4.4.2 电路设计 (18)4.5无线收发模块 (18)4.5.1 简介 (18)4.5.2 nRF24L01概述 (19)4.5.3 引脚功能及描述 (19)4.5.4 工作模式 (20)4.5.5 工作原理 (21)4.6 电源设计电路 (21)5.系统软件设计 (23)5.1无线发射模块软件设计 (23)5.2 接收端软件设计 (24)6.总结 (26)6.1调试总结 (26)6.2心得体会 (26)致谢 (28)参考文献 (29)附录 (30)1.绪论1.1课题的背景与意义近些年来,随着社会经济的发展以及工业发展的突飞猛进,人民生活水平也有了显著提高,世界的距离也在不断缩小,随着交通日益发达,越来越多的汽车进入了人们的日常生活,随着科学技术的发展,汽车偷窃技术越来越高,令人们防不胜防,已对全世界造成极大的危害,汽车防盗问题也成了一个不容忽视的问题,无论是对汽车制造商还是社会保险业都具有极其重要的研究价值,如何制定出更为严范的法规,开发出更为有效的汽车防盗装置,减少车主的损失是今后人们现就的重要课题。
基于DS18B20的温度采集显示系统的设计
目录1.引言 (1)1.1绪论 (1)1.2课程设计任务书 (1)2.设计方案 (3)3.硬件设计方案 (3)3.1最小系统地设计 (3)3.2LED发光报警电路 (5)3.3DS18B20地简介及在本次设计中地应用 (5)3.3.1 DS18B20地外部结构及管脚排列 (5)3.3.2 DS18B20地工作原理 (6)3.3.3 DS18B20地主要特性 (7)3.3.4 DS18B20地测温流程 (8)3.3.5 DS18B20与单片机地连接 (8)3.4报警温度地设置 (8)3.5数码管显示 (9)3.5.1数码管工作原理 (9)3.5.2数码管显示电路 (10)3.6硬件电路总体设计 (11)4.软件设计方案 (12)4.1主程序介绍 (12)4.1.1主程序流程图 (12)4.1.2主流程地C语言程序 (13)4.2部分子程序 (17)4.2.1 DS18B20复位子程序 (17)4.2.2 写DS18B20命令子程序 (18)4.2.3读温度子程序 (20)4.2.4计算温度子程序 (22)4.2.5显示扫描过程子程序 (23)5.基于DS18B20地温度采集显示系统地调试 (25)6.收获和体会 (27)7.参考文献 (27)1.引言1.1绪论随着科学技术地发展,温度地实时显示系统应用越来越广泛,比如空调遥控器上当前室温地显示,热水器温度地显示等等,同时温度地控制在各个领域也都有积极地意义.采用单片机对温度进行控制不仅具有控制方便、简单、灵活性大等特点,而且还可以大幅度提高被控温度地技术指标.本文介绍了基于DS18B20地温度实时采集与显示系统地设计与实现.设计中选取单片机AT89C51作为系统控制中心,数字温度传感器DS18B20作为单片机外部信号源,实现温度地实时采集.并且用精度较好地数码管作为温度地实时显示模块.利用单片机程序来完成对DS18B20与AT89C51地控制,最终实现温度地实时采集与显示.采用单片机对温度进行控制不仅具有控制方便、简单、灵活性大等特点,而且还可以大幅度提高被控温度地技术指标.1.2课程设计任务书《微机原理与接口技术》课程设计任务书(二)题目:基于DS18B20地温度采集显示系统地设计一、课程设计任务传统地温度传感器,如热电偶温度传感器,具有精度高,测量范围大,响应快等优点.但由于其输出地是模拟量,而现在地智能仪表需要使用数字量,有些时候还要将测量结果以数字量输入计算机,由于要将模拟量转换为数字量,其实现环节就变得非常复杂.硬件上需要模拟开关、恒流源、D/A转换器,放大器等,结构庞大,安装困难,造价昂贵.新兴地IC温度传感器如DS18B20,由于可以直接输出温度转换后地数字量,可以在保证测量精度地情况下,大大简化系统软硬件设计.这种传感器地测温范围有一定限制(大多在-50℃~120℃),多适用于环境温度地测量.DS18B20可以在一根数据线上挂接多个传感器,只需要三根线就可以实现远距离多点温度测量.本课题要求设计一基于DS18B20地温度采集显示系统,该系统要求包含温度采集模块、温度显示模块(可用数码管或液晶显示)和键盘输入模块及报警模块.所设计地系统可以从键盘输入设定温度值,当所采集地温度高于设定温度时,进行报警,同时能实时显示温度值.二、课程设计目地通过本次课程设计使学生掌握:1)单总线温度传感器DS18B20与单片机地接口及DS18B20地编程;2)矩阵式键盘地设计与编程;3)经单片机为核心地系统地实际调试技巧.从而提高学生对微机实时控制系统地设计和调试能力.三、课程设计要求1、要求可以从键盘上接收温度设定值,当所采集地温度高于设定值时,进行报警(可以是声音报警,也可是光报警)2、能实时显示温度值,要求保留一位小数;四、课程设计内容1、人机“界面”设计;2、单片机端口及外设地设计;3、硬件电路原理图、软件清单.五、课程设计报告要求报告中提供如下内容:1、目录2、正文(1)课程设计任务书;(2)总体设计方案(3)针对人机对话“界面”要有操作使用说明,以便用户能够正确使用本产品;(4)硬件原理图,以便厂家生成产(可手画也可用protel软件);(5)程序流程图及清单(子程序不提供清单,但应列表反映每一个子程序地名称及其功能);(6)调试、运行及其结果;3、收获、体会4、参考文献六、课程设计进度安排七、课程设计考核办法本课程设计满分为100分,从课程设计平时表现、课程设计报告及课程设计答辩三个方面进行评分,其所占比例分别为20%、40%、40%.2.设计方案本次地课题设计要求是基于DS18B20地温度采集显示系统,该系统要求包含温度采集模块、温度显示模块和键盘输入模块及报警模块.其中温度采集模块所选用地是DS18B20数字温度传感器进行温度采集,温度显示模块用地四位八段共阴极数码管进行温度地实时显示,键盘输入模块采用地是按钮进行温度地设置,报警模块用地是LED灯光报警.具体方案见图2-1.图2-1 总体设计方案3.硬件设计方案3.1最小系统地设计本次设计单片机采用地是AT89C51系列地,它由一个8位中央处理器(CPU),4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个串行I/O口及中断系统等部分组成.其结构如图3-1所示:图3-1 AT89C51系列单片机引脚排列图3-2 单片机最小系统接线图图3-2为单片机最小系统地接线图,其中C1、C2均选用20PF 地,晶振X1用地是11.0592MHZXTAL1XTAL2 RST EA地.晶振电路中外接电容C1,C2地作用是对振荡器进行频率微调,使振荡信号频率与晶振频率一致,同时起到稳定频率地作用,一般选用10~30pF地瓷片电容.并且电容离晶振越近越好,晶振离单片机越近越好.晶振地取值范围一般为0~24MHz,常用地晶振频率有6MHz、12 MHz、11.0592 MHz、24 MHz 等.晶振地振荡频率直接影响单片机地处理速度,频率越大处理速度越快.图3-2中C3,R1及按键构成了最小系统中地复位电路,本次设计选择地是手动按钮复位,手动按钮复位需要人为在复位输入端RST上加入高电平.一般采用地办法是在RST端和正电源Vcc之间接一个按钮.当人为按下按钮时,则Vcc地+5V电平就会直接加到RST端.由于人地动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位地时间要求.在单片机最小系统中还要将EA地非接高电平,如图3-2也有体现出来.3.2 LED发光报警电路P1.7图3-3 LED发光报警电路图3-3为LED报警电路地接法,其中一根线接单片机地8号P1.7口,另外一根接地.当温度超过预设温度值时LED灯被接通发光报警.3.3 DS18B20地简介及在本次设计中地应用3.3.1 DS18B20地外部结构及管脚排列DS18B20地管脚排列如图3-4所示:DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)图3-4 DS18B20地引脚排列及封装3.3.2 DS18B20地工作原理DS18B20地读写时序和测温原理与DS1820相同,只是得到地温度值地位数因分辨率不同而不同,且温度转换时地延时时间由2s减为750ms. DS18B20测温原理如图3-5所示.图中低温度系数晶振地振荡频率受温度影响很小,用于产生固定频率地脉冲信号送给计数器1.高温度系数晶振随温度变化其振荡率明显改变,所产生地信号作为计数器2地脉冲输入.计数器1和温度寄存器被预置在-55℃所对应地一个基数值.计数器1对低温度系数晶振产生地脉冲信号进行减法计数,当计数器1地预置值减到0时,温度寄存器地值将加1,计数器1地预置将重新被装入,计数器1重新开始对低温度系数晶振产生地脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值地累加,此时温度寄存器中地数值即为所测温度.图中地斜率累加器用于补偿和修正测温过程中地非线性,其输出用于修正计数器1地预置值.图3-5 DS18B20测温原理图3.3.3 DS18B20地主要特性(1)适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电;(2)独特地单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20地双向通讯;(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一地三线上,实现组网多点测温;(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管地集成电路内;(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃;(6)可编程地分辨率为9~12位,对应地可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温;(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快;(8)测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强地抗干扰纠错能力;(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作.3.3.4 DS18B20地测温流程图3-6 DS18B20地测温流程图3.3.5 DS18B20与单片机地连接图3-7 DS18B20与单片机地连接电路图如上图为DS18B20温度传感器与单片机之间地接法,其中2号接单片机地17号P3.7接口.DS18B20通过P3.7口将采集到地温度实时送入单片机中.3.4 报警温度地设置P2.5 P2.6 P2.7P3.7图3-8 报警温度地设置电路图3-8为报警温度地设置电路,其中K1,K2,K3分别接到单片机地P2.5,P2.6,P2.7口.其中K1用于报警温度设定开关,K2用于报警温度地设置时候地加温度(每次加一),K3用于报警温度地设置时地减温度(每次减一).实现了报警温度地手动设置.3.5 数码管显示3.5.1数码管工作原理图3-9 数码管地引脚排列及结构图3-9为数码管地外形及引脚排列和两种接法(共阴极和共阳极)地结构图.共阳极数码管地8个发光二极管地阳极(二极管正端)连接在一起.通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端.当某段驱动电路地输出端为低电平时,则该端所连接地字段导通并点亮.根据发光字段地不同组合可显示出各种数字或字符.此时,要求段驱动电路能吸收额定地段导通电流,还需根据外接电源及额定段导通电流来确定相应地限流电阻.共阴极数码管地8个发光二极管地阴极(二极管负端)连接在一起.通常,公共阴极接低电平(一般接地),其它管脚接段驱动电路输出端.当某段驱动电路地输出端为高电平时,则该端所连接地字段导通并点亮,根据发光字段地不同组合可显示出各种数字或字符.此时,要求段驱动电路能提供额定地段导通电流,还需根据外接电源及额定段导通电流来确定相应地限流电阻.要使数码管显示出相应地数字或字符,必须使段数据口输出相应地字形编码.字型码各位定义为:数据线D0与a字段对应,D1与b字段对应……,依此类推.如使用共阳极数码管,数据为0表示对应字段亮,数据为1表示对应字段暗;如使用共阴极数码管,数据为0表示对应字段暗,数据为1表示对应字段亮.如要显示“0”,共阳极数码管地字型编码应为:11000000B(即C0H);共阴极数码管地字型编码应为:00111111B(即3FH).依此类推,可求得数码管字形编码如表3-5所示.表3-5数码管字符表显示地具体实施是通过编程将需要显示地字型码存放在程序存储器地固定区域中,构成显示字型码表.当要显示某字符时,通过查表指令获取该字符所对应地字型码.3.5.2数码管显示电路图3-10 四位八段数码管动态显示电路图3-10为本次设计所用到地四位八段数码管动态显示,其中段选接到单片机地P0口,位选接到单片机地P2口地低四位.其中P0口也接地有上拉电阻,图中未标示出来,会在下面地总体电路中标示出来.采用地是动态显示方式.3.6 硬件电路总体设计图3-11为本次设计地硬件总体设计图,其中利用K1,K2,K3处进行报警温度地设置,然后有DS18B20进行实时温度采集,并在数码管上同步显示,若采集到地温度达到或者超过预设地报警温度,则LED 灯会发光报警,若低于该报警温度,则不会报警.P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1P2.2 P2.3图3-11 硬件电路总体设计图4.软件设计方案4.1主程序介绍4.1.1主程序流程图本次设计首先对程序进行初始化,然后打开报警温度设定开关,对报警温度进行设定,确认设定值后,DS18B20温度传感器进行温度采集并送入单片机中,单片机将传感器所检测到地温度同步显示在数码管上,并且与设置地报警温度进行比较,若达到或者超过报警温度时,LED灯发光报警,如果没有达到,则继续进行温度采集.图4-1主程序流程图4.1.2主流程地C语言程序main (){ALERT=0。
温度采集与显示设计程序详解
温度采集与显示设计程序详解程序流程如下:1.初始化温度传感器:连接温度传感器至控制器,并进行初始化。
这包括设置传感器接口和模式,设置精度等。
2.采集温度数据:通过温度传感器读取环境温度数据,并将其存储在变量中。
3.数据处理:对采集到的温度数据进行一定的处理,例如进行单位转换、滤波处理等。
4.数据显示:将处理后的温度数据通过显示器显示出来。
可以使用LCD液晶显示器、LED数码管、数码管等不同的显示器设备。
5.重复采集与显示:循环执行步骤2-4,以实现实时监测和显示环境温度。
实现细节如下:1. 初始化温度传感器:根据具体采用的温度传感器型号和接口类型,选择相应的初始化函数进行初始化。
例如,如果使用OneWire接口的DS18B20温度传感器,可以使用Arduino库中的OneWire库进行初始化。
2.采集温度数据:通过读取温度传感器的输出,可以获取到环境温度的原始数据。
具体的采集方法和代码取决于所采用的传感器和控制器类型。
3.数据处理:在采集到的温度数据上进行一定的处理,以满足实际需求。
例如,对于DS18B20传感器输出的12位数据,可以通过位运算进行小数点处理,从而得到实际的温度值。
4. 数据显示:根据设计需求选择相应的显示器设备,并使用相应的显示库函数将处理后的温度数据显示出来。
例如,使用LiquidCrystal库操作LCD液晶显示器进行显示。
5. 重复采集与显示:使用循环语句,如while循环,不断执行数据采集和显示的步骤,以实现实时监测和显示环境温度。
可以根据实际需求设置采集和显示的时间间隔。
总结:温度采集与显示设计主要包括温度传感器的初始化、温度数据的采集、数据的处理和显示器的选择与操作。
通过合理的程序设计和选择适合的硬件设备,可以实现实时监测和显示环境温度。
具体的实现细节和程序代码取决于具体的传感器和控制器类型,以及所采用的显示器设备。
温度采集C语言源代码
#include <reg52.h>#include <stdio.h>#define uchar unsigned char#define uint unsigned intsbit ds=P2^2; //温度传感器信号线sbit dula=P2^6; //数码管段选线sbit wela=P2^7; //数码管位选线sbit beep=P2^3; //蜂鸣器uint temp; //定义整型的温度数据float f_temp; //定义浮点型的温度数据uint warn_l1=260; //定义温度下限值是温度值乘以10后的结果uint warn_l2=250; //定义温度下限值uint warn_h1=300; //定义温度上限值uint warn_h2=320; //定义温度上限值sbit led0=P1^0; //控制发光二极管sbit led1=P1^1; //控制发光二极管sbit led2=P1^2; //控制发光二极管sbit led3=P1^3; //控制发光二极管unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //带小数点的0~9编码0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //不带小数点的0~9编码void delay(uint z)//延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void dsreset(void) //18B20复位,初始化函数{uint i;ds=0;i=103;while(i>0)i--;ds=1;i=4;while(i>0)i--;}bit tempreadbit(void) //读1位数据函数{uint i;bit dat;ds=0;i++; //i++ 起延时作用ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return (dat);}uchar tempread(void) //读1个字节数据函数{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里}return(dat);}void tempwritebyte(uchar dat) //向18B20写一个字节数据{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //写1{ds=0;i++;i++;ds=1;i=8;while(i>0)i--;}else{ds=0; //写0i=8;while(i>0)i--;ds=1;i++;i++;}}}void tempchange(void) //DS18B20 开始获取温度并转换{dsreset();delay(1);tempwritebyte(0xcc); // 写跳过读ROM指令tempwritebyte(0x44); // 写温度转换指令}uint get_temp() //读取寄存器中存储的温度数据{uchar a,b;dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread(); //读低8位b=tempread(); //读高8位temp=b;temp<<=8; //两个字节组合为1个字temp=temp|a;f_temp=temp*0.0625; //温度在寄存器中为12位分辨率位0.0625°temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入f_temp=f_temp+0.05;return temp; //temp是整型}////////////////////显示程序//////////////////////////void display(uchar num,uchar dat) //num是第几个数码管,dat是要显示的数据{uchar i;dula=0;P0=table[dat]; //编码赋给P0口dula=1;dula=0;wela=0;i=0XFF;i=i&(~((0X01)<<(num))); //用i来存储位选数据,只有一位为0P0=i;wela=1;wela=0;delay(1);}void dis_temp(uint t) //显示温度数值函数t传递的是整型的温度值{uchar i;i=t/100; //除以100得到商,为温度的十位display(0,i); //在第1个数码管上显示i=t%100/10; //100取余再除以10得到商,为温度的个位display(1,i+10); //在第2个数码管上显示i=t%100%10; //100取余再用10取余,为温度的小数位display(2,i);}//////////////////////////////////////////////void warn(uint s,uchar led) //蜂鸣器报警,灯闪烁{ //s控制音调,led控制灯uchar i;i=s;dula=0;wela=0;beep=0; //蜂鸣器响P1=(led); //控制相应的灯亮while(i--){dis_temp(get_temp()); //用温度显示函数起到延时的作用}beep=1; //蜂鸣器不响P1=0X00; //控制相应的灯灭i=s;while(i--){dis_temp(get_temp()); //用温度显示函数起到延时的作用}}void deal(uint t) //温度处理函数{uchar i;if((t>warn_l2)&&(t<=warn_l1)) //大于25度小于27度{warn(40,0x01); //第一个灯亮,蜂鸣器发出“滴”声}else if(t<=warn_l2) //小于25度{warn(10,0x03); //第一个和第二个灯亮,蜂鸣器发出“滴”声}else if((t<warn_h2)&&(t>=warn_h1)) //小于32度大于30度{warn(40,0x04); //第三个灯亮,蜂鸣器发出“滴”声}else if(t>=warn_h2) //大于32度{warn(10,0x0c); //第三个和第四个灯亮,蜂鸣器发出“滴”声}Else //在27度和30度之间时只是调用显示函数延时{i=40;while(i--){dis_temp(get_temp());}}}void init_com(void) //串口初始化函数{TMOD = 0x20;PCON = 0x00;SCON = 0x50;TH1 = 0xFd; //波特率9600TL1 = 0xFd;TR1 = 1;}void comm(char *parr) //串口数据发送函数{do{SBUF= *parr++; //发送数据while(!TI); //等待发送完成标志为1 TI=0; //标志清零}while(*parr); //保持循环直到字符为'\0' }void main() //主函数{uchar buff[4],i;dula=0;wela=0;init_com();while(1){tempchange(); //温度转换函数for(i=10;i>0;i--){dis_temp(get_temp()); //获取温度并显示}deal(temp); //进行温度处理sprintf(buff,"%f",f_temp); //将浮点型温度格式化为字符型for(i=10;i>0;i--){dis_temp(get_temp());} //温度显示comm(buff); //串口发送数据for(i=10;i>0;i--){dis_temp(get_temp());} //温度显示}}。
单片机DS18B20温度传感器C语言程序含CRC校验
单片机DS18B20温度传感器C语言程序含CRC校验单片机中使用DS18B20温度传感器C语言程序(参考1)/***************************************************** ***************************DS18B20 测温程序硬件:AT89S52(1)单线ds18b20接P2.2(2)七段数码管接P0口(3)使用外部电源给ds18b20供电,没有使用寄生电源软件:Kei uVision 3***************************************************** *****************************/#include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){ while(us--); }void delay(uint count) //延时子函数{ uint i;while(count){ i=200;while(i>0)i--;count--; } }/*串口初始化,波特率9600,方式1 */void init_com(){ TMOD=0x20; //设置定时器1为模式2 TH1=0xfd; //装初值设定波特率TL1=0xfd;TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示*/void display(uint temp){ uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存wela=0;P0=0xfe;wela=1;wela=0;delay(1); //延时约2msP0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1); }/*****************************************时序:初始化时序、读时序、写时序。
51单片机实验手册
51单片机实验手册一、概述51单片机是一种经典的8位微控制器,具有广泛的应用领域。
本实验手册旨在提供详细的实验指导,帮助初学者快速入门,并为进一步的学习提供基础。
二、实验准备在进行51单片机实验之前,我们需要准备以下材料:1. 一块51单片机开发板2. USB数据线或者串口线3. 电脑及编程软件4. 面包板及对应的连接线5. 红、绿、蓝LED以及相应的电阻三、实验一:LED闪烁LED闪烁是最基础的实验之一,通过控制51单片机的I/O口状态,使LED灯交替亮灭。
1. 连接电路将51单片机的VCC引脚连接到正极,GND引脚连接到负极,将LED的长脚连接到P1.0引脚,短脚连接到GND引脚。
2. 编写程序使用C语言编写如下程序:```c#include <reg52.h>void main() {while(1) {P1 = 0x00; // P1置低电平,LED灯熄灭Delay(1000); // 延时1秒P1 = 0xFF; // P1置高电平,LED灯点亮Delay(1000); // 延时1秒}}void Delay(unsigned int t) {while (t--);}```3. 烧录程序将编写好的程序通过编程软件下载到51单片机中。
4. 运行实验将USB数据线或串口线连接到51单片机开发板和电脑,将开发板上的开关打开,观察LED灯的闪烁情况。
四、实验二:数码管显示通过控制51单片机的I/O口状态,驱动数码管显示数字。
1. 连接电路将51单片机的VCC引脚连接到正极,GND引脚连接到负极,将数码管的A、B、C、D、E、F、G引脚分别连接到P1.0、P1.1、P1.2、P1.3、P1.4、P1.5、P1.6引脚。
2. 编写程序使用C语言编写如下程序:```c#include <reg52.h>unsigned char code segment[] = { // 数码管段码表0x3F, // 数字00x06, // 数字10x5B, // 数字20x4F, // 数字30x66, // 数字40x6D, // 数字50x7D, // 数字60x07, // 数字70x7F, // 数字80x6F // 数字9};void main() {unsigned int i;while(1) {for(i = 0; i < 10; i++) {P1 = segment[i]; // 依次在数码管上显示数字0-9 Delay(1000); // 延时1秒}}}void Delay(unsigned int t) {while (t--);}```3. 烧录程序将编写好的程序通过编程软件下载到51单片机中。
单片机数字温度计课程设计总结
单片机数字温度计课程设计总结一、引言温度是物体分子热运动的表现,对于很多应用场合来说,准确地测量和监控温度是非常重要的。
在本次课程设计中,我们使用单片机设计了一个数字温度计,能够实时测量环境温度并将其显示在数码管上。
本文将对该课程设计进行总结和归纳。
二、设计思路1. 硬件设计:我们使用了传感器、单片机和数码管等硬件元件。
传感器用于感知环境温度,单片机负责数据处理和控制,数码管用于显示温度数值。
2. 软件设计:我们使用C语言编写了相应的程序。
程序的主要逻辑是通过单片机与传感器进行通信,获取温度值并进行转换,然后将转换后的数值通过数码管进行显示。
三、硬件设计1. 传感器选择:在本次设计中,我们选择了NTC热敏电阻作为温度传感器。
它的电阻值随温度的变化而变化,通过测量电阻值的变化即可得到环境温度。
2. 单片机选择:我们选择了常用的STC89C52单片机作为控制核心。
它具有较高的性价比和丰富的资源。
3. 数码管选择:我们选择了常见的共阳极数码管,它能够直观地显示温度数值。
四、软件设计1. 数据采集:首先,我们需要通过AD转换将传感器输出的模拟信号转换为数字信号。
然后,我们将数字信号转换为温度值,根据传感器的特性曲线进行适当的校准。
2. 数据处理:接下来,我们需要对采集到的温度值进行处理,例如进行单位转换或滤波处理,以获得更加准确和稳定的结果。
3. 数据显示:最后,我们将处理后的温度值通过数码管进行显示。
为了方便观察,我们还可以添加一些提示信息,例如温度单位或警告标识。
五、调试和测试在设计完成后,我们需要进行调试和测试,以确保温度计能够正常工作。
首先,我们可以通过改变环境温度来验证温度计的测量准确性。
其次,我们还可以通过与其他温度计进行对比来验证其稳定性和精度。
六、设计优化和改进在实际使用过程中,我们可以根据需求进行进一步的优化和改进。
例如,我们可以添加温度报警功能,当温度超过设定阈值时,温度计能够及时发出警报。
VHDL语言编写DS18B20温度传感器程序
V H D L语言编写D S18B20温度传感器程序Revised on July 13, 2021 at 16:25 pm----------VHDL语言编写DS18B20温度传感器程序library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity ds18B20 isportclk : in std_logic; ---50MHzdq : inout std_logic;rst: in std_logic;LED : out std_logic;LED2 : out std_logic;LED3 : out std_logic;dataout1;dataout2;dataout3 : out std_logic_vector6 downto 0 ; --数end ds18B20;architecture Behavioral of ds18B20 isTYPE STATE_TYPE isRESET;CMD_CC;WRITE_BYTE;WRITE_LOW;WRITE_HIGH;READ_BIT; CMD_44;CMD_BE;WAIT800MS;GET_TMP;WAIT4MS;signal STATE: STATE_TYPE:=RESET;signal clk_temp : std_logic:='0';signal clk1m : std_logic; --分频后得到的1M时钟signal cp: std_logic; -- 1ms 时钟signal w : integer range 0 to 2 :=0; --- xian shi shun xusignal write_temp : std_logic_vector7 downto 0:="00000000";signal TMP : std_logic_vector11 downto 0;signal tmp_bit : std_logic;signal WRITE_BYTE_CNT : integer range 0 to 8:=0;signal WRITE_LOW_CNT : integer range 0 to 2:=0;signal WRITE_HIGH_CNT : integer range 0 to 2:=0;signal READ_BIT_CNT : integer range 0 to 3:=0;signal GET_TMP_CNT : integer range 0 to 13:=0;signal cnt : integer range 0 to 100_001:=0;----------******************************signal cnt2 : integer range 0 to 4000001:=0;signal temp : std_logic;signal data_temp0 : std_logic_vector15 downto 0;signal decimal0 : std_logic_vector15 downto 0;signal decimal1 : std_logic_vector15 downto 0;signal decimal2 : std_logic_vector15 downto 0;signal decimal3 : std_logic_vector15 downto 0;signal data_temp1 : std_logic_vector7 downto 0;signal integer0 : std_logic_vector7 downto 0;signal integer1 : std_logic_vector7 downto 0;signal integer2 : std_logic_vector7 downto 0;signal integer3 : std_logic_vector7 downto 0;signal integer4 : std_logic_vector7 downto 0;signal integer5 : std_logic_vector7 downto 0;signal integer6 : std_logic_vector7 downto 0;signal sign : std_logic_vector7 downto 0;signal count : integer range 0 to 51:=0;signal WRITE_BYTE_FLAG : integer range 0 to 4:=0; function disnum: std_logic_vector return std_logic_vector is begincase num iswhen "0000" => return "1000000"; --0when "0001" => return "1111001"; --1when "0010" => return "0100100"; --2when "0011" => return "0110000"; --3when "0100" => return "0011001"; --4when "0101" => return "0010010"; --5when "0110" => return "0000010"; --6when "0111" => return "1111000"; --7when "1000" => return "0000000"; --8when "1001" => return "0010000"; --9when "1010" => return "0001000"; --Awhen "1011" => return "0000011"; --bwhen "1100" => return "1000110"; --Cwhen "1101" => return "0100001"; --dwhen "1110" => return "0000110"; --Ewhen "1111" => return "0001110"; --Fwhen others => return "1111111"; --mieend case;end dis;begin----------@@@@@@@@@@@@@---------------- ClkDivider:process clk;clk_tempbeginif rising_edgeclk thenif count = 24 thencount <= 0;clk_temp<= not clk_temp;elsecount <= count +1;end if;end if;clk1m<=clk_temp;end Process;----------@@@@@@@@@@@@@----------------process clk1mvariable n: integer range 0 to 12000:=0;begin -----cp 1msif rising_edgeclk1m thenn:=n+1;if n>12000 then n:=0; cp<=not cp; end if;end if;end Process;STATE_TRANSITION:processSTATE;clk1mbeginif rising_edgeclk1m thenifrst='0' thenSTATE<=RESET;elsecase STATE iswhen RESET=>--**********LED2<='0';--*************-LED3<='0';--*********if cnt>=0 and cnt<500 then -- 500μs的复位低电平dq<='0';-- dq作为输出cnt<=cnt+1;STATE<=RESET;elsif cnt>=500 and cnt<510 then --高阻态再输入下一级电路的话;对下级电路无任何影响;和没接一样;高阻态可以应用在inout端口里面;这样在inout没有输出的时候就弄个高阻态;这样就其电平就可以由外面的输入信号决定了dq<='Z';cnt<=cnt+1;STATE<=RESET; --拉高dqelsif cnt>=510 and cnt<750 then -- 240μstemp<=dq; -- dq作为输入ifcnt=580 thentemp<=dq;iftemp='1' thenLED<='0';else LED<='1';end if;end if;cnt<=cnt+1;STATE<=RESET;elsif cnt>=750 thencnt<=0; --计数器清零STATE<=CMD_CC; --复位过程伴随着跳跃rom指令“CC”end if;when CMD_CC=> --跳跃rom指令“CC”LED2<='1';LED3<='0';STATE<=WRITE_BYTE;when WRITE_BYTE=>case WRITE_BYTE_CNT iswhen 0 to 7=>if write_tempWRITE_BYTE_CNT='0' thenSTATE<=WRITE_LOW;LED3<='1';elseSTATE<=WRITE_HIGH;end if;WRITE_BYTE_CNT<=WRITE_BYTE_CNT+1;when 8=>if WRITE_BYTE_FLAG=0 then -- 第一次写0XCC完毕STATE<=CMD_44;WRITE_BYTE_FLAG<=1;elsif WRITE_BYTE_FLAG=1 then --写0X44完毕写温度转换指令后没有读数据STATE<=RESET;WRITE_BYTE_FLAG<=2;elsif WRITE_BYTE_FLAG=2 then --第二次写0XCC完毕STATE<=CMD_BE;WRITE_BYTE_FLAG<=3;elsif WRITE_BYTE_FLAG=3 then --写0XBE完毕STATE<=GET_TMP;WRITE_BYTE_FLAG<=0;end if;WRITE_BYTE_CNT<=0;when others=>STATE<=RESET;end case;when WRITE_LOW=>LED3<='1';case WRITE_LOW_CNT iswhen 0=>dq<='0';if cnt=70 thencnt<=0;WRITE_LOW_CNT<=1;elsecnt<=cnt+1;end if;dq<='Z';if cnt=5 thencnt<=0;WRITE_LOW_CNT<=2;elsecnt<=cnt+1;end if;when 2=>STATE<=WRITE_BYTE;WRITE_LOW_CNT<=0;when others=>WRITE_LOW_CNT<=0; end case;when WRITE_HIGH=>case WRITE_HIGH_CNT iswhen 0=>dq<='0';if cnt=8 thencnt<=0;WRITE_HIGH_CNT<=1;elsecnt<=cnt+1;end if;when 1=>dq<='Z';if cnt=72 thencnt<=0;WRITE_HIGH_CNT<=2;elsecnt<=cnt+1;end if;when 2=>STATE<=WRITE_BYTE;WRITE_HIGH_CNT<=0;when others=>WRITE_HIGH_CNT<=0; end case;when CMD_44=>write_temp<="01000100";STATE<=WRITE_BYTE;when CMD_BE=>STATE<=WRITE_BYTE;----------------------------------when READ_BIT=>case READ_BIT_CNT isdq<='0'; --4μs的低电平if cnt=4 thenREAD_BIT_CNT<=1;cnt<=0;elsecnt<=cnt+1;end if;when 1=>dq<='Z'; --4μs的高电平if cnt=4 thenREAD_BIT_CNT<=2;cnt<=0;elsecnt<=cnt+1;end if;when 2=>dq<='Z';TMP_BIT<=dq; --12μs读出数据 ;就是最后一次赋值的结果.. if cnt=4 thenREAD_BIT_CNT<=3;cnt<=0;elsecnt<=cnt+1;end if;when 3=>---------------------dq<='Z'; --控制器拉高总线---------------------if cnt=50 then --读出数据后;等待50uscnt<=0;READ_BIT_CNT<=0;STATE<=GET_TMP;elsecnt<=cnt+1;end if;when others=>READ_BIT_CNT<=0;end case;-------#################--------------when GET_TMP=>case GET_TMP_CNT iswhen 0 =>STATE<=READ_BIT;GET_TMP_CNT<=GET_TMP_CNT+1;when 1 to 12=>STATE<=READ_BIT;TMPGET_TMP_CNT-1<=TMP_BIT;--将读出的每一位数据按顺序存进TMP0 to 11里面GET_TMP_CNT<=GET_TMP_CNT+1; --存的是读出的0到11位;第十二位没有存when 13=>GET_TMP_CNT<=0;STATE<=WAIT4MS;end case;when WAIT4MS=>if cnt>=4000 then--STATE<=WAIT4MS;STATE<=RESET;cnt<=0;elsecnt<=cnt+1;STATE<=WAIT4MS;end if;when others=>STATE<=RESET;LED<='0';LED2<='0';LED3<='0';end case;end if;end if;end process;-----------------------------------------------DISPLAY: process cp --------数码管动态显示温度值variable temp:std_logic_vector3 downto 0;begincase w iswhen 0 => temp:= TMP3 downto 0; dataout1<=distemp ;w<= 1;when 1 => temp:= TMP7 downto 4; dataout2<=distemp ;w<= 2;when 2 => temp:= TMP11 downto 8; dataout3<=distemp ;w<= 0;end case;end process;end Behavioral;。
单片机汇编语言设计实例详解
单片机汇编语言设计实例详解引言:单片机是嵌入式系统中常见的控制器,它具有体积小、功耗低、成本低等特点,被广泛应用于家电、汽车、工业控制等领域。
而汇编语言作为单片机的底层语言,直接操作硬件资源,具有高效性和灵活性。
本文将以一个实例,详细讲解如何使用单片机汇编语言进行设计。
实例背景:假设我们要设计一个温度检测系统,要求实时监测环境温度,并在温度超过某个阈值时触发报警。
硬件准备:1. 单片机:我们选择一款常用的8051单片机作为例子。
2. 温度传感器:我们选择一款数字温度传感器,它可以通过串行通信与单片机进行数据交互。
3. 显示屏:为了方便实时显示温度信息,我们选用一款数码管显示屏。
软件准备:1. Keil C51:这是一款常用的单片机开发软件,支持汇编语言的编写和调试。
2. 串口调试助手:用于测试串口通信功能。
设计步骤:1. 硬件连接:将单片机与温度传感器、显示屏连接起来。
注意接线的正确性和稳定性。
2. 编写初始化程序:使用汇编语言编写单片机的初始化程序,包括端口初始化、中断向量表设置、定时器初始化等。
3. 串口通信设置:通过串口与温度传感器进行数据交互,需要设置串口通信的波特率、数据位数、停止位等参数。
4. 温度检测程序:编写汇编语言程序,实时读取温度传感器的数据,并将数据送至显示屏进行显示。
5. 温度报警程序:在温度超过设定阈值时,触发报警程序,可以通过蜂鸣器等外设发出警报信号。
6. 调试与测试:使用Keil C51进行程序调试,通过串口调试助手测试串口通信和温度显示、报警功能。
设计思路:1. 初始化程序设计:先设置端口的输入输出方向,再设置中断向量表,最后初始化定时器。
这样可以确保程序的稳定性和可靠性。
2. 串口通信设置:根据温度传感器的通信协议,设置串口的波特率、数据位数、停止位等参数。
注意要与传感器的通信规范保持一致。
3. 温度检测程序设计:通过串口读取温度传感器的数据,并进行相应的处理。
单片机实验报告—— 数码管显示温度
XXXX学院实验报告Experimentation Report of Taiyuan Normal University系部计算机年级大三课程单片机原理与接口技术姓名同组者日期学号项目数码管显示温度一、实验目的1、了解单片机顺序执行的特点;2、掌握C语言的编写和keilc51的使用;3、熟悉DS18B20温度传感器的使用。
二、实验仪器硬件资源:单片机开发板笔记本电脑;软件资源:软件 Keil uVision5;三、实验原理1、流程图2、连接图四、实验结果数码管显示当前温度,用手握住温度传感器,数码管显示的温度值变大。
四、实验代码及分析//主函数void main(){while(1){LcdDisplay(Ds18b20ReadTemp()); //显示读取到的温度值}}void LcdDisplay(int temp) //lcd显示{float tp;if(temp< 0) //当温度值为负数{DisplayData[0] = 0x40; //因为读取的温度是实际温度的补码,所以减1,再取反求出原码temp=temp-1;temp=~temp;tp=temp;temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点后面的数自动去掉,//不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5 //的就算加上0.5,还是在小数点后面。
}else{DisplayData[0] = 0x00;tp=temp; //因为数据处理有小数点所以将温度赋给一个浮点型变量//如果温度是正的那么,那么正数的原码就是补码它本身temp=tp*0.0625*100+0.5;//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换//为整型的时候把小数点后面的数自动去掉,不管是否大于0.5,而+0.5之//后大于0.5的就是进1了,小于0.5的就算加上0.5,还是在小数点后面。
(完整word版)DS18B20水温控制系统+电路图程序
水温控制系统摘要:该水温控制系统采用单片机进行温度实时采集与控制。
温度信号由“一线总线”数字化温度传感器DS18B20提供,DS18B20在-10~+85°C范围内,固有测温分辨率为0.5 ℃。
水温实时控制采用继电器控制电热丝和风扇进行升温、降温控制.系统具备较高的测量精度和控制精度,能完成升温和降温控制。
关键字:AT89C51 DS18B20 水温控制Abstract: This water temperature control system uses the Single Chip Microcomputer to carry on temperature real-time gathering and controling。
DS18B20,digitized temperature sensor, provides the temperature signal by "a main line”. In -10~+85℃the scope,DS18B20’s inherent measuring accuracy is 0.5 ℃. The water temperature real-time control system uses the electricity nichrome wire carring on temperature increiseament and operates the electric fan to realize the temperature decrease control。
The system has the higher measuring accuracy and the control precision,it also can complete the elevation of temperature and the temperature decrease control. Key Words:AT89C51 DS18B20 Water temperature control目录1.系统方案选择和论证 (2)1。
单片机温控程序
单片机温控程序设计一个单片机温控程序涉及多个方面,包括传感器的接口、温度采集、控制算法、显示等。
以下是一个简要的单片机温控程序的设计示例,具体实现可能依赖于使用的单片机型号、传感器型号等。
1. 硬件设计a. 传感器接口选择合适的温度传感器,比如常用的DS18B20数字温度传感器。
连接传感器的引脚到单片机的GPIO口。
c// DS18B20传感器连接// VCC -> 单片机电源// GND -> 单片机地// DQ -> 单片机GPIO口b. 输出控制选择用于控制的输出设备,如继电器、加热器、风扇等。
连接输出设备的引脚到单片机的GPIO口。
c// 控制设备连接// 继电器、加热器、风扇等的控制引脚连接到单片机GPIO口c. 显示设备如果需要显示当前温度或其他信息,可以选择合适的显示设备,如数码管、LCD等。
c// 显示设备连接// 数码管、LCD等的引脚连接到单片机GPIO口2. 软件设计a. 温度采集使用单片机的GPIO口读取温度传感器的数据,获取当前环境温度。
c// 读取DS18B20传感器温度数据float readTemperature(){// 实现读取DS18B20数据的代码// 返回浮点数温度值}b. 控制算法根据采集到的温度数据,实现控制算法。
比如,当温度过高时打开风扇或者关闭加热器。
c// 温控算法void temperatureControl(float currentTemperature){float targetTemperature =25.0;// 目标温度float hysteresis =1.0;// 温度死区if(currentTemperature >targetTemperature +hysteresis){// 温度过高,执行降温操作,比如打开风扇turnOnFan();}else if(currentTemperature <targetTemperature -hysteresis){// 温度过低,执行升温操作,比如关闭风扇、打开加热器turnOffFan();turnOnHeater();}else{// 温度在目标范围内,保持当前状态turnOffFan();turnOffHeater();}}c. 控制设备根据控制算法的结果,控制相应的输出设备。
以51单片机为核心的DS18B20的数码管显示温度程序+Proteus仿真
//DS18B20的读写程序,数据脚P3.3 ////温度传感器18B20汇编程序,采用器件默认的12位转化////最大转化时间750微秒,显示温度-55到+125度,显示精度////为0.1度,显示采用4位LED共阳显示测温值////P0口为段码输入,P24~P27为位选///***************************************************/#include "reg51.h"#include "intrins.h" //_nop_();延时函数用#define Disdata P0 //段码输出口#define discan P2 //扫描口#define uchar unsigned char#define uint unsigned intsbit DQ=P3^3; //温度输入口sbit DIN=P0^7; //LED小数点控制uint h;uchar flag;//**************温度小数部分用查表法***********//uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//共阳LED段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" uchar code scan_con[4]={0x7f,0xbf,0xdf,0xef}; //列扫描控制字uchar data temp_data[2]={0x00,0x00}; //读出温度暂放uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用///////***********11微秒延时函数**********///void delay(uint t){for(;t>0;t--);}///***********显示扫描函数**********/scan(){char k;for(k=0;k<4;k++) //四位LED扫描控制{Disdata=0xff;Disdata=dis_7[display[k]];if(k==1){DIN=0;}discan=scan_con[k];delay(90);discan=0xff;}}/////***********18B20复位函数**********/ow_reset(void){char presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();DQ=0; //delay(50); // 550usDQ=1; //delay(6); // 66uspresence=DQ; // presence=0继续下一步}delay(45); //延时500uspresence = ~DQ;}DQ=1;}/////**********18B20写命令函数*********///向1-WIRE 总线上写一个字节void write_byte(uchar val){uchar i;for (i=8; i>0; i--) //{DQ=1;_nop_();_nop_();DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us DQ = val&0x01; //最低位移出delay(6); //66usval=val/2; //右移一位}DQ = 1;delay(1);}///*********18B20读1个字节函数********///从总线上读取一个字节uchar read_byte(void){uchar i;uchar value = 0;for (i=8;i>0;i--){DQ=1;_nop_();_nop_();value>>=1;DQ = 0; //_nop_();_nop_();_nop_();_nop_(); //4usDQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us if(DQ)value|=0x80;delay(6); //66us}DQ=1;return(value);}///***********读出温度函数**********///read_temp(){ow_reset(); //总线复位write_byte(0xCC); // 发Skip ROM命令write_byte(0xBE); // 发读命令temp_data[0]=read_byte(); //温度低8位temp_data[1]=read_byte(); //温度高8位ow_reset();write_byte(0xCC); // Skip ROMwrite_byte(0x44); // 发转换命令}///***********温度数据处理函数**********/ void work_temp(){uchar n=0;uchar doth,dotl;uchar flag3=1,flag2=1; //数字显示修正标记if((temp_data[1]&0xf8)!=0x00){temp_data[1]=~(temp_data[1]);temp_data[0]=~(temp_data[0])+1;n=1;flag=1;}//负温度求补码if(temp_data[0]>255){temp_data[1]++;}display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];doth=display[0]/10;dotl=display[0]%10;display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4); display[3]=display[4]/100;display[2]=display[4]/10%10;display[1]=display[4]%10;if(!display[3]){display[3]=0x0a;flag3=0;if(!display[2]){display[2]=0x0a;flag2=0;}}//最高位为0时都不显示if(n){display[3]=0x0b;//负温度时最高位显示"-"flag3=0;}}/////**************主函数****************/main(){Disdata=0xff; //初始化端口discan=0xff;for(h=0;h<4;h++){display[h]=8;}//开机显示8888ow_reset(); // 开机先转换一次write_byte(0xCC); // Skip ROMwrite_byte(0x44); // 发转换命令for(h=0;h<500;h++){scan();} //开机显示"8888"2秒while(1){read_temp(); //读出18B20温度数据work_temp(); //处理温度数据scan(); //显示温度值2秒}}////*********************结束**************************//。
单片机DS18B20温度传感器C语言程序含CRC校验
单片机中使用DS18B20温度传感器C语言程序(参考1)/******************************************************************************** DS18B20 测温程序硬件:AT89S52(1)单线ds18b20接 P2.2(2)七段数码管接P0口(3)使用外部电源给ds18b20供电,没有使用寄生电源软件:Kei uVision 3**********************************************************************************/ #include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为 int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){ while(us--); }void delay(uint count) //延时子函数{ uint i;while(count){ i=200;while(i>0)i--;count--; } }/*串口初始化,波特率9600,方式1 */void init_com(){ TMOD=0x20; //设置定时器1为模式2TH1=0xfd; //装初值设定波特率TL1=0xfd;TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示 */void display(uint temp){ uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存wela=0;P0=0xfe;wela=1;wela=0;delay(1); //延时约2msP0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1); }/*****************************************时序:初始化时序、读时序、写时序。
18b20 温度热水器控制数码管显示操作说明
18b20 温度控制数码管显示操作说明
本设计系统是18b20温度报警系统数码管显示,水温值,设置一个温度值,当低于设定值继电器吸合,控制外接加热装置加热。
高于高温设定温度,继电器断开,停止加热。
1.功能测量温度然后控制继电器输出
2.最左边的按键按下是设定
3.显示带H的是设置一个高温
4.按设定键两下显示带L的是低温
5.右边两个键是加键减键
6.设定好后如果测得的温度小于低温继电器吸合
7.测得的温度大于低温小于高温也吸合
8.大于高温时就断开
9.温度传感器在主控板上用手握住温度传感器就会升温
第一次按下“设定”进入温度设置:
按下“加、减”键可设置高温报警,最高设置成99.0度,
最低可设置成比低温报警高0.1度。
第二次按下“确定键”进入正常温度显示:
1.正常温度显示界面
当前温度11.3度
2.温度设置界面
高混报警值17.4度。
DS18B20温度传感器和数码管显示例程
//DS18B20温度传感器和数码管显示//编程时间:连线表: CPU=stc89C52 SysClock=12MHz// LEDLE= 控制位高电平有效 LEDSEG=P2 KEYBOARD=P3 LEDWEI=,LED高到底//**********************************************************//DS18B20//**********************************************************//连线表: CPU=stc89C52 SysClock=12MHz *//单总线: TMDAT=////**********************************************************#include <>#define uchar unsigned char#define uint unsigned intuchar discount=0;//显示扫描位计数uchar last=0;//最终温度值uchar itcount=0x13;//定时器延时计数uchar seg[4];//数码管显示暂存uchar tem[2];//读取温度暂存uchar flag=0;//温度正负标志位/********************LED引脚定义********************/sfr LEDSEG=0x80;//P2sfr LEDWEI=0xA0;//P3/********************DS18B20引脚定义********************/sbit TMDAT=P1^0; //温度传感器数据位/********************DS18B20函数定义*******************/void dmsec(uint count);//延时(count)毫秒void tmreset(void); //产生复位信号void tmpre(void); //检测器件应答信号bit tmrbit(void); //从总线读一个bituchar tmrbyte(void); //从总线读一个字节void mwbyte(uchar dat);//向总线写一个字节void tmstart(void); //启动一次温度转换uchar tmrtemp(void); //读取温度数据/********************LED函数定义*******************/uchar * uchartodectoseg(uchar unm);//字符转换为十进制然后转换为数码管段表void disp(uchar *seg);//显示函数void delay_ms(uint t); //延时函数/************************************************/uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0xc6};/*************数码表*******0 1 2 3 4 5 6 7 8 9 无显示 C**************/ /************************************************/uchar * uchartodectoseg(uchar unm){uchar x00,xx,x0,x,n;x00=unm/100;//取百位xx=unm%100;//取余x0=xx/10;//取十位x=xx%10;//取余即取个位n=0;seg[n]=table[x00];n++;seg[n]=table[x0];n++;seg[n]=table[x];n++;seg[n]=table[11];//最后一位显示摄氏度符号Cif(flag==1)seg[0]=0x40;//显示负号‘-’if(seg[0]==table[0])seg[0]=table[10]; //如果百位为零则不显示if((seg[0]==table[0])&(seg[1]==table[0]))seg[1]=table[10];//如果百位为零且十位为零则十位不显示return seg;}/***************************************************/ /******DELAY***************************/void delay_ms(uint t){uint m,n;for(m=0;m<t;m++){for(n=0;n<950;n++);}}/******************************************//*********************显示LEDSEG*****************************/void disp(uchar *seg){uchar wei[]={0x08,0x04,0x02,0x01};//位扫描码//LEDSEG=seg[10];LEDWEI =wei[discount];LEDSEG = seg[discount];delay_ms(1);discount++;if(discount==4){ delay_ms(1);discount=0;//LEDSEG=seg[10];LEDWEI=wei[discount];LEDSEG=seg[discount];}//检测是否扫描完,扫描完的话则重新置初值}/*********************************************************//*****************DS18B20函数体定义****************/void dmsec(uint count) {uint i;while(count--){for(i=0;i<125;i++){} }}void tmreset(void){uint i;TMDAT=0;i=103;while(i>0) i--;TMDAT=1;i=4;while(i>0) i--;}void tmpre(void){uint i;while(TMDAT);while(~TMDAT);i=4;while(i>0) i--;}bit tmrbit(void){uint i;bit dat;TMDAT=0;i++;TMDAT=1;i++;i++;dat=TMDAT;i=8;while(i>0) i--;return(dat);}uchar tmrbyte(void){uchar i,j,dat;dat=0;for(i=1;i<=8;i++){ j=tmrbit();dat=(j<<7)|(dat>>1); }return(dat);}void tmwbyte(uchar dat) {uint i;uchar j;bit testb;for(j=1;j<=8;j++){ testb=dat & 0x01; dat=dat>>1;if(testb){ TMDAT=0;i++; i++;TMDAT=1;i=8;while(i>0) i--; }else{ TMDAT=0;i=8;while(i>0) i--; TMDAT=1;i++; i++;}}}void tmstart(void){tmreset();tmpre();dmsec(1);tmwbyte(0xcc);tmwbyte(0x44);}uchar tmrtemp(void){uchar y1,y2,y3;tmreset();tmpre();dmsec(1);tmwbyte(0xcc);tmwbyte(0xbe);tem[0]=tmrbyte();tem[1]=tmrbyte();if(tem[1]>127){tem[1]=(255-tem[1]);tem[0]=(255-tem[0]);flag=1;} //负温度求补码y1=tem[0]>>4;y2=tem[1]<<4;y3=y1|y2;return(y3);}/*********************************************************/void main(){TMOD=0X01;TL0=0XB0;TH0=0X3C;EA=1;ET0=1;TR0=1;dmsec(1);tmstart();while(1){uchartodectoseg(last);disp(seg);}}void time0() interrupt 1{TL0=0XB0;TH0=0X3C;//定时50msitcount--;if(itcount==0){last=tmrtemp();dmsec(1);tmstart();itcount=0x13;}}。
pic单片机汇编语言程序设计实例
PIC单片机汇编语言程序设计实例介绍在计算机科学领域中,汇编语言是一种低级语言,用于编写机器指令的文本形式。
汇编语言程序设计是一门重要的技能,特别是在嵌入式系统开发中。
PIC (Peripheral Interface Controller)单片机是一种常见的微控制器,广泛应用于各种电子设备中。
本文将介绍PIC单片机汇编语言程序设计的实例,旨在帮助读者更好地理解和应用汇编语言编程。
PIC单片机简介PIC单片机是由美国微芯科技公司(Microchip Technology Inc.)设计和生产的一种微控制器。
它具有高性能、低功耗和丰富的外设接口,适用于各种应用领域,如家电、汽车电子、医疗设备等。
PIC单片机的指令集是基于汇编语言的,因此掌握汇编语言编程对于理解和应用PIC单片机至关重要。
PIC单片机汇编语言基础在开始编写PIC单片机汇编语言程序之前,我们首先需要了解一些基本概念和语法。
以下是一些常用的指令和语法:1. 数据寄存器PIC单片机有多个数据寄存器,用于存储数据和中间结果。
例如,W寄存器是一个通用寄存器,用于存储临时数据。
另外,还有一些特定功能的寄存器,如PORTA寄存器用于控制输入输出。
2. 指令集PIC单片机的指令集包含了各种操作指令,如算术运算、逻辑运算、位操作等。
每个指令都有特定的操作码和操作数,用于执行相应的操作。
3. 标志寄存器PIC单片机的标志寄存器用于存储一些状态信息,如进位标志、零标志等。
这些标志位可以用于条件分支和循环控制。
4. 中断PIC单片机支持中断机制,可以在特定条件下中断当前程序的执行,执行中断服务程序。
中断可以提高系统的响应速度和实时性。
PIC单片机汇编语言程序设计实例下面将通过几个实例来演示PIC单片机汇编语言程序的设计和实现。
实例1:LED闪烁步骤:1.初始化端口为输出模式。
2.设置LED引脚为高电平,使LED熄灭。
3.延时一段时间。
4.设置LED引脚为低电平,使LED亮起。
单片机综合设计实验
单片机综合设计实验一、实验目的通过单片机的综合设计实验,加深对单片机原理和应用的理解,练习使用单片机进行控制和数据处理的能力。
二、实验内容设计一个模拟温度控制系统,要求能够通过单片机读取温度传感器的温度值,并根据设定的目标温度进行判断和控制,使得温度值稳定在目标温度附近。
即实现一个简单的闭环温度控制系统。
三、实验器材1.单片机:使用8051单片机2.温度传感器:使用LM35温度传感器3.显示器:使用数码管显示器4.控制器:使用电热器作为温度控制的对象,通过控制电热器的加热时间和加热功率来控制温度四、实验步骤1.连接电路将LM35温度传感器与单片机相连接,使得单片机能够读取到温度传感器的模拟信号。
将单片机与数码管显示器以及电热器相连接,使得单片机能够通过数码管显示温度值,并能够控制电热器的加热时间和加热功率。
2.编写程序根据实验要求,设计一个闭环温度控制系统的程序。
通过单片机读取温度传感器的温度值,并与设定的目标温度进行比较,根据比较结果控制电热器的加热时间和加热功率。
同时,将温度值通过数码管进行显示,使得操作人员能够实时监控温度的变化。
3.调试验证五、实验结果经过调试验证,实验结果表明设计的温度控制系统能够达到预期的效果。
单片机能够准确读取温度传感器的温度值,并根据设定的目标温度进行判断和控制,使得温度能够稳定在目标温度附近。
六、实验总结通过这次单片机综合设计实验,我对单片机的原理和应用有了更深入的理解。
通过实际操作和编程,我学会了如何连接温度传感器和数码管显示器,以及如何通过单片机对温度进行控制和显示。
同时,我还锻炼了解决问题和调试的能力,提高了实际应用技能。
这次实验不仅提供了实践的机会,也巩固了我对单片机的相关知识,为今后的学习和应用打下了坚实的基础。