基于51單片機與藍牙Android溫度監測系統,提供安卓app的源碼和下位機單片機端的代碼
下面是原理圖:
0.png (52.43 KB, 下載次數: 141)
下載附件
2017-5-4 23:13 上傳
0.png (62.25 KB, 下載次數: 158)
下載附件
2017-5-4 23:15 上傳
單片機源碼如下:
-
- /*****************************************************************
- * 此部分為主程序
- *控制數碼管的顯示 以及定義發向串口的函數
- *!!!
- *此程序只能與上位機程序配合使用,或者修改相應上位機代碼
- ******************************************************************/
- #include <reg52.H>
- extern GetTemp(); //聲明引用外部函數
- extern unsigned int idata Temperature; // 聲明引用外部變量
-
- extern STC_send_bluetooth(unsigned char a); //聲明外部函數,與串口相關
- extern Serial_port_init();
- extern ctrl();
- extern unsigned char tmp;
- extern void Init18b20(void);
- extern bit flag;//DS18B20是否損壞標志位,1為完好
- void send();//處理18B20發來的溫度值,將各個位分別存儲,并控制發向串口
- void delay(unsigned int i);//延時程序
- //138的C、B、A端 用于數碼管的位選
- sbit LS138A=P2^2; //管腳定義
- sbit LS138B=P2^3;
- sbit LS138C=P2^4;
- sbit PowerDown=P2^1; //若18B20損壞,指示燈滅
-
- //此表為 LED 的字模, 共陰數碼管 0-9 -
- unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
- unsigned long LedOut[3],LedNumVal;
- unsigned char num[3];
- unsigned char end_char; //定義串口發送結束符
- unsigned char ARQFlag=0;//請求重發標志位,若為0,表示不重發
- unsigned char AutoSendFlag=0;//為了減小硬件帶來的誤差,單片機用于重新發送給上位機的標志位
- /********************************
- *判斷18B20是否損壞或未連接
- *若損壞或未連接,發給上位機FF作為提示
- *************************************/
- bit Is_18B20()
- {
- Init18b20();
- if(!flag)
- {
- STC_send_bluetooth(0x46); //字符F
- delay(500); //發送完一個字符加一定的延時
- STC_send_bluetooth(0x46);
- delay(500);
- STC_send_bluetooth(0x43); //字符C的ASCII碼,作為此次發送完畢的結束標?
-
- delay(5000); //稍微延長延時,等待發送完畢
- PowerDown=1; //指示燈滅
- PCON |= 0x02; //單片機進入停機模式,此時內部晶振停振,只能靠外部INT0~3引腳喚醒或復位
- return 0;
- }
- return 1;
- }
- /********************************
- *定時器中斷相關初始化
- *********************************/
- void system_Init()
- {
- TMOD&=0xF0;
- TMOD|= 0x01;
- TH0 = 0xD8; //10ms
- TL0 = 0xF0;
- TR0 = 1;
- ET0=1;
- EA=1;
- }
- /************************************************************************************
- *主函數,用于定時器中斷,波特率發生器初始化,處理串口數據,以及數碼管的顯示
- ************************************************************************************/
- void main()
- {
- unsigned char i;
- end_char='C';
- Serial_port_init();
- system_Init();
- //delay(1050);
- // 1000 19.57ms
- //800 15.67
- //1200 23.49
- //1100 21.52
- //1050 20.55
- if(Is_18B20()) //若18B20沒有損壞,則繼續執行
- {
- while(1)
- {
- if(RI==1) // 是否有數據到來
- {
- RI = 0;
- tmp = SBUF; // 暫存接收到的數據
- ctrl(); //根據接收的字符做出相應的處理
- }
- GetTemp(); //獲取溫度
- /********以下將讀18b20的數據送到LED數碼管顯示*************/
-
- for(i=0; i<2; i++)
- {
- P0 = LedOut[i] ;
-
- switch(i)
- { //138譯碼
- case 0:LS138C=0;LS138B=0;LS138A=0; break;
- case 1:LS138C=0;LS138B=0;LS138A=1; break; //001B 表示位選第一個數碼管
- //case 2:LS138C=0;LS138B=1;LS138A=0; break;
- }
-
- delay(100);
- }
-
- P0 = 0;
-
- }
- }
- }
- /**********************************************
- *延時程序
- **********************************************/
- void delay(unsigned int i)
- {
- char j;
- for(i; i > 0; i--)
- for(j = 200; j > 0; j--);
- }
- /******************************************
- *單片機串口發送函數
- ******************************************/
- void send()
- {
- if(AutoSendFlag==20) //當單片機有20秒沒有發送數據給上位機時,發送一次數據,防止硬件誤差
- {
- AutoSendFlag='s';
- }
- if((LedNumVal)==(Temperature) && ARQFlag==0&&AutoSendFlag!='s') // 溫度值與上次相等并且不要求重發,則不執行send()發送到串口
- {
- return;
- }
- else
- {
- LedNumVal=Temperature; //把實際溫度送到LedNumVal變量中
- num[0]= LedNumVal%100/10;
- num[1]= LedNumVal%10;
- /* //若需要小數后一位的數據
- num[0]= (LedNumVal/100)%10; //十位
- num[1]= (LedNumVal/10)%10; //個位
- num[2]= LedNumVal%10; //小數點后一位
- */
- delay(1050);
- STC_send_bluetooth(num[0]+0x30);
- delay(1050); //發送完一個字符加一定的延時
- STC_send_bluetooth(num[1]+0x30);
- delay(1050); //15.67ms
- STC_send_bluetooth(0x43); //字符C的ASCII碼,作為此次發送完畢的結束標志
- delay(1050);
- LedOut[0]=Disp_Tab[num[0]]; //溫度的十位
- LedOut[1]=Disp_Tab[num[1]]; //溫度的個位
- //LedOut[2]=Disp_Tab[num[2]]; //溫度的小數后一位
- if(ARQFlag) //若是上位機請求重發的,此時ARQFlag為1,需要手動置0
-
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料打包下載:
Android的溫度采集系統源碼.zip
(1.75 MB, 下載次數: 434)
2017-5-4 23:09 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|