ImageVerifierCode 换一换
格式:DOCX , 页数:36 ,大小:22.09KB ,
资源ID:3774623      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-3774623.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ds18b20基于msp430的水温控制系统完整程序.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

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

1、ds18b20基于msp430的水温控制系统完整程序main.c#include #include keypad.h#include lcd1602.h#include ds18b20.h#include control.htypedef unsigned char uchar;typedef unsigned int uint;void InitSys(); /函数声明int main(void) WDTCTL=WDTPW+WDTHOLD; /关闭看门狗 /*下面六行程序关闭所有的IO口*/ P1DIR = 0XFF;P1OUT = 0XFF; P2DIR = 0XFF;P2OUT = 0X

2、FF; P3DIR = 0XFF;P3OUT = 0XFF; P4DIR = 0XFF;P4OUT = 0XFF; P5DIR = 0XFF;P5OUT = 0XFF; P6DIR = 0XFF;P6OUT = 0XFF; P6DIR |= BIT2;P6OUT |= BIT2; /关闭电平转换 InitSys(); /系统初始化 Init_Keypad(); /键盘初始化 LcdReset(); /lcd初始化 start: disp_18b20(); goto start; /*系统初始化*/void InitSys() unsigned int iq0; BCSCTL1 &= XT2OF

3、F; /打开XT2振荡器 do IFG1 &= OFIFG; /清除振荡器失效标志 for(iq0=0xFF;iq00;iq0-);/延时,等待XT2起振 while(IFG1 & OFIFG)!=0); /判断XT2是否起振 BCSCTL2=SELM_2+SELS; /选择MCLK,SMCLK为XT2 TACTL |= TASSEL_2 + ID_3; /计数时钟选择SMLK=8MHz,1/8分频后为1MHz P5DIR |= BIT5; /加热器控制端口 P5OUT &= BIT5; P5DIR |= BIT7; /风扇控制端口 P5OUT &= BIT7; _EINT(); /打开全局中

4、断控制,若不需要打开,可以屏蔽本句/*端口1(键盘)中断函数*/#pragma vector=PORT1_VECTOR_interrupt void Port1() Key_Event(); /判断按键并获取键值 if(key_val16) /输入为数字键 temp_disp(); else if(key_val=12) /输入为确定键 sure=1; temp_set_2=ten2two(); else if(key_val=13) /输入为清除键 temp_clr(); Init_Keypad(); /键盘初始化keypad.hvoid Init_Keypad(void);void Che

5、ck_Key(void);void delay(unsigned int tmp);void Key_Event(void);/引用外部变量的声明extern unsigned char key_Pressed; extern unsigned char key_val; extern unsigned char key_Flag;keypad.c#include typedef unsigned char uchar;typedef unsigned int uint;/*全局变量*/uchar key_Pressed; /按键是否被按下:1-是,0-否uchar key_val; /存放键

6、值uchar key_Flag; /按键是否已放开:1-是,0-否/设置键盘逻辑键值与程序计算键值的映射uchar key_Map = 1,2,3,4,5,6,7,8, 9,0,11,12,13,14,15,16;/k12,清除键。k13,确定键/*Init_Keypad:初始化扫描键盘的IO端口 */void Init_Keypad(void) P1DIR = 0xf0; /P1.0P1.3设置为列输入, P1.4P1.7设置为行输出 P1OUT=0x0f; / P1.4P1.7输出低电平 P1IFG=0X00; P1SEL=0; /P1口设置为一般I/O端口 P1IES=0x0f; P1I

7、E=0x0f; /P1低四位中断开启 key_Flag = 0; key_Pressed = 0; key_val = 0;/*延时约15ms,完成消抖功能*/void delay(uint tmp) for(;tmp 0;tmp-);/*扫描键盘的IO端口,获得键值*/void Check_Key(void) uchar row ,col,tmp1,tmp2; tmp1 = 0x80; for(row = 0;row =1; if (P1IN & 0x0f) 0x0f) /是否P1IN的P1.0P1.3中有一位为0 tmp2 = 0x01; / tmp2用于检测出那一位为0 for(col

8、= 0;col 4;col+) / 列检测 if(P1IN & tmp2) = 0x00) / 是否是该列,等于0为是 key_val = key_Maprow * 4 + col; / 获取键值 return; / 退出循环 tmp2 = 1; / tmp2右移1位 /*检测按键,并获取键值*/void Key_Event(void) uchar tmp; P1OUT &= 0x00; / 设置P1OUT全为0,等待按键输入 tmp = P1IN; / 获取 p1IN if (key_Pressed = 0x00)&(tmp & 0x0f) 0x0f) /如果有键按下 key_Pressed

9、 = 1; / 如果有按键按下,设置key_Pressed标识 delay(1200); /消除抖动 Check_Key(); / 调用check_Key(),获取键值 else if (key_Pressed = 1)&(tmp & 0x0f) = 0x0f) /如果按键已经释放 key_Pressed = 0; / 清除key_Pressed标识 key_Flag = 1; / 设置key_Flag标识 else _NOP(); Lcd1602.hvoid DispStr(unsigned char x,unsigned char y,unsigned char *ptr);void Di

10、spNChar(unsigned char x,unsigned char y, unsigned char n,unsigned char *ptr);void LocateXY(unsigned char x,unsigned char y);void Disp1Char(unsigned char x,unsigned char y,unsigned char data);void LcdReset(void);void LcdWriteCommand(unsigned char cmd,unsigned char chk);void LcdWriteData( unsigned cha

11、r data );void WaitForEnable(void);void Delay5ms(void);void Delay400ms(void);extern unsigned char temp_set;lcd1602.c#include #include lcd1602.h#include keypad.htypedef unsigned char uchar;typedef unsigned int uint;uchar temp_set=temp set:_._;uchar temp_now=temp now:;/*宏定义*/#define DataDir P4DIR#defin

12、e DataPort P4OUT #define Busy 0x80#define CtrlDir P3DIR#define CLR_RS P3OUT&=BIT0; /RS = P3.0 #define SET_RS P3OUT|=BIT0; #define CLR_RW P3OUT&=BIT1; /RW = P3.1#define SET_RW P3OUT|=BIT1; #define CLR_EN P3OUT&=BIT2; /EN = P3.2 #define SET_EN P3OUT|=BIT2; /*让液晶从某个位置起连续显示一个字符串x-位置的列坐标y-位置的行坐标ptr-指向字符串

13、存放位置的指针*/void DispStr(uchar x,uchar y,uchar *ptr) uchar *temp; uchar i,n = 0; temp = ptr; while(*ptr+ != 0) n+; /计算字符串有效字符的个数 for (i=0;in;i+) Disp1Char(x+,y,tempi); if (x = 0x0f) x = 0; y = 1; /*让液晶从某个位置起连续显示N个字符x-位置的列坐标y-位置的行坐标n-字符个数ptr-指向字符存放位置的指针*/void DispNChar(uchar x,uchar y, uchar n,uchar *pt

14、r) uchar i; for (i=0;in;i+) Disp1Char(x+,y,ptri); if (x = 0x0f) x = 0; y = 1; /*功 能:向液晶输入显示字符位置的坐标信息参 数:x-位置的列坐标 y-位置的行坐标*/void LocateXY(uchar x,uchar y) uchar temp; temp = x&0x0f; y &= 0x01; if(y) temp |= 0x40; /如果在第2行 temp |= 0x80; LcdWriteCommand(temp,1);/*功 能:在某个位置显示一个字符参 数:x-位置的列坐标 y-位置的行坐标 dat

15、a-显示的字符数据*/void Disp1Char(uchar x,uchar y,uchar data) LocateXY( x, y ); LcdWriteData( data ); /*LcdReset:对1602液晶模块进行复位操作*/void LcdReset(void) CtrlDir |= 0x07; /控制线端口设为输出状态 DataDir = 0xFF; /数据端口设为输出状态 LcdWriteCommand(0x38, 0); /规定的复位操作 Delay5ms(); LcdWriteCommand(0x38, 0); Delay5ms(); LcdWriteCommand

16、(0x38, 0); Delay5ms(); LcdWriteCommand(0x38, 1); /显示模式设置 LcdWriteCommand(0x08, 1); /显示关闭 LcdWriteCommand(0x01, 1); /显示清屏 LcdWriteCommand(0x06, 1); /写字符时整体不移动 LcdWriteCommand(0x0c, 1); /显示开,不开游标,不闪烁 DispNChar(0,0,14,temp_set); /显示预设温度提示 DispNChar(0,1,9,temp_now); /显示实时温度提示/*函数名称:LcdWriteCommand功 能:向液

17、晶模块写入命令参 数:cmd-命令, chk-是否判忙的标志,1:判忙,0:不判*/void LcdWriteCommand(uchar cmd,uchar chk) if (chk) WaitForEnable(); / 检测忙信号? CLR_RS; CLR_RW; _NOP(); DataPort = cmd; /将命令字写入数据端口 _NOP(); SET_EN; /产生使能脉冲信号 _NOP(); _NOP(); CLR_EN; /*函数名称:LcdWriteData功 能:向液晶显示的当前地址写入显示数据参 数:data-显示字符数据返回值 :无*/void LcdWriteData

18、( uchar data ) WaitForEnable(); /等待液晶不忙 SET_RS; CLR_RW; _NOP(); DataPort = data; /将显示数据写入数据端口 _NOP(); SET_EN; /产生使能脉冲信号 _NOP(); _NOP(); CLR_EN; /*函数名称:WaitForEnable功 能:等待1602液晶完成内部操作*/void WaitForEnable(void) P4DIR &= 0x00; /将P4口切换为输入状态 CLR_RS; SET_RW; _NOP(); SET_EN; _NOP(); _NOP(); while(P4IN & Bu

19、sy)!=0); /检测忙标志 CLR_EN; P4DIR |= 0xFF; /将P4口切换为输出状态 /*Delay5ms:延时约5ms*/void Delay5ms(void) uint i=40000; while (i != 0) i-; /*Delay400ms:延时约400ms*/void Delay400ms(void) uchar i=50; uint j; while(i-) j=7269; while(j-); Ds18b20.hvoid DelayNus(unsigned int n);unsigned char Init_18B20(void);void Write_1

20、8B20(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);void Disp_Numb(unsigned int temper);void disp_18b20(void);extern unsigned char dN6; /要显示的6位温度数字extern unsigned int temp_now_2; /温度值

21、的十六进制存储ds18b20.c#include #include ds18b20.h#include lcd1602.h#include control.htypedef unsigned char uchar;typedef unsigned int uint;#define DQ1 P5OUT |= BIT6#define DQ0 P5OUT &= BIT6#define DQ_in P5DIR &= BIT6#define DQ_out P5DIR |= BIT6#define DQ_val (P5IN & BIT6)unsigned char dN6; /要显示的6位温度数字unsi

22、gned int temp_now_2=0; /温度值的十六进制存储void disp_18b20(void) Disp_Numb(Do1Convert(); Disp1Char(9,1,dN5+0x30); Disp1Char(10,1,dN4+0x30); Disp1Char(11,1,0x2e); /0x2e是小数点对应的ASCII码值 Disp1Char(12,1,dN3+0x30); Disp1Char(13,1,dN2+0x30); / Disp1Char(14,1,dN1+0x30); / Disp1Char(15,1,dN0+0x30); if(sure!=0) compare(); /*函数名称:DelayNus功 能:实现N个微秒的延时参 数:n-延时长度返回值 :无说明 :定时器A的计数时钟是1MHz,CPU主频8MHz 所以通过定时器延时能够得到极为精确的 us级延时*/void DelayNus(uint n) CCR0 = n; TACTL |= MC_1; /增计数到CCR0 while(!(TACTL & BIT0); /等待 TACTL &= MC_1; /停止计数 TACTL &= BIT0; /清除中断标志/*函数名称:Init_18B20功 能:对DS18B20进行复位操作参 数:无返回值 :初始化状态标志:1-失败,0-成功*

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2