基于PSOC3的多點溫度采集系統(tǒng)_第1頁
基于PSOC3的多點溫度采集系統(tǒng)_第2頁
基于PSOC3的多點溫度采集系統(tǒng)_第3頁
基于PSOC3的多點溫度采集系統(tǒng)_第4頁
基于PSOC3的多點溫度采集系統(tǒng)_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、電子系統(tǒng)綜合實訓(xùn) 基于PSOC3多點溫度采集系統(tǒng)一、 設(shè)計目的及要求1、基于PSOC3設(shè)計多點溫度采集系統(tǒng),要求設(shè)立三個節(jié)點,即一個主機和兩個從機。2、主機為0號機,兩個從機分別為1號機和2號機。3、0號機與PC、1號機、2號機相連,1號機與0號機相連,2號機與0號機相連。4、1,2號機測得溫度后匯總給0號機,0號機測得本機溫度后一并將三個節(jié)點的數(shù)據(jù)報送給PC。5、PC可以向0號機發(fā)送命令,命令如下:(1)開啟溫度采樣 start_all 開啟所有節(jié)點溫度采樣 start_n (n=0,1,2)開啟單一節(jié)點溫度采樣(2)關(guān)閉溫度采樣 stop_all stop_n (n=0,1,2)(3)設(shè)置

2、溫度上、下限 tem_h_all=xx.x tem_l_all=xx.x tem_h_n=xx.x (n=0,1,2) tem_l_n=xx.x (n=0,1,2)(4)設(shè)置數(shù)據(jù)發(fā)送周期 t=x.xs(5)設(shè)置節(jié)點修改權(quán)限 au_all_en au_n_en (n=0,1,2) au_all_dis au_n_dis (n=0,1,2)6、在PC端顯示數(shù)據(jù)的格式如下: No.o:溫度,門限,權(quán)限; No.1:溫度,門限,權(quán)限; No.2:溫度,門限,權(quán)限;二、 設(shè)計方案本設(shè)計采用PSOC3實驗板,用到的模塊有LCD1602模塊,ADC模塊、LM35、UART串口通信、BELL蜂鳴器。檢測溫度時

3、,利用ADC轉(zhuǎn)換數(shù)據(jù)得到溫度值:溫度值=ADC讀數(shù)/實際電壓*216/參考電壓其中實際電壓設(shè)置為1.25V即1250mV,參考電壓為10mV。檢測到溫度后存儲并以一定格式在LCD上顯示數(shù)據(jù)。0號機通過不停的查詢PC端發(fā)出命令,來對本機或1、2號機器進行操作,0號機向PC報送數(shù)據(jù)時,因為要設(shè)置報送周期,所以報送數(shù)據(jù)是在一個循環(huán)里面,此時對于其他命令利用中斷來實現(xiàn)。0號機查詢1、2號子機的溫度時,首先向1 (2)號子機發(fā)送start_1 (start_2)之后等待1、2號機以字符串形式報送溫度數(shù)據(jù),0號機收到數(shù)據(jù)后存儲。同時子機在不停的掃描從主機收到的指令,若收到start_1 (start_2)

4、則檢測溫度后存儲并以字符串形式報送給主機,若收到改變溫度上下限的命令則更改報警上下閾值。三、 原理圖設(shè)計及配置其中主機將用到所有模塊,子機只用到UART 1模塊、LCD、ADC、BELL。其中三個UART模塊配置相同,兩個Timer配置相同端口配置如下四、程序流程圖開始主機初始化各模塊Check0號機ADC轉(zhuǎn)換測得溫度,并存儲判斷溫 度蜂鳴器報警 溫度達到上下限 溫度未達到上下限LCD顯示溫度向1,2,號機發(fā)送start n(1,2)1,2號機反饋數(shù)據(jù),0號機儲存等待接收PC機命令判斷命 令Start nStop,n Stop,n(0,1,2,all) start n (0,1,2,all)

5、一級中斷 一級中斷 不使能n號機發(fā)送權(quán)使能n號機發(fā)送權(quán) t=x.xscheck au_n_en 一級中斷au_n_discheck 或二級中斷tem_h_n Send 0 tem_l_n n=(0,1,2,all) Send 0溫度上下限,發(fā)送周期,權(quán)限發(fā)生改變 子機開始子機檢查命令 判斷命 令 Start n 其它采集n號機器溫度 tem_h_n tem_l_n判斷溫度 溫度達到上下限蜂鳴器報警 溫度未達到上下限向主機報送數(shù)據(jù)改變溫度警告上下限四、 測試結(jié)果五、 源代碼0號機(主機)#include #include uint8 ch=A;uint8 jflag=0x00;uint8 tem

6、perture= .aa;uint8 shi0,ge0,xiao0,temhs0,temhg0,temhx0,temls0,temlg0,temlx0;uint8 shi1,ge1,xiao1,temhs1,temhg1,temhx1,temls1,temlg1,temlx1;uint8 shi2,ge2,xiao2,temhs2,temhg2,temhx2,temls2,temlg2,temlx2;uint8 send0enable=0;/發(fā)送功能使能uint8 send1enable=0;/發(fā)送功能使能uint8 send2enable=0;/發(fā)送功能使能char rxbuff=e 0s;

7、char rxbuff1=yy.y;char rxbuff2=xx.x;char au=NULL;char au1=NULL;char au2=NULL;char en=EN ;char dis=DIS;char temh0=33.0 ;/溫度上限char teml0=11.0 ;/溫度下限char temh1=33.0 ;/溫度上限char teml1=11.0 ;/溫度下限char temh2=33.0 ;/溫度上限char teml2=11.0 ;/溫度下限uint16 zhengshu;uint16 xiaoshu; uint32 subtime=1000;#define ROW_0

8、0 /* LCD row 0 */ #define COLUMN_0 0 /* LCD column 0*/#define COLUMN_9 9 /*LCD column 9*/#define COLUMN_12 12 /*LCD column 10*/#define COLUMN_13 13 /*LCD column 11*/#define CLEAR_TENS_HUNDREDS /*For clearing Tens and Hundreds place*/#define CLEAR_HUNDREDS /*For clearing Hundreds place*/uint8 tmpStat

9、;void wendu();void wendu1();void wendu2();void UpdateDisplay(float voltageRawCount);void UpdateDisplay (float voltageRawCount);void check();void comand();void send0();void start_0();void start_1();void start_2();void stop_0();void stop_1();void stop_2();void tem_h_0();void tem_h_1();void tem_h_2();v

10、oid tem_l_0();void tem_l_1();void tem_l_2();void sendtime();void au_0_en();void au_1_en();void au_2_en();void au_0_dis();void au_1_dis();void au_2_dis();volatile toggle_flag=0;CY_ISR_PROTO(timer1_isr);volatile time_flag=0;CY_ISR_PROTO(timer2_isr);void main() CyGlobalIntEnable; /* Enable interrupts *

11、/ UART_1_Start(); /* Start UART */ UART_2_Start(); UART_3_Start(); Timer_1_Start(); / isr_1_Start(); isr_2_Start(); isr_3_Start(); isr_4_Start(); isr_2_SetVector(timer1_isr); Timer_2_Start(); isr_3_SetVector(timer2_isr); LCD_Char_1_Start(); /* Initialize and clear the LCD */ LCD_Char_1_ClearDisplay(

12、); CyDelay(30); /* Appropriate delay could be used */ while(1) check(); /不停的掃描命令 有命令時操作 void wendu() float voltageRawCount; ADC_DelSig_1_Start(); /* Configure and power up ADC */ LCD_Char_1_Start(); /* Initialize and clear the LCD */ LCD_Char_1_Position(ROW_0,COLUMN_0); /* Move the cursor to Row 0,

13、Column 0 */ LCD_Char_1_PrintString(No.0 temperture: );ADC_DelSig_1_StartConvert(); /* Force ADC to initiate a conversion */ ADC_DelSig_1_IsEndConversion(ADC_DelSig_1_WAIT_FOR_RESULT); /* Wait for end of conversion */ voltageRawCount = ADC_DelSig_1_GetResult16(); /* Get conversion result */* ADC coun

14、t errata workaround */ voltageRawCount =voltageRawCount/65536*1250/10; UpdateDisplay(voltageRawCount); /* Print result on LCD */ void wendu1() int j=0; UART_2_PutString(start_1); while(1) ch=UART_2_GetChar(); rxbuff1j=ch; if(ch=0)break; j+; CyDelay(100); shi1=rxbuff10;ge1=rxbuff11;xiao1=rxbuff13; /s

15、hi1=50;ge1=49;xiao1=48;/tempflag/void wendu2() int j=0; UART_3_PutString(start_2); while(1) ch=UART_3_GetChar(); rxbuff2j=ch; if(ch=0)break; j+; CyDelay(100); shi2=rxbuff20;ge2=rxbuff21;xiao2=rxbuff23; /shi1=50;ge1=49;xiao1=48;/tempflag/void UpdateDisplay (float voltageRawCount) zhengshu=voltageRawC

16、ount; xiaoshu=(voltageRawCount*100-zhengshu*100)/10; shi0=zhengshu/10+48; ge0=zhengshu%10+48; xiao0=xiaoshu+48; if(temh00=shi0&temh01=ge0) BELL_Write(0x01u); CyDelay(1000); BELL_Write(0x00u); if(teml00=shi0&teml01=ge0) BELL_Write(0x01u); CyDelay(1000); BELL_Write(0x00u); LCD_Char_1_Position(1,ROW_0)

17、; /* Move the cursor to Row 0, Column 9 */ LCD_Char_1_PrintNumber(zhengshu); /* Print the result */ CyDelay(3); LCD_Char_1_PrintString(.); LCD_Char_1_PrintNumber(xiaoshu); /* Print the result */LCD_Char_1_PrintNumber(voltageRawCount); /* Print the result */ LCD_Char_1_Position(1,4); /* Move the curs

18、or to Row 0, Column 11 */ LCD_Char_1_PrintString(CLEAR_HUNDREDS); /* Clear last characters */ CyDelay(10); void send0()/發(fā)送所有數(shù)據(jù)到PC if(send0enable=1)/*第0號機器報送*/ UART_1_PutString(nNo.0:); CyDelay(3); UART_1_WriteTxData(shi0); /溫度十位 UART_1_WriteTxData(ge0); /溫度個位 UART_1_PutString(.); UART_1_WriteTxData(

19、xiao0); /溫度小數(shù) UART_1_PutString(,(); UART_1_PutString(teml0); /溫度警告上限 UART_1_PutString(,); UART_1_PutString(temh0); /溫度警告下限 CyDelay(3); UART_1_PutString(),); UART_1_PutString(au); /權(quán)限 UART_1_PutString(;); CyDelay(3); elseUART_1_PutString(nNo.0 OFF);/ if(send1enable=1)/*第1號機器報送*/ UART_1_PutString(nNo.

20、1:); CyDelay(3); UART_1_WriteTxData(shi1); /溫度十位 UART_1_WriteTxData(ge1); /溫度個位 UART_1_PutString(.); UART_1_WriteTxData(xiao1); /溫度小數(shù) UART_1_PutString(,(); UART_1_PutString(teml1); /溫度警告上限 UART_1_PutString(,); UART_1_PutString(temh1); /溫度警告下限 UART_1_PutString(),); UART_1_PutString(au1); /權(quán)限 CyDelay(

21、3); elseUART_1_PutString(nNo.1 OFF);/ if(send2enable=1)/*第2號機器報送*/ UART_1_PutString(nNo.2:); CyDelay(3); UART_1_WriteTxData(shi2); /溫度十位 UART_1_WriteTxData(ge2); /溫度個位 UART_1_PutString(.); UART_1_WriteTxData(xiao2); /溫度小數(shù) UART_1_PutString(,(); UART_1_PutString(teml2); /溫度警告上限 UART_1_PutString(,); UA

22、RT_1_PutString(temh2); /溫度警告下限 UART_1_PutString(),); UART_1_PutString(au2); /權(quán)限 UART_1_PutString(;n); CyDelay(3); elseUART_1_PutString(nNo.2 OFF);/ UART_1_PutString(n); /sendenable=0x00u; CyDelay(subtime); / /檢查是否接受命令,并存儲命令/void check() int j=0; wendu(); wendu1(); wendu2(); if(jflag=0x00u) while(1)

23、ch=UART_1_GetChar(); rxbuffj=ch; if(ch=0)break; j+; CyDelay(10);comand(); /檢查命令void comand()/start_all if(rxbuff0=s&rxbuff2=a&rxbuff6=a) start_0();start_1();start_2(); while(1) if(toggle_flag=1)check(); send0enable=1;send1enable=1;send2enable=1; send0(); toggle_flag=0; /start_0 if(rxbuff0=s&rxbuff2=

24、a&rxbuff6=0) start_0(); while(1) if(toggle_flag=1)check(); send0enable=1; send0(); /start_1 if(rxbuff0=s&rxbuff2=a&rxbuff6=1) start_1(); while(1) if(toggle_flag=1)check();send1enable=1; send0(); /start_2 if(rxbuff0=s&rxbuff2=a&rxbuff6=2) start_2(); while(1) if(toggle_flag=1)check();send2enable=1; se

25、nd0(); /stop_all if(rxbuff0=s&rxbuff2=o&rxbuff5=a) stop_0();stop_1();stop_2(); while(1) if(toggle_flag=1)check();send0enable=0;send1enable=0;send2enable=0; send0(); /stop_0 if(rxbuff0=s&rxbuff2=o&rxbuff5=0) stop_0(); while(1) if(toggle_flag=1)check();send0enable=0; send0(); /stop_1 if(rxbuff0=s&rxbu

26、ff2=o&rxbuff5=1) stop_1(); while(1) if(toggle_flag=1)check();send1enable=0; send0(); /stop_2 if(rxbuff0=s&rxbuff2=o&rxbuff5=2) stop_2(); while(1) if(toggle_flag=1)check();send2enable=0; send0(); /設(shè)置數(shù)據(jù)發(fā)送周期t=x.xs if(rxbuff0=t&rxbuff1=&rxbuff3=.) sendtime(); /au_all_en if(rxbuff0=a&rxbuff1=u&rxbuff3=a&

27、rxbuff7=e) au_0_en();au_1_en();au_2_en(); /au_all_dis if(rxbuff0=a&rxbuff1=u&rxbuff3=a&rxbuff7=d) au_0_dis();au_1_dis();au_2_dis();/au_0_en if(rxbuff0=a&rxbuff1=u&rxbuff3=0&rxbuff5=e) au_0_en(); /au_0_dis if(rxbuff0=a&rxbuff1=u&rxbuff3=0&rxbuff5=d) au_0_dis();/au_1_en if(rxbuff0=a&rxbuff1=u&rxbuff3=

28、1&rxbuff5=e) au_1_en(); /au_1_dis if(rxbuff0=a&rxbuff1=u&rxbuff3=1&rxbuff5=d) au_1_dis();/au_2_en if(rxbuff0=a&rxbuff1=u&rxbuff3=2&rxbuff5=e) au_2_en(); /au_2_dis if(rxbuff0=a&rxbuff1=u&rxbuff3=2&rxbuff5=d) au_2_dis();/ /tem_h_0=xx.x if(rxbuff0=t&rxbuff1=e&rxbuff4=h&rxbuff6=0) tem_h_0();/tem_l_0=xx.

29、x if(rxbuff0=t&rxbuff1=e&rxbuff4=l&rxbuff6=0) tem_l_0();/tem_h_1=xx.x if(rxbuff0=t&rxbuff1=e&rxbuff4=h&rxbuff6=1) tem_h_1();/tem_l_1=xx.x if(rxbuff0=t&rxbuff1=e&rxbuff4=l&rxbuff6=1) tem_l_1();/tem_h_2=xx.x if(rxbuff0=t&rxbuff1=e&rxbuff4=h&rxbuff6=2) tem_h_2();/tem_l_2=xx.x if(rxbuff0=t&rxbuff1=e&rxb

30、uff4=l&rxbuff6=2) tem_l_2();/CY_ISR(timer1_isr) /掃描中斷Timer_1_ReadStatusRegister();toggle_flag=1;CY_ISR(timer2_isr) /上報中斷Timer_2_ReadStatusRegister();time_flag=1;void start_0() send0enable=1; if(toggle_flag=1) UART_1_PutString(nstart_0); void start_1() int j=0; if(toggle_flag=1) UART_1_PutString(nsta

31、rt_1);void start_2() int j=0; if(toggle_flag=1) UART_1_PutString(nstart_2); void stop_0() if(toggle_flag=1)UART_1_PutString(nNo.0:NULL,NULL,OFF;);UART_1_PutString(nstop_0); void stop_1() if(toggle_flag=1)UART_1_PutString(nNo.1:NULL,NULL,OFF;);UART_1_PutString(nstop_1); void stop_2() if(toggle_flag=1

32、)UART_1_PutString(nNo.2:NULL,NULL,OFF;);UART_1_PutString(nstop_2); void sendtime() int x,y; if(time_flag=1)x=rxbuff2-48;y=rxbuff4-48; UART_1_PutString(nSubtime was set as:); CyDelay(3);subtime=(x+0.1*y)*1000;/計算之前吧asc碼轉(zhuǎn)換為數(shù)值 UART_1_WriteTxData(x+48); UART_1_PutString(.); UART_1_WriteTxData(y+48); UAR

33、T_1_PutString(s); void au_0_en() if(time_flag=1)UART_1_PutString(nau_0_en); strcpy(au,en); LCD_Char_1_ClearDisplay(); LCD_Char_1_Position(0,ROW_0); /* Move the cursor to Row 0, Column 9 */ LCD_Char_1_PrintString(No.0 was enabled); CyDelay(2000); LCD_Char_1_ClearDisplay(); check(); void au_1_en() if(

34、time_flag=1)UART_1_PutString(nau_1_en); strcpy(au1,en); LCD_Char_1_ClearDisplay(); LCD_Char_1_Position(0,ROW_0); /* Move the cursor to Row 0, Column 9 */ LCD_Char_1_PrintString(No.1 was enabled); CyDelay(2000); LCD_Char_1_ClearDisplay(); check(); void au_2_en() if(time_flag=1)UART_1_PutString(nau_2_

35、en); strcpy(au2,en); LCD_Char_1_ClearDisplay(); LCD_Char_1_Position(0,ROW_0); /* Move the cursor to Row 0, Column 9 */ LCD_Char_1_PrintString(No.2 was enabled); CyDelay(2000); LCD_Char_1_ClearDisplay(); check(); void au_0_dis() if(time_flag=1)UART_1_PutString(nau_0_en); strcpy(au,dis); LCD_Char_1_ClearDisplay(); LCD_Char_1_Position(0,ROW_0); /* Move the cursor to Row 0, Column 9 */ LCD_Char_1_P

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論