找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机多点温度巡回程序

[复制链接]
跳转到指定楼层
楼主
ID:116750 发表于 2016-4-26 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <stc12c5410ad.h>
  2. #include<absacc.h>
  3. #include<intrins.h>
  4. #include<math.h>
  5. #define byte unsigned char
  6. #define word  unsigned int
  7. /*======================TMR0定义==============================*/
  8. #define t0h (65536-9216)/256   //12MHz定时器定时10ms 减10000
  9. #define t0l (65536-9216)%256   //11.0592MHz定时器定时10ms 减9216
  10. uchar  t0_count=0;
  11. uchar t0_1h=0;
  12. uint  t0_hour=0;
  13. uchar  t0_10ms,t0_10s,t0_20s,t0_2m=0,t0_5m,t0_10m,t0_10m_e,t0_1m,ad_10m;
  14. bit  first_1m=1;
  15. bit  normal=1;
  16. /*=======================其他定义================================*/
  17. void  change_temp(uchar b20_num);   //温度值处理函数
  18. uchar temp_bai,temp_shi,temp_ge;
  19. bit  ad_en=0;
  20. /*======================EEPROM ISP/IAP定义======================*/
  21. uchar ADH=0X10;
  22. uchar ADL=0X00;
  23. uchar ISP_READ(uchar adh,adl);//读EEPROM函数
  24. void ISP_WRITE(uchar adh,adl,write_byte);//写EEPROM函数
  25. void ISP_ERASE(uchar adh,adl);//擦除EEPROM函数
  26. void ISP_DISABLE();//关闭ISP功能函数
  27. uchar read_eeprom[11];  //读EEPROM数据存储器
  28. /*=====================UART定义=========================*/
  29. //#define reload_count 0xD0;//Fosc=11.0592MHz,12T模式,SMOD=0时,计算出的自动重装数和波特率600
  30. //#define reload_count 0xe8;//Fosc=11.0592MHz,12T模式,SMOD=0时,计算出的自动重装数和波特率1200
  31. #define reload_count 0xfd;//Fosc=11.0592MHz,12T模式,SMOD=0时,计算出的自动重装数和波特率9600
  32. void   initial_uart();
  33. void   tx_dat(uchar len,uchar stemp[]);    //串口送数据子函数
  34. void   send_one_byte(uchar tx_data);
  35. uchar  xdata rc_count=0;
  36. uchar xdata rc_bytes[200];
  37. bit    rc_end=0;   //接受结束标志为
  38. bit  changenumber_flag=0;
  39. //===============GSM指令定义===========================
  40. uchar code cm0[]="AT\r\n";
  41. uchar code cm01[]="ATE0\r\n";          //ATE0关闭回显
  42. uchar code cm1[]="AT+CMGF=0\r\n";        //AT+CMGF=0  采用PDU格式,长度11
  43. uchar code cm2[]="AT+CNMI=2,2,0,0,1\r\n";    //AT+CNMI=2,2,0,0,1   设置接收显示
  44. uchar code fuhao[3]="002";
  45. uchar code cm9[]="5EA6";    //度
  46. uchar code cm10[16]="6E295EA68FC79AD8"; //温度过高
  47. uchar temp_bai,temp_shi,temp_ge;
  48. uchar false_count=0;  //失败计数值
  49. sbit cs=P1^2;
  50. sbit dat=P1^1;
  51. sbit clk=P1^0;
  52. void   DelayNS(unsigned int no);
  53. void   senddat(unsigned char d);
  54. void   send_i(unsigned char d);
  55. void   send_d(unsigned char d);
  56. void   hzkdis(uchar *s);
  57. void   init_lcm(void);
  58. void senddat(unsigned char d)/*写字节*/
  59. { unsigned char j;
  60.   for(j=0;j<8;j++)
  61. {
  62.   clk=0;
  63.   if(d&0x80)dat=1;
  64.   else dat=0;
  65.   clk=1;
  66.   d=d<<1;
  67.   }
  68. }
  69. void send_i(unsigned char d)/*写命令函数*/
  70. {
  71.   unsigned char i;
  72.   cs=1;
  73.   senddat(0xf8);
  74.   i=d&0xf0;
  75.   senddat(i);
  76.   i=(d%16)*16;
  77.   senddat(i);
  78.   cs=0;
  79. }
  80. void send_d(unsigned char d)/*写数据函数 */
  81. {
  82.   unsigned char i;
  83.   cs=1;
  84.   senddat(0xfa);
  85.   i=d&0xf0;
  86.   senddat(i);
  87.   i=(d%16)*16;
  88.   senddat(i);
  89.   cs=0;
  90. }

  91. //===================键盘定义==============================
  92. void key_ctrl();
  93. void key();
  94. sbit key1_add=P1^3;
  95. sbit key2_set_enter=P3^4;
  96. sbit key3_down=P3^5;
  97. bit  b_add,b_set_enter,b_down,k_key1,k_key2,k_key3;
  98. bit  set_flag,set_end_flag;
  99. bit  sf;
  100. bit  disp_flag=0;
  101. uchar key_count=1,add_count=0,addr_disp=0;
  102. uchar set_temp,set_temp_shi=0,set_temp_ge=0,set_num=8,set_time=1;
  103. bit   set_temp_flag,set_num_flag,set_time_flag,set_mobile_flag;
  104. bit   move_flag;
  105. uchar xdata mobile_num[11]="13000000000";
  106. void key()
  107. {
  108.   );
  109.          set_temp=set_temp_shi*10+set_temp_ge;
  110.        }
  111.        if(set_time_flag==1)
  112.        {
  113.         set_time_flag=0;
  114.         set_mobile_flag=0;
  115.         move_flag=0;

  116. void DelayNS(unsigned int no)
  117. {
  118.         unsigned char j;
  119.           for(; no>0; no--)
  120.           {
  121.              for(j=0; j<255; j++);
  122.           }
  123. }
  124. uchar ISP_READ(uchar adh,adl)
  125. {
  126.         uchar read_byte;
  127.         ISP_CONTR=0x83;
  128.         ISP_CMD=0x01;
  129.         ISP_ADDRH=adh;
  130.         ISP_ADDRL=adl;
  131.         ISP_TRIG=0X46;
  132.         ISP_TRIG=0XB9;
  133.         EA=0;
  134.         _nop_();
  135.         read_byte=ISP_DATA;
  136.         EA=1;
  137.         return(read_byte);
  138. }
  139. void ISP_WRITE(uchar adh,adl,write_byte)
  140. {
  141.         ISP_CONTR=0x83;
  142.         ISP_CMD=0x02;
  143.         ISP_ADDRH=adh;
  144.         ISP_ADDRL=adl;
  145.         ISP_DATA=write_byte;
  146.         EA=0;
  147.         ISP_TRIG=0X46;
  148.         ISP_TRIG=0XB9;
  149.         _nop_();        
  150.         EA=1;
  151. }
  152. ROM_NO[rom_byte_number] &= ~rom_byte_mask;

  153.             // serial number search direction write bit
  154.             OWWriteBit(search_direction);
  155.             //OWWriteBit(0);
  156.             // increment the byte counter id_bit_number
  157.             // and shift the mask rom_byte_mask
  158.             id_bit_number++;
  159.             rom_byte_mask <<= 1;

  160.             // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
  161.             if (rom_byte_mask == 0)
  162.             {
  163.                 docrc8(ROM_NO[rom_byte_number]);  // accumulate the CRC
  164.                 rom_byte_number++;
  165.                 rom_byte_mask = 1;
  166.             }
  167.          }
  168.       }
  169.       while(rom_byte_number < 8);  // loop until through all ROM bytes 0-7

  170.       // if the search was successful then
  171.       if (!((id_bit_number < 65) || (crc8 != 0)))
  172.       {
  173.          // search successful so set LastDiscrepancy,LastDeviceFlag,search_result
  174.          LastDiscrepancy = last_zero;

  175.          // check for last device
  176.          if (LastDiscrepancy == 0)
  177.             LastDeviceFlag = TRUE;

  178.          search_result = TRUE;
  179.       }
  180.    }

  181.    // if no device found then reset counters so next 'search' will be like a first
  182.    if ((!search_result
  183. // 1-Wire Functions to be implemented for a particular platform
  184. //--------------------------------------------------------------------------
  185. /
  186. *延时函数,us级
  187. *函数名称:delay(word seconds)
  188. *说明:不精确延时
  189. /
  190. void delay(uint seconds)
  191. {
  192.      uint sec=0;
  193.      sec=seconds*12;
  194.      while(--sec);
  195. }
  196. uchar OWReset()
  197. {
  198.     uchar presence;
  199.     DQ = 0;              /*pull DQ line low*/
  200.     delay(44);          /*至少480微秒, leave it low for 501us*/
  201.     DQ = 1;            /*allow line to return high?*/
  202.     delay(4); /* wait for presence18b20 36us*/
  203.     presence = DQ;   /*get presence signal   0= DS18B20 ready, 1= busy*/
  204.     delay(13);             // wait for end of timeslot
  205.     return(presence);
  206. }
  207. uchar OWReadByte(void)
  208. {
  209.     int j=0;
  210.     uchar i,byte_value;
  211.     for (i=8;i>0;i--)
  212.     {
  213.         byte_value>>=1;
  214.         DQ = 0;                 /* pull DQ low to start timeslot*/
  215.         _nop_();_nop_();_nop_();_nop_();
  216.         DQ = 1;               /*then return high*/
  217.         if(DQ) byte_value|=0x80;
  218.         delay(4);           /*wait for rest of timeslot*/
  219.      }
  220.      return(byte_value);
  221. }
  222.         temp_b20[num]=Read_Temperature(num);/*num DS18B20号*/
  223.         delay(50);
  224.         if(again_flag==1){again_flag=0;goto L2; }
  225.         if((error_flag==1)&&(num==(set_num-1)))
  226.         {
  227.                 error_flag=0;
  228.                 device_error=1;
  229.                 send_error_flag=1;
  230.                 ds18b20_error=1;
  231.                 ISP_ERASE(0x2e,0x00);  
  232. void SEARCH_SAVE()
  233. {
  234.           uchar rslt,ds18b20_num=0,i,m=1,j,addr;
  235.           rslt=OWFirst();
  236.       if(rslt==1)new_flag=1;
  237.           while(ds18b20_num<set_num)   //将来可能改为    ds18b20_num<set_num   设置个数
  238.            {
  239.                   while(!rslt)
  240.               {rslt=OWFirst();if(rslt==1)new_flag=1;}
  241.               for(i=m;i>0;i--)
  242.                 if((send_gsm_flag==1)&&(en_gsm==1))    //向GSM发送数据
  243.                  {
  244.                   send_gsm_flag=0;
  245.                   send_to_gsm();
  246.                  }
  247.                  if(disp_flag==1)
  248.                  {
  249.                     disp_flag=0;
  250.                     send_i(0x01);
  251.                         DelayNS(12);
  252.                         send_i(0x84);
  253.                         hzkdis("度");
  254.                 send_i(0x81);
  255.                 send_d(set_temp_shi+0x30);
  256.                 send_d(set_temp_ge+0x30);
  257.                         send_i(0x94);
  258.                         hzkdis("路") ;
  259.                 send_i(0x91);
  260.                         send_d(set_num/10+0x30);
  261.                         send_d(set_num%10+0x30);
  262.                         send_i(0x8b);
  263.                         hzkdis("小时") ;
  264.                 send_i(0x89);
  265.                 send_d(set_time/10+0x30);
  266.                 send_d(set_time%10+0x30);
  267.                         send_i(0x98);
  268.                 for(i=0;i<11;i++) send_d(mobile_num[ i]);
  269.                  }
  270.         }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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