找回密码
 立即注册

QQ登录

只需一步,快速开始

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

消洗台单片机源程序 RS485和Modbus协议的寄存器读取和单寄存器写入操作

[复制链接]
跳转到指定楼层
楼主
分享一个消洗台的单片机程序源码:

完整源码下载:
modbus通讯.zip (74.71 KB, 下载次数: 61)



部分源码预览:
  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 单片机教程网

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