基于MSP430G2553的DS18B20测温程序

合集下载

基于MSP430和DS18B20的智能温度检测系统的设计

基于MSP430和DS18B20的智能温度检测系统的设计

1、引言随着设备的电气化和自动化程度不断提高,对设备和环境进行实时监控显得尤为重要。

传统的测温器件热敏电阻测出的一般是电压,需要再转化为相应的温度,这就要有其它的外部硬件的支持。

因此硬件电路比较复杂,设计成本也比较高。

本智能温度检测系统采用的是一种改进型智能温度传感器DS18B20,数字温度传感器通过单总线与单片机连接,系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,也可应用于仓库测温、高层空调控制和农业生产过程监控等领域。

2、温度检测系统硬件构成该温度检测系统由主控制器MSP430F149、存储模块AT24C02、液晶显示模块HTM1602A、语音报警模块ISD1420、矩阵键盘和单总线接若干温度传感器DS18B20组成。

系统硬件框图如图1所示。

由图可见,多点温度测量电路只占用了M SP430F149的一个普通IO口,系统资源利用率较高。

图1系统硬件总体电路图2.1DS18B202.1.1DSl8B20的内部结构DS18B20的内部结构如图2所示[1],主要由四部分组成:光刻ROM、温度传感器、非易失性的温度报警触发器TH和TL配置寄存器。

DS18B20可以有多种封装形式,在TO-92封装中,如图2(a)所示,GND 为接地引脚,DQ为数据输入/输出引脚,VDD为可选的外部电源供电引脚,在寄生电源工作方式下接地。

光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。

64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码。

光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

2.1.2DS18B20的工作过程访问DS18B20的工作顺序通常为:初始化,发送ROM操作命令,发送RAM操作命令。

通过初始化复位工作使主设备知道传感器DS18B20存在并准备工作。

简谈430单片机和DS18B20的无线温检系统

简谈430单片机和DS18B20的无线温检系统

简谈430单片机和DS18B20的无线温检系统1.引言实际工业生产中某些测温场合要求设备性能稳定功耗低,测温过程温度信号处理易实现并且要便于集中处理,传统温度检测方法采用模拟传感器采集温度信号,信号经过一系列的模拟和数字电路处理后,再交由微处理器或DSP处理,元器件数量多而且整个检测系统有较大的偏差,稳定性和抗干扰性能都较差。

相比之下,多点测量及远程无线传输的设计方案成为最佳选择,本设计是基于MSP430单片机和DS18B20温度传感器以及nRF24L01无线收发模块的多点无线温度检测系统,可实现多点检测和无线传输,具有可靠性高、线路简单、测量精度高、功能便于扩展等优点。

2.硬件电路简介本设计采用的主控芯片及主电路模块基于美国TI 公司的超低功耗16位单片机芯片MSP430G2553;温度检测模块采用智能温度传感器DS18B20;电源部分采用可控型升压型DC- DC 电源模块TPS73033,对各功能单元的供电与否进行管理;温度显示单元采用TFT2.4液晶显示屏;射频无线收发模块nRF24L01能将相距甚远的不同节点采集到的数据将送入基站,其通过Motorola公司推出的三线同步接口SPI与单片机连接,系统结构简单,抗干扰能力强,适合于恶劣环境下进行多点无线温度检测,可以保证把传送到单片机的温度数据迅速安全的进行一站式处理。

因温度变化缓慢,本设计采用外设及MCU睡眠+定时唤醒模式进行数据采集,大幅降低系统功耗,延长了系统的使用周期,带来可观的经济效益。

3.各模块特点及简介3.1 传感器DS18B20DS18B20是美国Dalas 半导体公司继DS1820之后最新推出的一种改进型智能温度传感器,与传统的热敏电阻相比,它能够直接读出被测温度,并根据实际要求通过简单的编程实现9~12位的数字值读数方式,读取速度快,具有独特的单总线接口方式,即允许在一条信号线上挂接数十甚至上百个数字式传感器,从而简化测温装置与各传感器的接口,克服了模拟式传感器与微机接口时需要的A/D转换器及其它复杂外围电路的缺点,而且,可以通过总线供电,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源,由它组成的温度测控系统非常方便,而且成本低,体积小,可靠性高。

基于DS18B20和MSP430的无线测温系统设计

基于DS18B20和MSP430的无线测温系统设计
P1. , 2 TA l PI 1 TA0 ., P1 O TACLK ./ P2 4, . TA2 P2 3 TA 1 .,


15
14
8 9 1 0
13 12 ll
C U 只需一 根 端 口线 就 能 与 诸 多 DS 8 2 P 1 B 0通 信 ,
占用 微 处理 器端 口较 少 , 可节 省 大 量 引 线 和 逻 辑 电
图 1 MS 4 0 1 X 系列 单 片 机 的封 装 形 式 P 3F 1
度 检测 系 统.
12 MS 4 0单 片 机 . P3
器 的出 现和无 线 传输 方式 的发展 而 引 出 的一 项 温度
测量 技术 . 文 采 用 美 国 TI 司 的 MS 4 0 1 2 本 公 P3F 11
系列单 片机 和美 国 D L AL As公 司 的 DS 8 2 1 B 0组 成
就 发 出警报 并 给 出应 急措 施 , 以减 少 事故 的发 生 .
MS 4 0 1 x混 合 了 信 号 微 控 制 器 的 一 些 特 P 3F 1
性, : 如
1 低 电源 电压 范 围 1 8 . 超 低 功 耗 , ) . ~3 6V, 低
工作 电流.
2 5种节 电方式 ( 机 方 式 0 8 u 保 持 RAM ) 待 . A
[ 摘 要 ]介 绍 了一 种 无 线 温 度 采 集 系 统 的 设 计 , 数 字 式 温 度 传 感 器 D I B 0进 行 测 温 , 超 低 功 耗 单 片 用 S8 2 用 机 MS 40进 行 数 据 处 理 并 用 低 功 率 无 线 模 块 S R 0 行 数 据 传 输 . 系 统 具 有 低 成 本 、 可 靠 性 以及 实 用 P3 T 3进 该 高 性强等特点.

基于msp430单片机和DS18B20使用数码管显示的温度测量_毕业设计(论文) 精品

基于msp430单片机和DS18B20使用数码管显示的温度测量_毕业设计(论文) 精品

毕业设计论文基于msp430单片机和DS18B20使数码管显示的温度测量摘要:为了在现实生活和工业生产及过程控制中准确测量温度,设计了一种基于低功耗MSP430单片机的数字温度计,整个系统通过单片机MSP430F149控制DS18B20读取温度,采用数码管显示,温度传感器DS18B20与单片机之间通过串口进行数据传输,MSP430系列单片机具有超低功耗,且外围的整合性高,DS18B20只需一个端口即可实现数据通信,连接方便,通过多次实验证明,该系统的测试结果与实际环境温度一致,除了具有接口电路简单,测量精度高,误差小,可靠性高等特点外,其成本低,功耗低的特点使其拥有更广阔的应用前景。

关键字:温度测量MSP430单片机温度传感器DS18B20 超低功耗Abstract: in order to accurately measure the temperature in real life and industrial production and process control, a digital thermometer was designed with low power consumption based on MSP430 single chip microcomputer, the control system of DS18B20 read the temperature through the single-chip MSP430F149, the use of digital tube display, temperature sensor DS18B20 and single chip microcomputer for data transmission through the serial port, MSP430 Series MCU with low power consumption the periphery,and high integration, DS18B20 only needs one port to realize the data communication, the connection is convenient, through many experiments, the test results of the system and the actual environment temperature is the same, except with the interface circuit is simple, high precision, small error, high reliability, low cost, low power consumption it has a wider application prospect.图表1 Keywords: temperature measurement MSP430 temperature sensor DS18B20 ultra low2 power consumption目录一.温度测量器的总体设计 (3)二.温度测量器的硬件选择 (4)1 主控器件:MSP430F149 (4)2 温度信息采集单元:DS18B20 (5)2.1 DS18B20 (5)2.2 DS18B20管脚排列 (6)3.显示单元:数码管及其驱动 (7)3.1 数码管 (7)3.2 驱动芯片:74HC573 (7)三. 系统软件程序 (8)1、系统的程序流图 (8)2.处理DS18B20的子程序 (9)2、1 初始化时序 (10)2、2 写时序 (12)2、3 读时序 (14)3、温度计算子程序 (16)4、处理数码管显示的子程序 (19)四、系统调试 (20)1、硬件检测和调试 (20)2、软件程序调试 (22)3、整体调试 (22)五、结论分析 (23)参考文献: (24)附录一: (24)附录二: (24)附录三: (31)一.温度测量器的总体设计生活中最常见的应该是利用物体的热胀冷缩测温度,比如家里用的温度计、体温计等等,这种很好做但是精密程度不够,反正生活中用的也不需要那么精密。

基于msp430开发板的ds18b20温度测量程序+1602显示

基于msp430开发板的ds18b20温度测量程序+1602显示

基于msp430开发板的ds18b20温度测量程序+1602显示#include#include#define uchar unsigned char#define uint unsigned int#define DQ_1 P2OUT |= BIT3 //DS18B20数据脚接P2.3,LaunchPad上TXD、RXD跳线帽,由“‖”接改为“〓”。

用USB连接电脑后就可用超级终端看到温度了。

#define DQ_0 P2OUT &= ~BIT3#define DQ_in P2DIR &= ~BIT3#define DQ_out P2DIR |= BIT3#define DQ_val (P2IN & BIT3)#define Read_ROM 0x33 //读ROM#define Match_ROM 0x55 //匹配ROM#define Skip_ROM 0xcc //跳过ROM#define Search_ROM 0xf0 //搜索ROM#define Alarm_Search 0xec //告警搜索#define Convert_T emperature 0x44 //温度转换#define Read_Scratchpad 0xbe //读暂存存储器9字节内容#define Write_Scratchpad 0x4e //写暂存存储器,写的是TH and TL ,接着发送两位数据就可以unsigned int Check_val; //初始化检测变量unsigned int Temp;//温度整数值void UartPutchar(unsigned char c);unsigned char UartGetchar();unsigned int DS18b20_init(void){DQ_out;DQ_0;__delay_cycles(600);DQ_1;__delay_cycles(60);DQ_in;_NOP();if(DQ_val){Check_val = 0; //初始化失败}else{Check_val = 1; //初始化成功}__delay_cycles(10);DQ_out;DQ_1;__delay_cycles(100);return Check_val;}void DS18b20_write_byte(unsigned int dat) {unsigned int i;for(i = 0; i < 8;i++){DQ_0;__delay_cycles(2);if(dat & 0X01)DQ_1;elseDQ_0;__delay_cycles(60);dat >>= 1;;DQ_1;__delay_cycles(10);}}unsigned int DS18b20_read_byte(void) {unsigned i;unsigned int byte = 0;for(i = 0;i < 8;i++){byte >>= 1;DQ_0;__delay_cycles(2);DQ_1;__delay_cycles(2);DQ_in;_NOP();if(DQ_val)byte |= 0x80;__delay_cycles(60);DQ_out;DQ_1;__delay_cycles(10);}return byte;}unsigned int get_one_temperature(void) {unsigned int Temp_l;unsigned int Temp_h;unsigned int t;float tt;DS18b20_init();DS18b20_write_byte(Skip_ROM);DS18b20_write_byte(Convert_Temperature); __delay_cycles(1000000);DS18b20_init();DS18b20_write_byte(Skip_ROM);DS18b20_write_byte(Read_Scratchpad); Temp_l=DS18b20_read_byte();Temp_h=DS18b20_read_byte();t=Temp_h;t<<=8;t=t|Temp_l;tt=t*0.0625;t= tt*10+0.5; //放大10倍输出并四舍五入return(t);}#define DataDir P1DIR#define DataPort P1OUT#define Busy 0x80#define CtrlDir P2DIR#define CLR_RS P2OUT&=~BIT0; //RS = P3.0 #define SET_RS P2OUT|=BIT0;#define CLR_RW P2OUT&=~BIT1; //RW = P3.1 #define SET_RW P2OUT|=BIT1;#define CLR_EN P2OUT&=~BIT2; //EN = P3.2 #define SET_EN P2OUT|=BIT2;void DelayNus(unsigned int n){CCR0 = n;TACTL |= MC_1; //增计数到CCR0while(!(TACTL & BIT0)); //等待TACTL &= ~MC_1; //停止计数TACTL &= ~BIT0; //清除中断标志}void Delay5ms(void){//unsigned int i;//i=40000;//while (i != 0)// {// i--;// }DelayNus(5000);}void WaitForEnable(void)P1DIR &= 0x00; //将P1口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();while((P1IN & Busy)!=0); //检测忙标志CLR_EN;P1DIR |= 0xFF; //将P4口切换为输出状态}void write_com(unsigned char cmd) {WaitForEnable(); // 检测忙信号?CLR_RS;CLR_RW;_NOP();DataPort =cmd ; //将命令字写入数据端口_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}void write_data( unsigned int data )WaitForEnable(); //等待液晶不忙SET_RS;CLR_RW;_NOP();DataPort = data; //将显示数据写入数据端口_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}void zifuchuan(unsigned int *ch){while(*ch!=0)write_data(*ch++);Delay5ms();}void LcdReset(void){CtrlDir |= 0x07; //控制线端口设为输出状态DataDir = 0xFF; //数据端口设为输出状态write_com(0x38); //显示模式设置write_com(0x0c); //显示开,不开游标,不闪烁write_com(0x06); //写字符时整体不移动write_com(0x01); //显示清屏__delay_cycles(200);}/************************************************************* * 名称:void dis_temp(uint t)* 功能:分出十位、个位等* 入口参数:t* 出口参数:无* 说明: 送到1602显示*************************************************************/ void main(void){unsigned int a,b,c,d;// BCSCTL1|=DIVA_0;WDTCTL=WDTPW+WDTHOLD;// WDTCTL = WDT_ADLY_1000; // Stop watchdog timer// IE1 |=WDTIE;P1DIR = 0XFF;P1OUT = 0XFF;P2DIR = 0XFF;P2OUT = 0XFF;BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0; //dco不分频用作mclk,不分频默认用作smclkif (CALBC1_1MHZ != 0xFF){DCOCTL = 0x00;BCSCTL1 = CALBC1_1MHZ; /* Set DCO to 1MHz */DCOCTL = CALDCO_1MHZ;}BCSCTL1 |= XT2OFF + DIVA_0;LcdReset();while(1){a=get_one_temperature();b=a/100;c=(a%100)/10;d=a%10;P2SEL&=~BIT6;if(a>300){P2DIR|=BIT5;P2OUT|=BIT5;P2DIR|=BIT6;P2OUT|=BIT6;}else{P2DIR|=BIT5;P2OUT&=~BIT5;P2DIR|=BIT6;P2OUT&=~BIT6;}write_com(0x80+0x05);write_data(b+0x50);write_data(c+0x50);write_data(0x4e);write_data(d+0x50);write_data(0xbf); //显示温度的小圈write_data(0x23);//__delay_cycles();}}/*pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){_BIS_SR_IRQ(LPM3_bits); }*/。

用msp430g2553在3位共阳极数码管上显示18b20温度

用msp430g2553在3位共阳极数码管上显示18b20温度

//程序利用msp430g2553单片机写的,用的是28引脚的。

用3位共阳极数码管显示18B20 //的温度。

最后附上电路图。

我自己随意画的。

可能有些地址不太标准。

#include ""#define uchar unsigned char#define uint unsigned int#define DQ BIT3#define DQ1 P1OUT |= BIT3#define DQ0 P1OUT &= ~BIT3#define DQIN P1DIR &= ~BIT3#define DQOUT P1DIR |= BIT3#define READ_DQ (P1IN&DQ)//读DQ电平uint temp;uint a,b,c,d,F;uchar x;uint fz=0;//数码管7位段码:0--fuchar scandata[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};uchar scandata1[3] = {0x04,0x02,0x01};void delay2(void){uint tmp;for(tmp = 800;tmp > 0;tmp--);}void DS18B20_Init(void) //DS18B20初始化函数{//char x;DQOUT;DQ0; //拉低总线__delay_cycles(4800); //精准延时大于480usDQ1; //释放总线__delay_cycles(480);DQIN;if(READ_DQ){x =1;//初始化失败}else{x = 0;//初始化成功}DQOUT;DQ1;__delay_cycles(3600);}void DS18B20_WriteData(uchar dat) //写一个字节{uchar i;for(i=0;i<8;i++)//位计数值{DQ0; //拉低总线产生写信号__delay_cycles(48);if(dat&0x01) DQ1;//此位数据是不是为高,是高那么将单总线拉高else DQ0;//是低那么将单总线拉低dat>>=1; //预备下一名数据的传送__delay_cycles(400);DQ1; //释放总线,等待总线恢复__delay_cycles(80);}}uchar DS18B20_ReadData(void) //读一个字节{uchar i;uchar dat=0;for(i=0;i<8;i++)//位计数值{dat>>=1;//右移,预备同意新的数据位DQ0; //拉低总线产生读信号__delay_cycles(48);DQ1; //释放总线预备读数据__delay_cycles(72);//等待5微秒DQIN;//配置为输入,开始读取数据位_NOP();if(READ_DQ)//该位是不是为高{dat|=0x80;//是就将此位置高}__delay_cycles(400);//等待50微秒DQOUT;DQ1;__delay_cycles(80);}return(dat);//将读到的一个字节返回}uint Read_Temp(void) //读取温度{uint temp_low,temp_high,d;float c;DS18B20_Init();//初始化,每次写命令都从初始化开始DS18B20_WriteData(0xcc); //跳过ROM命令DS18B20_WriteData(0x44); //温度转换命令DS18B20_Init();//初始化,每次写命令都从初始化开始DS18B20_WriteData(0xcc); //跳过ROM命令DS18B20_WriteData(0xbe); //temp_low=DS18B20_ReadData();//读温度低字节temp_high=DS18B20_ReadData(); //读温度高字节if(temp_high&0xf8){temp_high<<=8;temp_high|=temp_low;d=~temp;d+=1;F=1;//温度为负值}else{temp_high<<=8;d=temp_high|temp_low;F=0;//温度为正值}c=d*;d=(uint)(c*100);return(d); //返回16位变量}void delay(uint z) //延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}int main(void){WDTCTL = WDTPW + WDTHOLD;//停止看门狗BCSCTL1 = CALBC1_8MHZ;//MCLK为DCO,8MHZ DCOCTL = CALDCO_8MHZ;P1DIR |=BIT0;P2DIR=0xff;P3DIR=0xff;while(1){temp=Read_Temp();if(F==0){a=temp%10000/1000;b=temp%1000/100;d=temp%100/10;c=temp/10000;int k=4000;if(c!=0){while(k>0){P2OUT = scandata1[2];P3OUT = scandata[c]; //用一名数码管显示delay2();P2OUT = scandata1[1];P3OUT = scandata[a]; //用一名数码管显示delay2();P2OUT = scandata1[0];P3OUT = scandata[b]; //用一名数码管显示delay2();k--;}}else{while(k>0){P2OUT = scandata1[2];P3OUT = scandata[a]; //用一名数码管显示delay2();P2OUT = scandata1[1];P3OUT = scandata[b]; //用一名数码管显示P3OUT&=~BIT7;delay2();P2OUT = scandata1[0];P3OUT = scandata[d]; //用一名数码管显示delay2();k--;}}}else{a=temp%10000/1000;b=temp%1000/100;int k=4000;while(k>0){P2OUT = scandata1[2];P3OUT&=~BIT6;delay2();P2OUT = scandata1[1];P3OUT = scandata[a]; //用一名数码管显示delay2();P2OUT = scandata1[0];P3OUT = scandata[b]; //用一名数码管显示delay2();k--;}}}}。

基于MSP430单片机和DS18B20的数字温度计

基于MSP430单片机和DS18B20的数字温度计

图 4 DS18B20 内部结构框图 Fig. 4 Internal structure diagram of DS18B20
-107-
《电子设计工程》2010 年第 11 期
3 系统软件设计
3.1 系统程序 系统的程序主要包括主程序、读出温度子程序、温度转
换命令子程序、计算温度子程序和显示数据刷新子程序。 程序 的 主要 功 能 是实 时 显 示 温 度 、读 出 并 处 理 DS18B20
2.3 温度 传 感 器[6-7] 单线 数 字 温 度 传 感 器 DS18B20 可 以 把 温 度 信 号 直 接 转
换成数字信号,每片 DS18B20 含有唯一的 64 位序列号 ,测温 范围是-55~+125 ℃,完全符合系统要求。
DS18B20 数字温度计提供 9 位 温度 读 数 ,指示 器 件 的温 度 信 息 经 过 单 线 接 口 送 入 DS18B20 或 从 DS18B20 送 出 ,和 MCU 之间只需一条线连接,读写和完成温度变换所需的电源 可以由数据线本身提供而无需外部电源。 由于每个 DS18B20 有 唯 一 的 系 列 号 (silicon serial number),因 此 ,多 个 DS18B20 可存在于同一条单线总线上 ,此特性可以应用于 HVAC 环境 控制建筑物设备或机械内的温度检测以及过程监视和控制 中的温度检测。
温 度 传 感 器 选 用 了 DALLAS 公 司 数 字 式 集 成 温 度 传 感 器 DS18B20, 采用 2 位共阴极 LED 数码 管以 及 2 个 CD4511 译 码 器 实 现温 度 显 示[3-4]。 系 统 的 整体 设 计 电路 如 图 2 所示 。 2.1 主控制器
1 数字式温度计的总体设计

单片机DS18B20温度计(有程序)

单片机DS18B20温度计(有程序)

;单片机DS18B20温度计C语言程序; 有程序#include<reg51.h>#include<intrins.h>#include <math.H> //要用到取绝对值函数abs()//通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值, 目前显示范围: -55~ +125度sbit wela = P2^7; //数码管位选sbit dula = P2^6; //数码管段选sbit ds = P2^2;int tempValue;//0-F数码管的编码(共阳极)unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//0-9数码管的编码(共阳极), 带小数点unsigned char code tableWidthDot[]={0x40, 0x79, 0x24, 0x30,0x19, 0x12, 0x02,0x78, 0x00, 0x10};//延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms.void delay(unsigned int i){unsigned int j;while(i--){for(j = 0; j < 125; j++);}}//初始化DS18B20//让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动 void dsInit(){//对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于?us unsigned int i;ds = 0;i = 100; //拉低约800us, 符合协议要求的480us以上while(i>0) i--;ds = 1; //产生一个上升沿, 进入等待应答状态i = 4;while(i>0) i--;}void dsWait(){unsigned int i;while(ds);while(~ds); //检测到应答脉冲i = 4;while(i > 0) i--;}//向DS18B20读取一位数据//读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,//之后DS18B20则会输出持续一段时间的一位数据bit readBit(){unsigned int i;bit b;ds = 0;i++; //延时约8us, 符合协议要求至少保持1usds = 1;i++; i++; //延时约16us, 符合协议要求的至少延时15us以上b = ds;i = 8;while(i>0) i--; //延时约64us, 符合读时隙不低于60us要求return b;}//读取一字节数据, 通过调用readBit()来实现unsigned char readByte(){unsigned int i;unsigned char j, dat;dat = 0;for(i=0; i<8; i++){j = readBit();//最先读出的是最低位数据dat = (j << 7) | (dat >> 1);}return dat;}//向DS18B20写入一字节数据void writeByte(unsigned char dat){unsigned int i;unsigned char j;bit b;for(j = 0; j < 8; j++){b = dat & 0x01;dat >>= 1;//写"1", 将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1if(b){ds = 0;i++; i++; //拉低约16us, 符号要求15~60us内ds = 1;i = 8; while(i>0) i--; //延时约64us, 符合写时隙不低于60us要求}else //写"0", 将DQ拉低60us~120usds = 0;i = 8; while(i>0) i--; //拉低约64us, 符号要求ds = 1;i++; i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us 了}}//向DS18B20发送温度转换命令void sendChangeCmd(){dsInit(); //初始化DS18B20, 无论什么命令, 首先都要发起初始化dsWait(); //等待DS18B20应答delay(1); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号writeByte(0xcc); //写入跳过序列号命令字Skip RomwriteByte(0x44); //写入温度转换命令字Convert T}//向DS18B20发送读取数据命令void sendReadCmd(){dsInit();dsWait();delay(1);writeByte(0xcc); //写入跳过序列号命令字Skip RomwriteByte(0xbe); //写入读取数据令字Read Scratchpad}//获取当前温度值int getTmpValue(){unsigned int tmpvalue;int value; //存放温度数值float t;unsigned char low, high;sendReadCmd();//连续读取两个字节数据low = readByte();high = readByte();//将高低两个字节合成一个整形变量//计算机中对于负数是利用补码来表示的//若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的valuetmpvalue = high;tmpvalue <<= 8;tmpvalue |= low;value = tmpvalue;//使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度t = value * 0.0625;//将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入//如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度//如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5return value;}unsigned char const timeCount = 3; //动态扫描的时间间隔//显示当前温度值, 精确到小数点后一位//若先位选再段选, 由于IO口默认输出高电平, 所以当先位选会使数码管出现乱码void display(int v){unsigned char count;unsigned char datas[] = {0, 0, 0, 0, 0};unsigned int tmp = abs(v);datas[0] = tmp / 10000;datas[1] = tmp % 10000 / 1000;datas[2] = tmp % 1000 / 100;datas[3] = tmp % 100 / 10;datas[4] = tmp % 10;if(v < 0){//关位选, 去除对上一位的影响P0 = 0xff;wela = 0;//段选P0 = 0x40; //显示"-"号dula = 1; //打开锁存, 给它一个下降沿量dula = 0;//位选P0 = 0xfe;wela = 1; //打开锁存, 给它一个下降沿量wela = 0;delay(timeCount);}for(count = 0; count != 5; count++){//关位选, 去除对上一位的影响P0 = 0xff;wela = 1; //打开锁存, 给它一个下降沿量wela = 0;//段选if(count != 2){P0 = table[datas[count]]; //显示数字}else{P0 = tableWidthDot[datas[count]]; //显示带小数点数字}dula = 0;//位选P0 = _crol_(0xfd, count); //选择第(count + 1) 个数码管wela = 1; //打开锁存, 给它一个下降沿量wela = 0;delay(timeCount);}}void main(){unsigned char i;while(1){//启动温度转换sendChangeCmd();//显示5次for(i = 0; i < 40; i++){display(tempValue);}tempValue = getTmpValue();}以下是我编的程序,可用#include <reg52.h>#include <intrins.h>//-----------------------------------------------------------sbit DQ=P1^5;//-----------------------------------------------------------unsigned char number[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};//数字0~9unsigned char wei[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //数码管位循环unsigned char Flag;unsigned char Templ,Temph;unsigned int temp;//-----------------------------------------------------------//函数声明//-----------------------------------------------------------void delay(unsigned char i); //延时程序//----------------------------------void Int18b20(void); //18b20初始化void Write18b20(unsigned char dat); //向18b20写一字节unsigned char Read18b20(void); //从18b20读一字节void Start18b20(void); //开始转换温度void Get18b20(void); //读出温度void chinT(void); //数据转换//----------------------------------void display(void); //显示程序//-----------------------------------------------------------//函数功能:延时//-----------------------------------------------------------/*************精确延时函数*****************/void delay(unsigned char i){while(--i);}/*此延时函数针对的是12Mhz的晶振delay(0); //延时518us 误差:518-2*256=6delay(1); //延时7us (原帖写"5us"是错的)delay(10); //延时25us 误差:25-20=5delay(20); //延时45us 误差:45-40=5delay(100); //延时205us 误差:205-200=5delay(200); //延时405us 误差:405-400=5*///-----------------------------------------------------------//DS18b20的相关程序//-----------------------------------------------------------//初始化//-----------------------------------------------------------void Int18b20(void){DQ=1;_nop_();_nop_();DQ=0; //拉低delay(100); //延时205usdelay(200); //延时405us //等待400~960微秒,最短为480us DQ=1;delay(1); //延时7usdelay(20); //延时45us //等待15~60微秒(等待回复)if(DQ==1) //判断初始化的情况是否成功{Flag=0; //复位失败}else{Flag=1;while(!DQ); //等待回复完成}delay(200); //延时405us //等待完成初始化}//-----------------------------------------------------------//写一字节//-----------------------------------------------------------void Write18b20(unsigned char dat){unsigned char i;for(i=0;i<8;i++){DQ=1;_nop_();DQ=0;delay(1); //延时7us //拉低后延时小于15usif(dat&0x01){DQ=1;}else{DQ=0;}dat=dat>>1;delay(20); //延时45usdelay(10); //延时25us //延时大于60usDQ=1;delay(1); //延时7us //延时大于1us}}//-----------------------------------------------------------//读一字节//-----------------------------------------------------------unsigned char Read18b20(void){unsigned char i,dat=0;for(i=0;i<8;i++){DQ=1;_nop_();DQ=0;delay(1); //延时7usdat=dat>>1;DQ=1;delay(1); //延时7us //确保在15us后60us前读数据if(DQ){dat|=0x80;}delay(20); //延时45us //确保读时续大于60us}return dat;}//-----------------------------------------------------------//开始转换温度//-----------------------------------------------------------void Start18b20(void){Int18b20();Write18b20(0xcc); //跳过ROM指令Write18b20(0x44); //温度转换指令}//-----------------------------------------------------------//读出温度//-----------------------------------------------------------void Get18b20(void){Int18b20();Write18b20(0xcc); //跳过ROM指令Write18b20(0xbe); //读暂存器指令Templ=Read18b20();Temph=Read18b20();}//-----------------------------------------------------------//数据转换//-----------------------------------------------------------void chinT(void){float Tt;temp=Temph; //先把高八位有效数据赋于temptemp=(temp<<8); //将数据从temp低八位移到高八位temp=temp|Templ; //将两字节合成一个整型变量Tt=temp*0.0625; //得到真实十进制温度值(因为DS18B20可以精确到0.0625度) temp=Tt*10+0.5; //放大十倍(将小数点后一位变成个位,个位变成十位,十位变成百位,并四舍五入)}//-----------------------------------------------------------//显示程序//-----------------------------------------------------------void display(void){unsigned int i;unsigned char A1,A2,A3;A1=temp/100; //百位(温度的十位)A2=temp%100/10; //十位(温度的个位)A3=temp%10; //个位(温度的小数点后一位)for(i=0;i<20;i++){P0=0x00;P2=0x00;P0=number[A1];P2=wei[0];delay(220);P0=0x00;P2=0x00;P0=number[A2];P2=wei[1];delay(220);P0=0x00;P2=0x00;P0=number[A3];P2=wei[2];delay(220);P0=0x00;P2=0x00;P0=0x80;P2=wei[1];delay(220);}}//-----------------------------------------------------------//----------------------------------------------------------- void main(void){while(1){Int18b20();if(Flag){Start18b20(); //开始转换温度Get18b20(); //得到温度chinT(); //数据转换display(); //显示}else P3=0x01;}}。

基于msp430g2553温度传感器18b20程序

基于msp430g2553温度传感器18b20程序
DQ_H; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delayus(10);//延时200us
}
//读一个字节
uchar readonechar(void)
{
uchar i=0;
uchar dat=0;
DQ_OUT;
for(i=8;i>0;i--)
{
DQ_L; // 给脉冲信号
dat>>=1;
_NOP();
DQ_H; // 给脉冲信号
_NOP();
DQ_IN;
if(P1IN&BIT4)
dat|=0x80;
delayus(2);
}
//初始化函数
void init_ds18b20()
{
DQ_OUT;
_NOP();
DQ_H; //DQ复位
delayus(2); //稍做延时40us
DQ_L; //单片机将DQ拉低
delayus(25); //精确延时 大于 500us
基于msp430g2553温度传感器18b20程序
#ifndef __DS18B20_H__
#define __DS18B20_H__
#include "delay.h"
#define DQ_OUT P1DIR|=BIT
#define DQ_H P1OUT|=BIT4
{
uchar a=0;
uchar b=0;
uint t=0;
float tt=0;
init_ds18b20();
writeonechar(0xCC); // 跳过读序号列号的操作

完整DS18B20温度测控程序

完整DS18B20温度测控程序

#include<reg52.h>sbit s2=P0^0;sbit led=P1^3;unsigned char wendushangxian=0;sbit DQ=P1^6;sbit wei1=P3^0;sbit wei2=P3^1;sbit wei3=P3^2;sbit wei4=P3^3;sbit key_Max_jia=P0^0;sbit key_Max_jian=P0^1;sbit key_Min_jia=P0^2;sbit key_Min_jian=P0^3;sbit dianji_jian=P1^2;sbit dianji_jia=P1^7;sbit Led_tempreture_Max=P1^3;sbit Led_tempreture_Min=P1^4;sbit Led_normal=P1^5;unsigned char num[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; int tempreture_Max=40;int tempreture_Min=-10;void delay_mylself(int temp){unsigned int i,j;for(i=0;i<temp;i++)for(j=0;j<1140;j++);}void delay(unsigned int i) //如果i是unsigend char类型,则会出现错误结果{while(i--);}void DS18B20_Init(void)//初始化{unsigned char flag=0;DQ = 1; //DQ复位delay(1);DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480us小于960usDQ = 1; //拉高总线delay(6);while(DQ);while(!DQ);//flag=DQ; //稍做延时后如果flag=0则初始化成功flag=1则初始化失败//delay(30);}unsigned char Read(void)//读字节{unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay(5);}return(dat);}void Write(unsigned char dat)//写字节{unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay(5);DQ = 1;dat>>=1;}}void init(){wei1=0;wei2=0;wei3=0;wei4=0;}void Display(unsigned int temp){unsigned char one,two,three,four;int wendu=0;if(temp<=0xf000){ temp>>=4; //右移4位,相当于乘0.0625,将温度化为十进制//temp*=10; //扩大10倍,显示一位小数one=temp/1000; //千位two=temp%1000/100; //百位three=temp%1000%100/10; //十位four=temp%1000%100%10; //个位wendu=temp;}else{temp=~temp;temp+=1;temp>>=4;one=10; //负数two=temp%1000/100; //百位three=temp%1000%100/10; //十位four=temp%1000%100%10; //个位wendu=-temp;}if(wendu>tempreture_Max){Led_tempreture_Max=0;Led_tempreture_Min=1;Led_normal=1;dianji_jian=1;dianji_jia=0;}else if(wendu<tempreture_Min){Led_tempreture_Max=1;Led_tempreture_Min=0;Led_normal=1;dianji_jia=1;dianji_jian=0;}else{Led_tempreture_Max=1;Led_tempreture_Min=1;Led_normal=0;dianji_jian=0;dianji_jia=0;}//第1位wei1=1;wei2=0;wei3=0;wei4=0;P2=num[one];delay_mylself(1);//第2位wei1=0;wei2=1;wei3=0;wei4=0;P2=num[two];delay_mylself(1);//第3位wei1=0;wei2=0;wei3=1;wei4=0;P2=num[three];delay_mylself(1);//第4位wei1=0;wei2=0;wei3=0;wei4=1;P2=num[four];delay_mylself(10);}void common_display(int temp){unsigned char one,two,three,four;one=temp/1000; //千位two=temp%1000/100; //百位three=temp%1000%100/10; //十位four=temp%1000%100%10; //个位if(temp<0){temp=-temp;two=temp%1000/100; //百位three=temp%1000%100/10; //十位four=temp%1000%100%10; //个位//第1位wei1=1;wei2=0;wei3=0;wei4=0;P2=num[10];delay_mylself(50);}else{//第1位wei1=1;wei2=0;wei3=0;wei4=0;P2=num[one];delay_mylself(50);}//第2位wei1=0;wei2=1;wei3=0;wei4=0;P2=num[two];delay_mylself(50);//第3位wei1=0;wei2=0;wei3=1;wei4=0;P2=num[three];delay_mylself(50);//第4位wei1=0;wei2=0;wei3=0;wei4=1;P2=num[four];delay_mylself(60);}void key(){unsigned char flag=0;if(key_Max_jia==0){flag=1;tempreture_Max+=1;if(tempreture_Max>125){tempreture_Max=125;}while(!key_Max_jia); //按键松手检测}else if(key_Max_jian==0){flag=2;tempreture_Max-=1;if(tempreture_Max<tempreture_Min){tempreture_Max=tempreture_Min;}while(!key_Max_jian); //按键松手检测}else if(key_Min_jia==0){flag=3;tempreture_Min+=1;if(tempreture_Min>tempreture_Max){tempreture_Min=tempreture_Max;}while(!key_Min_jia); //按键松手检测}else if(key_Min_jian==0){flag=4;tempreture_Min-=1;if(tempreture_Min<-55){tempreture_Min=-55;}while(!key_Min_jian); //按键松手检测}if(flag==1||flag==2){common_display(tempreture_Max);delay_mylself(200);flag=0;}else if(flag==4||flag==3){common_display(tempreture_Min);delay_mylself(200);flag=0;}}void main(){unsigned int temp;unsigned char tl=0,th=0;while(1){DS18B20_Init();Write(0xCC); // 跳过读序号列号的操作Write(0x44); // 启动温度转换delay(100);DS18B20_Init();Write(0xCC); //跳过读序号列号的操作Write(0xBE); //读取温度寄存器等delay(100);tl=Read(); //读取温度值低位th=Read(); //读取温度值高位temp=th<<8;temp|=tl;Display(temp);key();}}。

基于DS18B20和MSP430的温度控制器毕业设计

基于DS18B20和MSP430的温度控制器毕业设计
考虑到本题显示信息有汉字,我们决定选择LCM12864点阵显示器作为本系统的显示模块。
1.1.3
方案一:采用18B20温度传感器,信息经过单线接口送入DS1820或从DS1820送出,因此从中央处理器到DS1820仅需连接一条线(和地)。读写和完成温度变换所需的电源可以由数据线本身提供,而不需要外部电源。电路简单,成本低,精度高。
测温范围
安装螺纹
电缆长度
适用管道
TS-18B20
-55~125

1.5 m
-------
TS-18B20A
-55~125
M10X1
1.5m
DN15-25
TS-18B20B
-55~125
1/2G
接线盒
DN40-60
2.3.4
1.单线接口,仅需一根口线与CPU连接可以实现双向通信。
2.无需外围元件。
本设计的关键在于温度传感器DS18B20与单片机之间通过串口进行数据传输,单片机MSP430F169读取温度,电磁阀的驱动和单片机与电脑的通信。MSP430系列单片机具有超低功耗,且外围的整合性高,DS18B20只需一个端口即可实现数据通信,连接方便,设计以MSP430F169为基础,并以此为控制核心,同时利用温度传感技术实现对当前温度进行实时测量,并以按键控制温度。此项目主要包括温度传感部分、显示部分、电磁阀开关控制部分及按键控制部分。 经分析有着良好的研究意义和广泛用途。
4.工作电源: 3-5V/DC。
5.在使用中不需要任何外围元件。
6.测量结果以9-12位数字量方式串行传送。
2.3.3
温度传感器DS18B20共有三种型号,分别为TS-18B20,TS-18B20A,TS-18B20B,各种型号的具体性能及参数如表2-1所示。

DS18B20测温流程图

DS18B20测温流程图

主程序流程图:
DS18B20程序流程图:
程序按数据手册的时序图编写子函数模块:
1、DS18B20复位函数:resetDS18B20(void)
2、写一位的函数:WriteBit (unsigned char wb)
3、读一位的函数:unsigned char ReadBit (void)
4、读一个字节的函数:unsigned char readByteDS18B20(void)
即将位读取的时序循环8次。

5、写一个字节的函数:void writeByteDS18B20(unsigned char Data)。

即将位写入的时序循环8次。

6、first和next函数流程图:
1、端口初始化子函数;
2、串口初始化;
3、串口发送一个字符函数:void USART_Putchar(unsigned char
send_char)
4、串口发送数组函数:void UsartTransmit(unsigned char *data,
unsigned char len)
5、串口发送字符串函数:void USART1_Putstr(char *s)
即通过字符串长度控制USART_Putchar函数的循环次数。

6、串口发送字符串子程序(带有换行符):
void USART1_Puts(char *s)
7、串口接收字符串函数:unsigned char getchar1(void)
8、串口接收中断子程序:void USART_RXT(void)流程图
1、 数据打包子函数:void Packet_Data(void)
2、。

ds18b20基于msp430的水温控制系统完整程序

ds18b20基于msp430的水温控制系统完整程序

main.c#include <MSP430x14x.h>#include "keypad.h"#include "lcd1602.h"#include "ds18b20.h"#include "control.h"typedef unsigned char uchar;typedef unsigned int uint;void InitSys(); //函数声明int main(void){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗/*下面六行程序关闭所有的IO口*/P1DIR = 0XFF;P1OUT = 0XFF;P2DIR = 0XFF;P2OUT = 0XFF;P3DIR = 0XFF;P3OUT = 0XFF;P4DIR = 0XFF;P4OUT = 0XFF;P5DIR = 0XFF;P5OUT = 0XFF;P6DIR = 0XFF;P6OUT = 0XFF;P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换InitSys(); //系统初始化Init_Keypad(); //键盘初始化LcdReset(); //lcd初始化start:disp_18b20();goto start;}/*************************************************** 系统初始化*******************************************/void InitSys(){unsigned int iq0;BCSCTL1 &= ~XT2OFF; //打开XT2振荡器do{IFG1 &= ~OFIFG; //清除振荡器失效标志for(iq0=0xFF;iq0>0;iq0--);//延时,等待XT2起振}while((IFG1 & OFIFG)!=0); //判断XT2是否起振BCSCTL2=SELM_2+SELS; //选择MCLK,SMCLK为XT2TACTL |= TASSEL_2 + ID_3; //计数时钟选择SMLK=8MHz,1/8分频后为1MHzP5DIR |= BIT5; //加热器控制端口P5OUT &= ~BIT5;P5DIR |= BIT7; //风扇控制端口P5OUT &= ~BIT7;_EINT(); //打开全局中断控制,若不需要打开,可以屏蔽本句}/*********************************************************************端口1(键盘)中断函数*************************************************************/#pragma vector=PORT1_VECTOR__interrupt void Port1(){Key_Event(); //判断按键并获取键值if(key_val>16) //输入为数字键temp_disp();else if(key_val==12) //输入为确定键{sure=1;temp_set_2=ten2two();}else if(key_val==13) //输入为清除键temp_clr();Init_Keypad(); //键盘初始化}keypad.hvoid Init_Keypad(void);void Check_Key(void);void delay(unsigned int tmp);void Key_Event(void);//引用外部变量的声明extern unsigned char key_Pressed;extern unsigned char key_val;extern unsigned char key_Flag;keypad.c#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;/***************全局变量***************/uchar key_Pressed; //按键是否被按下:1--是,0--否uchar key_val; //存放键值uchar key_Flag; //按键是否已放开:1--是,0--否//设置键盘逻辑键值与程序计算键值的映射uchar key_Map[] = {'1','2','3','4','5','6','7','8','9','0',11,12,13,14,15,16};//k12,清除键。

基于MSP430G2553和ds18b20的测温系统

基于MSP430G2553和ds18b20的测温系统

嵌入式控制系统与应用课程论文题目: 基于MSP430G2553和ds18b20的测温系统院系名称:专业班级:学生姓名:学号:摘要为了在现实生活和工业生产及过程控制中准确测量温度,设计了一种基于低功耗MSP430单片机的数字温度计,整个系统通过单片机MSP430控制DS18B20读取温度,采用LCD1602显示,温度传感器DS18B20与单片机之间通过串口进行数据传输,且外围的整合性高,DS18B20只需一个端口即可实现数据通信,连接方便,通过多次实验证明,该系统的测试结果与实际环境温度一致,除了具有接口电路简单,测量精度高,误差小,可靠性高等特点外,其成本低,功耗低的特点使其拥有更广阔的应用前景。

关键字:DS18B20 MSP430G2553单片机液晶显示目录1 引言 (1)2 测温系统硬件构成 (1)2.1 硬件设计 (1)3 软件设计 (6)3.1 总体设计流程图 (6)3.2 初始化模块 (6)4 实验展示 (7)4.1 实物整体展示 (7)4.2 报警显示和蜂鸣器报警 (8)5设计心得 (10)6本设计的不足和反思 (11)参考文献 (12)附录 (13)附一:元器件及仪器明细表 (13)附二:实验设计程序 (13)1 引言温度的测量和控制在储粮仓库、智能楼宇空调控制及其它的工农业生产和科学研究中应用广泛。

温度检测的传统方法是使用诸如热电偶、热电阻、半导体PN结(如AD590)之类的模拟传感器,经信号取样电路、放大电路和模数转换电路处理,获取表示温度值的数字信号,再交由微处理器或DSP处理。

被测温度信号从敏感元件接收的非电模拟量开始,到转换为微处理器可处理的数字信号之间,设计者须考虑的线路环节较多,相应测温装置中元器件数量难以下降,随之影响产品的可靠性及体积微小化。

由此会造成整个检测系统有较大的偏差.稳定性和抗干扰性能都较差。

本文设计一种基于数字温度传感器DSl8820的小型测温系统,主控芯片采用TI公司的MSP430单片机,数字温度传感器通过单总线与单片机连接,系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,可应用于仓库测温、楼宇空调控制和生产过程监控等领域。

ds18b20温度测量程序

ds18b20温度测量程序

#include <reg51.h>#include <stdio.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define uint unsigned intsbit CLKPIN = P0^0; //用户自定义CLK对应引脚sbit DIPIN = P0^1; //用户自定义DI对应引脚sbit DQ=P0^2;unsigned char data ppdata[5]; //用户自定义LCD缓冲区/* 延时t毫秒*/void delay(uint t){uint i;while(t--){/* 对于12M时钟,约延时1ms */for (i=0;i<123;i++){}}}/* 产生复位脉冲初始化DS18B20 ,DS18B20产生应答信号,返回为1时可以用,为0时不能用*/uint TxReset(void){uint i,j;DQ = 0;i = 100;while (i>0) i--; //拉低约900usDQ=1; // 产生上升沿i=5;while (i>0) i--; //维护约24us //等待15-60us;j=11;while(j>0) j--;if(DQ==1) return(0); //70US左右如果检测到了DS18B20应答脉冲则DQ比为1,否则为0j= 70;while(j>0) j--;if(DQ==0) return(0);else return(1); //430US左右应检测到高电平,否则就表示DS18B@)不工作}/* 读取数据的一位,满足读时隙要求*/bit RdBit(void){uint i;bit b;DQ=1;DQ=0;i++;DQ=1;i++;i++; //产生下降沿,DQ至少保持低电平1US;,且输出数据在15us内有效,本例12us b=DQ;i=9; //读时隙至少60USwhile(i>0) i--;return(b);}/* 读取数据的一个字节8位*/uchar RdByte(void){uchar j,c;uint i;for(i=1;i<=8;i++){j = RdBit();c = (j<<7)|(c>>1); //从高位开始读取}return(c);}/* 写数据的一个字节,满足写1和写0的时隙要求*/void WrByte(uchar b){uint i;uchar j;bit btmp;for(j=1;j<=8;j++){btmp = b&0x01;b = b>>1; // 取下一位(由低位向高位)if (btmp){/* 写1 */DQ=0;i++;i++; // 延时,使得15us以内拉高DQ = 1;i = 9;while(i>0) i--; // 整个写1时隙不低于60us }else{/* 写0 */DQ = 0;i = 9;while(i>0) i--; // 保持低在60us到120us之间DQ=1;i++;i++;}}}/*将结果转换成10进制的,缺少显示正负的部分*/float change(uchar a,uchar b) //a为高字节,b为低字节{uint i,zhengfu;bit k,p,f;float re1=8,re2,re3=1,resu=0;for(i=0;i<3;i++){k=a&0x01;re1=re1*2;if(k){resu=resu+re1;}a=a>>1;}if(a&0x01) zhengfu=1;else zhengfu=0;re2=0.03125;for(i=1;i<5;i++){p=b&0x01;re2=re2*2;if(p){resu=resu+re2;}b=b>>1;}if(b&0x01)resu=resu+1;b=b>>1;for(i=0;i<3;i++){f=b&0x01;re3=re3*2;if(f)resu=resu+re3;b=b>>1;}return(resu);}/* 启动温度转换如果DS18B20好使则转换温度。

MSP430单片机驱动ds18b20程序

MSP430单片机驱动ds18b20程序

MSP430单片机驱动ds18b20程序#include<msp430g2553.h>#define DS18B20_DIR P1DIR#define DS18B20_OUT P1OUT#define DS18B20_IN P1IN#define DS18B20_DQ BIT0#define DS18B20_H DS18B20_OUT|=DS18B20_DQ //DQ置位#define DS18B20_L DS18B20_OUT&=~DS18B20_DQ //DQ复位#define DQ_IN DS18B20_DIR &= ~DS18B20_DQ //设置DQ为输入#define DQ_OUT DS18B20_DIR |= DS18B20_DQ //设置DQ为输出#define READ_DQ (DS18B20_IN&DS18B20_DQ) //读DQ电平#define CPU_F ((double)1000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))void DS18B20_init(); //DS18B20初始化unsigned char DS18B20_Reset(); //DS18B20复位void DS18B20_WriteData(unsigned char); //写数据到DS18B20 unsigned char DS18B20_ReadData(); //读数据unsigned int DS18B20_Conert(); //转换温度/***********************************************************DS18B20初始化*函数名称:DS18B20_Init()*说明:本初始化程序可以不要,因为18B20在出厂时就被配置为12位精度了**********************************************************/void DS18B20_Init(){DS18B20_Reset();DS18B20_WriteData(0xCC); // 跳过ROMDS18B20_WriteData(0x4E); // 写暂存器DS18B20_WriteData(0x64); // 往暂存器的第三字节中写上限值100℃DS18B20_WriteData(0x00); // 往暂存器的第四字节中写下限值0℃DS18B20_WriteData(0x7F); // 将配置寄存器配置为12位精度DS18B20_Reset();}/***********************************************************复位DS18B20(通过存在脉冲可以判断DS1820是否损坏)*函数名称:DS18B20_Reset()**********************************************************/ unsigned char DS18B20_Reset(){unsigned char flag;DQ_OUT; //DQ为输出DS18B20_H;delay_us(8); //延时8微秒DS18B20_L; //拉低总线delay_us(500); //延时500微秒,产生复位脉冲,必须大于480微秒DS18B20_H;delay_us(80); //15~60us 后接收 60-240us的存在脉冲,必须大于60微秒DQ_IN;if(READ_DQ)flag=0; //等待从机 DS18B20 应答(低电平有效)else flag=1;DQ_OUT;delay_us(440);DS18B20_H;return(flag);}/***********************************************************写数据到DS18B20*函数名称:DS18B20_WriteData()**********************************************************/void DS18B20_WriteData(unsigned char wData){unsigned char i;DQ_OUT; //DQ为输出for (i=8;i>0;i--){DS18B20_L; //拉低总线,产生写信号delay_us(15); //延时在15us~30usif(wData&0x01) //发送1位{DS18B20_H;}else {DS18B20_L;}delay_us(45); //延时15~60usDS18B20_H; //释放总线,等待总线恢复wData>>=1; //准备下一位数据的传送}}/********************************************************** *从DS18B20中读出数据*函数名称:DS18B20_ReadData()**********************************************************/ unsigned char DS18B20_ReadData(){unsigned char i,TmepData;for(i=8;i>0;i--){TmepData>>=1; //数据右移DQ_OUT; //DQ为输出DS18B20_L; //拉低总线,产生读信号delay_us(6);DS18B20_H; //释放总线,准备读数据delay_us(4);DQ_IN; //DQ为输入if(READ_DQ){TmepData|=0x80;}delay_us(65);}return(TmepData); //返回读到的数据}/***********************************************************DS18B20转换温度*函数名称:DS18B20_Conert()**********************************************************/ unsigned int DS18B20_Conert(){unsigned char TempData1,TempData2;DS18B20_Reset();DS18B20_WriteData(0xCC); // 跳过ROMDS18B20_WriteData(0x44); // 开始转换delay_us(500); //延时一般在500us不能过小 DS18B20_Reset();DS18B20_WriteData(0xCC); // 跳过ROMDS18B20_WriteData(0xBE); //读取 RAMTempData1=DS18B20_ReadData(); //读低八位,LS Byte, RAM0TempData2=DS18B20_ReadData(); //读高八位,MS Byte, RAM1delay_ms(750); //延时750~900ms,保证工作周期DS18B20_Reset();//return (((TempData2<<8)|TempData1)*0.625); //0.0625=xx, 0.625=xx.x, 6.25=xx.xxreturn (((TempData2<<8)+TempData1)); //0.0625=xx, 0.625=xx.x, 6.25=xx.xx}。

基于MSP430G2553的DS18B20测温程序

基于MSP430G2553的DS18B20测温程序

/** main.c*//************************************************************* ********************************************include header file************************************************************** *******************************************/#include<msp430g2553.h>#include"system.h"#include"uart.h"#include"ds18b20.h"unsigned int temp;char tx_buf[6] = {0,0,0,0,'\n','\0'};/************************************************************* ********************************************** Function name: main** Descriptions: main function** input parameters: none** output parameters: none** Returned value: none************************************************************** *******************************************/void main(void){System_Init();UartInit();_EINT();if (DS18B20_Init()){P1OUT |= BIT0;}else{P1OUT |= BIT6;}while (1){__delay_cycles(800000);__delay_cycles(800000);temp = DS18B20_GetTemp();// x_buf[0] = temp%10000/1000+'0';// tx_buf[1] = temp%1000/100+'0';// tx_buf[2] = temp%100/10+'0';// tx_buf[3] = temp%10+'0';tx_buf[0] = temp%100/10+'0';tx_buf[1] = temp%10+'0';Uart_SendStr(tx_buf);}}/************************************************************* ********************************************Include header file************************************************************** *******************************************/#include<msp430g2553.h>#include"system.h"/************************************************************* ********************************************Function Declaration************************************************************** *******************************************/void Config_WDT(void);void Config_Clock(void);void Config_IO(void);/************************************************************* ********************************************** Function name: Config_WDT** Descriptions: WatchDog Timer Configuration** input parameters: none** output parameters: none** Returned value: none************************************************************** *******************************************/void Config_WDT(void){WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer}/*********************************************************************************************************** Function name: Config_Clock** Descriptions: System Clock Configuration** input parameters: none** output parameters: none** Returned value: none*********************************************************************************************************/void Config_Clock(void){BCSCTL1 = CALBC1_8MHZ; // Set DCO 1M 8M 12M 16MDCOCTL = CALDCO_8MHZ;BCSCTL2 = SELM_1 + DIVM_1 + DIVS_3; // MCLK = 8M;SMCLK = 1MBCSCTL2 &= ~SELS;if (CALBC1_8MHZ == 0xFF || CALDCO_8MHZ == 0xFF){while(1); //hang-up}}/*********************************************************************************************************** Function name: Config_IO** Descriptions: IO Port Configuration** input parameters: none** output parameters: none** Returned value: none*********************************************************************************************************/void Config_IO(void){// set all IO port outputsP1DIR = 0xFF; // All P1.x outputsP1OUT = 0x00; // All P1.x resetP2DIR = 0xFF; // All P2.x outputsP2OUT = 0x00; // All P2.x reset}/************************************************************* ********************************************** Function name: System_Init** Descriptions: WatchDog Timer Configuration** input parameters: none** output parameters: none** Returned value: none************************************************************** *******************************************/void System_Init(void){Config_WDT();Config_Clock();Config_IO();__delay_cycles(800000);__delay_cycles(800000);}#ifndef SYSTEM_H_#define SYSTEM_H_/************************************************************* ********************************************Extern Function Declaration************************************************************** *******************************************/extern void System_Init(void);#endif/* SYSTEM_H_ */************************************************************** *******************************************/#include<msp430g2553.h>#include<string.h>#include"uart.h"/************************************************************* ********************************************** Function name: UartInit** Descriptions: Serial port initialization** input parameters: none** output parameters: none** Returned value: none************************************************************** *******************************************/void UartInit(void){P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXDP1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXDUCA0CTL1 |= UCSSEL_1; // CLK = ACLKUCA0BR0 = 0x03; // 32kHz/9600 = 3.41UCA0BR1 = 0x00; //UCA0MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt}/************************************************************* ********************************************** Function name: Uart_SendHexInt** Descriptions: Serial port send data by interrupt** input parameters: _data: data** output parameters: none** Returned value: none************************************************************** *******************************************/void Uart_SendHexInt(unsigned char _data){IE2 |= UCA0TXIE; // enable USCI_A0 TX interruptUCA0TXBUF = _data;}/************************************************************* ********************************************** Function name: Uart_SendStr** Descriptions: Serial port send string** input parameters: *pBuffer: the buffer will be transmitted** output parameters: none** Returned value: none************************************************************** *******************************************/void Uart_SendStr(char *pBuffer){unsigned int q0;unsigned int n_Byte;n_Byte = strlen(pBuffer);for(q0 = 0;q0<n_Byte;q0++){while((IFG2&UCA0TXIFG)==0);UCA0TXBUF = *pBuffer;pBuffer++;}}/************************************************************* ********************************************Interrupt Response Function************************************************************** *******************************************//************************************************************* ********************************************** Function name: USCI0TX_ISR** Descriptions: Serial port transmit interrupt function ** input parameters: none** output parameters: none** Returned value: none************************************************************** *******************************************/#pragma vector = USCIAB0TX_VECTOR__interrupt void USCI0TX_ISR(void){while((IFG2&UCA0TXIFG)==0);IE2 &= ~UCA0TXIE; // close USCI_A0 TX interrupt }/************************************************************* ********************************************** Function name: USCI0RX_ISR** Descriptions: Serial port receive interrupt function ** input parameters: none** output parameters: none** Returned value: none************************************************************** *******************************************/#pragma vector = USCIAB0RX_VECTOR__interrupt void USCI0RX_ISR(void){unsigned char RcvBuf = 0;RcvBuf = UCA0RXBUF;Uart_SendHexInt(RcvBuf);}#ifndef UART_H_#define UART_H_/************************************************************* ********************************************Extern Function Declaration************************************************************** *******************************************/extern void UartInit(void);extern void Uart_SendHexInt(unsigned char);extern void Uart_SendStr(char*);#endif/* USART_H_ *//*********************************************************************************************************Function Declaration*********************************************************************************************************/#define DS18B20_Delay(us) __delay_cycles(8*us)void DS18B20_WriteByte(unsigned char);unsigned char DS18B20_ReadByte(void);void DS18B20_ReadBytes(unsigned char, unsigned char*); void DS18B20_ReadID (unsigned char *id);void DS18B20_Config(void);unsigned int DS18B20_ReadTemp(void);unsigned char DS18B20_CRC(unsigned char, unsigned char*); unsigned char CrcTable [256]={0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209,143, 12, 82, 176, 238,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};unsigned char DS18B20_IDBuff[8];/*********************************************************************************************************** Function name: DS18B20_Init** Descriptions: Initial DS18B20** input parameters: none** output parameters: none** Returned value: 0: detect ds18b20 fail!1:detect ds18b20 success!*********************************************************************************************************/unsigned char DS18B20_Init(void){unsigned char return_val = 0;DS18B20_WRITE;DS18B20_Delay(5);DS18B20_DQ_CLR;DS18B20_Delay(500);DS18B20_DQ_SET;DS18B20_Delay(20);DS18B20_READ;DS18B20_Delay(5);if(DS18B20_DQ_IS_LOW)return_val = 1; //detect 1820 success!elsereturn_val = 0; //detect 1820 fail!DS18B20_Delay(100);DS18B20_WRITE;DS18B20_Delay(5);DS18B20_DQ_SET;return return_val;}/************************************************************* ********************************************** Function name: DS18B20_WriteByte** Descriptions: DS18B20 send one byte** input parameters: dat: byte** output parameters: none** Returned value: none************************************************************** *******************************************/void DS18B20_WriteByte(unsigned char dat){unsigned char i;DS18B20_WRITE;DS18B20_Delay(5);for (i=0;i<8;i++){DS18B20_DQ_CLR;DS18B20_Delay(5);if (dat&0x01){DS18B20_DQ_SET;}DS18B20_Delay(85);DS18B20_DQ_SET;dat >>= 1;DS18B20_Delay(1);}}/************************************************************* ********************************************** Function name: DS18B20_ReadByte** Descriptions: DS18B20 read one byte** input parameters: none** output parameters: none** Returned value: read byte************************************************************** *******************************************/unsigned char DS18B20_ReadByte(void){unsigned char i,dat=0;for(i=0;i<8;i++){DS18B20_WRITE;DS18B20_Delay(1);DS18B20_DQ_CLR;dat >>= 1;DS18B20_DQ_SET;DS18B20_READ;DS18B20_Delay(12);if(DS18B20_DQ_IS_HIGH){dat |= 0x80;}DS18B20_Delay(5);}return dat;}/************************************************************* ********************************************** Function name: DS18B20_ReadBytes** Descriptions: DS18B20 read bytes** input parameters: len: number of bytes** output parameters: *p: read buffer** Returned value: none************************************************************** *******************************************/void DS18B20_ReadBytes(unsigned char len, unsigned char *p) {unsigned char i;for(i=0;i<len;i++){*p = DS18B20_ReadByte();p++;}}/************************************************************* ********************************************** Function name: DS18B20_ReadID** Descriptions: DS18B20 read ID** input parameters: none** output parameters: *id: ds18b20 ID** Returned value: none************************************************************** *******************************************/void DS18B20_ReadID(unsigned char *id){DS18B20_Init();DS18B20_WriteByte(0x33); //read ROMDS18B20_ReadBytes(8,id);}/************************************************************* ********************************************** Function name: DS18B20_Config** Descriptions: DS18B20 internal config** input parameters: none** output parameters: none** Returned value: none************************************************************** *******************************************/void DS18B20_Config(void){DS18B20_Init();DS18B20_WriteByte(0xcc); //skip ROMDS18B20_WriteByte(0x4e); //write scratchpadDS18B20_WriteByte(0x19); //upper limitDS18B20_WriteByte(0x1a); //lower limitDS18B20_WriteByte(0x7f); //set 11 bit (0.125)DS18B20_Init();DS18B20_WriteByte(0xcc); //skip ROMDS18B20_WriteByte(0x48); //save set valueDS18B20_Init();DS18B20_WriteByte(0xcc); //skip ROMDS18B20_WriteByte(0xb8); //call-back set value}/************************************************************* ********************************************** Function name: DS18B20_GetTemp** Descriptions: DS18B20 get temperature** input parameters: none** output parameters: none** Returned value: temperature************************************************************** *******************************************/unsigned int DS18B20_GetTemp(void){DS18B20_ReadID(DS18B20_IDBuff);DS18B20_Config();DS18B20_Init ();DS18B20_WriteByte(0xcc); //skip romDS18B20_WriteByte(0x44); //Temperature convertDS18B20_Init ();DS18B20_WriteByte(0xcc); //skip romDS18B20_WriteByte(0xbe); //read Temperaturereturn DS18B20_ReadTemp();}/************************************************************* ********************************************** Function name: DS18B20_ReadTemp** Descriptions: read temperature from ds18b20** input parameters: none** output parameters: none** Returned value: temperature buffer************************************************************** *******************************************/unsigned int DS18B20_ReadTemp(void){unsigned int Temperature;unsigned char temp_buff[9];DS18B20_ReadBytes(9,temp_buff);if (DS18B20_CRC(9,temp_buff)==0) //CRC verify succeed{Temperature = temp_buff[1]*0x100 + temp_buff[0];// Temperature *= 0.625;Temperature /= 16;}return Temperature;}/************************************************************* ********************************************** Function name: DS18B20_CRC** Descriptions: CRC verification** input parameters: len: number of bytes** *temp_buff: verification array** output parameters: none** Returned value: verification result************************************************************** *******************************************/unsigned char DS18B20_CRC(unsigned char len, unsigned char *temp_buff){unsigned char i,crc_data=0;for(i=0;i<len;i++) //table look-up verifycrc_data = CrcTable[crc_data^temp_buff[i]];return crc_data;}#ifndef DS18B20_H_#define DS18B20_H_/************************************************************* ********************************************Port Definitions************************************************************** *******************************************///#define DS18B20_DQ_DIR P1DIR//#define DS18B20_DQ_OUT P1OUT//#define DS18B20_DQ_IN P1IN//#define DS18B20_DQ BIT5#define DS18B20_DQ_DIR P2DIR#define DS18B20_DQ_OUT P2OUT#define DS18B20_DQ_IN P2IN#define DS18B20_DQ BIT0/************************************************************* ********************************************Macro definition -- Main clock frequency************************************************************** *******************************************/#define MCLKFRQ 8000000L/************************************************************* ********************************************Extern Function Declaration************************************************************** *******************************************/unsigned char DS18B20_Init(void);unsigned int DS18B20_GetTemp(void);#endif/* DS18B20_H_ */。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/** main.c*//************************************************************* ********************************************include header file************************************************************** *******************************************/#include<msp430g2553.h>#include"system.h"#include"uart.h"#include"ds18b20.h"unsigned int temp;char tx_buf[6] = {0,0,0,0,'\n','\0'};/************************************************************* ********************************************** Function name: main** Descriptions: main function** input parameters: none** output parameters: none** Returned value: none************************************************************** *******************************************/void main(void){System_Init();UartInit();_EINT();if (DS18B20_Init()){P1OUT |= BIT0;}else{P1OUT |= BIT6;}while (1){__delay_cycles(800000);__delay_cycles(800000);temp = DS18B20_GetTemp();// x_buf[0] = temp%10000/1000+'0';// tx_buf[1] = temp%1000/100+'0';// tx_buf[2] = temp%100/10+'0';// tx_buf[3] = temp%10+'0';tx_buf[0] = temp%100/10+'0';tx_buf[1] = temp%10+'0';Uart_SendStr(tx_buf);}}/************************************************************* ********************************************Include header file************************************************************** *******************************************/#include<msp430g2553.h>#include"system.h"/************************************************************* ********************************************Function Declaration************************************************************** *******************************************/void Config_WDT(void);void Config_Clock(void);void Config_IO(void);/************************************************************* ********************************************** Function name: Config_WDT** Descriptions: WatchDog Timer Configuration** input parameters: none** output parameters: none** Returned value: none************************************************************** *******************************************/void Config_WDT(void){WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer}/*********************************************************************************************************** Function name: Config_Clock** Descriptions: System Clock Configuration** input parameters: none** output parameters: none** Returned value: none*********************************************************************************************************/void Config_Clock(void){BCSCTL1 = CALBC1_8MHZ; // Set DCO 1M 8M 12M 16MDCOCTL = CALDCO_8MHZ;BCSCTL2 = SELM_1 + DIVM_1 + DIVS_3; // MCLK = 8M;SMCLK = 1MBCSCTL2 &= ~SELS;if (CALBC1_8MHZ == 0xFF || CALDCO_8MHZ == 0xFF){while(1); //hang-up}}/*********************************************************************************************************** Function name: Config_IO** Descriptions: IO Port Configuration** input parameters: none** output parameters: none** Returned value: none*********************************************************************************************************/void Config_IO(void){// set all IO port outputsP1DIR = 0xFF; // All P1.x outputsP1OUT = 0x00; // All P1.x resetP2DIR = 0xFF; // All P2.x outputsP2OUT = 0x00; // All P2.x reset}/************************************************************* ********************************************** Function name: System_Init** Descriptions: WatchDog Timer Configuration** input parameters: none** output parameters: none** Returned value: none************************************************************** *******************************************/void System_Init(void){Config_WDT();Config_Clock();Config_IO();__delay_cycles(800000);__delay_cycles(800000);}#ifndef SYSTEM_H_#define SYSTEM_H_/************************************************************* ********************************************Extern Function Declaration************************************************************** *******************************************/extern void System_Init(void);#endif/* SYSTEM_H_ */************************************************************** *******************************************/#include<msp430g2553.h>#include<string.h>#include"uart.h"/************************************************************* ********************************************** Function name: UartInit** Descriptions: Serial port initialization** input parameters: none** output parameters: none** Returned value: none************************************************************** *******************************************/void UartInit(void){P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXDP1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXDUCA0CTL1 |= UCSSEL_1; // CLK = ACLKUCA0BR0 = 0x03; // 32kHz/9600 = 3.41UCA0BR1 = 0x00; //UCA0MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt}/************************************************************* ********************************************** Function name: Uart_SendHexInt** Descriptions: Serial port send data by interrupt** input parameters: _data: data** output parameters: none** Returned value: none************************************************************** *******************************************/void Uart_SendHexInt(unsigned char _data){IE2 |= UCA0TXIE; // enable USCI_A0 TX interruptUCA0TXBUF = _data;}/************************************************************* ********************************************** Function name: Uart_SendStr** Descriptions: Serial port send string** input parameters: *pBuffer: the buffer will be transmitted** output parameters: none** Returned value: none************************************************************** *******************************************/void Uart_SendStr(char *pBuffer){unsigned int q0;unsigned int n_Byte;n_Byte = strlen(pBuffer);for(q0 = 0;q0<n_Byte;q0++){while((IFG2&UCA0TXIFG)==0);UCA0TXBUF = *pBuffer;pBuffer++;}}/************************************************************* ********************************************Interrupt Response Function************************************************************** *******************************************//************************************************************* ********************************************** Function name: USCI0TX_ISR** Descriptions: Serial port transmit interrupt function ** input parameters: none** output parameters: none** Returned value: none************************************************************** *******************************************/#pragma vector = USCIAB0TX_VECTOR__interrupt void USCI0TX_ISR(void){while((IFG2&UCA0TXIFG)==0);IE2 &= ~UCA0TXIE; // close USCI_A0 TX interrupt }/************************************************************* ********************************************** Function name: USCI0RX_ISR** Descriptions: Serial port receive interrupt function ** input parameters: none** output parameters: none** Returned value: none************************************************************** *******************************************/#pragma vector = USCIAB0RX_VECTOR__interrupt void USCI0RX_ISR(void){unsigned char RcvBuf = 0;RcvBuf = UCA0RXBUF;Uart_SendHexInt(RcvBuf);}#ifndef UART_H_#define UART_H_/************************************************************* ********************************************Extern Function Declaration************************************************************** *******************************************/extern void UartInit(void);extern void Uart_SendHexInt(unsigned char);extern void Uart_SendStr(char*);#endif/* USART_H_ *//*********************************************************************************************************Function Declaration*********************************************************************************************************/#define DS18B20_Delay(us) __delay_cycles(8*us)void DS18B20_WriteByte(unsigned char);unsigned char DS18B20_ReadByte(void);void DS18B20_ReadBytes(unsigned char, unsigned char*); void DS18B20_ReadID (unsigned char *id);void DS18B20_Config(void);unsigned int DS18B20_ReadTemp(void);unsigned char DS18B20_CRC(unsigned char, unsigned char*); unsigned char CrcTable [256]={0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209,143, 12, 82, 176, 238,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};unsigned char DS18B20_IDBuff[8];/*********************************************************************************************************** Function name: DS18B20_Init** Descriptions: Initial DS18B20** input parameters: none** output parameters: none** Returned value: 0: detect ds18b20 fail!1:detect ds18b20 success!*********************************************************************************************************/unsigned char DS18B20_Init(void){unsigned char return_val = 0;DS18B20_WRITE;DS18B20_Delay(5);DS18B20_DQ_CLR;DS18B20_Delay(500);DS18B20_DQ_SET;DS18B20_Delay(20);DS18B20_READ;DS18B20_Delay(5);if(DS18B20_DQ_IS_LOW)return_val = 1; //detect 1820 success!elsereturn_val = 0; //detect 1820 fail!DS18B20_Delay(100);DS18B20_WRITE;DS18B20_Delay(5);DS18B20_DQ_SET;return return_val;}/************************************************************* ********************************************** Function name: DS18B20_WriteByte** Descriptions: DS18B20 send one byte** input parameters: dat: byte** output parameters: none** Returned value: none************************************************************** *******************************************/void DS18B20_WriteByte(unsigned char dat){unsigned char i;DS18B20_WRITE;DS18B20_Delay(5);for (i=0;i<8;i++){DS18B20_DQ_CLR;DS18B20_Delay(5);if (dat&0x01){DS18B20_DQ_SET;}DS18B20_Delay(85);DS18B20_DQ_SET;dat >>= 1;DS18B20_Delay(1);}}/************************************************************* ********************************************** Function name: DS18B20_ReadByte** Descriptions: DS18B20 read one byte** input parameters: none** output parameters: none** Returned value: read byte************************************************************** *******************************************/unsigned char DS18B20_ReadByte(void){unsigned char i,dat=0;for(i=0;i<8;i++){DS18B20_WRITE;DS18B20_Delay(1);DS18B20_DQ_CLR;dat >>= 1;DS18B20_DQ_SET;DS18B20_READ;DS18B20_Delay(12);if(DS18B20_DQ_IS_HIGH){dat |= 0x80;}DS18B20_Delay(5);}return dat;}/************************************************************* ********************************************** Function name: DS18B20_ReadBytes** Descriptions: DS18B20 read bytes** input parameters: len: number of bytes** output parameters: *p: read buffer** Returned value: none************************************************************** *******************************************/void DS18B20_ReadBytes(unsigned char len, unsigned char *p) {unsigned char i;for(i=0;i<len;i++){*p = DS18B20_ReadByte();p++;}}/************************************************************* ********************************************** Function name: DS18B20_ReadID** Descriptions: DS18B20 read ID** input parameters: none** output parameters: *id: ds18b20 ID** Returned value: none************************************************************** *******************************************/void DS18B20_ReadID(unsigned char *id){DS18B20_Init();DS18B20_WriteByte(0x33); //read ROMDS18B20_ReadBytes(8,id);}/************************************************************* ********************************************** Function name: DS18B20_Config** Descriptions: DS18B20 internal config** input parameters: none** output parameters: none** Returned value: none************************************************************** *******************************************/void DS18B20_Config(void){DS18B20_Init();DS18B20_WriteByte(0xcc); //skip ROMDS18B20_WriteByte(0x4e); //write scratchpadDS18B20_WriteByte(0x19); //upper limitDS18B20_WriteByte(0x1a); //lower limitDS18B20_WriteByte(0x7f); //set 11 bit (0.125)DS18B20_Init();DS18B20_WriteByte(0xcc); //skip ROMDS18B20_WriteByte(0x48); //save set valueDS18B20_Init();DS18B20_WriteByte(0xcc); //skip ROMDS18B20_WriteByte(0xb8); //call-back set value}/************************************************************* ********************************************** Function name: DS18B20_GetTemp** Descriptions: DS18B20 get temperature** input parameters: none** output parameters: none** Returned value: temperature************************************************************** *******************************************/unsigned int DS18B20_GetTemp(void){DS18B20_ReadID(DS18B20_IDBuff);DS18B20_Config();DS18B20_Init ();DS18B20_WriteByte(0xcc); //skip romDS18B20_WriteByte(0x44); //Temperature convertDS18B20_Init ();DS18B20_WriteByte(0xcc); //skip romDS18B20_WriteByte(0xbe); //read Temperaturereturn DS18B20_ReadTemp();}/************************************************************* ********************************************** Function name: DS18B20_ReadTemp** Descriptions: read temperature from ds18b20** input parameters: none** output parameters: none** Returned value: temperature buffer************************************************************** *******************************************/unsigned int DS18B20_ReadTemp(void){unsigned int Temperature;unsigned char temp_buff[9];DS18B20_ReadBytes(9,temp_buff);if (DS18B20_CRC(9,temp_buff)==0) //CRC verify succeed{Temperature = temp_buff[1]*0x100 + temp_buff[0];// Temperature *= 0.625;Temperature /= 16;}return Temperature;}/************************************************************* ********************************************** Function name: DS18B20_CRC** Descriptions: CRC verification** input parameters: len: number of bytes** *temp_buff: verification array** output parameters: none** Returned value: verification result************************************************************** *******************************************/unsigned char DS18B20_CRC(unsigned char len, unsigned char *temp_buff){unsigned char i,crc_data=0;for(i=0;i<len;i++) //table look-up verifycrc_data = CrcTable[crc_data^temp_buff[i]];return crc_data;}#ifndef DS18B20_H_#define DS18B20_H_/************************************************************* ********************************************Port Definitions************************************************************** *******************************************///#define DS18B20_DQ_DIR P1DIR//#define DS18B20_DQ_OUT P1OUT//#define DS18B20_DQ_IN P1IN//#define DS18B20_DQ BIT5#define DS18B20_DQ_DIR P2DIR#define DS18B20_DQ_OUT P2OUT#define DS18B20_DQ_IN P2IN#define DS18B20_DQ BIT0/************************************************************* ********************************************Macro definition -- Main clock frequency************************************************************** *******************************************/#define MCLKFRQ 8000000L/************************************************************* ********************************************Extern Function Declaration************************************************************** *******************************************/unsigned char DS18B20_Init(void);unsigned int DS18B20_GetTemp(void);#endif/* DS18B20_H_ */。

相关文档
最新文档