久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3073|回復: 1
打印 上一主題 下一主題
收起左側

消洗臺單片機源程序 RS485和Modbus協議的寄存器讀取和單寄存器寫入操作

[復制鏈接]
跳轉到指定樓層
樓主
分享一個消洗臺的單片機程序源碼:

完整源碼下載:
modbus通訊.zip (74.71 KB, 下載次數: 64)



部分源碼預覽:
  1. /*
  2. *******************************************************************************
  3. *   
  4. *
  5. * 文件名:main.c
  6. * 描  述:RS485的Modbus
  7. *
  8. * 備  注:
  9. *         支持Modbus協議的寄存器讀取和單寄存器寫入操作
  10. *******************************************************************************
  11. */

  12. #include <reg52.h>
  13. #include "i2c.h"
  14. #define KEY P1
  15. typedef unsigned int uint;         
  16. typedef unsigned char u8;
  17. unsigned char addr;
  18. unsigned char dat;

  19. int s=0,m=1,sa=0,ma=2,num;
  20. sbit LSA=P2^2;
  21. sbit LSB=P2^3;
  22. sbit LSC=P2^4;
  23. sbit OUTa=P2^5;
  24. sbit OUT=P2^6;
  25. sbit LE=P2^7;
  26.     uint a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0到9
  27.     uint sg,ss,mg,ms,sga,ssa,mga,msa,K=0;
  28. sbit BUZZ = P1^5;
  29. bit flagBuzzOn = 0;   
  30. unsigned char KH,KL;
  31. unsigned char T0RH = 0;  
  32. unsigned char T0RL = 0;  
  33. unsigned char regGroup[5];  
  34. unsigned char MODADD=0X01;
  35. void ConfigTimer0(unsigned int ms);
  36. extern void UartDriver();
  37. extern void ConfigUART(unsigned int baud);
  38. extern void UartRxMonitor(unsigned char ms);
  39. extern void UartWrite(unsigned char *buf, unsigned char len);
  40. extern unsigned int GetCRC16(unsigned char *ptr,  unsigned char len);
  41. extern void zhu();
  42. extern        void DigDisplay();
  43. extern        void Timer1Init();
  44. extern        void delay(uint i);
  45. extern  int Keypros();
  46. extern        void At24c02Write(unsigned char addr,unsigned char dat)        ;
  47. extern        unsigned char At24c02Read(unsigned char addr);
  48. void main()
  49. {
  50.     unsigned char x=~OUT,y=~OUTa;
  51.        m=At24c02Read(1);         
  52.          
  53.            delay(1000);
  54.            ma=At24c02Read(2);
  55.            
  56.          while (1)
  57.      {
  58.            while((OUT&OUTa)==1)        
  59.           {  
  60.            
  61.                     EA = 1;            
  62.                     ConfigTimer0(1);   
  63.                     ConfigUART(9600);  
  64.          while ((KEY&0x0f)!=0x01)
  65.          {
  66.                   DigDisplay();
  67.           UartDriver();  
  68.          
  69.                   Keypros();
  70.                           if((KEY&0x0f)==0x01)
  71.                           {
  72.                          delay(3000);
  73.                             if((KEY&0x0f)==0x01)
  74.                          OUT=0;
  75.                      return;
  76.                         }
  77.                  }
  78.         
  79.                   
  80.          }
  81.            if((m||ma)!=0)
  82.            {
  83.             
  84.                   
  85.               
  86.                   zhu();
  87.                      KL=At24c02Read(4);
  88.                   delay(1000);
  89.                   
  90.                   KH=At24c02Read(3);
  91.                   delay(1000);
  92.                   K=(KH<<8)+KL;
  93.                   DigDisplay();
  94.                   K++;                        
  95.                      KH=K>>8;
  96.                   KL=K&0X00FF;
  97.                   At24c02Write(4,KL);  
  98.                      delay(1000);
  99.                   while(K==100){DigDisplay();}
  100.                   At24c02Write(3,KH);
  101.                      delay(1000);
  102.                      
  103.             }
  104.      }        
  105.          
  106.         }

  107.    


  108. void UartAction(unsigned char *buf, unsigned char len)
  109. {

  110.     unsigned char i;
  111.     unsigned char cnt;
  112.    
  113.     unsigned int  crc;
  114.     unsigned char crch, crcl;
  115.     MODADD=At24c02Read(0);
  116.     if (buf[0] !=MODADD ) //本機地址設定為0x01,
  117.     {                  
  118.         return;         
  119.     }
  120.    
  121.     crc = GetCRC16(buf, len-2);
  122.     crch = crc >> 8;
  123.     crcl = crc & 0xFF;
  124.     if ((buf[len-2]!=crch) || (buf[len-1]!=crcl))
  125.     {
  126.         return;  
  127.     }
  128.    
  129.     switch (buf[1])
  130.     {
  131.         case 0x03:  
  132.             if ((buf[2]==0x00) && (buf[3]<=0x05))
  133.             {
  134.                 if (buf[3] <= 0x04)
  135.                 {
  136.                                         regGroup[0]=At24c02Read(0);
  137.                                         regGroup[1]=At24c02Read(1);
  138.                     regGroup[2]=At24c02Read(2);
  139.                                         regGroup[3]=At24c02Read(3);
  140.                                         regGroup[4]=At24c02Read(4);
  141.                                         i = buf[3];      
  142.                     cnt = buf[5];   
  143.                     buf[2] = cnt*2;  
  144.                     len = 3;         
  145.                     while (cnt--)
  146.                     {
  147.                         buf[len++] = 0x00;         
  148.                         buf[len++] = regGroup[i++];
  149.                   
  150.                                     }
  151.                 }
  152.                 else  
  153.                 {
  154.                     buf[2] = 2;  
  155.                     buf[3] = 0x00;
  156.                     buf[4] = flagBuzzOn;
  157.                     len = 5;
  158.                 }
  159.                 break;
  160.             }
  161.             else  
  162.             {
  163.                 buf[1] = 0x83;
  164.                 buf[2] = 0x02;  
  165.                 len = 3;
  166.                 break;
  167.             }
  168.             
  169.         case 0x06:  
  170.             if ((buf[2]==0x00) && (buf[3]<=0x05))
  171.             {
  172.                 if (buf[3] <= 0x04)
  173.                 {
  174.                   switch(buf[3])
  175.                                    {
  176.                                    case 0:
  177.                                     i = buf[3];            
  178.                     regGroup[i] = buf[5];   
  179.                     MODADD = regGroup[i];
  180.                            
  181.                                         At24c02Write(0,MODADD);
  182.                    case 1:
  183.                                     i = buf[3];            
  184.                     regGroup[i] = buf[5];   
  185.                     m = regGroup[i];
  186.                            
  187.                                         At24c02Write(1,m);
  188.                                    case 2:
  189.                                     i = buf[3];            
  190.                     regGroup[i] = buf[5];   
  191.                     ma = regGroup[i];
  192.                            
  193.                                         At24c02Write(2,ma);
  194.                                    }
  195.                 }
  196.                 else  
  197.                 {
  198.                     flagBuzzOn = (bit)buf[5];
  199.                 }
  200.                 len -= 2;
  201.                 break;
  202.             }
  203.             else  
  204.             {
  205.                 buf[1] = 0x86;  
  206.                 buf[2] = 0x02;  
  207.                 len = 3;
  208.                 break;
  209.             }
  210.             
  211.         default:
  212.             buf[1] |= 0x80;  
  213.             buf[2] = 0x01;   
  214.             len = 3;
  215.             break;
  216.     }
  217.     crc = GetCRC16(buf, len);
  218.     buf[len++] = crc >> 8;   
  219.     buf[len++] = crc & 0xFF;  
  220.     UartWrite(buf, len);     
  221. }
  222. /* 配置并啟動T0 */
  223. void ConfigTimer0(unsigned int ms)
  224. {
  225.     unsigned long tmp;  
  226.    
  227.     tmp = 11059200 / 12;      
  228.     tmp = (tmp * ms) / 1000;  
  229.     tmp = 65536 - tmp;        
  230.     tmp = tmp + 33;           
  231.     T0RH = (unsigned char)(tmp>>8);  
  232.     T0RL = (unsigned char)tmp;
  233.     TMOD &= 0xF0;   
  234.     TMOD |= 0x01;   
  235.     TH0 = T0RH;     
  236.     TL0 = T0RL;
  237.     ET0 = 1;      
  238.     TR0 = 1;        
  239. }
  240. /* T0中斷服務函數,執行串口接收監控和蜂鳴器驅動 */
  241. void InterruptTimer0() interrupt 1
  242. {
  243.     TH0 = T0RH;  
  244.     TL0 = T0RL;
  245.     if (flagBuzzOn)  
  246.         BUZZ = ~BUZZ;
  247.     else
  248.         BUZZ = 1;
  249.     UartRxMonitor(1);  
  250. }
  251. /*******************************************************************************
  252. * 函 數 名         : delay
  253. * 函數功能                   : 延時函數,i=1時,大約延時10us
  254. *******************************************************************************/
  255. void delay(uint i)
  256. {
  257.         while(i--);        
  258. }

  259. /*******************************************************************************
  260. * 函數名         :Keypros()
  261. * 函數功能                 :按鍵處理函數
  262. * 輸入           : 無
  263. * 輸出                  : 鍵值
  264. *******************************************************************************/
  265. int Keypros()
  266. {
  267.         
  268.    if ((OUT&OUTa)!=0)
  269.    {
  270.         if((KEY&0x0f)==0x05)
  271.           {
  272.              m--;
  273.                  delay(30000);
  274.                 if(m<=1)
  275.                  m=1;
  276.           }
  277.          
  278.         if((KEY&0x0f)==0x06)
  279.         
  280.          {
  281.              m++;
  282.                  delay(40000);
  283.                 if(m>30)
  284.                  m=30;
  285.          }
  286.          

  287.         if((KEY&0x0f)==0x08)
  288.         {
  289.            ma--;
  290.          
  291.           delay(40000);
  292.                 if(ma<=1)
  293.                  ma=1;            //現在第1次ma減到0會死機---------------------------------------
  294.          }
  295.   
  296.         if((KEY&0x0f)==0x09)
  297.         {
  298.              ma++ ;
  299.           delay(30000);
  300.                  if(ma>30)
  301.                  ma=30;
  302.                 }
  303.                  if((KEY&0x0f)==0x0a)
  304.           {
  305.                 delay(1000);  
  306.                 if((KEY&0x0f)==0x0a)
  307.                 {        
  308.                         At24c02Write(1,m);   
  309.                     delay(1000);        // 等待寫完。
  310.                         At24c02Write(2,ma);   
  311.                 }
  312.         
  313.            }
  314.                 if((KEY&0x0f)==0x0c)
  315.            {
  316.                  delay(1000);  
  317.              if((KEY&0x0f)==0x0c)
  318.                 {
  319.                   num=At24c02Read(1);          //讀取EEPROM地址1內的數據保存在num中
  320.                   m=num;
  321.                    delay(1000);
  322.                   num=At24c02Read(2);
  323.                   ma=num;
  324.                 }
  325.           }
  326.      }
  327.          return(m,ma);
  328.   }

  329. /***************************************************
  330. 動態置LEDCOM口低電平
  331. **********************/
  332. void DigDisplay()

  333.   {                          
  334.                 u8 i;
  335.                
  336.                     sg=s%10;
  337.                     ss=s/10;
  338.                     mg=m%10;
  339.                     ms=m/10;
  340.                            sga=sa%10;
  341.                     ssa=sa/10;
  342.                     mga=ma%10;
  343.                     msa=ma/10;
  344.                  for(i=0;i<8;i++)
  345.                  {        
  346.                   switch(i)         
  347.                    {
  348.                         case(0):
  349.                                 LSA=0;LSB=0;LSC=0;   P0=a[sg]; break;//顯示第0位
  350.                         case(1):
  351.                                 LSA=1;LSB=0;LSC=0;  P0=a[ss]; break;//顯示第1位
  352.                         case(2):
  353.                                 LSA=0;LSB=1;LSC=0;   P0=a[mg]; break;//顯示第2位
  354.                         case(3):
  355.                                 LSA=1;LSB=1;LSC=0;   P0=a[ms];break;//顯示第3位
  356.                         case(4):
  357.                                 LSA=0;LSB=0;LSC=1;  P0=a[sga]; break;//顯示第4位
  358.                         case(5):
  359.                                 LSA=1;LSB=0;LSC=1;  P0=a[ssa];break;//顯示第5位
  360.                         case(6):
  361.                                 LSA=0;LSB=1;LSC=1;  P0=a[mga];; break;//顯示第6位
  362.                         case(7):
  363.                                 LSA=1;LSB=1;LSC=1;   P0=a[msa]; break;//顯示第7位        
  364.                    }
  365.                
  366.                 delay(10); //  增減亮度。      
  367.                 P0=0x00;//消隱
  368.            }
  369. }

  370. /*******************************************************************************
  371. * 函 數 名         : Timer1Init
  372. * 函數功能                   : 定時器1初始化
  373. * 輸    入         : 無
  374. * 輸    出         : 無
  375. *******************************************************************************/
  376. void Timer1Init()
  377. {        
  378.         TMOD=0X11;
  379.         ET1=1;
  380.         EA=1;
  381.         TR1=1;                        
  382. }
  383. /*******************************************************************************
  384. * 函 數 名         : void Timer1() interrupt 3
  385. * 函數功能                   : 定時器1中斷函數
  386. * 輸    入         : 無
  387. * 輸    出         : 無
  388. *******************************************************************************/
  389. void Timer1() interrupt 3
  390. {
  391.         static uint i;
  392.             TH1=0X3c;        //給定時器賦初值,定時50ms
  393.             TL1=0Xb0;
  394.             i++;
  395.    if((s||m)!=0)
  396.         {
  397.            if(i==20)                  //中斷次數
  398.         {
  399.           {
  400.                   i=0;
  401.           s--;
  402.                   }
  403.          if(s<=-1&&(m!=0))
  404.         {
  405.           s=59;
  406.           m--;
  407.                 }
  408.       
  409.               }
  410.       
  411.          
  412.         }
  413.   else
  414.         {
  415.         if((sa||ma)!=0)
  416.         {
  417.           if(i==20)
  418.         {
  419.           {
  420.                   i=0;
  421.           sa--;
  422.                   }
  423.          if(sa<=-1&&(ma!=0))
  424.         {
  425.           sa=59;
  426.           ma--;
  427.                 }
  428.         else{ ma-=0; if(ma<=-1) { ma=0; }}
  429.               }
  430.         else{ sa-=0; if(sa<=-1) { sa=0;  }}
  431.          
  432.                  if((sa||ma)!=0)
  433.            {
  434.                
  435.                     OUTa=0;        OUT=1;
  436.                
  437.                    }
  438.         
  439.              if((sa||ma)==0)  
  440.              {OUTa=1; OUT=1;TR1=0;}
  441.           }
  442.         }         
  443. }


  444. /*******************************************************************************
  445. * 函 數 名       : zhu
  446. * 函數功能               
  447. * 輸    入       : 無
  448. * 輸    出             : 無
  449. *******************************************************************************/
  450. void zhu()
  451.             
  452. {         while(ma||sa)
  453.         
  454.       {        
  455.            
  456.            if((KEY&0x0f)!=0x01)
  457.             {
  458.                   
  459.                    Keypros();
  460.            DigDisplay();
  461.                  }
  462.                     else
  463.                   {
  464.                   
  465.                    {
  466.                         if((KEY&0x0f)==0x01)
  467.                            delay(1000);
  468.                            if((KEY&0x0f)==0x01)
  469.                      {
  470.                   
  471.                            num=At24c02Read(1);          //讀取EEPROM地址1內的數據保存在num中
  472.                            m=num;
  473.                            delay(1000);
  474.                            num=At24c02Read(2);
  475.                            ma=num;
  476.                                    
  477.                         while (sa||ma!=0)        
  478.                            { DigDisplay();
  479.                                    
  480.                              Timer1Init();  
  481.                               }
  482.                           }
  483.                  
  484.                    }           
  485.                 }                                            
  486.            }      
  487.    }
復制代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:134271 發表于 2018-1-21 10:12 | 只看該作者
陋習,一點注釋沒有。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 青草久久免费视频 | 久久99国产精品 | 国产激情综合五月久久 | 久久av在线播放 | 日本一区二区三区四区 | 有码在线| 特级生活片 | 亚洲一区二区视频 | 国产一二区免费视频 | 亚洲91精品| 成人免费网站在线 | 亚洲日韩中文字幕一区 | 欧美在线激情 | 伊人焦久影院 | 中文字幕在线电影观看 | 国产精选一区 | 天堂男人av | 国产欧美在线一区二区 | 欧美激情在线一区二区三区 | 一区二区精品 | 日韩成人免费视频 | 中文字幕 国产 | 午夜在线| 日韩精品久久久久久 | 精品美女在线观看视频在线观看 | 亚洲精久| 九九热在线免费观看 | 亚洲激情一区二区三区 | 暖暖成人免费视频 | 国产精品日韩欧美一区二区三区 | 久久久久久久一区二区三区 | 中文字幕在线观看第一页 | 国外成人在线视频网站 | 国产丝袜av | 在线色网 | 国产成人高清视频 | 女生羞羞网站 | 成人av免费 | 日韩一二三区视频 | 亚洲国产一区二区三区在线观看 | 91伊人|