找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 17600|回復(fù): 31
打印 上一主題 下一主題
收起左側(cè)

(原創(chuàng))基于單片機(jī)的遠(yuǎn)程實(shí)時(shí)溫度監(jiān)控系統(tǒng)設(shè)計(jì) 上位機(jī)詳細(xì)教程(gprs通訊) 源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
采用51單片機(jī)主控的整個(gè)遠(yuǎn)程溫度監(jiān)控系統(tǒng)設(shè)計(jì)出來的實(shí)物圖如下:

  左上角是gprs模塊,需要插入手機(jī)卡才能遠(yuǎn)程通訊。具有串口接口,顯示部分采用的是lcd12864液晶.




原理圖,pcb文件(是用ad畫的附件中可下載工程文件):


詳盡資料在附件中,因網(wǎng)站上傳限制,需要其他相關(guān)資料可留言。這個(gè)設(shè)計(jì)花了大概三個(gè)星期時(shí)間,gprs實(shí)時(shí)通訊方面難度相對(duì)大。望多多指教!

部分源程序預(yù)覽:
  1. /*******************************************************************************
  2. * 實(shí)驗(yàn)名                           :溫度顯示實(shí)驗(yàn)
  3. * 使用的IO             :
  4. * 實(shí)驗(yàn)效果       :1602顯示溫度
  5. *        注意                                         :
  6. *******************************************************************************/

  7. #include<reg51.h>
  8. #include"LCD12864_SPI.h"
  9. #include"temp.h"
  10. #include<math.h>
  11. #include<string.h>

  12. #include <all.h>

  13. sbit K1 = P1^3;
  14. sbit K2 = P1^4;
  15. sbit K3 = P1^5;
  16. sbit K4 = P1^6;
  17. sbit K5 = P1^7;

  18. sbit Buzzer1 = P0^2;
  19. sbit LED1    = P0^0;

  20. sbit Buzzer2 = P0^5;
  21. sbit LED2    = P0^6;

  22. int Temperature = 0;     //用于存儲(chǔ)溫度值
  23. int Deviation = 0;       //1存儲(chǔ)偏差  
  24. int Report = 5000;       //1高溫報(bào)警值

  25. int Temperature1 = 0;     //用于存儲(chǔ)溫度值
  26. int Deviation1 = 0;       //2存儲(chǔ)偏差  
  27. int Report1 = 5000;       //2高溫報(bào)警值

  28. char Set = 0;

  29. unsigned char xdata TCP[] = {"AT+CIPSTART=TCP,103.44.145.245,33601\x0D\x0A"};  //映射的域名對(duì)應(yīng)IP及端口在這里修改

  30. unsigned char dat[8] = {0, 0, 0, 0, 0, 0, 0, 0}; //定義數(shù)組

  31. unsigned int count=0;
  32. unsigned char Flag=0;
  33. unsigned char Num=0;

  34. #define LenRxBuf 50

  35. char  AT_SK[]="\x0D\x0A> ";       // 0D 0A 3E 20         \x0D\x0A
  36. char  AT_Code[]="\x0D\x0AOK";    // 0D 0A 4F 4B 0D 0A
  37. char  CONNECT_OK[]="\x0D\x0ACONNECT OK";  //CONNECT OK // 0D 0A 43 4F 4E 4E 45 43 54 20 4F 4B 0D 0A 0D 0A 4F 4B 0D 0A


  38. char  RsPoint=0;  //發(fā)送  數(shù)組指針

  39. char xdata RsBuf[LenRxBuf];     //接收緩存



  40. void REPORT(int temperature, int report, uchar es);
  41. void UsartConfiguration();
  42. void TX_Char(unsigned char TXData);
  43. void Send_Str(unsigned char *str);
  44. void SendnStr(char *str, char n);//發(fā)送字符串
  45. void Int_Char(int temp);
  46. void ClrRsBuf(char *p, int len);
  47. char WaitOK(char *th, char time);
  48. char Connect_GPRS();
  49. void KeyScan();
  50. int  TempDeal(int temp);
  51. void LcdDisplay(int temp);
  52. void LcdDisplay1(int temp);          //lcd顯示

  53. /*******************************************************************************
  54. * 函數(shù)名         : main
  55. * 函數(shù)功能                   : 主函數(shù)
  56. * 輸入           : 無
  57. * 輸出                  : 無
  58. *******************************************************************************/

  59. void main()
  60. {
  61.         unsigned char i;
  62.         P0=0XFF;
  63.         Buzzer1 = 1;  //熄滅LED及關(guān)閉蜂鳴器
  64.         LED1    = 1;
  65.         Buzzer2 = 1;
  66.         LED2    = 1;
  67.        
  68.         Lcd_Init();                         //初始化LCD12864
  69.         UsartConfiguration(); //初始化串口,波特率9600

  70.         while(1)
  71.         {
  72.                                
  73.                 KeyScan();
  74.                
  75.                 if(Set==0)
  76.                 {                       
  77.                         LcdWriteStr(0x80, "Temp1:", 6);       
  78.                         LcdWriteStr(0x90, "Temp2:", 6);       
  79.                                                                        
  80.                         Temperature = TempDeal(Ds18b20ReadTemp()) + Deviation;
  81.                         Temperature1 = TempDeal(Ds18b20ReadTemp1()) + Deviation1;
  82.                        
  83.                         LcdDisplay(Temperature);  //顯示溫度
  84.                         LcdDisplay1(Temperature1);  //顯示溫度               
  85.                        
  86.                         REPORT(Temperature, Report, 1);  //報(bào)警
  87.                         REPORT(Temperature1, Report1, 2);  //報(bào)警
  88.                                                        
  89.                 }
  90. //                delay_1ms(1000);//1s鐘刷一次
  91.                
  92.                
  93.                 if((count>=200) && (Flag==1))    //10s  
  94.                 {
  95.                         count=0;
  96.                        
  97. //                        ClrRsBuf(RsBuf,50); //清空接收緩沖區(qū)
  98. //                        RsPoint=0;
  99. //                       
  100. //                        ES=0;                                                //關(guān)閉接收中斷
  101. //                        Send_Str("AT+CIPSTATUS\x0D\x0A");    //查詢tcp連接狀態(tài) 0D 0A 0D 0A 2B 43 49 50 53 54 41 54 55 53 3A 30 2C 43 4F 4E 4E 45 43 54 20 4F 4B 20 20 0D 0A
  102. //                        ES=1;                                                //打開接收中斷
  103. //                        if(WaitOK(AT_Code, 10)==1)
  104. //                        {                                            
  105. //                                LcdWriteCom(0x98);  //清空lcd后1行
  106. //                                for(i=0;i<16;i++)
  107. //                                        LcdWriteData(' ');
  108. //                                Flag=1;
  109. //                                LcdWriteStr(0x98, "CONNECT OK", 10);       
  110. //                               
  111.                                
  112.                                 ClrRsBuf(RsBuf,50); //清空接收緩沖區(qū)
  113.                                 RsPoint=0;       
  114.                                
  115.                                 ES=0;                                                //關(guān)閉接收中斷
  116.                                 Send_Str("AT+CIPSEND\x0D\x0A");    //tcp發(fā)送
  117.                                 ES=1;                                                ////打開接收中斷
  118.                                 if(WaitOK(AT_SK, 2)==1)            // '>'  0D 0A 3E 20
  119.                                 {                                                               
  120.                                         ES=0;                                                //關(guān)閉接收中斷
  121.                                         Int_Char(Temperature);
  122.                                         Send_Str("節(jié)點(diǎn)1溫度值為:");
  123.                                         SendnStr(dat,8);
  124.                                         Send_Str(";\x0A");       
  125.                                        
  126.                                         Int_Char(Temperature1);
  127.                                         Send_Str("節(jié)點(diǎn)2溫度值為:");               
  128.                                         SendnStr(dat,8);
  129.                                         Send_Str(";\x0A\x1A");               
  130.                                         ES=1;                                                ////打開接收中斷
  131.                                        
  132.                                         switch(WaitOK(AT_Code, 3))
  133.                                         {
  134.                                                 case 0:       
  135.                                                                         {
  136.                                                                                 LcdWriteCom(0x98);  //清空lcd后1行
  137.                                                                                 for(i=0;i<16;i++)
  138.                                                                                         LcdWriteData(' ');
  139.                                                                                 LcdWriteStr(0x98, "SEND FAIL", 9);
  140.                                                                                 Num++;
  141.                                                                                 if(Num==10)
  142.                                                                                 {
  143.                                                                                         Num=0;
  144.                                                                                         Flag=0;
  145.                                                                                         LcdWriteCom(0x88);  //清空lcd后2行
  146.                                                                                         for(i=0;i<16;i++)
  147.                                                                                                 LcdWriteData(' ');
  148.                                                                                         LcdWriteCom(0x98);
  149.                                                                                         for(i=0;i<16;i++)
  150.                                                                                                 LcdWriteData(' ');
  151.                                                                                 }
  152.                                                                         }
  153.                                                                         break;
  154.                                                                        
  155.                                                 case 1:       
  156.                                                                         {
  157.                                                                                 LcdWriteCom(0x98);  //清空lcd后1行
  158.                                                                                 for(i=0;i<16;i++)
  159.                                                                                         LcdWriteData(' ');
  160.                                                                                 LcdWriteStr(0x98, "SEND SUCCESS", 12);
  161.                                                                                 Flag=1;
  162.                                                                         }
  163.                                                                         break;
  164.                                                                        
  165.                                                 default:
  166.                                                                         break;
  167.                                         }
  168.                                 }
  169.                                
  170.                 }
  171.                                        
  172.         }
  173.        
  174. }
  175. /*******************************************************************************
  176. * 函數(shù)名         : Int_Char
  177. * 函數(shù)功能                   : 整形數(shù)據(jù)轉(zhuǎn)換為字符型
  178. * 輸入           : temp
  179. * 輸出                  : 無
  180. *******************************************************************************/
  181. void Int_Char(int temp)
  182. {
  183.        
  184.         dat[0] = (temp % 10000 / 1000)+0x30;
  185.         dat[1] = (temp % 1000 / 100)+0x30;
  186.         dat[2] = '.';
  187.         dat[3] = (temp % 100 / 10)+0x30;
  188.         dat[4] = (temp % 10)+0x30;
  189.         dat[5] = '\xA1';
  190.         dat[6] = '\xE3';
  191.         dat[7] = 'C';
  192. }
  193. /*******************************************************************************
  194. * 函數(shù)名         : REPORT(int temperature, int report, uchar es)
  195. * 函數(shù)功能                   : 報(bào)警處理,
  196. * 輸入           : 采集的溫度:temperature;報(bào)警溫度:report; 節(jié)點(diǎn)選擇:es
  197. * 輸出                  : 無
  198. *******************************************************************************/
  199. void REPORT(int temperature, int report, uchar es)
  200. {
  201.         switch(es)
  202.         {       
  203.                 case 1:       
  204.                                         {
  205.                                                 if(temperature>=report)   //報(bào)警temperature
  206.                                                 {
  207.                                                         Buzzer1 = 0;
  208.                                                         LED1    = 0;
  209.                                                                                                                                                                        
  210.                                                 }
  211.                                                 else
  212.                                                 {
  213.                                                         Buzzer1 = 1;
  214.                                                         LED1    = 1;
  215.                                                 }                                               
  216.                                         }
  217.                                         break;
  218.                                        
  219.                 case 2:       
  220.                                         {
  221.                                                 if(temperature>=report)   //報(bào)警
  222.                                                 {
  223.                                                         Buzzer2 = 0;
  224.                                                         LED2    = 0;                       
  225.                                                 }
  226.                                                 else
  227.                                                 {
  228.                                                         Buzzer2 = 1;
  229.                                                         LED2    = 1;
  230.                                                 }                                               
  231.                                         }
  232.                                         break;
  233.                                        
  234.                 default:               
  235.                                         break;
  236.         }
  237. }
  238. /*******************************************************************************
  239. * 函數(shù)名         :UsartConfiguration()
  240. * 函數(shù)功能                   :設(shè)置串口
  241. * 輸入           : 無
  242. * 輸出                  : 無
  243. *******************************************************************************/

  244. void UsartConfiguration()
  245. {
  246.         SCON=0X50;                        //設(shè)置為工作方式1
  247.         TMOD=0X21;                        //設(shè)置計(jì)數(shù)器1工作方式2;定時(shí)器 0工作方式1
  248.         PCON=0X80;                        //波特率加倍
  249.         TH1=0XFA;                                //計(jì)數(shù)器初始值設(shè)置,注意波特率是9600;4800的f3
  250.         TL1=0XFA;
  251.        
  252.         TH0=0X3C;                                //定時(shí)50ms
  253.         TL0=0XB0;
  254.        
  255.         ES=0;                                                //bu打開接收中斷
  256.         ET0=1;                                                //打開定時(shí)器0中斷
  257.         EA=1;                                                //打開總中斷
  258.        
  259.         TR1=1;                                        //打開計(jì)數(shù)器1
  260.         TR0=0;                                        //關(guān)閉定時(shí)器0
  261. }
  262. /*******************************************************************************
  263. * 函數(shù)名         : TX_Char(unsigned char TXData)
  264. * 函數(shù)功能                   : 串口發(fā)送字符
  265. * 輸入           : TXData
  266. * 輸出                  : 無
  267. *******************************************************************************/
  268. void TX_Char(unsigned char TXData)
  269. {
  270.         SBUF=TXData;     //發(fā)送數(shù)據(jù)
  271.         while(!TI);                         //等待發(fā)送數(shù)據(jù)完成
  272.         TI=0;                                                 //清除發(fā)送完成標(biāo)志位
  273. }
  274. /*******************************************************************************
  275. * 函數(shù)名         : TX_Char(unsigned char TXData)
  276. * 函數(shù)功能                   : 串口發(fā)送字符串
  277. * 輸入           : TXData
  278. * 輸出                  : 無
  279. *******************************************************************************/
  280. void Send_Str(unsigned char *str)//發(fā)送字符串
  281. {

  282.         while(*str!='\0')
  283.         {
  284.                 TX_Char(*str);
  285.                 str++;
  286.         }
  287. }            

  288. /*******************************************************************************
  289. * 函數(shù)名         : SendnStr(char *str, char n)
  290. * 函數(shù)功能                   : 串口發(fā)送n字節(jié)字符串
  291. * 輸入           : TXData
  292. * 輸出                  : 無
  293. *******************************************************************************/
  294. void SendnStr(char *str, char n)//發(fā)送字符串
  295. {

  296.         while((n--) && (*str!='\0'))
  297.         {
  298.                 TX_Char(*str);
  299.                 str++;
  300.         }
  301. }            
  302. /*******************************************************************************
  303. * 函數(shù)名         : ClrRsBuf(char *p,int len)
  304. * 函數(shù)功能                   : 清空p指針里len字節(jié)長(zhǎng)度的內(nèi)存
  305. * 輸入           : 指針:p  ; 清空長(zhǎng)度:len
  306. * 輸出                  : 無
  307. *******************************************************************************/
  308. void  ClrRsBuf(char *p,int len) //清空
  309. {          
  310.           while(len--)
  311.           {
  312.                         *p='\0';
  313.                          p++;
  314.           }
  315. }

  316. /*******************************************************************************
  317. * 函數(shù)名         : strncmp ( char * s1, char * s2, size_t n)
  318. * 函數(shù)功能                   :比較str1與str2的前n個(gè)字符,相同返回0;不同返回( *s1 - *s2 )
  319. * 輸入           : 指針:str1  ; 指針:str2 ;長(zhǎng)度:n
  320. * 輸出                  : 比較結(jié)果相同返回0;不同返回( *s1 - *s2 )
  321. *******************************************************************************/
  322. char strncmp ( char * s1, char * s2, size_t n)
  323. {
  324.   if ( !n )    //n為0,則返回0
  325.    return(0);
  326.   //在接下來的while循環(huán)中
  327.   //第一個(gè)循環(huán)條件:--n,如果比較到前n個(gè)字符,則退出循環(huán)
  328.   //第二個(gè)循環(huán)條件:*s1,如果s1指向字符串末尾,則退出循環(huán)
  329.   //第三個(gè)循環(huán)條件:*s1 == *s2,如果兩字符不等,則退出循環(huán)
  330.   while (--n && *s1 && *s1 == *s2)
  331.   {
  332.      s1++;
  333.      s2++;
  334.   }
  335.   return( *s1 - *s2 );
  336. }
  337. /*******************************************************************************
  338. * 函數(shù)名         : strlen(const char *str)
  339. * 函數(shù)功能                   : 求指針的長(zhǎng)度
  340. * 輸入           : 指針:str  
  341. * 輸出                  : 指針的長(zhǎng)度
  342. *******************************************************************************/
  343. size_t strlen(const char *str)
  344. {  
  345.     size_t length = 0;  
  346.     while (*str++)  
  347.         ++length;  
  348.     return length;  
  349. }  
  350. /*******************************************************************************
  351. * 函數(shù)名         : *strstr( const char *s1, const char *s2 )
  352. * 函數(shù)功能                   : 找出s2字符串在s1字符串中第一次出現(xiàn)的位置
  353. * 輸入           : 指針:s1  ; 指針:s2
  354. * 輸出                  : 返回該位置的指針,如找不到則返回NULL
  355. *******************************************************************************/
  356. char *strstr( const char *s1, const char *s2 )
  357. {
  358.   int len2;
  359.   if ( !(len2 = strlen(s2)) )
  360.   return (char *)s1;
  361.   for ( ; *s1; ++s1 )
  362. {
  363.   if ( *s1 == *s2 && strncmp( s1, s2, len2 )==0 )
  364.   return (char *)s1;
  365. }
  366.   return NULL;
  367. }
  368. /*******************************************************************************
  369. * 函數(shù)名         : WaitOK(uchar *th, uchar time)
  370. * 函數(shù)功能                   : 等待time s的時(shí)間,判斷6A模組返回信息是否OK
  371. * 輸入           : 指針:th  ; 等待時(shí)間:time
  372. * 輸出                  : OK返回1,否則返回0
  373. *******************************************************************************/
  374. char WaitOK(char *th, char time)
  375. {
  376.         while(time--)
  377.         {
  378.                 if(strstr(RsBuf,th) != NULL)            //strncmp
  379.                 {
  380.                         return 1;
  381.                 }
  382.                        
  383.                 else
  384.                 {
  385.                         if(time!=0)                               
  386.                                 delay_1ms(1000);
  387.                 }
  388.         }
  389.         return 0;
  390. }

  391. /*******************************************************************************
  392. * 函數(shù)名         : Connect_GPRS()
  393. * 函數(shù)功能                   : 連接GPRS
  394. * 輸入           : 無
  395. * 輸出                  : 無
  396. *******************************************************************************/
  397. char Connect_GPRS()
  398. {
  399.         char i;       
  400.        
  401.         ClrRsBuf(RsBuf,50); //清空接收緩沖區(qū) AT_Code
  402.         RsPoint=0;        
  403.         ES=0;                                                //關(guān)閉接收中斷
  404.         Send_Str("ATE0\x0D\x0A");    //ATE0:關(guān)閉回顯;  ATE1:打開回顯
  405.         ES=1;                                                //打開接收中斷
  406.         if(WaitOK(AT_Code, 10)!=1)     
  407.                 return 0;
  408.        
  409.         ClrRsBuf(RsBuf,50); //清空接收緩沖區(qū) AT_Code
  410.         RsPoint=0;        
  411.         ES=0;                                                //關(guān)閉接收中斷
  412.         Send_Str("AT+CGATT=1\x0D\x0A");    //GPRS 附著;     AT+CGATT=0 GPRS分離
  413.         ES=1;                                                //打開接收中斷
  414.         if(WaitOK(AT_Code, 10)!=1)     
  415.                 return 0;
  416.        
  417.         ClrRsBuf(RsBuf,50); //清空接收緩沖區(qū) AT_Code
  418.         RsPoint=0;
  419.         ES=0;                                                //關(guān)閉接收中斷
  420.         Send_Str("AT+CGACT=1,1\x0D\x0A");  //PDP上下文激活   去激活:AT+CGACT=0,1
  421.         ES=1;                                                //打開接收中斷
  422.         if(WaitOK(AT_Code, 10)!=1)     
  423.                 return 0;
  424.        
  425.         ClrRsBuf(RsBuf,50); //清空接收緩沖區(qū) AT_Code
  426.         RsPoint=0;
  427.         ES=0;                                                //關(guān)閉接收中斷
  428.         Send_Str("AT+CIFSR\x0D\x0A");      //查詢 IP 地址
  429.         ES=1;                                                //打開接收中斷
  430.         if(WaitOK(AT_Code,10)==1)
  431.         {
  432.                 LcdWriteCom(0x88); //清空第3行
  433.                 for(i=0;i<16;i++)
  434.                         LcdWriteData(' ');
  435.                 LcdWriteCom(0x88);
  436.                
  437.                 for(i=2;i<17;i++)
  438.                 {
  439.                         if((RsBuf[i]!='\x0D')&&(RsBuf[i]!='\x0A')&&(RsBuf[i]!=' '))                               
  440.                                 LcdWriteData(RsBuf[i]);               
  441.                 }
  442.         }       
  443.        
  444.         ClrRsBuf(RsBuf,50); //清空接收緩沖區(qū) AT_Code
  445.         RsPoint=0;
  446.         ES=0;                                                //關(guān)閉接收中斷
  447.         Send_Str(TCP);                 //GPRS TCP 連接
  448.         ES=1;                                                //打開接收中斷
  449.         if(WaitOK(AT_Code,10)==1)                  //strncmp(RsBuf+17,CONNECT_OK, 10)==0   WaitOK(CONNECT_OK, 10)==1
  450.         {
  451.                 LcdWriteCom(0x98);  //清空lcd后1行
  452.                 for(i=0;i<16;i++)
  453.                         LcdWriteData(' ');

  454.                 LcdWriteStr(0x98, "CONNECT OK", 10);
  455.                 Flag=1;  //置GPRS連接標(biāo)志               
  456.                
  457.                 return 1;                               
  458.         }       
  459.        

  460.                 LcdWriteCom(0x88);  //清空lcd后1行
  461.                 for(i=0;i<16;i++)
  462.                         LcdWriteData(' ');
  463.                 LcdWriteCom(0x98);  //清空lcd后1行
  464.                 for(i=0;i<16;i++)
  465.                         LcdWriteData(' ');

  466.                 LcdWriteStr(0x98, "CONNECT ERROR", 13);
  467.                 Flag=0;   //清GPRS連接標(biāo)志
  468.                                
  469.                 return 0;       
  470.                
  471. }

  472. /*******************************************************************************
  473. * 函數(shù)名         : void Usart()
  474. * 函數(shù)功能                   : 串口中斷函數(shù)
  475. * 輸入           : 無
  476. * 輸出                  : 無
  477. *******************************************************************************/
  478. void Usart() interrupt 4 using 3
  479. {
  480.         if(RI==1)
  481.   {
  482.     RI=0;
  483.     RsBuf[RsPoint++]=SBUF;
  484.     if (RsPoint>=50)
  485.     {
  486.                         ES=0;                                                //關(guān)閉接收中斷
  487.       RsPoint=50;
  488.     }  
  489.   }
  490. }

  491. /*******************************************************************************
  492. * 函數(shù)名         : Timer0
  493. * 函數(shù)功能                   : 定時(shí)器0中斷函數(shù)
  494. * 輸入           : 無
  495. * 輸出                  : 無
  496. *******************************************************************************/
  497. void Timer0() interrupt 1 using 3
  498. {
  499.         TH0=0X3C;                                //重裝定時(shí)值50ms
  500.         TL0=0XB0;
  501.         count++;
  502.        
  503. }
  504. /*******************************************************************************
  505. * 函數(shù)名         : KeyScan
  506. * 函數(shù)功能                   : 按鍵檢測(cè)函數(shù)
  507. * 輸入           : 無
  508. * 輸出                  : 無
  509. *******************************************************************************/
  510. void KeyScan()
  511. {
  512.         unsigned char i=0;
  513.         int Dev;
  514.        
  515.         K1=1;
  516.         if(K1==0)                //檢測(cè)按鍵K1是否按下
  517.                 {
  518.                         delay_1ms(10);        //消除抖動(dòng)
  519.                         if(K1==0)               //按鍵1按下時(shí)執(zhí)行該動(dòng)作
  520.                         {
  521.                                
  522.                                 Set += 1;         
  523.                                 if(Set==5)
  524.                                         Set=0;
  525.                                
  526.                                 LcdWriteCom(0x01);           //寫入空格清屏幕
  527.                        
  528.                                 LcdWriteCom(0x80);           //設(shè)定首行顯示位置
  529.                                
  530.                                 if(Set==1)
  531.                                 {
  532.                                                 LcdWriteStr(0x80, "Correct Temp1:", 14);       
  533.                                                
  534.                                                 LcdWriteCom(0x91);           //設(shè)定顯示位置
  535.                                                
  536.                                                 if(Deviation == 0)
  537.                                                         LcdWriteData(' ');                  //顯示
  538.                                                 if(Deviation > 0)
  539.                                                         LcdWriteData('+');                  //顯示正
  540.                                                 if(Deviation < 0)
  541.                                                         LcdWriteData('-');                  //顯示負(fù)
  542.                                                
  543.                                                 Dev = abs(Deviation);
  544.                                                
  545.                                                 dat[0] = Dev % 1000 / 100;
  546.                                                 dat[1] = Dev % 100 / 10;
  547.                                                 dat[2] = Dev % 10;
  548.                                                
  549.                                                 LcdWriteData('0'+dat[0]); //個(gè)位
  550.                                                 LcdWriteData('.');                     //顯示 ‘.’
  551.                                                 LcdWriteData('0'+dat[1]); //十分位
  552.                                                 LcdWriteData('0'+dat[2]); //百分位
  553.                                                 LcdWriteData(' ');
  554.                                                 LcdWriteData('C');
  555.                                 }
  556.                                
  557.                                 if(Set==2)
  558.                                 {
  559.                                                 LcdWriteStr(0x80, "Correct Temp2:", 14);       
  560.                                                
  561.                                                 LcdWriteCom(0x91);           //設(shè)定顯示位置
  562.                                                
  563.                                                 if(Deviation1 == 0)
  564.                                                         LcdWriteData(' ');                  //顯示
  565.                                                 if(Deviation1 > 0)
  566.                                                         LcdWriteData('+');                  //顯示正
  567.                                                 if(Deviation1 < 0)
  568.                                                         LcdWriteData('-');                  //顯示負(fù)
  569.                                                
  570.                                                 Dev = abs(Deviation1);
  571.                                                
  572.                                                 dat[0] = Dev % 1000 / 100;
  573.                                                 dat[1] = Dev % 100 / 10;
  574.                                                 dat[2] = Dev % 10;
  575.                                                
  576.                                                 LcdWriteData('0'+dat[0]); //個(gè)位
  577.                                                 LcdWriteData('.');                     //顯示 ‘.’
  578.                                                 LcdWriteData('0'+dat[1]); //十分位
  579.                                                 LcdWriteData('0'+dat[2]); //百分位
  580.                                                 LcdWriteData(' ');
  581.                                                 LcdWriteData('C');
  582.                                 }
  583.                                
  584.                                 if(Set==3)
  585.                                 {
  586.                                                 LcdWriteStr(0x80, "High Ring1:", 10);       
  587.                                                
  588.                                                 LcdWriteCom(0x91);           //設(shè)定顯示位置
  589.                                                
  590.                                                 if(Report == 0)
  591.                                                         LcdWriteData(' ');                  //顯示
  592.                                                 if(Report > 0)
  593.                                                         LcdWriteData('+');                  //顯示正
  594.                                                 if(Report < 0)
  595.                                                         LcdWriteData('-');                  //顯示負(fù)
  596.                                                
  597.                                                 Dev = abs(Report);
  598.                                                
  599.                                                 dat[0] = Dev % 10000 / 1000;
  600.                                                 dat[1] = Dev % 1000 / 100;
  601.                                                 dat[2] = Dev % 100 / 10;
  602.                                                 dat[3] = Dev % 10;
  603.                                                
  604.                                                 LcdWriteData('0'+dat[0]); //十位
  605.                                                 LcdWriteData('0'+dat[1]); //個(gè)位
  606.                                                 LcdWriteData('.');                     //顯示 ‘.’
  607.                                                 LcdWriteData('0'+dat[2]); //十分位
  608.                                                 LcdWriteData('0'+dat[3]); //百分位
  609.                                                 LcdWriteData(' ');
  610.                                                 LcdWriteData('C');
  611.                                 }
  612.                                
  613.                                 if(Set==4)
  614.                                 {
  615.                                                 LcdWriteStr(0x80, "High Ring2:", 10);       
  616.                                                
  617.                                                 LcdWriteCom(0x91);           //設(shè)定顯示位置
  618.                                                
  619.                                                 if(Report1 == 0)
  620.                                                         LcdWriteData(' ');                  //顯示
  621.                                                 if(Report1 > 0)
  622.                                                         LcdWriteData('+');                  //顯示正
  623.                                                 if(Report1 < 0)
  624.                                                         LcdWriteData('-');                  //顯示負(fù)
  625.                                                
  626.                                                 Dev = abs(Report1);
  627.                                                
  628.                                                 dat[0] = Dev % 10000 / 1000;
  629.                                                 dat[1] = Dev % 1000 / 100;
  630.                                                 dat[2] = Dev % 100 / 10;
  631.                                                 dat[3] = Dev % 10;
  632.                                                
  633.                                                 LcdWriteData('0'+dat[0]); //十位
  634.                                                 LcdWriteData('0'+dat[1]); //個(gè)位
  635.                                                 LcdWriteData('.');                     //顯示 ‘.’
  636.                                                 LcdWriteData('0'+dat[2]); //十分位
  637.                                                 LcdWriteData('0'+dat[3]); //百分位
  638.                                                 LcdWriteData(' ');
  639.                                                 LcdWriteData('C');
  640.                                 }
  641.                                
  642.                                 while((i<50)&&(K1==0))         //檢測(cè)按鍵是否松開
  643.                                 {
  644.                                         delay_1ms(10);
  645.                                         i++;
  646.                                 }
  647.                                 i=0;
  648.                         }
  649.                 }       
  650.        
  651.         K2=1;
  652.         if(K2==0)                //檢測(cè)按鍵K1是否按下
  653.                 {
  654.                         delay_1ms(10);        //消除抖動(dòng)
  655.                         if(K2==0)
  656.                         {
  657.        
  658.                                 if(Set==1)
  659.                                 {
  660.                                                 Deviation += 10;        //按鍵2按下時(shí)執(zhí)行該動(dòng)作,按一下溫度值正向糾正 0.1°C,最多糾正5°C
  661.                                                 if(Deviation >= 500)
  662.                                                 {       
  663.                                                         Deviation = 500;
  664.                                                 }
  665.                                                 LcdWriteCom(0x91);           //設(shè)定顯示位置
  666.                                                
  667.                                                 if(Deviation == 0)
  668.                                                         LcdWriteData(' ');                  //顯示
  669.                                                 if(Deviation > 0)
  670.                                                         LcdWriteData('+');                  //顯示正
  671.                                                 if(Deviation < 0)
  672.                                                         LcdWriteData('-');                  //顯示負(fù)
  673.                                                
  674.                                                 Dev = abs(Deviation);
  675.                                                
  676.                                                 dat[0] = Dev % 1000 / 100;
  677.                                                 dat[1] = Dev % 100 / 10;
  678.                                                 dat[2] = Dev % 10;
  679.                                                
  680.                                                 LcdWriteData('0'+dat[0]); //個(gè)位
  681.                                                 LcdWriteData('.');                     //顯示 ‘.’
  682.                                                 LcdWriteData('0'+dat[1]); //十分位
  683.                                                 LcdWriteData('0'+dat[2]); //百分位
  684.                                                 LcdWriteData(' ');
  685.                                                 LcdWriteData('C');
  686.                           }
  687.                                
  688.                                 if(Set==2)
  689.                                 {
  690.                                                 Deviation1 += 10;        //按鍵2按下時(shí)執(zhí)行該動(dòng)作,按一下溫度值正向糾正 0.1°C,最多糾正5°C
  691.                                                 if(Deviation1 >= 500)
  692.                                                 {       
  693.                                                         Deviation1 = 500;
  694.                                                 }
  695.                                                 LcdWriteCom(0x91);           //設(shè)定顯示位置
  696.                                                
  697.                                                 if(Deviation1 == 0)
  698.                                                         LcdWriteData(' ');                  //顯示
  699.                                                 if(Deviation1 > 0)
  700.                                                         LcdWriteData('+');                  //顯示正
  701.                                                 if(Deviation1 < 0)
  702.                                                         LcdWriteData('-');                  //顯示負(fù)
  703.                                                
  704.                                                 Dev = abs(Deviation1);
  705.                                                
  706.                                                 dat[0] = Dev % 1000 / 100;
  707.                                                 dat[1] = Dev % 100 / 10;
  708.                                                 dat[2] = Dev % 10;
  709.                                                
  710.                                                 LcdWriteData('0'+dat[0]); //個(gè)位
  711.                                                 LcdWriteData('.');                     //顯示 ‘.’
  712.                                                 LcdWriteData('0'+dat[1]); //十分位
  713.                                                 LcdWriteData('0'+dat[2]); //百分位
  714.                                                 LcdWriteData(' ');
  715.                                                 LcdWriteData('C');
  716.                           }
  717.                                
  718.                                 if(Set==3)
  719.                                 {
  720.                                                 Report += 10;        //按鍵2按下時(shí)執(zhí)行該動(dòng)作,按一下溫度報(bào)警值正向增加0.1°C
  721.                                                 if(Report >= 9000)
  722.                                                 {       
  723.                                                         Report = 9000;
  724.                                                 }
  725.                                                
  726. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………

復(fù)制代碼



資料下載:
程序 原理圖 用到的包括串口助手,服務(wù)器等資料.zip (4 MB, 下載次數(shù): 405)

評(píng)分

參與人數(shù) 3黑幣 +113 收起 理由
as252585425 + 8 資料很全面。非常好
shenlan121 + 5 贊一個(gè)!
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏19 分享淘帖 頂4 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:192050 發(fā)表于 2017-4-25 18:53 | 只看該作者
該模塊的主芯片換成了51
回復(fù)

使用道具 舉報(bào)

板凳
ID:192050 發(fā)表于 2017-4-25 18:54 | 只看該作者
通訊過程的調(diào)試,連接成功視頻可以私發(fā)
回復(fù)

使用道具 舉報(bào)

地板
ID:209529 發(fā)表于 2017-6-19 12:55 | 只看該作者
學(xué)習(xí)了,簡(jiǎn)潔明了。感謝樓主的分享。。。。
回復(fù)

使用道具 舉報(bào)

5#
ID:209659 發(fā)表于 2017-6-28 15:13 | 只看該作者
我做了1個(gè)基于51單片機(jī)的溫度檢測(cè)器,通過串口和A7模塊相連。但是有一個(gè)問題A7模塊要求串口波特率必須為115200,我用的是STC89c52芯片普中的板在串口調(diào)試時(shí)為什么只有4800才正常發(fā)送數(shù)據(jù)?這樣就和A7通信不了了
回復(fù)

使用道具 舉報(bào)

6#
ID:234120 發(fā)表于 2017-9-20 21:56 | 只看該作者
好東西,謝謝樓主,希望留個(gè)聯(lián)系方式,咱們一起學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

7#
ID:254981 發(fā)表于 2017-12-5 22:03 | 只看該作者
有做仿真嗎?程序在哪份文件?
回復(fù)

使用道具 舉報(bào)

8#
ID:161033 發(fā)表于 2018-1-14 23:22 | 只看該作者
感謝分享。
回復(fù)

使用道具 舉報(bào)

9#
ID:82765 發(fā)表于 2018-1-15 12:21 | 只看該作者

呼叫管理員,為什么下載后是亂碼呢

回復(fù)

使用道具 舉報(bào)

10#
ID:1 發(fā)表于 2018-3-1 02:27 | 只看該作者
剛下載看了,不是亂碼啊
回復(fù)

使用道具 舉報(bào)

11#
ID:295854 發(fā)表于 2018-3-23 10:59 | 只看該作者
樓主你好,我畢設(shè)正好做有關(guān)基于無線的環(huán)境檢測(cè),能發(fā)我一些相關(guān)資料嗎
回復(fù)

使用道具 舉報(bào)

12#
ID:295854 發(fā)表于 2018-3-23 11:00 | 只看該作者
我的郵箱985082400@qq.com
回復(fù)

使用道具 舉報(bào)

13#
ID:296103 發(fā)表于 2018-3-23 20:24 | 只看該作者
樓主你好,我畢設(shè)正好做有關(guān)基于無線的環(huán)境檢測(cè),能發(fā)我一些相關(guān)資料嗎
回復(fù)

使用道具 舉報(bào)

14#
ID:296276 發(fā)表于 2018-3-24 11:19 | 只看該作者
感謝樓主分享。
回復(fù)

使用道具 舉報(bào)

15#
ID:296923 發(fā)表于 2018-3-25 20:55 | 只看該作者
學(xué)習(xí)學(xué)習(xí) 支持一下
回復(fù)

使用道具 舉報(bào)

16#
ID:209367 發(fā)表于 2018-3-26 09:36 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

17#
ID:209367 發(fā)表于 2018-3-26 10:09 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

18#
ID:303042 發(fā)表于 2018-4-7 10:51 | 只看該作者
可以發(fā)一下鏈接嗎?
回復(fù)

使用道具 舉報(bào)

19#
ID:318352 發(fā)表于 2018-4-28 14:12 | 只看該作者
好資源
回復(fù)

使用道具 舉報(bào)

20#
ID:337022 發(fā)表于 2018-5-24 08:40 | 只看該作者
學(xué)習(xí)學(xué)習(xí),感謝樓主分享!
回復(fù)

使用道具 舉報(bào)

21#
ID:79874 發(fā)表于 2018-6-22 11:36 | 只看該作者

我做了1個(gè)基于51單片機(jī)的溫度檢測(cè)器,通過串口和A7模塊相連。但是有一個(gè)問題A7模塊要求串口波特率必須為115200,我用的是STC89c52芯片普中的板在串口調(diào)試時(shí)為什么只有4800才正常發(fā)送數(shù)據(jù)?這樣就和A7通信不了了 ,能不傳一份51的我
回復(fù)

使用道具 舉報(bào)

22#
ID:336340 發(fā)表于 2018-7-9 14:58 | 只看該作者
沒有用
回復(fù)

使用道具 舉報(bào)

23#
ID:380389 發(fā)表于 2018-7-29 10:10 來自手機(jī) | 只看該作者
這是好東西啊,趕緊收藏
回復(fù)

使用道具 舉報(bào)

24#
ID:335688 發(fā)表于 2018-12-22 22:15 | 只看該作者

感謝樓主分享。
回復(fù)

使用道具 舉報(bào)

25#
ID:640249 發(fā)表于 2019-11-12 10:37 | 只看該作者
資料很全面,程序很好用,感謝樓主
回復(fù)

使用道具 舉報(bào)

26#
ID:640249 發(fā)表于 2019-11-12 11:44 來自手機(jī) | 只看該作者
樓主你好
回復(fù)

使用道具 舉報(bào)

27#
ID:640249 發(fā)表于 2019-11-12 11:53 來自手機(jī) | 只看該作者
怎么看下載的
回復(fù)

使用道具 舉報(bào)

28#
ID:642152 發(fā)表于 2019-11-16 10:08 | 只看該作者
我的資料里面沒有GPRS網(wǎng)絡(luò)通訊。。。
回復(fù)

使用道具 舉報(bào)

29#
ID:632095 發(fā)表于 2019-11-29 17:24 來自手機(jī) | 只看該作者
corey666 發(fā)表于 2017-4-25 18:54
通訊過程的調(diào)試,連接成功視頻可以私發(fā)

可以分享下嗎
回復(fù)

使用道具 舉報(bào)

30#
ID:350104 發(fā)表于 2019-11-29 21:45 | 只看該作者
資料很全 不錯(cuò) 支持了
回復(fù)

使用道具 舉報(bào)

31#
ID:620993 發(fā)表于 2019-11-30 10:13 | 只看該作者
很好的學(xué)習(xí)資料,很全面,感謝樓主
回復(fù)

使用道具 舉報(bào)

32#
ID:7175 發(fā)表于 2020-5-17 18:17 | 只看該作者
我的資料里面沒有GPRS網(wǎng)絡(luò)通訊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表