标题: (原创)基于单片机的远程实时温度监控系统设计 上位机详细教程(gprs通讯) 源码 [打印本页]

作者: corey666    时间: 2017-4-21 16:29
标题: (原创)基于单片机的远程实时温度监控系统设计 上位机详细教程(gprs通讯) 源码
采用51单片机主控的整个远程温度监控系统设计出来的实物图如下:

  左上角是gprs模块,需要插入手机卡才能远程通讯。具有串口接口,显示部分采用的是lcd12864液晶.




原理图,pcb文件(是用ad画的附件中可下载工程文件):


详尽资料在附件中,因网站上传限制,需要其他相关资料可留言。这个设计花了大概三个星期时间,gprs实时通讯方面难度相对大。望多多指教!

部分源程序预览:
  1. /*******************************************************************************
  2. * 实验名                           :温度显示实验
  3. * 使用的IO             :
  4. * 实验效果       :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;     //用于存储温度值
  23. int Deviation = 0;       //1存储偏差  
  24. int Report = 5000;       //1高温报警值

  25. int Temperature1 = 0;     //用于存储温度值
  26. int Deviation1 = 0;       //2存储偏差  
  27. int Report1 = 5000;       //2高温报警值

  28. char Set = 0;

  29. unsigned char xdata TCP[] = {"AT+CIPSTART=TCP,103.44.145.245,33601\x0D\x0A"};  //映射的域名对应IP及端口在这里修改

  30. unsigned char dat[8] = {0, 0, 0, 0, 0, 0, 0, 0}; //定义数组

  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;  //发送  数组指针

  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);//发送字符串
  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. * 函数名         : main
  55. * 函数功能                   : 主函数
  56. * 输入           : 无
  57. * 输出                  : 无
  58. *******************************************************************************/

  59. void main()
  60. {
  61.         unsigned char i;
  62.         P0=0XFF;
  63.         Buzzer1 = 1;  //熄灭LED及关闭蜂鸣器
  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);  //报警
  87.                         REPORT(Temperature1, Report1, 2);  //报警
  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); //清空接收缓冲区
  98. //                        RsPoint=0;
  99. //                       
  100. //                        ES=0;                                                //关闭接收中断
  101. //                        Send_Str("AT+CIPSTATUS\x0D\x0A");    //查询tcp连接状态 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); //清空接收缓冲区
  113.                                 RsPoint=0;       
  114.                                
  115.                                 ES=0;                                                //关闭接收中断
  116.                                 Send_Str("AT+CIPSEND\x0D\x0A");    //tcp发送
  117.                                 ES=1;                                                ////打开接收中断
  118.                                 if(WaitOK(AT_SK, 2)==1)            // '>'  0D 0A 3E 20
  119.                                 {                                                               
  120.                                         ES=0;                                                //关闭接收中断
  121.                                         Int_Char(Temperature);
  122.                                         Send_Str("节点1温度值为:");
  123.                                         SendnStr(dat,8);
  124.                                         Send_Str(";\x0A");       
  125.                                        
  126.                                         Int_Char(Temperature1);
  127.                                         Send_Str("节点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. * 函数名         : Int_Char
  177. * 函数功能                   : 整形数据转换为字符型
  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. * 函数名         : REPORT(int temperature, int report, uchar es)
  195. * 函数功能                   : 报警处理,
  196. * 输入           : 采集的温度:temperature;报警温度:report; 节点选择: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)   //报警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)   //报警
  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. * 函数名         :UsartConfiguration()
  240. * 函数功能                   :设置串口
  241. * 输入           : 无
  242. * 输出                  : 无
  243. *******************************************************************************/

  244. void UsartConfiguration()
  245. {
  246.         SCON=0X50;                        //设置为工作方式1
  247.         TMOD=0X21;                        //设置计数器1工作方式2;定时器 0工作方式1
  248.         PCON=0X80;                        //波特率加倍
  249.         TH1=0XFA;                                //计数器初始值设置,注意波特率是9600;4800的f3
  250.         TL1=0XFA;
  251.        
  252.         TH0=0X3C;                                //定时50ms
  253.         TL0=0XB0;
  254.        
  255.         ES=0;                                                //bu打开接收中断
  256.         ET0=1;                                                //打开定时器0中断
  257.         EA=1;                                                //打开总中断
  258.        
  259.         TR1=1;                                        //打开计数器1
  260.         TR0=0;                                        //关闭定时器0
  261. }
  262. /*******************************************************************************
  263. * 函数名         : TX_Char(unsigned char TXData)
  264. * 函数功能                   : 串口发送字符
  265. * 输入           : TXData
  266. * 输出                  : 无
  267. *******************************************************************************/
  268. void TX_Char(unsigned char TXData)
  269. {
  270.         SBUF=TXData;     //发送数据
  271.         while(!TI);                         //等待发送数据完成
  272.         TI=0;                                                 //清除发送完成标志位
  273. }
  274. /*******************************************************************************
  275. * 函数名         : TX_Char(unsigned char TXData)
  276. * 函数功能                   : 串口发送字符串
  277. * 输入           : TXData
  278. * 输出                  : 无
  279. *******************************************************************************/
  280. void Send_Str(unsigned char *str)//发送字符串
  281. {

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

  288. /*******************************************************************************
  289. * 函数名         : SendnStr(char *str, char n)
  290. * 函数功能                   : 串口发送n字节字符串
  291. * 输入           : TXData
  292. * 输出                  : 无
  293. *******************************************************************************/
  294. void SendnStr(char *str, char n)//发送字符串
  295. {

  296.         while((n--) && (*str!='\0'))
  297.         {
  298.                 TX_Char(*str);
  299.                 str++;
  300.         }
  301. }            
  302. /*******************************************************************************
  303. * 函数名         : ClrRsBuf(char *p,int len)
  304. * 函数功能                   : 清空p指针里len字节长度的内存
  305. * 输入           : 指针:p  ; 清空长度:len
  306. * 输出                  : 无
  307. *******************************************************************************/
  308. void  ClrRsBuf(char *p,int len) //清空
  309. {          
  310.           while(len--)
  311.           {
  312.                         *p='\0';
  313.                          p++;
  314.           }
  315. }

  316. /*******************************************************************************
  317. * 函数名         : strncmp ( char * s1, char * s2, size_t n)
  318. * 函数功能                   :比较str1与str2的前n个字符,相同返回0;不同返回( *s1 - *s2 )
  319. * 输入           : 指针:str1  ; 指针:str2 ;长度:n
  320. * 输出                  : 比较结果相同返回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循环中
  327.   //第一个循环条件:--n,如果比较到前n个字符,则退出循环
  328.   //第二个循环条件:*s1,如果s1指向字符串末尾,则退出循环
  329.   //第三个循环条件:*s1 == *s2,如果两字符不等,则退出循环
  330.   while (--n && *s1 && *s1 == *s2)
  331.   {
  332.      s1++;
  333.      s2++;
  334.   }
  335.   return( *s1 - *s2 );
  336. }
  337. /*******************************************************************************
  338. * 函数名         : strlen(const char *str)
  339. * 函数功能                   : 求指针的长度
  340. * 输入           : 指针:str  
  341. * 输出                  : 指针的长度
  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. * 函数名         : *strstr( const char *s1, const char *s2 )
  352. * 函数功能                   : 找出s2字符串在s1字符串中第一次出现的位置
  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. * 函数名         : WaitOK(uchar *th, uchar time)
  370. * 函数功能                   : 等待time s的时间,判断6A模组返回信息是否OK
  371. * 输入           : 指针:th  ; 等待时间: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. * 函数名         : Connect_GPRS()
  393. * 函数功能                   : 连接GPRS
  394. * 输入           : 无
  395. * 输出                  : 无
  396. *******************************************************************************/
  397. char Connect_GPRS()
  398. {
  399.         char i;       
  400.        
  401.         ClrRsBuf(RsBuf,50); //清空接收缓冲区 AT_Code
  402.         RsPoint=0;        
  403.         ES=0;                                                //关闭接收中断
  404.         Send_Str("ATE0\x0D\x0A");    //ATE0:关闭回显;  ATE1:打开回显
  405.         ES=1;                                                //打开接收中断
  406.         if(WaitOK(AT_Code, 10)!=1)     
  407.                 return 0;
  408.        
  409.         ClrRsBuf(RsBuf,50); //清空接收缓冲区 AT_Code
  410.         RsPoint=0;        
  411.         ES=0;                                                //关闭接收中断
  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); //清空接收缓冲区 AT_Code
  418.         RsPoint=0;
  419.         ES=0;                                                //关闭接收中断
  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); //清空接收缓冲区 AT_Code
  426.         RsPoint=0;
  427.         ES=0;                                                //关闭接收中断
  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); //清空接收缓冲区 AT_Code
  445.         RsPoint=0;
  446.         ES=0;                                                //关闭接收中断
  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连接标志               
  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连接标志
  468.                                
  469.                 return 0;       
  470.                
  471. }

  472. /*******************************************************************************
  473. * 函数名         : void Usart()
  474. * 函数功能                   : 串口中断函数
  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;                                                //关闭接收中断
  487.       RsPoint=50;
  488.     }  
  489.   }
  490. }

  491. /*******************************************************************************
  492. * 函数名         : Timer0
  493. * 函数功能                   : 定时器0中断函数
  494. * 输入           : 无
  495. * 输出                  : 无
  496. *******************************************************************************/
  497. void Timer0() interrupt 1 using 3
  498. {
  499.         TH0=0X3C;                                //重装定时值50ms
  500.         TL0=0XB0;
  501.         count++;
  502.        
  503. }
  504. /*******************************************************************************
  505. * 函数名         : KeyScan
  506. * 函数功能                   : 按键检测函数
  507. * 输入           : 无
  508. * 输出                  : 无
  509. *******************************************************************************/
  510. void KeyScan()
  511. {
  512.         unsigned char i=0;
  513.         int Dev;
  514.        
  515.         K1=1;
  516.         if(K1==0)                //检测按键K1是否按下
  517.                 {
  518.                         delay_1ms(10);        //消除抖动
  519.                         if(K1==0)               //按键1按下时执行该动作
  520.                         {
  521.                                
  522.                                 Set += 1;         
  523.                                 if(Set==5)
  524.                                         Set=0;
  525.                                
  526.                                 LcdWriteCom(0x01);           //写入空格清屏幕
  527.                        
  528.                                 LcdWriteCom(0x80);           //设定首行显示位置
  529.                                
  530.                                 if(Set==1)
  531.                                 {
  532.                                                 LcdWriteStr(0x80, "Correct Temp1:", 14);       
  533.                                                
  534.                                                 LcdWriteCom(0x91);           //设定显示位置
  535.                                                
  536.                                                 if(Deviation == 0)
  537.                                                         LcdWriteData(' ');                  //显示
  538.                                                 if(Deviation > 0)
  539.                                                         LcdWriteData('+');                  //显示正
  540.                                                 if(Deviation < 0)
  541.                                                         LcdWriteData('-');                  //显示负
  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]); //个位
  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);           //设定显示位置
  562.                                                
  563.                                                 if(Deviation1 == 0)
  564.                                                         LcdWriteData(' ');                  //显示
  565.                                                 if(Deviation1 > 0)
  566.                                                         LcdWriteData('+');                  //显示正
  567.                                                 if(Deviation1 < 0)
  568.                                                         LcdWriteData('-');                  //显示负
  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]); //个位
  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);           //设定显示位置
  589.                                                
  590.                                                 if(Report == 0)
  591.                                                         LcdWriteData(' ');                  //显示
  592.                                                 if(Report > 0)
  593.                                                         LcdWriteData('+');                  //显示正
  594.                                                 if(Report < 0)
  595.                                                         LcdWriteData('-');                  //显示负
  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]); //个位
  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);           //设定显示位置
  618.                                                
  619.                                                 if(Report1 == 0)
  620.                                                         LcdWriteData(' ');                  //显示
  621.                                                 if(Report1 > 0)
  622.                                                         LcdWriteData('+');                  //显示正
  623.                                                 if(Report1 < 0)
  624.                                                         LcdWriteData('-');                  //显示负
  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]); //个位
  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))         //检测按键是否松开
  643.                                 {
  644.                                         delay_1ms(10);
  645.                                         i++;
  646.                                 }
  647.                                 i=0;
  648.                         }
  649.                 }       
  650.        
  651.         K2=1;
  652.         if(K2==0)                //检测按键K1是否按下
  653.                 {
  654.                         delay_1ms(10);        //消除抖动
  655.                         if(K2==0)
  656.                         {
  657.        
  658.                                 if(Set==1)
  659.                                 {
  660.                                                 Deviation += 10;        //按键2按下时执行该动作,按一下温度值正向纠正 0.1°C,最多纠正5°C
  661.                                                 if(Deviation >= 500)
  662.                                                 {       
  663.                                                         Deviation = 500;
  664.                                                 }
  665.                                                 LcdWriteCom(0x91);           //设定显示位置
  666.                                                
  667.                                                 if(Deviation == 0)
  668.                                                         LcdWriteData(' ');                  //显示
  669.                                                 if(Deviation > 0)
  670.                                                         LcdWriteData('+');                  //显示正
  671.                                                 if(Deviation < 0)
  672.                                                         LcdWriteData('-');                  //显示负
  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]); //个位
  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按下时执行该动作,按一下温度值正向纠正 0.1°C,最多纠正5°C
  691.                                                 if(Deviation1 >= 500)
  692.                                                 {       
  693.                                                         Deviation1 = 500;
  694.                                                 }
  695.                                                 LcdWriteCom(0x91);           //设定显示位置
  696.                                                
  697.                                                 if(Deviation1 == 0)
  698.                                                         LcdWriteData(' ');                  //显示
  699.                                                 if(Deviation1 > 0)
  700.                                                         LcdWriteData('+');                  //显示正
  701.                                                 if(Deviation1 < 0)
  702.                                                         LcdWriteData('-');                  //显示负
  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]); //个位
  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按下时执行该动作,按一下温度报警值正向增加0.1°C
  721.                                                 if(Report >= 9000)
  722.                                                 {       
  723.                                                         Report = 9000;
  724.                                                 }
  725.                                                
  726. …………限于本文篇幅 余下代码请从51黑下载附件…………

复制代码



资料下载:
程序 原理图 用到的包括串口助手,服务器等资料.zip (4 MB, 下载次数: 405)


作者: corey666    时间: 2017-4-25 18:53
该模块的主芯片换成了51
作者: corey666    时间: 2017-4-25 18:54
通讯过程的调试,连接成功视频可以私发

作者: awind_cn    时间: 2017-6-19 12:55
学习了,简洁明了。感谢楼主的分享。。。。
作者: 666到家    时间: 2017-6-28 15:13
我做了1个基于51单片机的温度检测器,通过串口和A7模块相连。但是有一个问题A7模块要求串口波特率必须为115200,我用的是STC89c52芯片普中的板在串口调试时为什么只有4800才正常发送数据?这样就和A7通信不了了
作者: feibao0015    时间: 2017-9-20 21:56
好东西,谢谢楼主,希望留个联系方式,咱们一起学习
作者: 13725929040    时间: 2017-12-5 22:03
有做仿真吗?程序在哪份文件?

作者: xmch    时间: 2018-1-14 23:22
感谢分享。
作者: cjjcjj1    时间: 2018-1-15 12:21
提示: 作者被禁止或删除 内容自动屏蔽
作者: admin    时间: 2018-3-1 02:27
刚下载看了,不是乱码啊
作者: haibuhao    时间: 2018-3-23 10:59
楼主你好,我毕设正好做有关基于无线的环境检测,能发我一些相关资料吗
作者: haibuhao    时间: 2018-3-23 11:00
我的邮箱985082400@qq.com
作者: heruihung1    时间: 2018-3-23 20:24
楼主你好,我毕设正好做有关基于无线的环境检测,能发我一些相关资料吗
作者: ghostintheshell    时间: 2018-3-24 11:19
感谢楼主分享。
作者: ftmovie    时间: 2018-3-25 20:55
学习学习 支持一下
作者: dashabi123    时间: 2018-3-26 09:36
谢谢楼主分享

作者: dashabi123    时间: 2018-3-26 10:09
谢谢楼主分享
作者: 每一个人    时间: 2018-4-7 10:51
可以发一下链接吗?
作者: 15897660437    时间: 2018-4-28 14:12
好资源
作者: elephone11    时间: 2018-5-24 08:40
学习学习,感谢楼主分享!
作者: pengyongnet    时间: 2018-6-22 11:36

我做了1个基于51单片机的温度检测器,通过串口和A7模块相连。但是有一个问题A7模块要求串口波特率必须为115200,我用的是STC89c52芯片普中的板在串口调试时为什么只有4800才正常发送数据?这样就和A7通信不了了 ,能不传一份51的我
作者: Ray_liu    时间: 2018-7-9 14:58
没有用
作者: xsj1877578806    时间: 2018-7-29 10:10
这是好东西啊,赶紧收藏
作者: zaqwsx1122    时间: 2018-12-22 22:15

感谢楼主分享。
作者: 抬头看星星    时间: 2019-11-12 10:37
资料很全面,程序很好用,感谢楼主
作者: 抬头看星星    时间: 2019-11-12 11:44
楼主你好
作者: 抬头看星星    时间: 2019-11-12 11:53
怎么看下载的
作者: sansansan.3    时间: 2019-11-16 10:08
我的资料里面没有GPRS网络通讯。。。
作者: WNI    时间: 2019-11-29 17:24
corey666 发表于 2017-4-25 18:54
通讯过程的调试,连接成功视频可以私发

可以分享下吗
作者: zhouwei0815    时间: 2019-11-29 21:45
资料很全 不错 支持了
作者: jvsoft    时间: 2019-11-30 10:13
很好的学习资料,很全面,感谢楼主
作者: 江畔望月    时间: 2020-5-17 18:17
我的资料里面没有GPRS网络通讯




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1