找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16575|回复: 31
打印 上一主题 下一主题
收起左侧

(原创)基于单片机的远程实时温度监控系统设计 上位机详细教程(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)

评分

参与人数 3黑币 +113 收起 理由
as252585425 + 8 资料很全面。非常好
shenlan121 + 5 赞一个!
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏18 分享淘帖 顶4 踩
回复

使用道具 举报

沙发
ID:192050 发表于 2017-4-25 18:53 | 只看该作者
该模块的主芯片换成了51
回复

使用道具 举报

板凳
ID:192050 发表于 2017-4-25 18:54 | 只看该作者
通讯过程的调试,连接成功视频可以私发
回复

使用道具 举报

地板
ID:209529 发表于 2017-6-19 12:55 | 只看该作者
学习了,简洁明了。感谢楼主的分享。。。。
回复

使用道具 举报

5#
ID:209659 发表于 2017-6-28 15:13 | 只看该作者
我做了1个基于51单片机的温度检测器,通过串口和A7模块相连。但是有一个问题A7模块要求串口波特率必须为115200,我用的是STC89c52芯片普中的板在串口调试时为什么只有4800才正常发送数据?这样就和A7通信不了了
回复

使用道具 举报

6#
ID:234120 发表于 2017-9-20 21:56 | 只看该作者
好东西,谢谢楼主,希望留个联系方式,咱们一起学习
回复

使用道具 举报

7#
ID:254981 发表于 2017-12-5 22:03 | 只看该作者
有做仿真吗?程序在哪份文件?
回复

使用道具 举报

8#
ID:161033 发表于 2018-1-14 23:22 | 只看该作者
感谢分享。
回复

使用道具 举报

9#
ID:82765 发表于 2018-1-15 12:21 | 只看该作者

呼叫管理员,为什么下载后是乱码呢

回复

使用道具 举报

10#
ID:1 发表于 2018-3-1 02:27 | 只看该作者
刚下载看了,不是乱码啊
回复

使用道具 举报

11#
ID:295854 发表于 2018-3-23 10:59 | 只看该作者
楼主你好,我毕设正好做有关基于无线的环境检测,能发我一些相关资料吗
回复

使用道具 举报

12#
ID:295854 发表于 2018-3-23 11:00 | 只看该作者
我的邮箱985082400@qq.com
回复

使用道具 举报

13#
ID:296103 发表于 2018-3-23 20:24 | 只看该作者
楼主你好,我毕设正好做有关基于无线的环境检测,能发我一些相关资料吗
回复

使用道具 举报

14#
ID:296276 发表于 2018-3-24 11:19 | 只看该作者
感谢楼主分享。
回复

使用道具 举报

15#
ID:296923 发表于 2018-3-25 20:55 | 只看该作者
学习学习 支持一下
回复

使用道具 举报

16#
ID:209367 发表于 2018-3-26 09:36 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

17#
ID:209367 发表于 2018-3-26 10:09 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

18#
ID:303042 发表于 2018-4-7 10:51 | 只看该作者
可以发一下链接吗?
回复

使用道具 举报

19#
ID:318352 发表于 2018-4-28 14:12 | 只看该作者
好资源
回复

使用道具 举报

20#
ID:337022 发表于 2018-5-24 08:40 | 只看该作者
学习学习,感谢楼主分享!
回复

使用道具 举报

21#
ID:79874 发表于 2018-6-22 11:36 | 只看该作者

我做了1个基于51单片机的温度检测器,通过串口和A7模块相连。但是有一个问题A7模块要求串口波特率必须为115200,我用的是STC89c52芯片普中的板在串口调试时为什么只有4800才正常发送数据?这样就和A7通信不了了 ,能不传一份51的我
回复

使用道具 举报

22#
ID:336340 发表于 2018-7-9 14:58 | 只看该作者
没有用
回复

使用道具 举报

23#
ID:380389 发表于 2018-7-29 10:10 来自手机 | 只看该作者
这是好东西啊,赶紧收藏
回复

使用道具 举报

24#
ID:335688 发表于 2018-12-22 22:15 | 只看该作者

感谢楼主分享。
回复

使用道具 举报

25#
ID:640249 发表于 2019-11-12 10:37 | 只看该作者
资料很全面,程序很好用,感谢楼主
回复

使用道具 举报

26#
ID:640249 发表于 2019-11-12 11:44 来自手机 | 只看该作者
楼主你好
回复

使用道具 举报

27#
ID:640249 发表于 2019-11-12 11:53 来自手机 | 只看该作者
怎么看下载的
回复

使用道具 举报

28#
ID:642152 发表于 2019-11-16 10:08 | 只看该作者
我的资料里面没有GPRS网络通讯。。。
回复

使用道具 举报

29#
ID:632095 发表于 2019-11-29 17:24 来自手机 | 只看该作者
corey666 发表于 2017-4-25 18:54
通讯过程的调试,连接成功视频可以私发

可以分享下吗
回复

使用道具 举报

30#
ID:350104 发表于 2019-11-29 21:45 | 只看该作者
资料很全 不错 支持了
回复

使用道具 举报

31#
ID:620993 发表于 2019-11-30 10:13 | 只看该作者
很好的学习资料,很全面,感谢楼主
回复

使用道具 举报

32#
ID:7175 发表于 2020-5-17 18:17 | 只看该作者
我的资料里面没有GPRS网络通讯
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表