基于msp温数码管显示_第1页
基于msp温数码管显示_第2页
基于msp温数码管显示_第3页
基于msp温数码管显示_第4页
基于msp温数码管显示_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、/*程序功能:用DS18B20测量室温并在数码管上显示。-测试说明:观察显示温度数值。*/#include <msp430x14x.h>#include "DS18B20.h"#include "DS18B20.c"#define wei_h P5OUT|= BIT5#define wei_l P5OUT&= BIT5#define duan_l P6OUT &= BIT6#define duan_h P6OUT |= BIT6/要显示的6位温度数字uchar dN6; /数码管七段码;0-fuchar scandata16

2、= 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/数码管位选变量uchar cnt = 0; void Disp_Numb(uint temper);/*主函数*/void main(void) /*下面六行程序关闭所有的IO口*/ P5DIR = 0xff; P5OUT = 0xff;P1DIR = 0XFF;P1OUT = 0XFF; P2DIR = 0XFF;P2OUT = 0XFF; P3DIR = 0XFF;P3OUT = 0XFF; P4DIR = 0XFF;P4O

3、UT = 0XFF; P5DIR = 0XFF;P5OUT = 0XFF; P6DIR = 0XFF;P6OUT = 0XFF; uchar i; WDTCTL=WDTPW+WDTHOLD; /*-选择系统主时钟为8MHz-*/ BCSCTL1 &= XT2OFF; /打开XT2高频晶体振荡器 do IFG1 &= OFIFG; /清除晶振失败标志 for (i = 0xFF; i > 0; i-); /等待8MHz晶体起振 while (IFG1 & OFIFG); /晶振失效标志仍然存在? BCSCTL2 |= SELM_2 + SELS; /MCLK和SMC

4、LK选择高频晶振 P6DIR |= BIT6;P6OUT |= BIT6; /关闭电平转换 P5DIR |= BIT5;P5OUT |= BIT5; /关闭电平转换 P6DIR |= BIT7;P6OUT |= BIT7; /关闭蜂鸣器 / 设置看门狗定时器,初始化控制数码管的IO WDTCTL = WDT_ADLY_1_9; IE1 |= WDTIE; / P4DIR = 0xff; / P5DIR = 0xFF; / P5OUT = 0xff; /P4OUT = 0xff; /P6DIR = 0xff; /P6OUT = 0xFF; /计数时钟选择SMLK=8MHz,1/8分频后为1MHz

5、 TACTL |= TASSEL_2 + ID_3; /打开全局中断 _EINT(); /循环读数显示 while(1) Disp_Numb(Do1Convert(); /不停地转换显示 /*函数名称:watchdog_timer功 能:看门狗定时器中断服务函数,进行数码 管动态扫描参 数:无返回值 :无*/#pragma vector = WDT_VECTOR_interrupt void watchdog_timer(void) / P4OUT = 0xFF; / wei_h; / wei_l; P4OUT = scandatadN5-cnt; if(cnt=1) P4OUT |= BIT

6、7; /在第二位显示小数点 duan_h; duan_l; P4OUT = (1<<cnt); wei_h; wei_l; cnt+; if(cnt = 6) cnt = 0; /*函数名称:Disp_Numb功 能:将从DS18B20读取的11bit温度数据转换 成数码管显示的温度数字参 数:temper-11bit温度数据返回值 :无*/void Disp_Numb(uint temper) uchar i; for(i = 0;i < 6;i+) dNi = 0; /初始化显示变量 /数值转换 if(temper & BIT0) dN0 = 5; dN1 = 2

7、; dN2 = 6; if(temper&BIT1) dN1 += 5; dN2 += 2; dN3 += 1; if(temper & BIT2) dN2 += 5; dN3 += 2; if(dN2 >= 10) dN2 -= 10; dN3 += 1; if(temper&BIT3) dN3 += 5; if(temper & BIT4) dN4 += 1; if(temper & BIT5) dN4 += 2; if(temper & BIT6) dN4 += 4; if(temper & BIT7) dN4 += 8; i

8、f(dN4 >= 10) dN4 -= 10; dN5 += 1; if(temper & BIT8) dN4 += 6; dN5 += 1; if(dN4 >= 10) dN4 -= 10; dN5 += 1; if(temper & BIT9) dN4 += 2; dN5 += 3; if(dN4 >= 10) dN4 -= 10; dN5 += 1; if(temper & BITA) dN4 += 4; dN5 += 6; if(dN4 >= 10) dN4 -= 10; dN5 += 1; if(dN5 >= 10) dN5 -=

9、 10; /*18b20.C*/#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;#define DQ1 P1OUT |= BIT6#define DQ0 P1OUT &= BIT6#define DQ_in P1DIR &= BIT6#define DQ_out P1DIR |= BIT6#define DQ_val (P1IN & BIT6)/*函数名称:DelayNus功 能:实现N个微秒的延时参 数:n-延时长度返回值 :无说明 :定时器A的计数时

10、钟是1MHz,CPU主频8MHz 所以通过定时器延时能够得到极为精确的 us级延时*/void DelayNus(uint n) CCR0 = n; TACTL |= MC_1; /增计数到CCR0 while(!(TACTL & BIT0); /等待 TACTL &= MC_1; /停止计数 TACTL &= BIT0; /清除中断标志/*函数名称:Init_18B20功 能:对DS18B20进行复位操作参 数:无返回值 :初始化状态标志:1-失败,0-成功*/uchar Init_18B20(void) uchar Error; DQ_out; /拉高 _DINT(

11、); /关闭中断 DQ0; /拉低 DelayNus(500); DQ1; /拉高 DelayNus(55); DQ_in; /方向设置输入 _NOP(); if(DQ_val) /输入值为1 Error = 1; /初始化失败 else /输入值为0 Error = 0; /初始化成功 DQ_out; /设为输出 DQ1; /拉高 _EINT(); /中断使能 DelayNus(400); return Error;/*函数名称:Write_18B20功 能:向DS18B20写入一个字节的数据参 数:wdata-写入的数据返回值 :无*/void Write_18B20(uchar wdat

12、a) uchar i; _DINT(); for(i = 0; i < 8;i+) DQ0; DelayNus(6); /延时6us if(wdata & 0X01) DQ1; else DQ0; wdata >>= 1; DelayNus(50); /延时50us DQ1; DelayNus(10); /延时10us _EINT();/*函数名称:Read_18B20功 能:从DS18B20读取一个字节的数据参 数:无返回值 :读出的一个字节数据*/uchar Read_18B20(void) uchar i; uchar temp = 0; _DINT(); fo

13、r(i = 0;i < 8;i+) temp >>= 1; DQ0; DelayNus(6); /延时6us DQ1; DelayNus(8); /延时9us DQ_in; _NOP(); if(DQ_val) temp |= 0x80; DelayNus(45); /延时45us DQ_out; DQ1; DelayNus(10); /延时10us _EINT(); return temp; /读到的一个字节/*函数名称:Skip功 能:发送跳过读取产品ID号命令参 数:无返回值 :无*/void Skip(void) Write_18B20(0xcc);/*函数名称:Co

14、nvert功 能:发送温度转换命令参 数:无返回值 :无*/void Convert(void) Write_18B20(0x44);/*函数名称:Read_SP功 能:发送读ScratchPad命令参 数:无返回值 :无*/void Read_SP(void) Write_18B20(0xbe);/*函数名称:ReadTemp功 能:从DS18B20的ScratchPad读取温度转换结果参 数:无返回值 :读取的温度数值*/uint ReadTemp(void) uchar temp_low; uint temp; temp_low = Read_18B20(); /读低位 temp = R

15、ead_18B20(); /读高位 temp = (temp<<8) | temp_low; return temp; /读取的温度数值/*函数名称:ReadTemp功 能:控制DS18B20完成一次温度转换参 数:无返回值 :测量的温度数值*/uint Do1Convert(void) uchar i; do i = Init_18B20(); while(i); /初始化是否完成 Skip(); /送跳过读取产品ID号命令 Convert(); /发送温度转换命令 for(i = 20;i > 0;i-) DelayNus(60000); /延时800ms以上 do i = Init_18B20(); while(i); Skip(); Read_SP(); /发送读ScratchPad命令 return ReadTemp(); /读取的温度数值/*/*18b20.h*/

温馨提示

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

最新文档

评论

0/150

提交评论