基于430单片机的温度传感器编程
(太原理工大学)基于msp430单片机的数字温度计的制
目的
通过数字温度计的制作,介绍msp430单片机系列内核msp430f413微处理器,了解一个典型的430单片机系统的实现过程,能够使用430的C语言集成开发环境,掌握产品的开发流程。
目标对象
高等院校对口专业(单片机软硬件、电子工程、自动化等)高年级学生。
特别是面临就业的毕业班学生。
课程设计
实习课程安排:
1、msp430flash型超低功耗16位单片机的硬件结构介绍及应用领域
2、430的汇编语言和c语言的编程结构简单介绍
3、430的c语言开发环境(IAR Embedded Workbench for MSP430)的应用
4、配合一些简单的实例练习软件的使用和软件仿真
5、数字温度计的原理及电路图分析
6、焊接数字温度计的电路板
7、调试数字温度计的电路板,硬件仿真、功能实现及如何解决所出现的问题。
基于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单片机的温度pid算法设计
南阳理工学院本科生毕业设计(论文)学院(系):电子与电气工程学院专业:自动化学生:黄帅豪指导教师:殷华文完成日期 2014 年 5 月南阳理工学院本科生毕业设计(论文)基于MSP430单片机的温度PID算法设计Design of Temperature PID Algorithm Based on MSP430 Single Chip Microcomputer总计: 20 页表格: 0 个插图: 13 幅南阳理工学院本科毕业设计(论文)基于MSP430单片机的温度PID算法设计Design of Temperature PID Algorithm Based on MSP430 SingleChip Microcomputer学院(系):电子与电气工程学院专业:自动化学生姓名:黄帅豪学号:105090640035指导教师(职称):殷华文(副教授)评阅教师:完成日期:南阳理工学院Nanyang Institute of Technology基于MSP430单片机的温度PID算法设计自动化专业黄帅豪[摘要] 本设计基于MSP430F149单片机,以IAR Embedded Workbench软件为开发平台,在MSP430中用自编的位置式PID算法程序实现对电加热锅炉水温的控制,并在上位计算机上实现组态王软件监控。
Pt100热电阻信号经放大调理后通过MSP430 ADC 模块送入单片机。
在MATLAB中通过一元二次方程进行温度数据拟合,把拟合结果在MSP430中编程进行温度数据标度变换,上位机向MSP430发送温度设定值和PID参数,根据组态王软件监控结果对算法进行分析和改进,加入不完全微分和积分分离程序。
通过实验验证和结果分析,温度控制无超调,稳态误差<0.3℃。
[关键词]MSP430单片机;位置式温度PID算法;温度数据拟合;不完全微分;积分分离Design of Temperature PID Algorithm Based on MSP430 SingleChip MicrocomputerAutomation Specialty HUANG Shuai-haoAbstract:The design is based on SCM MSP430F149, using IAR Embedded Workbench software as a development platform, to realize the temperature control of electric water boiler with location PID algorithm program compiled in MSP430, and realizes the Kingview software in upper computer monitoring. Pt100 thermal resistance signal is amplified by MSP430 ADC after conditioning module into the microcontroller. The temperature data through a two quadratic equations in the MATLAB, the fitting results are programmed in MSP430 temperature data scale conversion, computer set value and PID parameter to send set temperature to MSP430, after analyzed and improved on the algorithm according to the monitoring results of Kingview software, with incomplete differential and integral separation procedure. Through experiment and analysis of the results, the temperature control has no overshoot, steady-state error of <0.3 ℃.Key Words: MSP430 single chip microcomputer;position type temperature PID algorithm; temperature data fitting; incomplete differential; integral separationI目录1 引言 (1)1.1 单片机温度PID算法的发展现状 (1)1.2 本课题的研究意义及前景 (1)1.3 论文组织结构 (1)2 系统整体方案设计与关键技术分析 (2)2.1 系统主要工作原理 (2)2.2 系统整体设计方案 (3)2.2.1 温度信号采集设计方案 (3)2.2.2 单片机程序设计方案 (3)3 系统硬件电路的选型及设计 (5)3.1 单片机的选型 (5)3.2 开关电源模块设计 (6)3.3 前向模拟通道设计 (7)3.3.1 前置放大器 (8)3.3.2 采样保持器 (8)3.4 输出驱动模块设计 (8)4 系统软件设计 (8)4.1 软件开发平台 (8)4.2 温度控制程序设计 (10)4.2.1 主程序 (10)4.2.2 PID算法程序 (11)4.2.3 ADC模数转换程序 (13)4.2.4 定时器设置程序 (13)4.2.5 异步通讯程序 (14)4.2.6温度拟合程序 (15)5 系统调试及结果分析 (16)5 .1 系统整体的调试和结果 (16)5.1.1 MODBUS-ASCII的调试 (16)5.1.2 上位机监控画面 (17)5.2结果分析 (18)结束语 (19)II附录 (21)致谢 (48)III1 引言1.1 单片机温度PID算法的发展现状在现代工业生产的许多环节中,温度是非常重要的一个指标,因此温度控制系统在工业控制领域中十分重要。
430测温程序
#include"msp430G2553.h"#include"stdio.h"char m ;long temp;long IntDeg;void ADC10_init(void){ADC10CTL0 &= ~ENC; // 关闭AD转换器ADC10CTL0 = ADC10IE + ADC10ON + REFON + ADC10SHT_3 + SREF_1;//1 允许ADC10中断 1 ADC10开启,打开基准源 64个ADC10CLK周期ADC10CTL1 = CONSEQ_0 + ADC10SSEL_0 + ADC10DIV_3 + SHS_0 + INCH_10;//单通道单次采样模式 ADC10OSC 8分频 ADC10SC位__delay_cycles(30000);ADC10CTL0 |= ENC; //开启AD转换器}#pragma vector=ADC10_VECTOR__interrupt void ADC10_ISR_HOOK(void){_bic_SR_register_on_exit(LPM4_bits);}void Init_uart0(){UCA0CTL1|=UCSWRST;P1SEL|=BIT1+BIT2; //将P1.1 P1.2设为第二功能P1SEL2|=BIT1+BIT2;//系统组合P1DIR |= BIT2; //P1.2 UART_TXP1DIR &=~BIT1; //P1.2 UART_RXUCA0CTL0&=~UC7BIT;//字符长度为8UCA0CTL1|=UCSSEL_2;//选择系统时钟UCA0BR0=0x68; //波特率为9600UCA0BR1=0;UCA0MCTL=0X40;//UCA0MCTL=UCBRS0;UCA0CTL1&=~UCSWRST;IE2|=UCA0RXIE;//开接收使能}void Uart0Sends(char *s){while(*s!='\0') //查找字符。
基于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); }*/。
基于MSP430单片机的无线温度检测系统设计
机 需
,
其 突 出 的 特 点 是 可 以 实现 极 低 的 功 耗
的工
。
它有 5
1
种可编程
作 模 式 其 中活 动 模 式 下
,
工
作电流仅
IJ A
。
280 p A
L PM 4 ,
模 式 下 仅 需
4 8K B + 2 56B
以 及
口
0
.
M S P 4 3 0 F 16 1 1
内部 具 有
,
的
F la s h
s o gc aa tr t so w o t, ih rl bl , i l tu tr , tbep ro ma c n r ciai , n y t n h rce i i fl c s hg ei i t smpe s cu e sa l ef r n ea dp a t l a d ma r sc o a i y r c t y
序 列 号 是 出厂 前 被
,
0 0 62 5 ℃
.
,
可 实现 高 精 度 测 温
.
。
适 应 电压 范 围
,
:
光 刻 好 的 其 排 列 是 : 品 类 型 标 号 接 着的 4 8 位 是 产
该 D S l 8 B Z O 环 冗 余 校 验 码 (C R C 码 ) 光 刻 R O M 的
。
3 0
E E PR OM 性 质的上
.
再 由 复 制 R A M 命令 写 入
。
(4 ) 成 本 低 廉
1) S 18 8 2 0
。
、
下 限 报 警寄存 器 中
6 内部 结 构 主 要 由 四 部 分 组 成 : 4 位 光
单片机控制的温度传感器C语言程序代码(WORD档)9页word
#include <at89x52.h>#define DO P3_7#define SEG P0 //数码管自左至右依次为1234位#define MS2L 0x18 //1ms的延时参数#define MS2H 0xfc#define uchar unsigned char#define uint unsigned intuchar code comm[4] = {0x01,0x02,0x04,0x08};uchar code seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code seg_add_dicimal[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};uchar code seg_dicimal[2] ={0xc0, 0x92};uchar k = 0;uchar temp_l = 0;uchar temp_h = 0;uchar tempsign = 0;uchar hundreds = 0;uchar tens = 0;uchar ones = 0;uchar low_four = 0;/*延时以ms为单位的t时间*/void Delay(uint t)uint i;while(t--)for(i=0; i<125; i++)/*us级延时,延时时间约4+2*i*/void Delayus(uchar i)while(--i);/*产生复位脉冲,等待应答信号*/void Resetpaulse()DO = 0; //拉低约600usDelayus(150);Delayus(150);DO = 1;//产生上升沿,延时约15~60us Delayus(30);while(~DO); //等待应答信号/*读取数据一位*/bit Readbit()uint i = 0;bit b = 0;DO = 0; //产生读时隙i++; //维持低电平至少1usDO = 1; //1us以上后拉高Delayus(2); //延时8us,DO下降沿15内ds18b20输出的数据才有效 b = DO; //读取数据Delayus(40); //每个读时隙至少持续60usreturn(b);/*读取一个字节*/uchar Readbyte()uchar byte_read = 0;uchar i, j;for(i=0; i<8; i++)j = Readbit();byte_read = (j<<i) | byte_read; //低位读起return(byte_read);/*写一个字节*/void Writebyte(uchar byte_to_write)uchar i = 0;uchar j = 0;bit write_bit = 0;for(j=0; j<8; j++)write_bit = (byte_to_write & 0x01);if(write_bit == 1) //写1DO = 0; //产生写时隙Delayus(3); //延时15usDO = 1; //写1Delayus(40); //延时,写时隙不得低于60uselseDO = 0; //产生写时隙Delayus(50); //延时,保持低约60us~120usDO = 1;i++;byte_to_write = byte_to_write >> 1;/*配置ds18b20,9位分辨率 */void Configurate()EA = 0;Resetpaulse(); //发出复位脉冲,每次操作都从复位开始 Delay(1);Writebyte(0xcc); //skip room命令Writebyte(0x4e);Writebyte(0x7f);Writebyte(0x80);Writebyte(0x1f);EA = 1;/*启动温度转换*/void StartConvert()Resetpaulse(); // 发出复位脉冲,每次操作都从复位开始Delay(1);EA = 0;Writebyte(0xcc); //skip room命令Writebyte(0x44); //启动温度转换命令EA = 1;/*读取温度值*/void ReadTempreture()EA = 0;Resetpaulse(); // 发出复位脉冲,每次操作都从复位开始Delay(1);Writebyte(0xcc); //skip room命令Writebyte(0xbe); //读取暂存器命令temp_l = Readbyte(); //存储温度低字节值(整数部分低四位和小数部分)temp_h = Readbyte(); //存储温度高字节值(其中高五位为符号位) EA = 1;/*数据转换*/void DigitalConvert()uchar total = 0;tempsign = (temp_h >> 7) & 0x01; //得出符号位if(tempsign == 0) //正数的处理方法total = ((temp_h << 4)&0xf0) | ((temp_l >> 4)&0x0f); //取整数位low_four = (temp_l>>3) & 0x01; //取小数位,9位分辨率,低字节第3位为小数位,只有0、1两种取值hundreds = total / 100; //计算百、十、个位tens = (total%100)/10;ones = (total%100)%10;else //负数处理求负数补码规则是,按位取反,得到反码,加1即得补码(符号位不变)tempsign = 1;total = ((temp_l >> 4) & 0x0f); //取整数部分低4位total |= ((temp_h << 4) & 0xf0); //整数部分高三位和符号位low_four = (temp_l >> 3) & 0x01; //取小数位if(low_four == 0) //这里total位uchar型变量,所以根据最低位来确定整数取补规则total = ~total + 1; //最低位为0的时候,取反加1后有进位,所以这里total要取反加1elsetotal = ~total; //最低位为1的时候,取反加1没有进位,所以total直接取反即可tens = (total%100)/10;ones = (total%100)%10;/*中断处理*/void Display() interrupt 1EA = 0;TL0 = MS2L;TH0 = MS2H;DigitalConvert(); //数据转换if(tempsign == 0) //正数if(k == 0)if(hundreds == 0) //高位0消隐{P1 = 0;}elseP1 = comm[k];SEG = seg[hundreds];else if(k == 1)if(tens == 0 && hundreds == 0) //高位0消隐{P1 = 0;}elseP1 = comm[k];SEG = seg[tens];else if(k == 2) //显示个位,因为个位有小数点,所以又定义了一个数组分开来显示P1 = comm[k];SEG = seg_add_dicimal[ones]; //要加上小数点else //显示小数,0或5P1 = comm[k];SEG = seg_dicimal[low_four];else if(tempsign == 1) //负数if(k == 0) //显示符号位P1 = comm[k];SEG = 0xbf;else if(k == 1)if(tens == 0){P1 = 0;}elseP1 = comm[k];SEG = seg[tens];else if(k == 2) //显示个位,因为各位有小数点,所以分开来显示 P1 = comm[k];SEG = seg_add_dicimal[ones]; //要加上小数点else //显示小数,0或5P1 = comm[k];SEG = seg_dicimal[low_four];k++;if(k == 4)k = 0;EA = 1;/*主函数部分*/void main()TMOD = 0x01;TL0 = MS2L;TH0 = MS2H;TF0 = 0;EA = 1;ET0 = 1;TR0 = 1;Configurate();do{Delay(1);StartConvert();Delay(100);ReadTempreture();while(1);希望以上资料对你有所帮助,附励志名言3条::1、世事忙忙如水流,休将名利挂心头。
基于msp430g2553温度传感器18b20程序
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); // 跳过读序号列号的操作
MSP430DS18B20操作
实例描述:本例程是通过微控的MC430F14实验板上MSP430单片机对数字温度传感器DS18B20进行操作,将读取到的数字数据加于处理在中文显示模块上显示出来。
实验源程序://文件名:MC430F14_DEMO_5.c//版本: 1.0//描述:MC430F14开发板的主程序,MSP430对DS18B20操作,将读取的温度显示在LCD上。
//编程环境:IAR WE430 3.40A#include <msp430x14x.h>#include "DS1820.h"#include "lcd_ch.h"#define DQ1 P5OUT|=BIT7 //DQ=1#define DQ0 P5OUT&=~BIT7 //DQ=0const unsigned char digit[10] = {'0','1','2','3','4','5','6','7','8','9'};unsigned char temp_display [9] = {'x','0','0','0','.','0','0','0','\0'};//将温度值转换成可显示十进制值//取数范围整数3位,小数点后3位.void display_number(float f_data){ unsigned long value;float n;n=f_data *1000;value = (unsigned long int)n;temp_display[1] = digit[value/100000]; //100位value = value%100000;temp_display[2] = digit[value/10000]; //10位value = value%10000;temp_display[3] = digit[value/1000]; //1位value = value%1000;temp_display[5] = digit[value/100]; //0.1位value = value%100;temp_display[6] = digit[value/10]; //0.01位value = value%10;temp_display[7] = digit[value/1]; //0.001位}//--------------------------------------------------------------------//说明:实验标题1,应用单实形式发送.void send_title() //标题显示{sendCMD(off_cursor); //关光标sendCMD(LCD_L11);display(LCD_L11,0xce,0xa2); //微display(LCD_L12,0xBf,0xd8); //控sendDAT('D'); sendDAT('S'); sendDA T('1'); sendDAT('8'); sendDAT('2'); sendDAT('0');display(LCD_L16,0xca,0xb5); //实display(LCD_L17,0xd1,0xe9); //验display(LCD_L25,0xa1,0xe6); //度sendCMD(LCD_L21); //显示地址指回处sendCMD(off_cursor); //关光标}//---------------------------------------------------------------------//MSP430F14初始化void mcuinit(void){P1DIR |=BIT1; //P1.1驱动LEDP5DIR |=BIT7; //设DQ电时为1DQ1;initlcm(); //LCD初始化send_title(); //显示实验标题}//---------------------------------------------------------------------//MC430F14 DS18B20实验主程序void main(void){WDTCTL = WDTPW + WDTHOLD; // 停止WDT mcuinit();while(1){GetTemp(); //读取温度if(symbol==1)temp_display[0] = '+'; //处理正负符合elsetemp_display[0] = '-';if(Error==1){ display(LCD_L26,0xca,0xa7); //失display(LCD_L27,0xb0,0xdc); //败}else{ display(LCD_L26,0xd5,0xfd); //正display(LCD_L27,0xc8,0xb7); //确}P1OUT ^= BIT1;display_number(Temper); //数据变换显示数据 char_string (temp_display,LCD_L21);}}//END--------------------------------------------------------------//文件名:MC430F14_DEMO_5.h//版本: 1.0//描述:程序声明//编程环境:IAR WE430 3.40A//编写: DC//时期: 2006.10.21//例程解说: 将DS18B20的变量及程序声明,供外部程序使用extern unsigned char Error;extern float Temper; //真正有效温度值extern int temperature; //读取两字节温度数据extern unsigned char symbol; //温度正负符号void GetTemp(void); //读取温度//END--------------------------------------------------------------//文件名:MSP430_DS18B20.c//版本: 1.0//描述:MC430F14开发板的MSP430与DS18B20操作主程。
基于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单片机的温度测控装置的设计与开发设计与开发基于MSP430单片机的温度测控装置一、引言随着科技的不断进步,温度测控装置在生活和工业中扮演着重要的角色。
本文将介绍基于MSP430单片机的温度测控装置的设计与开发。
该装置可以用于实时监测环境温度,并根据设定的阈值控制温度。
二、硬件设计1.传感器选择:本设计采用温度传感器DS18B20。
它是一种数字式温度传感器,通过一根串行线来与单片机通信。
2.电路连接:将传感器与MSP430单片机连接。
传感器的VCC引脚接单片机的3.3V电源,GND引脚接地,DQ引脚接到单片机的GPIO引脚。
3.LCD模块:为了显示当前温度和控制参数,我们需要一个LCD模块。
将LCD模块的数据引脚接到单片机的GPIO引脚。
4.电源:设计一个适当的电源电路,以提供所需的电压和电流。
三、软件设计1.硬件初始化:在程序开始时,初始化MSP430单片机的GPIO引脚,配置传感器引脚为输入模式和LCD数据引脚为输出模式。
2.温度采集:通过传感器的引脚与单片机通信,获取当前温度数据。
传感器采用一线式通信协议,在读取温度数据之前,先向传感器发送读取命令,然后从传感器接收数据。
单片机通过GPIO引脚进行数据的收发。
3.温度显示:将获取到的当前温度数据通过LCD模块显示出来。
4.温度控制:设定一个温度阈值,当实际温度超过阈值时,单片机控制继电器等设备进行温度调节。
可以采用PID控制算法,根据当前温度与设定温度的差异,调整控制设备的输出。
5.程序循环:通过一个无限循环来保持程序运行。
四、测试与验证1.硬件测试:对硬件电路进行测试,确保传感器和LCD模块的接线正确,电源电压稳定。
2.软件测试:通过模拟不同温度值,确认温度采集、显示和控制功能正常。
3.综合测试:将温度测控装置放置在实际环境中,观察温度采集和控制性能,根据需要进行调整。
五、结论本文设计与开发了基于MSP430单片机的温度测控装置。
MSP430内部温度传感器测试程序
MSP430内部温度传感器测试程序MSP430内部温度传感器测试程序//MSP430基础实验开发组件 - ADC12内部模块演示程序之内部温度传感器//时钟设置:////ACLK = n/a, MCLK = SMCLK = default DCO ~ 800kHz, ADC12CLK = ADC12OSC //当前演示程序功能描述:////利用MSP430F14X内部的温度传感器,通过ADC12的通道10进行AD转换////计算取得摄氏温度和华氏温度,通过断点在View->Watch中观察温度值////由于定标问题, 可能会存在温度的误差#includeunsigned int long temp;unsigned int long TemperF; //华氏温度unsigned int long TemperC; //摄氏温度void main(void) {WDTCTL = WDTPW + WDTHOLD; //关闭系统看门狗ADC12CTL0 = SHT0_8 + REFON + ADC12ON; //内部1.5V参考电压,打开ADC12模块,设置采样保持定时器ADC12CTL1 = SHP; //采使用采样定时器ADC12MCTL0 = SREF_1 + INCH_10; //参考电压和通道选择ADC12IE =BIT0; //ADC12MEM0ADC12CTL0 |= ENC; //允许转换_BIS_SR(GIE); //开启系统中断while(1) {ADC12CTL0 |= ADC12SC; //开始采样并AD转换//oF = ((x/4096)*1500mV)-923mV)*1/1.97mV = x*761/4096- 468 //IntDegF = (ADC12MEM0 - 2519)* 761/4096TemperF = (temp - 2519) * 761;TemperF = TemperF / 4096; //简化的华氏温度转换公式//oC = ((x/4096)*1500mV)-986mV)*1/3.55mV = x*423/4096 - 278 //IntDegC = (ADC12MEM0 - 2692)* 423/4096TemperC = (temp - 2692) * 423;TemperC = TemperC / 4096; //简化的摄氏温度转换公式_NOP(); //加入断点可用来观察IntDegF和IntDegC结果}}#pragma vector=ADC_VECTOR__interrupt void ADC12ISR(void) {temp = ADC12MEM0; //保存转换结果}。
基于MSP430单片机与温度传感器和步进电机装置的设计与分析
基于MSP430单片机与温度传感器和步进电机装置的设计与分析在人们日常的生活当中,温度作为环境因素的重要组成部分,影响着人们生产生活的方方面面。
而就如何准确的预知和掌控温度便成为了人们在提高生产效率、降低生产成本、减少生产损失的关键性因素。
随着信息化时代的到来,有关预知和掌控温度的电子信息产品正在不断的步入农业、制冷、日常生活等多个领域。
如冰箱、空调等设备的气温调节、预防火灾的报警装置都是利用电子设备来达到预知和控制温度的目的。
其主要优点便是在传统设备的基础上,安装了自动警报装置和调控温度的功能。
不仅增加了装置的实时性和安全性,也增加了生产作业的效率、降低了生产作业的成本,释放了人力。
因此,对这种精度高、成本低的自动化温度监测装置的研发具有重要意义。
基于此,本文所构建的是一种以MSP430G2553单片机为核心,与温度传感器和步进电机相结合的一种温度监测装置。
并且通过所监测的温度值来判断和控制步进电机的工作状态。
在农业生产领域,该装置可根据环境温度的变化来实现大棚自动开启和闭合的目的,以此来保证农作物所需要的生长环境。
1系统总体设计方案基于MSP430单片机与温度传感器和步进电机装置的设计由温度监测、步进电机控制、信息显示三部分组成。
当该装置安装完毕并且启动工作后,用户可根据自身的需要选择自动工作模式和手动工作模式。
选择自动工作模式时,用户需将大棚内农作物的最适宜生长温度存储到单片机中。
存储完毕后,温度传感器DS18B20便会测量大棚内的环境温度,并根据所测的温度值与MSP430G2553单片机所存储的农作物最适宜生长温度值作比较,若所测温度大于最适宜农作物生长温度,单片机便会控制步进电机顺时针旋转,来达到开启大棚降低棚内温度的目的。
反之,若所测温度小于最适宜农作物生长温度,单片机便会控制步进电机逆时针旋转,来达到关闭大棚升高棚内温度的目的。
选择手动工作模式时,用户可根据温度传感器DS18B20所测的温度值,并依靠自身的经验,人为的判断大棚是否开启或关闭。
通用型MSP430单片机——内置温度传感器测试程序
1.//*****************************************************************************2.//程序主要是利用MSP430内置温度传感器检测CPU温度随外界温度的变化,由串口显示变化的情况,3.//用TimerA0定时1s采集一个数据在发送到串口上,在没有取平均值之前检测到温度不是很准确4.//5.//******************************************************************************6.7.#include <msp430x14x.h>8.//#define ADCDeltaOn 1 // ~2 Deg C delta9.#define CPU_F ((double)8000000)10.#define delay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))11.#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))12.13.#define uchar unsigned char14.#define uint unsigned int15.#define ulong unsigned long16.17./*当BRCLK=CPU_F时用下面的公式可以计算,否则要根据设置加入分频系数*/18.#define baud 9600 //设置波特率的大小19.#define baud_setting (uint)((ulong)CPU_F/((ulong)baud)) //波特率计算公式20.#define baud_h (uchar)(baud_setting>>8) //提取高位21.#define baud_l (uchar)(baud_setting) //低位22.int long temp;23.int long sum;24.int count_f=0;25.//*************************************************************************26.// 系统时钟初始化27.//*************************************************************************28.void Clock_Init()29.{30.uchar i;31.BCSCTL1&=~(XT2OFF+XTS); //打开XT振荡器32.BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ33.do{34.IFG1&=~OFIFG; //清除震荡标志35.for(i=0;i<100;i++)36._NOP(); //延时等待38.while((IFG1&OFIFG)!=0); //如果标志为1,则继续循环等待39.IFG1&=~OFIFG;40.}//*************************************************************************41.// MSP430串口初始化42.//*************************************************************************43.void UART_Init()44.{45.U1CTL|=SWRST; //复位SWRST46.U1CTL|=CHAR; //8位数据模式47.U1TCTL|=SSEL1; //SMCLK为串口时钟48.U1BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N49.U1BR0=baud_l; //N=UBR+(UxMCTL)/850.U1MCTL=0x00; //微调寄存器为0,波特率9600bps51.ME2|=UTXE1; //UART1发送使能52.ME2|=URXE1; //UART1接收使能53.U1CTL&=~SWRST;54.IE2|=URXIE1; //接收中断使能位55.P3SEL|= BIT6; //设置IO口为特殊功能模块56.P3DIR|= BIT6; //设置P3.4为输入,P3.5为输出口57.P3SEL|= BIT7; //设置IO口为外围功能模块58.59.}60.61.//*************************************************************************62.// 串口1发送数据函数63.//*************************************************************************64.void Send_Byte(uchar data)65.{66.U1TXBUF=data;67.while ((IFG2 & UTXIFG1)==0);68.}69.//*************************************************************************70.// 处理来自串口1的发送中断,预留71.//*************************************************************************72.73.#pragma vector=UART1TX_VECTOR74.__interrupt void UART1_TX_ISR(void)76.77.}78.//*************************************************************************79.// 定时器中断服务程序80.//*************************************************************************81.#pragma vector = TIMERA0_VECTOR82.__interrupt void Timer_A(void)83.{84.}85.//*************************************************************************86.// ADC中断服务程序87.//*************************************************************************88.#pragma vector=ADC12_VECTOR89.__interrupt void ADC12ISR (void)90.{91.if(count_f<10)92.{temp = ADC12MEM0;93.sum+=temp;94.sum/=2;95.count_f++;96.}97.98.Send_Byte(sum);99.P2OUT |= ~0xFE; // LED on100.count_f=0;101._BIC_SR_IRQ(CPUOFF); // Clear CPUOFF bit from 0(SR)102.103.}104.//************************************************************* ************105.// 主程序106.//************************************************************* ************107.void main(void)108.{109.WDTCTL = WDTPW + WDTHOLD; // Stop watchdog110.UART_Init();111.Clock_Init();112.P2OUT = 0x00; // Clear P1113.P2DIR = 0xFF; // P1.0 as output114.ADC12CTL1 = SHS_1 + SHP + CONSEQ_2; // TA trig., rpt conv. 115.ADC12MCTL0 = SREF_1 + INCH_10; // Channel A10, Vref+116.ADC12IE = 0x01; // Enable ADC12IFG.0117.ADC12CTL0 = SHT0_8 + REF2_5V + REFON + ADC12ON + ENC; // Config ADC12 118.TACCTL1 = OUTMOD_4; // Toggle on EQU1 (TAR = 0)R0=32768;TL0 = CCIE;121.TACTL = TASSEL_1 + MC_1; // AMCLK122._EINT();123.while(1)124.{125.ADC12CTL0 |= ADC12SC; // Sampling and conversion start126._BIS_SR(LPM0_bits + GIE); // LPM0 with interrupts enabled 127.}128.}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
uchar i;
WDTCTL = WDTPW + WDTHOLD; //关狗
函数名称:DelayNus
功能:实现N个微秒的延时
参数:n--延时长度
返回值:无
说明:定时器A的计数时钟是1MHz,CPU主频8MHz
所以通过定时器延时能够得到极为精确的
us级延时
********************************************/
void DelayNus(uint n)
for(i = 0; i < 16; i++)
Write_Data(0x20 + i); //显示0x50~0x5f对应的字符
Write_Cmd(0x98); //写第四行的显示地址
for(i = 0; i < 16; i++)
Write_Data(0x30 + i); //显示0x60~0x6f对应的字符
#define DQ1 P1OUT |= BIT6
#define DQ0 P1OUT &= ~BIT6
#define DQ_in P1DIR &= ~BIT6
#define DQ_out P1DIR |= BIT6
#define DQ_val (P1IN & BIT6)
/*******************************************
//13.清除显示命令
Write_Cmd(0x01); //清屏
Write_Cmd(0x80);
for(i=0;i<5;i++)
Write_Data(lab[i]);
Write_Cmd(0x90); //写第二行的显示地址
if(1)
{
Disp_Numb(Do1Convert());
Write_Data(dN[5]+0x30);
Clear_GDRAM(); //清除上电复位后RAM中的随机数值
Draw_TX(0x80,0x84,laba); //重新显示设置16*16大小图形
//11.关闭GDRAM显示
Write_Cmd(0x34); //打开扩展功能模式,关闭绘图显示
//12.设定基本指令集
Write_Cmd(0x30); //回到基本指令集
Write_Cmd(0x07); //光标右移整体显示左移
Write_Data(0x20); //写入两个空格
Write_Data(0x20);
Write_Cmd(0x05); //光标左移整体显示右移
Write_Data(0x20); //写入两个空格
Write_Data(0x20);
Write_Cmd(0x06); //光标右移整体显示不移动
//7.反白命令
Write_Cmd(0x04); //同时反白1、3行
Write_Cmd(0x04); //再次反白1、3行,相当于关闭1、3行反白
Write_Cmd(0x05); //同时反白2、4行
Write_Cmd(0x05); //再次反白2、4行,相当于关闭2、4行反白
//8.睡眠模式命令
主程序
#include "msp430.h"
#include "cry12864.h"
#include "DS18B20.h"
typedef unsigned char uchar;
typedef unsigned int uint;
unsigned char lab[]={"温度:"};
uchar laba[]=
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)
{
CCR0 = n;
TACTL |= MC_1; //增计数到CCR0
while(!(TACTL & BIT0)); //等待
TACTL &= ~MC_1; //停止计数
TACTL &= ~BIT0; //清除中断标志
}
/*******************************************
Write_Data(dN[4]+0x30);
Write_Data(0x2e); //0x2e是小数点对应的ASCII码值
Write_Data(dN[3]+0x30);
Write_Data(dN[2]+0x30);
Write_Data(dN[1]+0x30);
Write_Data(dN[0]+0x30);
Write_Cmd(0x0f); //整体显示开,游标开,游标位置开
//3.位址归位
Write_Cmd(0x02); //位址归位,游标回到原点
Write_Cmd(0x84); //将DDRAM地址设为0x88,游标在此闪烁
//4.点设定指令
//(以下四个命令是控制写入字符以后光标及整屏显示的移动)
Ini_Lcd();
for(i=0;i<16;i++)
Write_Data(lab[i]);
//循环读数显示
WDTCTL = WDTPW + WDTHOLD; //关狗
Ini_Lcd(); //初始化液晶
Write_Cmd(0x80); //写第一行的显示地址
for(i = 0; i < 16; i++)
Write_Cmd(0x10); //光标左移
Write_Cmd(0x14); //光标右移
Write_Cmd(0x18); //整体显示左移,光标跟随
Write_Cmd(0x1c); //整体显示右移,光标跟随
Write_Cmd(0x0c); //关闭光标
//6.进入扩展功能模式命令
Write_Cmd(0x34); //打开扩展功能模式,绘图显示关闭
Write_Cmd(0x90); //设定DDRAM地址,因为此时DDRAM地址已经溢出
//2.显示状态命令
Write_Cmd(0x08); //整体显示关,游标关,游标位置关
Write_Cmd(0x0c); //整体显示开,游标关,游标位置关
Write_Cmd(0x0e); //整体显示开,游标开,游标位置关
{
dN[4] += 4;
dN[5] += 6;
if(dN[4] >= 10)
{
dN[4] -= 10;
dN[5] += 1;
}
if(dN[5] >= 10)
{
dN[5] -= 10;
}
}
}
传感器
#include <msp430x14x.h>
typedef unsigned char uchar;
typedef unsigned int uint;
}
LPM4;
}
/*******************************************
函数名称:Disp_Numb
功能:将从DS18B20读取的11bit温度数据转换
成液晶显示的温度数字
参数:temper--11bit温度数据
返回值:无
********************************************/
DQ0;
DelayNus(500);
DQ1;
DelayNus(55);
DQ_in;
_NOP();
if(DQ_val)
{
Error = 1; //初始化失败
}
else
{
Error = 0; //初始化成功
}
DQ_out;
DQ1;
_EINT();
DelayNus(400);
return Error;
}
/*******************************************
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;
{ 0x00,0x00,0x00,0xC0,0x01,0x48,0x02,0x44,0x04,0x52,0xF8,0x49,0x88,0x49,0x88,0x49,
0x88,0x49,0x88,0x49,0xF8,0x49,0x04,0x52,0x02,0x44,0x01,0x48,0x00,0xC0,0x00,0x00};