基于msp430温度数码管显示

合集下载

基于MSP430单片机的低功耗数显温度计的设计

基于MSP430单片机的低功耗数显温度计的设计
竹 ‘i_ J l ; W l 1 c l e n c B a n q I u  ̄ n n u = o g y& I F I / I O V t  ̄ I . [ I O R
2 0q 5军
第 20剽
文章 编号:2 0 9 5 —6 8 3 5( 2 0 1 5)2 0 —0 1 0 2 —0 2
器 ( 8 MH z ) , MC L K和 S MC L K选择高频 晶振 。定时器 A,B
选择 S MC L K并进行 8分频 ,定时器 B被设置为增计数模式 , 定时器 B计数值为 0 7 C F H,定 时器 B每隔 2 ms中断一次 ,开 定时器 B中断和全局 中断 。系统进入低功耗模式 ,用定时器 B 唤醒单片机采样并实 时显示温度 。 接通电源后 , 单 片机开始工作 。 定时器 B定时 2 ms 中断一
图 1 数 显温 度计 电路
DS 1 8 B 2 0温度传感器将温度模拟量转换为 1 2位 串行数字 值经 P 1 . 6 引脚输入单片机 。 D S 1 8 B 2 0 温度传感器与微处理器连 接仅需要一条线 即可双 向通讯 。DS 1 8 B 2 0温度传感器 的测温范 围为 一5 5~1 2 5℃ , 在1 O ~8 5 ℃时 , 精 度为 ± 0 . 5 ℃,工作 电 源为 3— 5 . 5 V/ DC。 测量结果以 9—1 2 位数 字方式 串行传送 , 默 认为 1 2 位数字 量 串行 传送 ,此时 的分 辨率 为 O . 0 6 2 5 c C。 DS 1 8 B 2 0 采用外部 电源供 电方式 , 工作 电源 由 V DD引脚 接入 , 为了增加输出的稳定性 ,在输 出线上接 5 . 1 K上拉 电阻。需要 注意的是 ,在外部供 电方 式下 ,DS 1 8 B 2 0的 G N D 引脚不能悬 空 ,否则不能转换温度 ,读取 的温度总是 8 5 ℃。 系统供电 由 MAX6 0 4芯片固定输 出的典型应用 电路提供 , 电路 的输入电压范围为 2 . 7 ~l 1 . 5 V, 固定输出为 3 . 3 V 。 锂 电池 的电压范 围为 3 . 8 ~ 4 . 0 V,可选择锂 电池作为该芯片的输入 电 源 。接通 电源后 ,电源电路输出 3 . 3 V电压给 MS P 4 3 0 F 1 4 9 单 片机 、DS 1 8 C 2 0温度传感器 和 S MC 1 6 0 2 A液 晶显示器供 电。 温度值显 示 由 S MC1 6 0 2 A 标 准字 符型液 晶显示器显示 。 S MC1 6 0 2 A 显示器采用点阵型液 晶显示器 ( L C D) ,可显示 1 6

基于msp430温度数码管显示

基于msp430温度数码管显示

/*************************************************程序功能:用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 dN[6];//数码管七段码;0--fuchar scandata[16] = {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;P4OUT = 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和SMCLK选择高频晶振P6DIR |= BIT6;P6OUT |= BIT6; //关闭电平转换P5DIR |= BIT5;P5OUT |= BIT5; //关闭电平转换P6DIR |= BIT7;P6OUT |= BIT7; //关闭蜂鸣器// 设置看门狗定时器,初始化控制数码管的IOWDTCTL = WDT_ADLY_1_9;IE1 |= WDTIE;// P4DIR = 0xff;// P5DIR = 0xFF;// P5OUT = 0xff;//P4OUT = 0xff;//P6DIR = 0xff;//计数时钟选择SMLK=8MHz,1/8分频后为1MHzTACTL |= TASSEL_2 + ID_3;//打开全局中断_EINT();//循环读数显示while(1){Disp_Numb(Do1Convert()); //不停地转换显示}}/*******************************************函数名称:watchdog_timer功能:看门狗定时器中断服务函数,进行数码管动态扫描参数:无返回值:无********************************************/#pragma vector = WDT_VECTOR__interrupt void watchdog_timer(void){// wei_h;// wei_l;P4OUT = scandata[dN[5-cnt]];if(cnt==1) P4OUT |= BIT7; //在第二位显示小数点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++) dN[i] = 0; //初始化显示变量//数值转换if(temper & BIT0){dN[0] = 5;dN[1] = 2;dN[2] = 6;}if(temper&BIT1){dN[1] += 5;dN[2] += 2;dN[3] += 1;}if(temper & BIT2){dN[3] += 2;if(dN[2] >= 10){dN[2] -= 10;dN[3] += 1;}}if(temper&BIT3) {dN[3] += 5;}if(temper & BIT4) {dN[4] += 1;}if(temper & BIT5) {dN[4] += 2;}if(temper & BIT6) {}if(temper & BIT7) {dN[4] += 8;if(dN[4] >= 10){dN[4] -= 10;dN[5] += 1;}}if(temper & BIT8) {dN[4] += 6;dN[5] += 1;if(dN[4] >= 10){dN[4] -= 10;dN[5] += 1;}}if(temper & BIT9)dN[4] += 2;dN[5] += 3;if(dN[4] >= 10){dN[4] -= 10;dN[5] += 1;}}if(temper & BITA) {dN[4] += 4;dN[5] += 6;if(dN[4] >= 10){dN[4] -= 10;dN[5] += 1;}if(dN[5] >= 10){dN[5] -= 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的计数时钟是1MHz,CPU主频8MHz 所以通过定时器延时能够得到极为精确的us级延时********************************************/void DelayNus(uint n){CCR0 = n;TACTL |= MC_1; //增计数到CCR0while(!(TACTL & BIT0)); //等待TACTL &= ~MC_1; //停止计数TACTL &= ~BIT0; //清除中断标志}/*******************************************函数名称:Init_18B20功能:对DS18B20进行复位操作参数:无返回值:初始化状态标志:1--失败,0--成功********************************************/uchar Init_18B20(void){uchar Error;DQ_out; //拉高_DINT(); //关闭中断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 wdata){uchar i;_DINT();for(i = 0; i < 8;i++){DQ0;DelayNus(6); //延时6usif(wdata & 0X01) DQ1;else DQ0;wdata >>= 1;DelayNus(50); //延时50usDQ1;}_EINT();}/*******************************************函数名称:Read_18B20功能:从DS18B20读取一个字节的数据参数:无返回值:读出的一个字节数据********************************************/ uchar Read_18B20(void){uchar i;uchar temp = 0;_DINT();for(i = 0;i < 8;i++){temp >>= 1;DQ0;DelayNus(6); //延时6usDQ1;DQ_in;_NOP();if(DQ_val) temp |= 0x80;DelayNus(45); //延时45usDQ_out;DQ1;DelayNus(10); //延时10us }_EINT();return temp; //读到的一个字节}/*******************************************函数名称:Skip功能:发送跳过读取产品ID号命令参数:无返回值:无********************************************/void Skip(void){Write_18B20(0xcc);}/******************************************* 函数名称:Convert功能:发送温度转换命令参数:无返回值:无********************************************/ 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 = Read_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***************************/void DelayNus(unsigned int n);unsigned char Init_18B20(void);void Write_18B20(unsigned char wdata);unsigned char Read_18B20(void);void Skip(void);void Convert(void);void Read_SP(void);unsigned int ReadTemp(void);unsigned int Do1Convert(void);。

MSP430程序库九数码管显示

MSP430程序库九数码管显示

数码管也是单片机系统最常用的输出设备之一(还有液晶、发光二极管等)。

七段(这里用的是8段,有小数点)数码管可以完成显示0-9数字和一部分的英文字符如:A、b。

本文实现的程序完成显示数字和可显示的英文字符;同时完成数码管显示的printf函数的移植,以支持printf的格式化字符等好用的特点(我用的数码管8个排为一排,方便数字等的显示)。

1.硬件介绍:这里所用到的硬件资源包括8个数码管、和msp430单片机的两个8位IO口(这里用的是P3和P5口,如有改变,可以通过宏定义更改)。

数码管是8个共阴的数码管,a-h8段通过一个200Ω的电阻接到430单片机的P5口。

共阴端是由单片机的P3口控制,单片机的一位IO通过一个三极管接到数码管的共阴端,以完成位选。

单片机的P3口时数码管的位选口,某位为高则选中;P5口时段选口;要数码管显示时,通过P3位选,选中某个数码管亮,P5段选选择8段(a-h)中的那些亮,从而控制某一位显示数字或字符。

要同时显示多个数码管,就要动态扫描;动态扫描时,本程序选用的是由看门狗的中断扫描显示:每1.9ms显示其中的一位,动态扫描显示每一位,从而让数码管看起来是同时亮的。

2.程序实现:数码管显示首先要有一个数码管显示的断码表(完成数字和字符到数码管段值的表),程序中采用了《MSP430系列单片机系统工程设计与实践》这本书推荐的方式实现的这个数码表:先用宏定义定义每段对应的单片机要输出的段值,然后再实现是个表,当硬件改变时,只需更改前面的每段的段值定义即可,改动的地方少了很多,代码如下:/*宏定义,数码管a-h各段对应的比特,更换硬件只用改动以下8行*/#define a0x01//AAAA#define b0x02//F B#define c0x04//F B#define d0x08//GGGG#define e0x10//E C#define f0x20//E C#define g0x40//DDDD HH#define h0x80//小数点/*用宏定义自动生成段码表,很好的写法,值得学习*//*更换硬件无需重写段码表*/const char Tab[]={a+b+c+d+e+f,//Displays"0"b+c,//Displays"1"a+b+d+e+g,//Displays"2"a+b+c+d+g,//Displays"3"b+c+f+g,//Displays"4"a+c+d+f+g,//Displays"5"a+c+d+e+f+g,//Displays"6"a+b+c,//Displays"7"a+b+c+d+e+f+g,//Displays"8"a+b+c+d+f+g,//Displays"9"a+b+c+e+f+g,//Displays"A"c+d+e+f+g,//Displays"B"a+d+e+f,//Displays"C"b+c+d+e+g,//Displays"D"a+d+e+f+g,//Displays"E"a+c+d+e+f,//Displays"G" b+c+e+f+g,//Displays"H" e+f,//Displays"I" b+c+d+e,//Displays"J" b+d+e+f+g,//Displays"K" d+e+f,//Displays"L" a+c+e+g,//Displays"M" a+b+c+e+f,//Displays"N" c+e+g,//Displays"n" c+d+e+g,//Displays"o" a+b+c+d+e+f,//Displays"O" a+b+e+f+g,//Displays"P" a+b+c+f+g,//Displays"Q" e+g,//Displays"r" a+c+d+f+g,//Displays"S" d+e+f+g,//Displays"t" a+e+f,//Displays"T" b+c+d+e+f,//Displays"U" c+d+e,//Displays"v" b+d+f+g,//Displays"W" b+c+d+f+g,//Displays"Y"g,//Displays"-"h,//Displays"."0//Displays"" };#undef a#undef b#undef c#undef d#undef e#undef f#undef g0-9的位置对应显示0-9,之后的是A开始往后显示,为了方便访问这个表格,定义了AA等一系列的常量,方便访问这个表。

基于MSP430单片机的实时时钟设计(数码管显示)

基于MSP430单片机的实时时钟设计(数码管显示)

苏州市职业大学毕业设计说明书毕业设计题目基于MSP430单片机的实时时钟设计系部电子信息工程系专业班级08电气1班姓名学号指导教师2011年5月29 日摘要本文研究了基于数码管显示的数字时钟系统设计与实现。

该系统具有时间设置及显示、闹钟、计时等功能,系统以MSP430单片机为核心,主要进行基于MSP430单片机的低功耗型数字时钟及其系统的研究。

系统带有数码管显示器,配合按键提供友好的用户界面,操作简单,该数字时钟能长期、连续、可靠、稳定的工作;同时还具有体积小、功耗低等特点,便于携带,使用方便。

系统软件设计包括单片机编程。

单片机软件编程主要实现按键、数码管显示、时钟、计时、闹钟等模块功能。

在本设计中充分利用了单片机内部资源,涉及到了键盘控制、数码管显示、中断系统、定时/计数器、串口通信等。

关键字:数字时钟;MSP430单片机;数码管AbstractThis paper studies the digital pipe display based on digital clock system design and realization. This system has the time set and display, alarm clock, timing, and other functions, system to MSP430 microcontroller as the core, mainly for the low power consumption MCU based on MSP430 type of digital clock and its system. System, cooperate with digital tube display buttons provide friendly user interface, easy operation, this digital clock can long-term continuous, reliable and stable working; It also has the features such as small volume, power consumption, easy to carry, easy to use. System software design including microcontroller programming. Single-chip microcomputer software programming mainly realizes buttons, digital pipe display, clock, timing, alarm clock function module.In this design make full use of the internal resources, involving the microcontroller keyboard control, digital tube display, interrupt system, timing/counters, serial communication.Keyword: Digital clock, MSP430 microcontroller,Digital tube目录第一章绪论 (1)1.1课题研究的意义 (1)1.2课程设计内容 (1)1.3课程设计目的 (2)第二章数字时钟的构成及方案选择 (3)2.1数字时钟的构成 (3)2.2模块方案选择 (3)2.2.1单片机模块方案 (3)2.2.2 时钟方案选择 (3)2.2.3 键盘模块选择 (4)2.2.4 显示模块方案选择 (4)第三章系统硬件设计与实现 (5)3.1电路设计图 (5)3.2系统硬件设计 (5)3.2.1 MSP430单片机简介 (5)3.2.2 复位电路的设计 (6)3.2.3 晶振电路设计 (7)3.2.4 时钟模块设计 (8)3.2.5 键盘模块设计 (8)3.2.6 显示模块设计 (9)第四章系统的软件设计 (11)4.1系统设计总流程图 (11)4.2 DS1302时钟流程图 (11)4.3 LED数码管显示流程图 (12)第五章系统的调试与仿真 (14)5.1 IAR FOR 430简介 (14)5.2程序调试过程 (14)第六章结论 (16)参考文献 (17)附录一:系统原理图 (18)致谢 (35)第一章绪论1.1课题研究的意义20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力的推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

基于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 数字式温度计的总体设计

基于MSP430G2553的温度检测系统设计

基于MSP430G2553的温度检测系统设计
单片机技术 ・ S C M T e c h n o l o g y
基于 MS P 4 3 0 G 2 5 5 3的温度检测 系统设计
文/ 耿 浩 然
目 前 , 在 自 动 控 制 领 域 利 用 温 度 作 为 一 种 控 制 量 对 系统 进
行 自动 控制 已经越 来越 普 遍 ,在 人们 的生产 生 活 中对 温度 的测 量
( 2 )温度 传感 器采集温度 数据 ,实时 在
OL E D 更新 显 示 ; 【 关 键 词 】M S P 4 3 0 G 2 5 5 3 温 度检 测 0 L E D显 示
… …
( 3 )L E D 高 温报 警 循 环 闪烁 。
3 硬 件 设 计
本 系 统 以 MS P 4 3 0 G 2 5 5 3单 片机 为 核 心 ,
和 监 控 已 不 可 缺 少 。 针 对 这 种 实
U 挪 P O 强 W E & R 叠 h D 鳓 D o c 卜 — — 一 誊 匡 蘸≯
一 | 。
| …
际 情 况,本 文设 计并 实现 了基 于 M S P 4 3 0 G 2 5 5 3 单 片机 的温度检测 显 示 系 统 , 重 点 介 绍 了 电 源 稳 压 电
( AD) 转 换 芯 片 或 带 AD 功 能 的 单 片 机 。 综
合考虑 ,本文设计的测温系统最终选用 带有模
数功能的 1 6位 通 用 单 片 机 M S P 4 3 0 G2 5 5 3作
温 度 检 测 模 块 选 用 的 是 DS 1 8 B 2 0数
字 温 度 芯 片 进 行 温 度 的检 测 和 采 集。 所 使
路,D S 1 8 B 2 0温 度 检 测 电路 ,0 L E D 显 示 电路 以 及 核 心 单 片机 的 硬 件
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*************************************************程序功能:用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 dN[6];//数码管七段码;0--fuchar scandata[16] = {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;P4OUT = 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和SMCLK选择高频晶振P6DIR |= BIT6;P6OUT |= BIT6; //关闭电平转换P5DIR |= BIT5;P5OUT |= BIT5; //关闭电平转换P6DIR |= BIT7;P6OUT |= BIT7; //关闭蜂鸣器// 设置看门狗定时器,初始化控制数码管的IOWDTCTL = WDT_ADL Y_1_9;IE1 |= WDTIE;// P4DIR = 0xff;// P5DIR = 0xFF;// P5OUT = 0xff;//P4OUT = 0xff;//P6DIR = 0xff;//P6OUT = 0xFF;//计数时钟选择SMLK=8MHz,1/8分频后为1MHzTACTL |= 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 = scandata[dN[5-cnt]];if(cnt==1) P4OUT |= BIT7; //在第二位显示小数点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++) dN[i] = 0; //初始化显示变量//数值转换if(temper & BIT0){dN[0] = 5;dN[1] = 2;dN[2] = 6;}if(temper&BIT1){dN[1] += 5;dN[2] += 2;dN[3] += 1;}if(temper & BIT2){dN[2] += 5;dN[3] += 2;if(dN[2] >= 10){dN[2] -= 10;}}if(temper&BIT3) {dN[3] += 5;}if(temper & BIT4) {dN[4] += 1;}if(temper & BIT5) {dN[4] += 2;}if(temper & BIT6) {dN[4] += 4;}if(temper & BIT7) {dN[4] += 8;if(dN[4] >= 10){dN[4] -= 10;dN[5] += 1;}}if(temper & BIT8) {dN[4] += 6;dN[5] += 1;if(dN[4] >= 10){dN[4] -= 10;dN[5] += 1;}}if(temper & BIT9) {dN[4] += 2;dN[5] += 3;if(dN[4] >= 10){dN[5] += 1;}}if(temper & BITA){dN[4] += 4;dN[5] += 6;if(dN[4] >= 10){dN[4] -= 10;dN[5] += 1;}if(dN[5] >= 10){dN[5] -= 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的计数时钟是1MHz,CPU主频8MHz所以通过定时器延时能够得到极为精确的us级延时********************************************/void DelayNus(uint n){CCR0 = n;TACTL |= MC_1; //增计数到CCR0while(!(TACTL & BIT0)); //等待TACTL &= ~MC_1; //停止计数TACTL &= ~BIT0; //清除中断标志}/******************************************* 函数名称:Init_18B20功能:对DS18B20进行复位操作参数:无返回值:初始化状态标志:1--失败,0--成功********************************************/ uchar Init_18B20(void){uchar Error;DQ_out; //拉高_DINT(); //关闭中断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 wdata){uchar i;_DINT();for(i = 0; i < 8;i++){DQ0;DelayNus(6); //延时6usif(wdata & 0X01) DQ1;else DQ0;wdata >>= 1;DelayNus(50); //延时50usDQ1;DelayNus(10); //延时10us }_EINT();}/******************************************* 函数名称:Read_18B20功能:从DS18B20读取一个字节的数据参数:无返回值:读出的一个字节数据********************************************/ uchar Read_18B20(void){uchar i;uchar temp = 0;_DINT();for(i = 0;i < 8;i++){temp >>= 1;DQ0;DelayNus(6); //延时6usDQ1;DelayNus(8); //延时9usDQ_in;_NOP();if(DQ_val) temp |= 0x80;DelayNus(45); //延时45usDQ_out;DQ1;DelayNus(10); //延时10us }_EINT();return temp; //读到的一个字节}/*******************************************函数名称:Skip功能:发送跳过读取产品ID号命令参数:无返回值:无********************************************/ void Skip(void){Write_18B20(0xcc);}/*******************************************函数名称:Convert功能:发送温度转换命令参数:无返回值:无********************************************/ 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 = Read_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***************************/void DelayNus(unsigned int n);unsigned char Init_18B20(void);void Write_18B20(unsigned char wdata);unsigned char Read_18B20(void); void Skip(void);void Convert(void);void Read_SP(void);unsigned int ReadTemp(void); unsigned int Do1Convert(void);。

相关文档
最新文档