版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、說明本系統(tǒng)采用的是msp430f149單片機,軟件用的是ira embedded workbench4.20.1版本。 并附開發(fā)板原理圖此系統(tǒng)程序包含鍵盤掃描程序,溫度獲取程序(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(); 函數(shù)聲明int main (void)wdtctl=wdtpw+wdthold; 關(guān)閉看門狗 廠下面六行程序關(guān)閉所有的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; 關(guān)閉電平轉(zhuǎn)換lnitsys();系統(tǒng)初始化lnit_keypad();鍵盤初始化lcdreset();/led 初始化start: disp_18b20();goto start;* * * * * *系統(tǒng)初始化*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; /計數(shù)時鐘選擇 smlk=8mhz, 1/8 分頻后為 1mhzp5dir |= bit5;p5out &二 bit5;p5dir |= bit7;p5out &二 bit7;加熱器控制端口風(fēng)扇控制端口_eint();打開全局屮斷控制,若不需要打開,可以屏蔽本句/* * 端口 1(鍵盤)中斷函數(shù) */ #pragma vector=port 1_vect0r_int
5、errupt void portl()key_event();判斷按鍵并獲取鍵值if(key_val>16) 輸入為數(shù)字鍵 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“否 設(shè)置鍵盤邏輯鍵值與程序計算鍵值的映射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設(shè)置為列輸入,p1.4p1.7設(shè)置為行輸出p10ut=oxof;p1ifg=oxoo; p1sel=o;plles=oxof; plle=oxof;/ p1.4-p1.7輸出低電平/p1 口設(shè)置為一般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;/退出循環(huán)/tmp2右移1位tmp2 «= 1;*檢測按鍵,并獲取鍵值*void key_event(void)uchar tmp;p1out &二 0x00; tmp = pun;設(shè)置p1out全為0,等待按鍵輸入/獲取plinif (key_pressed = oxoo)&&(tmp & oxof) < oxof) /如
10、果有鍵按下key_pressed = 1;如果有按鍵按下,設(shè)置key_pressed標識delay(1200); check_key();消除抖動/調(diào)用check_key(),獲取鍵值else 訐(key_pressed =1)&&(tmp & oxof) = oxof) 如果按鍵已經(jīng)釋放tkey_pressed = 0; key_flag= 1;/ 清除 key_pressed 標識設(shè)置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ù)顯示一個字符串x-位置的列坐標位置的行坐標pt 一指向字符串存放位置的指針*void dispstr(uchar x,uchar y,uchar *ptr) uchar *temp;uchar i,n 二 0;temp = ptr;while(*ptr+ != 'xo')n+;計算字符串有效字符的個數(shù)for (i=0;ivn;i+)displchar(x+/y/tempi);if (x = oxof)x = 0;y a= i;讓液晶從某個位置起連續(xù)顯示n個字符 x-位置的列坐標y-位置的行坐標n-字符
15、個數(shù)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;*功 能:向液晶輸入顯示字符位置的坐標信息參 數(shù):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);/*功 能:在某個位置顯示一個字符參 數(shù):x-位置的列坐標y-位置的行坐標data-顯示的字符數(shù)據(jù)*void displcharfuchar x,uchar y,uchar data) locatexyf x, y);lcdwritedata( data );*led reset:對1602液晶模塊進行復(fù)位操作* * * * * *void lcdreset(void)ctrldir | = 0x07;datadir = oxff;控制線端口設(shè)為輸出狀態(tài)數(shù)據(jù)端口設(shè)為輸出狀態(tài)lcdwritecommand(0x3& 0);delay5ms();
17、lcdwritecommand(0x3& 0);delay5ms();lcdwritecommand(0x38, 0);delay5ms();規(guī)定的復(fù)位操作lcdwritecommand(0x3 & 1); lcdwritecommand(0x08,1);顯示模式設(shè)置顯示關(guān)閉lcdwritecommand(0x01z 1);lcdwritecommand(0x06,1);lcdwritecommand(oxoc, 1);dispnchar(0,0,14,temp_set);dispnchar(0,l,9,temp_now); 顯示清屏寫字符時整體不移動顯示開,不開游標,不閃爍顯
18、示預(yù)設(shè)溫度提示顯小實時溫度提小/*函數(shù)名稱:ledwritecommand功 能:向液晶模塊寫入命令參 數(shù):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;將命令字寫入數(shù)據(jù)端口產(chǎn)生使能脈沖信號函數(shù)名稱:lcdwritedata功 能:向液品顯示的當前地址寫入顯示數(shù)據(jù)參 數(shù):data-顯示字符數(shù)
19、據(jù) 返回值:無*void lcdwritedata) uchar data )waitforenable();等待液晶不忙set_rs; clr_rw;_nop();dataport = data; _nop();將顯示數(shù)據(jù)寫入數(shù)據(jù)端口產(chǎn)生使能脈沖信號set_en; _nop(); _nop();clr_en;/*函數(shù)名稱:waitforenable功 能:等待1602液晶完成內(nèi)部操作*/*void waitforenable(void)p4dir &= 0x00; 將p4 口切換為輸入狀態(tài)clr_rs;set_rw; _nop();set_en;_nop();nop();while(
20、p4in & busy)!=0); 檢測忙標志clr_en;p4dir |=0xff; 將p4 口切換為輸出狀態(tài)*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位溫度數(shù)字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位溫度數(shù)字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 是小數(shù)點對應(yīng)的 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);/* 函數(shù)名稱:delaynus功能:實現(xiàn)n個微秒的延吋參數(shù):n-延時長度返回值:無說明 :定時器a的計數(shù)時鐘是1mhz, cpu主頻8mhz所以通過定時器延時能夠得到極為精確的 us級延時*void delaynus(uint n)ccro = n;增計數(shù)到ccro等待停止計數(shù)清除屮斷標志tactl |=mc_1; while(!(tactl & bito);tactl &二tactl &二 bit0;/me*函數(shù)名稱:lnit_18b20功 能:對d
25、s18b20進行復(fù)位操作參 數(shù):無返回值:初始化狀態(tài)標志: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;/* 函數(shù)名稱:write_18b20功能:向ds18b20寫入一個字節(jié)的數(shù)據(jù)參數(shù):wdata-寫入的數(shù)據(jù)返回值:無 *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函數(shù)名稱: 功 能: 參 數(shù): 返回值:read_18b20從ds18b20讀取一個字節(jié)的數(shù)據(jù) 無讀出的一個字節(jié)數(shù)據(jù)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;/* * * * 函數(shù)名稱:skip功能:發(fā)送跳過讀取產(chǎn)品id號命令參數(shù):無返回值:無* * * * * * *void skip(void)write_18b20(0xcc);/* * * * * 函數(shù)名稱:convert功能:發(fā)送溫度轉(zhuǎn)換
28、命令參數(shù):無返回值:無* * * * * *void convert(void)write_18b20(0x44);*函數(shù)名稱:read_sp功 能:發(fā)送讀scratchpad命令參 數(shù):無返回值:無*void read_sp(void)write_18b20(0xbe);函數(shù)名稱:功 能:參 數(shù): 返回值:/*readtemp從ds18b20的scratchpad讀取溫度轉(zhuǎn)換結(jié)果無讀取的溫度數(shù)值 *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完成一次溫度轉(zhuǎn)換 返回值:測量的溫度數(shù)值*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;函數(shù)名稱:disp_numb功能:將從
30、ds18b20讀収的libit溫度數(shù)據(jù)轉(zhuǎn)換成液晶顯示的溫度數(shù)字參數(shù):temper-libit溫度數(shù)據(jù)返回值:無*/void disp_numb(uint temper)uchar i;for(i = 0;i < 6;i+) dni = 0; /初始化顯示變量數(shù)值轉(zhuǎn)換 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算法比例系數(shù)#define ki 0.002/pid算法積分
34、系數(shù)#define kd 0.3/pid算法微分系數(shù)float fzf=o;/pid返回值做控制用float u2=0;float e3=0;unsigned char j=0;unsigned char flag=0;定時器計數(shù)標志位unsigned char key;設(shè)定溫度寄存器unsigned char ent = 0;記錄顯示位數(shù)的全局變量unsigned char sure=0;確定鍵標志unsigned int temp_set_2=0;記錄設(shè)定溫度的十六進制數(shù)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輸入溫度與設(shè)定溫度進行比較* * * */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;關(guān)閉看門狗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;關(guān)閉看門狗wdtctl=wdtpw+wdthold;for(tempr=0;tempr<4;tempr+) keytempr=o;p5out &二 bit7;p5out &二 bit5;/*將-1 進制轉(zhuǎn)化為-1 六進制,低四位為小數(shù)部分*/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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智慧圖書館整體解決方案
- 卡姿蘭活動策劃方案
- 音樂教育中的教學(xué)方法創(chuàng)新
- 腫瘤治療藥臨床使用管理
- 沉與浮教案反思
- 氧化碳制取的說課稿
- 市政工程招投標授權(quán)委托書
- 橡膠制品損壞賠償指南
- 建筑工程改造系統(tǒng)施工合同范本
- 環(huán)保建設(shè)幼兒園施工合同
- 電焊作業(yè)風(fēng)險分析及管控措施
- 醫(yī)療機構(gòu)管理條例(79張)課件
- 五年級下學(xué)期信息技術(shù)3Done三維制作蘿卜課件
- 設(shè)備故障報修維修記錄單
- DB14∕T 1318-2016 公路采空區(qū)處治工程預(yù)算定額
- 諾瓦科技LED多媒體播放器快速使用指引
- 鋼管靜壓樁質(zhì)量監(jiān)理實施細則Word版(共25頁)
- 《沁園春·長沙》理解性默寫
- 畢業(yè)設(shè)計論文--伊利集團內(nèi)部控制的調(diào)查分析
- GB-T 41233-2022 凍魚糜制品(高清版)
- 羊水栓塞-(PPT)PPT課件
評論
0/150
提交評論