版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、说明本系统采用的是msp430f149单片机,软件用的是ira embedded workbench4.20.1版本。 并附开发板原理图此系统程序包含键盘扫描程序,温度获取程序(dsl8b20), lcdl602显示程序,pid算法 程序,以及控制程序。目录main.c2keypad.h4lcdl602.h7dsl8b20.h13control.h21pid算法程序24main.c#include <msp430xl4x.h>#include "keypad.h"#include "lcdl602.h"#include "dsl8b
2、20.h"#inelude "control.h"typedef unsigned char uchar; typedef unsigned int uint;void lnitsys(); 函数声明int main (void)wdtctl=wdtpw+wdthold; 关闭看门狗 厂下面六行程序关闭所有的10 口*/p1dir = oxff;p10ut = oxff;p2dir = 0xff;p2out = oxff;p3dir = 0xff;p3out = 0xff;p4dir = 0xff;p4out = oxff;p5dir = 0xff;p5out =
3、 oxff;p6dir = 0xff;p6out = oxff;p6dir |=bit2;p6out |= bit2; 关闭电平转换lnitsys();系统初始化lnit_keypad();键盘初始化lcdreset();/led 初始化start: disp_18b20();goto start;* * * * * *系统初始化*void lnitsys()unsigned int iqo;bcsctll &二 xt2off; 打开 xt2 振荡器doifg1 &= ofifg; 清除振荡器失效标志for(iq0=0xff;iq0>0;iq0-);/延时,等待 xt2
4、起振while(ifgl & ofifg)!=0); 判断 xt2 是否起振bcsctl2二selm_2+sels;选择 mclk,smclk 为 xt2tactl | = tassel_2 + id_3; /计数时钟选择 smlk=8mhz, 1/8 分频后为 1mhzp5dir |= bit5;p5out &二 bit5;p5dir |= bit7;p5out &二 bit7;加热器控制端口风扇控制端口_eint();打开全局屮断控制,若不需要打开,可以屏蔽本句/* * 端口 1(键盘)中断函数 */ #pragma vector=port 1_vect0r_int
5、errupt void portl()key_event();判断按键并获取键值if(key_val>16) 输入为数字键 temp_disp();else if(key_val=12) 输入为确定键sure=l;temp_set_2=te n2two();else if(key_val=13)输入为清除键temp_clr();lnit_keypad();键盘初始化keypad.hvoid init_keypad(void);void check_key(void);void delay)unsigned int tmp);void key_event(void);引用外部变量的声明ex
6、tern unsigned char key_pressed; extern unsigned char key_val;extern unsigned char key_flag;keypadec#include <msp430xl4x.h> typedef unsigned char uchar; typedef unsigned int uint;/* 2蜀“ *uchar key_pressed; uchar key_val;uchar key_flag;按键是否被按下:1-是,0-否存放键值按键是否己放开:是,0“否 设置键盘逻辑键值与程序计算键值的映射uchar key
7、_map = r2,3t4t5t6:7,8,9,/,0,/ll,12/13/14/15/16;/kl2/清除键。kl3,确定键/*lnit_keypad:初始化扫描键盘的10端口*void init_keypad(void)pldir = oxfo;/p1.0p1.3设置为列输入,p1.4p1.7设置为行输出p10ut=oxof;p1ifg=oxoo; p1sel=o;plles=oxof; plle=oxof;/ p1.4-p1.7输出低电平/p1 口设置为一般i/o端口/p1低四位屮断开启key_flag = 0; key_pressed = 0; key_val = 0;*延吋约15ms
8、,完成消抖功能* * * * *void delay(uint tmp)*扫描键盘的10端口,获得键值*void check_key(void)uchar row ,col,tmpl,tmp2;tmpl = 0x80; for(row = 0;row < 4;row+)行扫描p10ut = oxfo;p10ut -= tmpl;tmpl »=1;if (pun &0xof) < oxof)/p1.4-p1.7 输出全 1/p1.4-pl.7输出四位中有一个为0是否pun的p1.o-p1.3中有一位为0tmp2 = 0x01;for(col = 0;col <
9、 4;col+)/tmp2用于检测出那一位为0 /列检测if(plln& tmp2) = 0x00)/是否是该列,等丁 0为是key_val = key_maprow * 4 + col; / 获取键值 return;/退出循环/tmp2右移1位tmp2 «= 1;*检测按键,并获取键值*void key_event(void)uchar tmp;p1out &二 0x00; tmp = pun;设置p1out全为0,等待按键输入/获取plinif (key_pressed = oxoo)&&(tmp & oxof) < oxof) /如
10、果有键按下key_pressed = 1;如果有按键按下,设置key_pressed标识delay(1200); check_key();消除抖动/调用check_key(),获取键值else 讦(key_pressed =1)&&(tmp & oxof) = oxof) 如果按键已经释放tkey_pressed = 0; key_flag= 1;/ 清除 key_pressed 标识设置key_flag标识else_nop();lcdl602.hvoid dispstr(unsigned char x,unsigned char y,unsigned char *pt
11、r);void dispnchar(unsigned char x,unsigned char y, unsigned char nunsigned char *ptr);void locatexy(unsigned char x,unsigned char y);void displchar(unsigned char xunsigned char “unsigned char data);void lcdreset(void);void lcdwritecommand(unsigned char cmd,unsigned char chk);void lcdwritedata( unsig
12、ned char data );void waitforenable(void);void delay5ms(void);void delay400ms(void);extern unsigned char temp_set;lcdl602.c#include <msp430xl4x.h>#include "lcdl602.h"include "keypad.h"typedef unsigned char uchar; typedef unsigned int uint;uchar temp_set=htemp set:_._h; uchar
13、 temp_now="temp now:1'*/* 方定义 *#define datadirp4dir#define data portp4out#define busy#define ctrldir0x80p3dir#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 #d
14、efine set_en p3out|=bit2;/* 让液晶从某个位置起连续显示一个字符串x-位置的列坐标位置的行坐标pt 一指向字符串存放位置的指针*void dispstr(uchar x,uchar y,uchar *ptr) uchar *temp;uchar i,n 二 0;temp = ptr;while(*ptr+ != 'xo')n+;计算字符串有效字符的个数for (i=0;ivn;i+)displchar(x+/y/tempi);if (x = oxof)x = 0;y a= i;让液晶从某个位置起连续显示n个字符 x-位置的列坐标y-位置的行坐标n-字符
15、个数ptr-指向字符存放位置的指针void dispnchar(uchar x,uchar y, uchar n,uchar *ptr)uchar i;for (i=0;ivn;i+)displchar(x+,y/ptri); if (x = oxof)x = 0;y a= i;*功 能:向液晶输入显示字符位置的坐标信息参 数:x位置的列坐标 y“位置的行坐标*void locatexy(uchar x,uchar y)uchar temp;temp = x&oxof;y &二 0x01;if(y) temp | = 0x40; 如果在第 2 行 temp |= 0x80;lc
16、dwritecommand(temp,l);/*功 能:在某个位置显示一个字符参 数:x-位置的列坐标y-位置的行坐标data-显示的字符数据*void displcharfuchar x,uchar y,uchar data) locatexyf x, y);lcdwritedata( data );*led reset:对1602液晶模块进行复位操作* * * * * *void lcdreset(void)ctrldir | = 0x07;datadir = oxff;控制线端口设为输出状态数据端口设为输出状态lcdwritecommand(0x3& 0);delay5ms();
17、lcdwritecommand(0x3& 0);delay5ms();lcdwritecommand(0x38, 0);delay5ms();规定的复位操作lcdwritecommand(0x3 & 1); lcdwritecommand(0x08,1);显示模式设置显示关闭lcdwritecommand(0x01z 1);lcdwritecommand(0x06,1);lcdwritecommand(oxoc, 1);dispnchar(0,0,14,temp_set);dispnchar(0,l,9,temp_now); 显示清屏写字符时整体不移动显示开,不开游标,不闪烁显
18、示预设温度提示显小实时温度提小/*函数名称:ledwritecommand功 能:向液晶模块写入命令参 数:cmd命令,chk是否判忙的标志,1:判忙,0:不判 */ void lcdwritecommand(uchar cmd,uchar chk)if (chk) waitforenable(); / 检测忙信号?clr_rs;clr_rw;_nop();dataport = emd; _nop();set_en;_nop();_nop();clr_en;将命令字写入数据端口产生使能脉冲信号函数名称:lcdwritedata功 能:向液品显示的当前地址写入显示数据参 数:data-显示字符数
19、据 返回值:无*void lcdwritedata) 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(
20、p4in & busy)!=0); 检测忙标志clr_en;p4dir |=0xff; 将p4 口切换为输出状态*delay5ms:延时约 5ms* * * * * *void delay5ms(void)uint i=40000; while (i != 0) *delay400ms:延时约 400ms*void delay400ms(void) uchar i=50;uint j;while(i-)j=7269; while(j-);dsl8b20.hvoid delaynus(unsigned int n);unsigned char lnit_18b20(void);void
21、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 dolconvert(void);void disp_numb(unsigned int temper);void disp_18b20(void);extern unsigned char dn;要显示的6位温度数字extern unsigned int temp_now_2;温
22、度值的十六进制存储dsl8b20.c#inelude <msp430xl4x.h>#inelude "dsl8b20.hn#include "lcdl602.h"#include "control.h"typedef unsigned char uchar;typedef unsigned int uint;#define dq1 p5out |= bit6#define dqo p5out &二 bit6#define dq_in p5dir &二 bit6#define dq_out p5dir |= bit6#
23、define dq_val (p5in & bit6)unsigned char dn;耍显示的6位温度数字unsigned int temp_now_2=0; 温度值的十六进制存储void disp_18b20(void)disp_numb(dolc on vert();displchar(9,l,dn5+0x30);displchar(10,lzdn4+0x30);displchar(ll,l,0x2e);/0x2e 是小数点对应的 ascii 码值displchar(12,l,dn3+0x30);displchar(13,l,dn2+0x30);/ displchar(14,l,
24、dnl+0x30);/ displchar(15,l,dn0+0x30);if (sure!=o) compare);/* 函数名称:delaynus功能:实现n个微秒的延吋参数:n-延时长度返回值:无说明 :定时器a的计数时钟是1mhz, cpu主频8mhz所以通过定时器延时能够得到极为精确的 us级延时*void delaynus(uint n)ccro = n;增计数到ccro等待停止计数清除屮断标志tactl |=mc_1; while(!(tactl & bito);tactl &二tactl &二 bit0;/me*函数名称:lnit_18b20功 能:对d
25、s18b20进行复位操作参 数:无返回值:初始化状态标志:1“失败,0“成功*uchar lnit_18b20(void) uchar error;dq_out;_dint();dqo;delaynus(500);dq1;delaynus(55);dqjn; _nop();if(dq_val)error = 1;初始化失败elseerror = 0;dq_out;dql;_eint();初始化成功delaynus(400);return error;/* 函数名称:write_18b20功能:向ds18b20写入一个字节的数据参数:wdata-写入的数据返回值:无 *void write_18
26、b20(uchar wdata)uchar i;_dint(); for(i = 0; i< 8;i+)dq0;delaynus(6); if(wdata & 0x01) else wdata »= 1; delaynus(50); dq1; delaynus(lo);_eint();/*延时6usdq1;dq0;延时50us延时lous函数名称: 功 能: 参 数: 返回值:read_18b20从ds18b20读取一个字节的数据 无读出的一个字节数据uchar read_18b20(void)uchar i;uchar temp = 0;_dint();for(i =
27、 0;i < 8;i+)temp »= 1;dqo;delaynus;延时 6usdq1;delaynus(8);延时 9usdqjn;_nop();if(dq_val) temp | = 0x80;delaynus(45);延时 45usdq_out;dq1;delaynus(lo);延吋 lous_eint();return temp;/* * * * 函数名称:skip功能:发送跳过读取产品id号命令参数:无返回值:无* * * * * * *void skip(void)write_18b20(0xcc);/* * * * * 函数名称:convert功能:发送温度转换
28、命令参数:无返回值:无* * * * * *void convert(void)write_18b20(0x44);*函数名称:read_sp功 能:发送读scratchpad命令参 数:无返回值:无*void read_sp(void)write_18b20(0xbe);函数名称:功 能:参 数: 返回值:/*readtemp从ds18b20的scratchpad读取温度转换结果无读取的温度数值 *uint readtemp(void)uchar tempjow;uint temp;tempjow = read_18b20();读低位temp = read_18b20();读高位temp =
29、 (temp«8) | tempjow; temp_now_2=temp;return temp;/*功 能:控制ds18b20完成一次温度转换 返回值:测量的温度数值*uint dolconvert(void)uchar i;doi = lnit_18b2o();while(i);skip();convert();for(i = 20;i > 0;i-)delaynus(60000); /延时 800ms 以上doi = lnit_18b20(); while(i); skip();read_sp(); return readtempo;函数名称:disp_numb功能:将从
30、ds18b20读収的libit温度数据转换成液晶显示的温度数字参数:temper-libit温度数据返回值:无*/void disp_numb(uint temper)uchar i;for(i = 0;i < 6;i+) dni = 0; /初始化显示变量数值转换 if(temper & bito) dno = 5; dnl = 2; dn2 = 6; if(temper&bitl)dnl += 5; dn2 += 2; dn3 += 1;if(temper & bit2) dn2 += 5; dn3 += 2;if(dn2 >= 10)dn-=10;dn
31、3 += 1;if(temper&bit3)dn3 += 5;if(temper & bit4)dn4 += 1;ifftemper & bit5)dn4 += 2;if(temper & bit6)dn4 += 4;if(temper & bit7)dn4 += 8;if(dn4 >= 10)dn4 -= 10; dn5 += 1;ifftemper & bit8)dn4 += 6;dn5 += 1;if(dn4 >= 10)dn4 -= 10; dn5 += 1;ifftemper & bit9)dn4 += 2;dn5
32、+= 3;if(dn4 >= 10)dn4 -= 10;dn5 += 1;if(temper & bita)dn4 += 4;dn5 += 6;if(dn4 >= 10)dn4 -= 10; dn5 += 1;if(dn5 >= 10)dn5 -= 10;control.hvoid temp_disp(void);void temp_ok(void);void temp_clr(void);void compare(void);unsigned intten2two(void);float two2f(unsigned int cjg);float pid_suanf
33、a(float a_set,float b_now);void lnit_wdt(void);extern unsigned char sure;extern unsigned int temp_set_2;control.c#inelude <msp430xl4x.h>#inelude "keypad.h"#include "lcdl602.h"#include "dsl8b2o.hn#include "control.hh#define kp 3.3 /pid算法比例系数#define ki 0.002/pid算法积分
34、系数#define kd 0.3/pid算法微分系数float fzf=o;/pid返回值做控制用float u2=0;float e3=0;unsigned char j=0;unsigned char flag=0;定时器计数标志位unsigned char key;设定温度寄存器unsigned char ent = 0;记录显示位数的全局变量unsigned char sure=0;确定键标志unsigned int temp_set_2=0;记录设定温度的十六进制数float temp_set_f,temp _no w_f;/* 显示键盘输入的温度void temp_disp(voi
35、d)if(cnt<5)if(cnt=o) keyo=key_val-'o'讦(cnt=l)keyl=key_val-'o'if (cnt=2)key2=key_val-'o'cnt+;if(cnt=4) key3=key_val-'o'displchar(9+cnt,0,key_val);cnt+;y*5输入温度与设定温度进行比较* * * */void compare(void)temp_set_f=two2f(temp_set_2); te m p_n o w_f 二 t wo 2f (te m p_n o w_2);j
36、f (temp_set_f-2.5>temp_now_f)p5out |= bit5;p5out &二 bit7;else if(temp_set_f+0.13>temp_now_f)p5out & =bit7; fzf=pid_suanfa(temp_set_f,temp_now_f); lnit_wdt();elsewdtctl 二 wdtpw+wdthold;关闭看门狗p5out &二 bit5;p5out |= bit7;temp_clr:清除键按下*void temp_clr(void)unsigned char tempr;dispnchar(0
37、/0,14,temp_set);cnt=0;sure=0;flag=o;fzf=o;u0=0;ul=0;e0=0;el=0;e2=0;关闭看门狗wdtctl=wdtpw+wdthold;for(tempr=0;tempr<4;tempr+) keytempr=o;p5out &二 bit7;p5out &二 bit5;/*将-1 进制转化为-1 六进制,低四位为小数部分*/unsigned intten2two(void)unsigned int two=0x0000;unsigned char shifen=0,baifen=0;two=key0*10+keyl;two«=4;shife n 二 key2; baife
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纯化水系统试题及答案
- 护理疼痛管理与控制
- 呼吸系统疾病患者的护理教育
- 呼吸衰竭患者电解质紊乱的护理
- 宫颈炎的护理评估
- 呼吸系统疾病患者的护理人文关怀
- 护理沟通中的文化差异与应对
- 护理跨文化护理:应对多元文化
- 护理教育:模拟教学与技能训练
- 【高考真题】黑龙江省2026年高考生物试卷(解析版)
- 保险考试基础知识试题库及答案
- 诊所挂证医师免责协议书
- 家装工长培训课件
- 深度解析(2026)《HJT 55-2000大气污染物无组织排放监测技术导则》(2026年)深度解析
- 物体打击安全教育培训课件
- 2026年四川高考理科综合真题试卷及答案
- 精神障碍患者家属护理常识讲座
- IMPA船舶物料指南(电子版)
- 2025年事业单位工勤人员技师考试职业道德复习题(附答案)
- 人教版高中地理必修第二册期末复习重点知识背诵提纲
- 在职攻读博士管理办法
评论
0/150
提交评论