基于msp430温度数码管显示
基于MSP430单片机的低功耗数显温度计的设计
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温度数码管显示
/*************************************************程序功能:用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程序库九数码管显示
数码管也是单片机系统最常用的输出设备之一(还有液晶、发光二极管等)。
七段(这里用的是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单片机的实时时钟设计系部电子信息工程系专业班级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显示#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单片机写的,用的是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的数字温度计
图 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的温度检测系统设计
基于 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 显 示 电路 以 及 核 心 单 片机 的 硬 件
基于MSP430最小系统的数字温度计论文
目录摘要 (2)绪论 (3)1、电子系统设计任务书 (4)2、总体方案设计 (5)2.1设计要求 (5)2.2选题背景 (5)2.3设计方案选择及论证 (6)2.3.1芯片方案一 (6)2.3.2芯片方案二 (6)2.3.3传感器方案一 (7)2.3.4传感器方案二 (7)3、系统硬件设计 (7)3.1硬件总体框图 (7)3.2主要器件介绍 (8)3.2.1 MSP430F149单片机 (8)3.2.2 AD590传感器 (10)3.3 设计过程论述 (12)3.3.1 设计原理分析 (12)3.3.2 软件程序设计 (14)3.3.3 数据分析计算 (15)3.3.4 硬件调试 (15)3.4 设计结果分析及总结 (16)3.4.1 设计结果分析 (16)3.4.2 设计总结 (16)4、致谢 (17)5、附录 (18)5.1 附录一(PCB图) (18)5.2 附录二(实物图) (19)5.3 附录三(程序) (19)6、参考文献 (21)摘要为了完成课题任务,设计了一种基于低功耗MSP430单片机的数字温度计。
整个系统通过单片机MSP430F149控制AD590读取温度,采用1602显示,温度传感器AD590与单片机之间通过串口进行数据传输。
MSP430系列单片机具有超低功耗,且外围的整合性高,AD590只需一个端口即可实现数信,连接方便。
通过多次实验证明,该系统的测试结果与实际环境温度一致,除了具有据通接口电路简单、测量精度高、误差小、可靠性高等特点外,低成本、低功耗的特点使其拥有更广阔的应用前景。
论述了一种以16位单片机MSP430F149为控制核心,利用电流输出型集成温度传感器AD590实现温度测量的温度检测系统。
详细论述了该系统的硬件组成和软件设计,给出了关键部分的电路图及相应的MSP430F149单片机温度测量程序。
实验结果表明,该温度检测系统具有低成本、可靠性高、结构简单、性能稳定、经济实用等特点,可根据不同需要应用于多种工农业温度检测领域。
基于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单片机的温度监控系统设计
摘要当前,温度控制系统被广泛应用于生活的很多方面,它与人们的日常生活、工作和学习息息相关。
如何设计制作一个性能良好的温度监控系统,实现温度的精确、实时监控成为设计该系统的主要问题。
随着我国电子技术的不断提高,以单片机为核心处理器,温度传感器为远端设备构成的温度监控系统逐渐成为时下的主流设计。
论文介绍了温度控制系统的研究背景和研究意义,国内外发展状况,超低功耗系列单片机MSP430,单总线数字温度传感器DS18B20等器件以及设计所需的相关软件的使用。
在此基础上,对系统进行设计、编程和调试,并绘制了系统的电路原理图和印制板图。
该温度监控系统具有监控多点温度,并将其循环显示,利用按键实现某一点的选择显示,从而实现多点温度的实时监控的功能。
关键词:超低功耗单片机,单总线温度传感器,JTAG仿真ABSTRACTCurrently, The temperature control system is widely used in our daily life and closely linked with our work and study. How to design and make a temper -ature control system which has the characters of high performance, accurate measurement,real time monitoring is still a main problem. As with the high de-velopment of the electronic technique in our country, the temperature control system used the microcontroller as the centre and thermal sensor as the far-end equipment is becoming the main trend.In this paper, it introduces the research background and the significance of the temperature control system, the situation at home and abroad. the MSP430 series MCU which is widely used now ,the digital thermal sensor, DS18B20 and so on. At that basis , we design, programe and debug it, draw the SCH and PCB about it in the Protel. It can monitor the temperature of multi-points and choose one to display in the LCD by pressing the key, which leads to realizing the meal time monitoring of the temperature of these points.Keywords:Ultralow-Power microcontroller, the one-wire digital thermal sensor, JTAG simulation目录1 绪论 (1)1.1研究背景和意义 (1)1.2 国内外动向 (2)1.3 课题的主要研究内容 (5)2 系统方案设计 (6)2.1 MSP430系列单片机 (6)2.2 DS18B20数字温度传感器 (11)2.3 DS1302日历时钟芯片 (17)2.4 OCMJ4x8B液晶显示模块 (20)2.5 键盘 (24)2.6 JTAG仿真和IAR Workbench (26)2.7 结语 (30)3 系统电路及软件实现 (31)3.1系统设计框图及功能实现 (31)3.2单元电路原理图 (32)3.3 系统程序设计 (37)3.4结语 (45)4 总结与展望 (46)参考文献 (48)致谢 (50)附录 (51)附录1 外文文献 (51)附录2 温度监控系统C语言程序 (64)附录3 电路原理图和印制板图 (72)1 绪论1.1研究背景和意义在人们的日常生活、工业制造、制冷等领域,温度作为当前环境的重要因素之一,被人们广泛的作为参考因素来使用,从而保证各项工作的正常运行,如火灾报警、温室或粮仓中温度的实时监测、冷库温度的调节等,因此以温度参数为基础而设计的温度控制系统被广泛开发和使用。
基于MSP430的多点无线温度测控系统
本文介绍了一种无线温度测控系统的设计方案。
本系统由MSP430单片机控制温度传感器DS18B20(数字温度传感器)采集每一路的12位数据,与2路开关量,一起送入无线收发模块PTR8000,进行发送,并在发送方显示当前的温度。
同时51单片机控制另一块PTR8000接受数据,并把所接受到的数据通过串口通信传送到PC机显示,用户可以通过软件设定所需要的温度的上限和下限温度,实现报警功能。
关键词:430单片机51单片机PTR8000 无线收发串口通信目录第一章选题依据 1§1.1温度控制器的发展概况及现状 1§1.2 本设计的选题和研究内容 1第二章方案设计与论证 2§2.1总体方案设计 2§2.2系统模块方案 3§2.2.1 温度传感器方案 3§2.2.2 无线传输方案 4§2.2.3 报警提示系统方案 4§2.2.4发送端温度显示 5§2.2.5 接收端监控方式 5§2.3总体方案的选择 5§2.4 方案的论证 6§2.4.1方案的可行性 6§2.4.2方案的经济性 6第三章硬件系统设计 7§3.1 串口通信部分设计 7§3.2 报警电路部分设计 8第四章软件设计 9§4.1 单片机串口程序 9§4.2 上位机VB 11第五章系统调试 13§5.1 分步调试 13§5.1.1、测试环境及工具 13§5.1.2、测试方法 13§5.1.3、测试结果分析 13§5.2 统一调试 14结束语 15参考文献 16致谢 17附录: 18附录一:系统工作总图 18附录二:系统原理图 18第一章选题依据§1.1温度控制器的发展概况及现状在工农业生产和日常生活中,对温度的测量及控制占据着极其重要地位。
基于DS18B20和MSP430的温度控制器毕业设计
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所示。
MSP430键盘与8位数码管显示应用
MSP430键盘与8位数码管显示应用作者:魏小龙南京航空航天大学硬件连接:1、4×4 扫描键盘连接在P1 端口,P10---P13 为行线,P14---P17 为列线,列线下拉到地。
2、8 只数码管的显示电路,通过164 串行移位输出8 位段码,138 位8 只数码管的位选信号。
也都连接在P1 端口上。
与键盘复用引脚。
如下图:软件分析:1、扫描显示。
扫描显示的原理在于利用人眼睛的视觉暂停,让每个数码管只显示一点时间,所有的数码管轮流显示,而人眼睛看起来就象所有的都在显示一样。
所以硬件上所有的数码管的段码端都连接在一起,而每一个数码管的公共端(地)不连接在一起,而由138 选中每个是数码管。
所以软件上,很明显,分几个步骤。
第一、将要显示的数码转换为段码。
可使用查表的方式。
比如要显示“1、2、3、4、5、6、7、8”分别在8 个数码管上,首先安排段码表,设置一个数组seg[]:unsigned char seg[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}则5 的段码为seg[5]。
第二、将要显示的段码输出,这里使用164 移位输出。
第三、每输出一个要显示的段码,则使用138 选中应该显示的数码管。
第四、延时一小段时间。
这个时间不能长,也不能短。
太长则8 只数码管看起来很抖动,太短则8 只数码管一片模糊。
第五、循环第一到第四。
2、扫描键盘。
本程序的目的在于知道那个键被按下了。
二实现此目的需要以下步骤。
第一、判断有没有键被按下。
第二、如果有,消除键盘的机械抖动。
这是必须的,抖动是机械键盘必然存在的。
第三、判断是哪个键被按下。
第四、等待按键松开。
这也是必须的,不然将会输出很多重复的按键值。
3、将按键的键值显示的数码管上。
调用键盘程序,调用显示程序即可。
MSP430程序库九数码管显示+++
数码管也是单片机系统最常用的输出设备之一(还有液晶、发光二极管等)。
七段(这里用的是8段,有小数点)数码管可以完成显示0-9数字和一部分的英文字符如:A、b。
本文实现的程序完成显示数字和可显示的英文字符;同时完成数码管显示的printf函数的移植,以支持printf的格式化字符等好用的特点(我用的数码管8个排为一排,方便数字等的显示)。
1.硬件介绍:这里所用到的硬件资源包括8个数码管、和msp430单片机的两个8位IO口(这里用的是P3和P5口,如有改变,可以通过宏定义更改)。
数码管是8个共阴的数码管,a-h 8段通过一个200Ω的电阻接到430单片机的P5口。
共阴端是由单片机的P3口控制,单片机的一位IO通过一个三极管接到数码管的共阴端,以完成位选。
单片机的P3口时数码管的位选口,某位为高则选中;P5口时段选口;要数码管显示时,通过P3位选,选中某个数码管亮,P5段选选择8段(a-h)中的那些亮,从而控制某一位显示数字或字符。
要同时显示多个数码管,就要动态扫描;动态扫描时,本程序选用的是由看门狗的中断扫描显示:每1.9ms显示其中的一位,动态扫描显示每一位,从而让数码管看起来是同时亮的。
2.程序实现:数码管显示首先要有一个数码管显示的断码表(完成数字和字符到数码管段值的表),程序中采用了《MSP430系列单片机系统工程设计与实践》这本书推荐的方式实现的这个数码表:先用宏定义定义每段对应的单片机要输出的段值,然后再实现是个表,当硬件改变时,只需更改前面的每段的段值定义即可,改动的地方少了很多,代码如下:0-9的位置对应显示0-9,之后的是A开始往后显示,为了方便访问这个表格,定义了AA等一系列的常量,方便访问这个表。
A从10开始访问这个表格,如果要显示A只需这样用Tab[AA],即可得到需要的段值,AA-空格的宏定义放在H文件里,方便其他文件访问(当要调用显示函数的时候需要AA等宏定义)。
为什么是AA而不是A呢?主要原因是单字母的有几个已经在单片机430的头文件里定义了,为了访问的时候一致,就都用两个字母的了。
基于MSP430的LED数码管显示电路设计
基于MSP430的LED数码管显示电路设计LED数码管显示电路是一种常见的电路应用,用于显示数字和字符等信息。
本文基于MSP430微控制器设计了一个LED数码管显示电路,主要包括芯片选择、数码管选择、驱动电路设计、显示电路设计等方面。
首先,在芯片选择上,我们选择了MSP430微控制器。
MSP430是德州仪器(Texas Instruments)的一种低功耗单片机,具有强大的计算和控制能力,适合用于各种应用场景。
我们选择MSP430主要考虑了其低功耗特性和易于编程的特点。
接下来,在数码管选择上,我们选择了常见的共阳极数码管。
共阳极数码管的特点是具有共阳极,即所有的阳极连接在一起,并通过操控各个阴极的状态来实现显示。
选择共阳极数码管的主要原因是其易于控制和接口。
然后,在驱动电路设计上,我们采用B脚驱动方式。
B脚驱动方式是指通过控制数码管的B脚(即常导极)来操控各个阴极的状态。
具体实现方法是将B脚通过一个电流放大器连接到MSP430微控制器的一个输出引脚上,通过控制输出引脚的高低电平来控制B脚的导通和断开。
最后,在显示电路设计上,我们采用了逐位显示的方式。
逐位显示是指依次将要显示的数字或字符通过MSP430微控制器的输出引脚分别连接到数码管的各个阴极上,通过快速切换各个阴极的状态来实现数字的显示。
具体实现方法是通过设置MSP430微控制器的输出引脚序列和各个数码管阴极的连接关系,实现数字的逐位显示。
总结起来,基于MSP430的LED数码管显示电路设计主要包括芯片选择、数码管选择、驱动电路设计、显示电路设计等方面。
通过选择适合的硬件平台和驱动方式,结合MSP430微控制器的强大功能和易于编程的特点,我们可以设计出一个稳定可靠、易于控制和显示的LED数码管显示电路。
基于MSP430单片机的高精度温度测试系统
摘要摘要本文旨在设计一个基于MSP430单片机的高精度的温度测试系统,以应用于实际温度测控。
有两个主要要求:1.用LCD做显示器。
2.微功耗实现。
预期成果是使得该系统测温精度达到±0.5℃,测温范围达到0℃-100℃,实现uA级功耗。
基于上述要求,论文首先介绍了超低功耗16 位单片机MSP430F149和数字温度传感器DS18B20 的基本特性,内部结构和应用,然后结合液晶显示模块MG-12232,画出了PROTEL电路图,PCB图,设计了一个小型测温系统,并写出了相应的程序代码。
利用MSP430 单片机的超低功耗以及DS18B20 的单线接口方式,实现了整个系统的低功耗,结构简单,性能稳定,经济实用。
最后基于集成开发环境IAR Workbench 给出了主要的C430函数。
关键词:测温系统,MSP430F149, DS18B20ABSTRACTABSTRACTThis article is for the purpose of designing one based on the MSP430 monolithic integrated circuit high accuracy temperature test system, meets uses in the actual temperature observation and control. Some two overriding demands: 1. uses LCD monitor.2. ultra-low power realizations. The anticipated achievement is causes this system temperature measurement precision to achieve ±0.5℃, the temperature measurement scope achieves 0℃-100℃, realizes the uA level power.Based on the above request, the paper first introduced ultra low power loss 16 monolithic integrated circuit MSP430F149 and the digital temperature sensor DS18B20 basic characteristic, the internal structure and the application, then union liquid crystal display module MG-12232, has drawn the PROTEL circuit diagram, the PCB chart, has designed a small temperature measurement system, and has written the corresponding procedure code.Using the ultra-low power of the MSP430 microcontroller and the 1-WARE interface mode of the DS18B20, the ultra-low power、simple structure、stable performance and practicality of the whole system is realized.Some primary C430 functions are presented in the IAR Workbench IDE.Key words: temperature detecting system,MSP430F149,DS18B20目录目录第1章引言 (1)1.1课题背景 (1)1.2课题简介 (1)第2章MSP430单片机 (3)2.1 MSP430系列单片机的特点 (3)2.2 MSP430系列的内部结构概述 (5)2.3 MSP430单片机的端口介绍 (9)2.4 MSP430单片机复位电路 (11)2.5 Msp430单片机时钟模块 (11)2.6 MSP430单片机WDT看门狗定时器 (14)2.7 MSP430低功耗结构 (16)2.8 MSP430单片机MSP430定时器 (18)第3章数字温度传感器 (20)3.1 DS18B20的特性 (20)3.2 DS18B20的外形和内部结构 (21)3.3 DS18B20工作原理 (22)3.4 高速暂存存储器 (24)3.5 DS18B20的应用电路 (26)第4章温度测试系统 (30)4.1 单片机电路 (31)4.2 电源电路和复位电路 (34)4.3 单片机与液晶模块的接口设计 (35)4.4 MSP430F149单片机与DS18B20的接口设计 (37)4.4.1 接口电路设计 (37)4.4.2 软件设计 (38)4.4.3 DS1820使用中注意事项 (38)4.5 系统软件设计 (39)参考文献 (42)电子科技大学学士学位论文致谢 (43)附录一 (44)附录二 (45)附录三 (57)外文资料原文 (63)中文译文 (68)第1章引言第1章引言1.1课题背景温度是一种最基本的环境参数,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);。