单片机实验程序温度测量实验
基于C51单片机的温度闭环控制实验程序

#include <reg51.h>#include <absacc.h>#include <math.h>void pid(void) //PID算法子程序void init(void) //初始化子程序void display(void) //延时子程序void clear() //清零子程序int mmul(int x,int y) //16位乘法,溢出赋极值int madd(int x,int y) //16位加法,溢出赋极值int change32_16(int x,int t) //32——16char change16_8(int wd) //16——8#define C8255_A XBYTE[0x7F00]#define C8255_B XBYTE[0x7F01]#define C8255_C XBYTE[0x7F02]#define C8255_CON XBYTE[0x7F03]#define AD0809 XBYTE[0xFEFF] //定义AD0809的地址sbit P17=P1^7; //PWM的驱动char TS=0x64; //采样周期int X=0x80;char SPEC=0x28; //给定:要求达到的温度值char IBAND=0x60; //积分分离值:PID算法中积分分离值int KP=12; //比例系数:PID算法中比例项系数char KI=20; //积分系数char KD=32; //微分系数int CK; //控制量:PID算法产生用于控制的量int TC; //采样周期变量char FPWM; //PWM脉冲中间标识位int CK_1; //控制量变量,用于记录上次控制的值int AAAA; // PWM高电平脉冲时间计算int VAA; //AAAA变量int BBB; //PWM低电平脉冲时间计算int VBB; //BBB变量int TKMARK; //采样标志值int ADMARK; //AD转换结束标志位int ADV ALUE; //AD采样后保存int YK; //反馈:测量温度值int EK; //温度误差int EK_1;int AEK;int BEK;unsigned char dis; //BCD码显示unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char b[]={0x00,0x00,0x00,0x00}; //位选/********************温度表**************/unsigned char codea[0x100]={0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x16,0x17,0x18,0x19, 0x1a,0x1b,0x1c,0x1d,0x1e,0x1e,0x1f,0x20,0x21,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x31,0x32,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3 c,0x3d,0x3e,0x3f,0x40,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x4 f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x6 2,0x63,0x64,0x64,0x65,0x65,0x66,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6e,0x6f,0 x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,0x80,0x81,0x82,0x83,0x84,0x84,0x85,0x86,0x87,0x88,0x89,0x8 a,0x8b,0x8c,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9b,0 x9c,0x9c,0x9d,0x9d,0x9e,0x9e,0x9f,0x9f,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0 xb0,0xb0,0xb1,0xb2,0xb3,0xb4,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbd,0xbe,0xbe,0xc1 ,0xc2,0xc3,0xc4,0xc5,0xc6,0xc8,0xca,0xcc,0xce,0xcf,0xd0,0xd1,0xd2,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd ,0xde,0xe3,0xe6,0xe9,0xec,0xf0,0xf2,0xf6,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0 xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,}/**************延时子程序*********************/void delay(unsigned int time){unsigned int i;for(i=0;i<time;i++)}/*************主程序*************************/void main(){init();while(1);{while(1){if(TRMARK==0x01)break; //采样周期到否}TRMARK==0x00;while(1){if(ADMARK==0x01)break; //AD转换是否结束}ADMARK=0x00;YK=a[ADV ALUE];dis=(char)YK; //查温度表pid(); //PID算法if(CK<=0x80) //根据CK产生PWMAAAA=0x00;elseAAAA=CK-0x80;BBB=0x7f-AAAA;}}/***********初始化函数*********************/void init(void){YK=0x00; //变量初始化EK=0x00;EK_1=0x00;AEK=0x00;BEK=0x00;CK=0x00;CK_1=0x00;BBB=0x00;VBB=0x00;ADV ALUE=0x00;TKMARK=0x00;ADMARK=0x00;TC=0x00; //采样周期变量FPWM=0x01;AAAA=0x7f;V AA=0x7f;C8255_CON=0x81;display();clear();TMOD=0x11; //T1 ,T0由外部控制中断控制信号,16位定时器,工作在方式一下IP=0x02; //设定T0中断优先级最高IT1=1; //外部中断请求信号方式为脉冲触发方式,外中断1为下降沿有效EX1=1; //允许INT1中断TH0=0xd8;TL0=0xef;TH1=0xd8;TL1=0xef;ET0=ET1=1; //允许T0,T1中断TR0=TR1=1; //启动T0,T1EA=1;AD0809=1; //启动AD转换}void myint3(void) interrupt 3 //定时器1 LED显示{TH1=0xd8;TL1=0xef;ET1=1;display();clear();}void myint1(void) interrupt 2 //外中断1 读AD转换结果{ADV ALUE=AD0809;ADMARK=0x01;}void myint2(void) interrupt 1 //定时器0 启动AD转换{TH0=0xd8;TL0=0xef;ET0=1; //启动定时器0AD0809=1; //启动ADif(TC<TS)TC++; //采样周期变量else{TKMARK=0x01;TC=0x00;}if(FPWM==0x01) //产生PWM ,0x01表示加热模块{if(V A!=0x00){V AA=V AA-1;P17=0; //输出为低加热else{FPWM=0x02;VBB=BBB/2;}}if(FPWM==0x02) //0x02表示停止加热模块{if(VBB!=0x00){VBB=VBB-1;P17=1; //输出为高停止加热}else{FPWM=0x01;V AA=AAAA/2;}}return;}/*****************PID子程序***********/void pid(void){int K,P,I,D;K=P=I=D=0;EK=SPEC-YK;//得到偏差BEK=EK-EK_1-AEK;//12EKAEK=EK-EK_1; //偏差变化量/*********UK=Kp*AEK+Ki*EK+Kd*BEK****/if(abs(EK)>abs(IBAND))I=0; //判积分分离elseI=(EK*TS)/KI; //计算积分项P=AEK;D=((KD/TS)*BEK)/10000; //计算微分项//与书上对照,忽略KP K=madd(I,P);K=madd(D,K);K=mmul(K,KP);CK=K+CK_1;CK=change16_8(CK);CK_1=CK;EK_1=EK;CK=CK+X;}int mmul(int x,int y){int t,z;long s;s=x*y;z=(int)(s&0x0ffff);t=(int)((s>>16)&0x0ffff);s=change32_16(z,t);return(s);}int change32_16(int z,int t) //t=高字节,z=低字节{int s;if(t==0){if((z&0x8000)==0) s=z;else s=0x7fff;}else if((t&0xffff)==0xffff){if((z&0x8000)==0) s=0x8000;else s=z;}else if((t&0x8000)==0) s=0x7fff;else s=0x8000;return(s);}int mmad(int x,int y){int t;t=x+y;if(x>=0&&y>=0) //同号相乘,符号位变反说明溢出{if((t&0x8000)!=0) t=0x7fff;}else if(x<=0&&y<=0){if((t&0x8000)==0) t=0x8000;}return(t);}char change16_8(int wd) //t=高字节,z=低字节{char z,t,s;z=(wd>>8)&0x0ff;if(t==0x00){if((z&0x80)==0) s=z;else s=0x7f;}else if((t&0xff)==0xff){if((z&0x80)==0) s=0x80;else s=z;}else if((t&0x80)==0) s=0x7f;else s=0x80;return(s);}void display() //数码管显示函数{unsigned char i,j=0xf7;b[3]=SPEC/10;b[2]=SPEC%10;b[1]=dis/10;b[0]=dis%10;for(i=0;i<4;i++){C8255_A=j;C8255_B=led[b[i]];delay(0x55);j>>=1;}}void clear(){C8255_B=0x00;}。
单片机热电偶测温程序详解

引言概述:本文是关于单片机热电偶测温程序的详解第二部分。
在本文中,我们将继续深入探讨单片机热电偶测温程序的工作原理、设计方法和实施步骤。
热电偶是一种常用的温度测量传感器,具有高精度和广泛的应用范围。
通过本文的阐述,读者将能够深入了解如何在单片机系统中使用热电偶进行温度测量,并能够通过程序实现温度数据的读取和处理。
正文内容:一、热电偶工作原理1.热电效应的基本原理2.热电偶的结构和组成3.热电偶的工作原理4.热电偶的温度电压关系二、单片机热电偶测温程序设计基础1.单片机的基本概念和应用2.单片机与热电偶的接口原理3.单片机测温程序设计的基本要求4.温度测量精度的考虑因素三、程序实施步骤详解1.硬件电路的设计与搭建2.硬件接口的连接与配置3.软件开发环境的选择与配置4.温度测量算法的选择与实现5.温度测量数据的读取与显示四、热电偶测温程序的优化与改进1.传感器放大电路的设计与优化2.温度补偿算法的引入与优化3.程序运行效率的优化与改进4.温度数据的误差分析与校正5.程序的拓展与应用五、实验验证与结果分析1.实验环境与设备准备2.程序功能的验证与测试3.实验数据的分析与对比4.结果的可行性评估5.实验结果的优化与改进总结:本文详细阐述了单片机热电偶测温程序的设计和实施步骤。
通过对热电偶的工作原理、单片机接口原理和程序设计基础的介绍,读者能够了解到如何在单片机系统中应用热电偶进行温度测量。
本文还对程序实施步骤进行了详细介绍,包括硬件电路的设计与搭建、硬件接口的连接与配置、软件开发环境的选择与配置、温度测量算法的选择与实现以及温度测量数据的读取与显示。
本文也提出了热电偶测温程序的优化与改进方法,包括传感器放大电路的设计与优化、温度补偿算法的引入与优化、程序运行效率的优化与改进、温度数据的误差分析与校正以及程序的拓展与应用。
通过实验验证与结果分析,本文验证了所设计的单片机热电偶测温程序的功能和可行性,并提出了进一步优化和改进的建议。
单片机的数字温度计设计方案(附代码与仿真)

基于STC89C52的数字温度计目录1、简介....... .......... ..... 3 _ _2、计划选择2.1。
主控片选 (3)2.2.显示模块.............................. (3)2.3、温度检测模块………………………………… .. 43、系统硬件设计3.1。
51单片机最小系统设计………………………… .4 .电源电路设计…………………… .. 5.液晶显示电路设计……………………………… ..63.4.温度检测电路设计………… . . . 74.系统软件设计4.1。
温度传感器数据读取流程图......... .. (9)4.2.系统编程………………… .105. 编程与仿真5.1、Keil编程软件………………… .. .. 115.2.变形杆菌 (11)5.3.模拟界面……………………… ..116.总结........ .......... ........ 12 _ _ _ _ _七、附录附录 1. 原理图........ .......... (12)附录 2. 程序清单…………………………………………………………………… ..131 简介进入信息飞速发展的21世纪,科学技术的发展日新月异。
科学技术的进步带动了测量技术的发展,现代控制设备的性能和结构发生了翻天覆地的变化。
我们已经进入高速发展的信息时代,测量技术也成为当今技术的主流,已经渗透到研究和应用工程的各个领域。
温度与人们的生活息息相关,温度的测量变得非常重要。
2.系统方案选择2.1 主控芯片选型方案一:STC89C52RCSTC89C52RC是8051内核的ISP在线可编程芯片,最高工作时钟频率为80MHz,芯片内含8KB Flash ROM,可反复擦写1000次。
该器件兼容MCS-51指令系统和8051引脚结构。
该芯片集成了通用8位中央处理器和ISP Flash存储单元,具有在线可编程特性,在PC端有控制程序,用户程序代码可下载到单片机部门,无需购买通用编程器,速度更快。
温度监测系统实验报告

一、实验目的1. 熟悉温度监测系统的基本组成和原理。
2. 掌握温度传感器的应用和数据处理方法。
3. 学会搭建简单的温度监测系统,并验证其功能。
二、实验原理温度监测系统主要由温度传感器、数据采集器、控制器、显示屏和报警装置等组成。
温度传感器将温度信号转换为电信号,数据采集器对电信号进行采集和处理,控制器根据设定的温度范围进行控制,显示屏显示温度信息,报警装置在温度超出设定范围时发出警报。
本实验采用DS18B20数字温度传感器,该传感器具有体积小、精度高、抗干扰能力强等特点。
数据采集器采用单片机(如STC89C52)作为核心控制器,通过并行接口读取温度传感器输出的数字信号,并进行相应的处理。
三、实验器材1. DS18B20数字温度传感器2. STC89C52单片机3. LCD显示屏4. 电阻、电容等电子元件5. 电源模块6. 连接线四、实验步骤1. 搭建温度监测系统电路,包括温度传感器、单片机、显示屏、报警装置等。
2. 编写程序,实现以下功能:(1)初始化单片机系统;(2)读取温度传感器数据;(3)将温度数据转换为摄氏度;(4)显示温度数据;(5)判断温度是否超出设定范围,若超出则触发报警。
3. 连接电源,启动系统,观察温度数据变化和报警情况。
五、实验结果与分析1. 系统搭建成功,能够稳定运行,实时显示温度数据。
2. 温度数据转换准确,显示清晰。
3. 当温度超出设定范围时,系统能够及时触发报警。
六、实验总结1. 本实验成功地搭建了一个简单的温度监测系统,实现了温度数据的采集、处理和显示。
2. 通过实验,加深了对温度传感器、单片机、显示屏等电子元件的理解和应用。
3. 实验过程中,学会了如何编写程序,实现温度数据的处理和显示。
七、实验建议1. 在实验过程中,注意电路连接的准确性,避免因连接错误导致实验失败。
2. 在编写程序时,注意代码的简洁性和可读性,便于后续修改和维护。
3. 可以尝试将温度监测系统与其他功能结合,如数据存储、远程传输等,提高系统的实用性和功能。
stm32 实验报告

stm32 实验报告STM32 实验报告一、引言STM32是一款由STMicroelectronics公司推出的32位单片机系列,具有高性能、低功耗和丰富的外设资源等特点。
本篇实验报告将介绍我在学习和实践STM32过程中的一些经验和成果。
二、实验目的本次实验的目的是通过使用STM32单片机,实现一个简单的温度监测系统。
通过该实验,我希望能够熟悉STM32的开发环境,掌握基本的硬件连接和编程方法,并能够成功运行一个简单的应用程序。
三、实验步骤1. 硬件连接:将STM32单片机与温度传感器、LCD显示屏等硬件设备连接起来。
确保连接正确,避免短路或接触不良的情况。
2. 开发环境搭建:下载并安装STM32CubeIDE,配置开发环境。
这是一个集成开发环境,支持STM32系列的开发和调试。
3. 编写代码:使用C语言编写一个简单的程序,实现温度传感器数据的读取和显示。
在编写代码过程中,需要熟悉STM32的寄存器和外设配置,以及相关的函数库。
4. 编译和烧录:将编写好的代码进行编译,生成可执行文件。
然后使用JTAG或SWD接口将可执行文件烧录到STM32单片机中。
5. 测试和调试:将STM32单片机连接到电源,观察LCD显示屏上是否正确显示当前的温度数值。
如果有错误或异常情况,需要进行调试和排查。
四、实验结果经过以上的实验步骤,我成功地实现了一个简单的温度监测系统。
在LCD显示屏上,我可以清晰地看到当前的温度数值,并且该数值能够实时更新。
通过与实际温度计的对比,我发现该系统的测量结果相当准确。
五、实验总结通过这次实验,我对STM32单片机的开发和应用有了更深入的了解。
我学会了如何搭建开发环境、编写代码、编译和烧录程序,并且成功实现了一个简单的应用。
在实验过程中,我也遇到了一些问题,但通过查阅资料和与同学的交流,我能够及时解决这些问题。
在今后的学习和实践中,我将进一步探索STM32单片机的功能和应用领域。
我希望能够深入研究更复杂的项目,并挖掘出更多的潜力。
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单片机中。
DS18B20温度测量与控制实验报告

课程实训报告《单片机技术开发》专业:机电一体化技术班级: 104201学号: 10420134姓名:杨泽润浙江交通职业技术学院机电学院2012年5月29日目录一、DS18B20温度测量与控制实验目的……………………二、DS18B20温度测量与控制实验说明……………………三、DS18B20温度测量与控制实验框图与步骤……………………四、DS18B20温度测量与控制实验清单……………………五、DS18B20温度测量与控制实验原理图…………………六、DS18B20温度测量与控制实验实训小结………………一、实验目的1.了解单总线器件的编程方法。
2.了解温度测量的原理,掌握 DS18B20 的使用。
二、实验说明本实验系统采用的温度传感器DS18B20是美国DALLAS公司推出的增强型单总线数字温度传感器。
Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。
DS18B20测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
DS18B20可以程序设定9~12位的分辨率,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS18B20 内部结构DS18B20 内部结构主要由四部分组成:64 位光刻 ROM、温度传感器、非挥发的温度报警触发器 TH 和 TL、配置寄存器。
DS18B20 的管脚排列如下: DQ 为数字信号输入/输出端;GND 为电源地;VDD 为外接供电电源输入端(在寄生电源接线方式时接地)。
光刻 ROM 中的 64 位序列号是出厂前被光刻好的,它可以看作是该DS18B20 的地址序列码。
单片机课程设设计--------单总线和I2C总线结合实现数.

单片机课程设计题目 :单总线和 I2C 总线结合实现数字温度计实验班级:设计者:指导教师 :单总线和 I2C 总线结合实现数字温度计实验一、实验目的通过本实验 ,理解掌握单总线器件和 I2C 总线器件的应用 ,熟悉串行总线的操作技巧。
二、实验设备及器件IBM PC 机一台DP-51PROC 单片机综合仿真实验仪一台三、实验内容1. 编写程序 ,通过单片机的 P3.3 口控制一个 DS18B20 完成数字温度的采集 ,然后用程序处理采集到的数据结果。
2. 编写程序 ,通过 I2C 总线器件 ZLG7290 实现温度数据的输出显示。
3. 结合以上两部分程序 ,编程实现数字式温度计的程序设计。
四、实验要求熟练掌握单总线方式器件的应用,熟悉I2C总线协议,学习I2C器件的使用方法。
五、实验过程和步骤(一、新建工程文件1、点击工具栏 Project 选项,在下拉菜单中选择 New Project 命令 ,弹出项目文件保存对话框 ,输入项目名后 ,点击保存按钮。
2、在工程建立完毕以后,uVision 会弹出器件选择窗口,选择相应的器件型号。
如想修改 ,可点击工具栏 Project 选项,在下拉菜单中选择 Select Device forTarget …Target ?命令。
3、点击工具栏 File 选项,选中 New 命令,新建文件 ,输入源程序。
4、把文件保存到磁盘中,如用汇编语言编写程序用.asm为扩展名,如用C语言编写程序用 .c 为扩展名。
5、添加该文件到工程中 ,在 Projectwindos 窗口内 ,选中 Source Group1 然后点击鼠标右键 ,选择 Add files to Group “Source Group1 ”,选择刚才创建的源程序文件 ,单击 Add 按钮。
(二、程序文件的编译、链接1. 安装B4区JP12接口上的短路帽,将B4区的DQ 与A2区INT1(P3.3相连。
2. 安装 D5 区 JP1 接口上的短路帽 ,将 D5 区的 SDA、 SCL 分别与 A2 区的 P17、P16 相连。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序分析2-动态显示
P1_buff=wei[disp_cnt]; P1=P1_buff; P2=duan[disp_buff[disp_cnt]]; if(disp_cnt==1) P2=P2&0x7f; /*显示小数点*/ disp_cnt=disp_cnt+1; if (disp_cnt==5) disp_cnt=0;
实验20 温度测量
功能
• 驱动DS18D20,读取温度值 • 在数码管上显示温度 • 每秒测量一次温度
程序设计
• 利用定时器中断进行动态显示 • 利用定时器生成秒脉冲 • 编写1wire总线协议读取DS18B20中的温度
程序分析1-1-wire协议
• 读取温度ReadTemperature
– – – – – – – – – – – – – – DS18B20_Reset(); //设备复位 DS18B20_WriteByte(0xCC); //跳过ROM命令 DS18B20_WriteByte(0x44); //开始转换命令 DS18B20_Reset(); //设备复位 DS18B20_WriteByte(0xCC); //跳过ROM命令 DS18B20_WriteByte(0xBE); //读暂存存储器命令 TPL = DS18B20_ReadByte(); //读温度低字节 TPH = DS18B20_ReadByte(); //读温度高字节 t=TPH; t<<=8; t = t | TPL; tt =t * 0.0625; //将温度的高位与低位合并 t = tt * 10+0.5; //对结果进行4舍5入 return(t)
code unsigned char duan[]= //数码管显示字型表 {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, //0..9 0x88,0x83,0xA7,0xA1,0x86,0x8E,0xff}; //A b c d E F blank (10~16)
unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; // 数码管位的选择
程序分析3-全局变量
• • • • • • • • #include <stc12c5410ad.h> #include <intrins.h> #include <math.h> #define MAIN_Fosc 11059200UL //定义主时钟 #define Timer0_Reload (MAIN_Fosc / 12000) typedef unsigned char BYTE; BYTE TPH; //存放温度值的高字节 BYTE TPL; //存放温度值的低字节
程序分析2-刷新显示缓冲区
void ChangeTime(void) { secflag=0; tempbuf=ReadTemperature(); disp_buff[0]=tempbuf/1000; disp_buff[1]=tempbuf%100/10; disp_buff[2]=tempbuf%10; disp_buff[3]=16; disp_buff[4]=16; disp_buff[5]=16; }
• • • • • • •
• • • •
sbit DQ =P1^7; //定义DS18B20通信端口 bit secflag=0; unsigned char disp_buff[6]; unsigned int Countms; unsigned int tempbuf; unsigned char disp_cnt; unsigned char P1_buff;