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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

C51單片機接收到一個開關量之后,通過串口RS485發送一個指令出來

[復制鏈接]
跳轉到指定樓層
樓主
ID:115923 發表于 2020-12-17 22:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. *********************************************************************/
  2. #include "main.h"
  3. #include "init.h"

  4. #define ENABLE_IAP 0x83 //系統工作時鐘<12MHz 時,對IAP_CONTR 寄存器設置此值
  5. #define CMD_IDLE 0
  6. #define CMD_READ 1
  7. #define CMD_PROGRAM 2
  8. #define CMD_ERASE 3
  9. #define ENABLE_IAP 0x83//SYSCLK<12MH
  10. #define IAP_ADDRESS 0x0000        //存儲地址


  11. uint8 add;    //掉電保持485的地址
  12. uint8 j=0;
  13. uint8 dat=0X00;   
  14. bit flag_zx=0;
  15.         bit bz1=0;
  16.         bit bz2=0;
  17.         bit bz3=0;
  18.         bit bz4=0;
  19.         bit bz5=0;
  20.         bit bz6=0;
  21.         bit bz7=0;
  22.         bit bz8=0;
  23. uint8 sendPosi=0;     //發送緩沖區指針
  24. uint8 receCount=0;    //接收緩沖區指針
  25. uint8 sendCount=0;    //需要發送數據個數
  26. uint8 receTimeOut=0;  //通訊超時值
  27. uint8 byteCount=5;    //發送個數

  28. uint8 sendBuf[10];          //發送緩沖區
  29. uint8 receBuf[10];    //接收緩沖區

  30. /********************************************************************
  31.                            定義數據類型
  32. *********************************************************************/
  33. uint8 TBUF,RBUF;
  34. uint8 TDAT,RDAT;
  35. uint8 TCNT,RCNT;
  36. uint8 TBIT,RBIT;
  37. bit TING,RING;
  38. bit TEND,REND;

  39. uint8 t,r,ii;                  //定義數據類型
  40. uint8 but[16];          //數據存儲數組
  41. /********************************************************************
  42.                             定義 ISP/IAP/EEPROM 命令
  43. *********************************************************************/

  44. void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 單片機 在 一 安全 狀態
  45. uint8 IapReadByte(uint16 addr);//讀數據
  46. void IapProgramByte(uint16 addr, uint8 dat);//寫數據
  47. void IapEraseSector(uint16 addr);//擦除數據


  48. void delay()//延時程序
  49. {
  50.         uint8 m,n,s;
  51.         for(m=10;m>0;m--)
  52.         for(n=20;n>0;n--)
  53.         for(s=248;s>0;s--);
  54. }




  55. /****************發送函數*********************/
  56. void senduart2()
  57. {            RS485_DIR=1;
  58.         for(ii=0;ii<5;ii++)
  59.                 {
  60.                     if(TEND)          //允許發送
  61.                         {
  62.                                  TEND=0;
  63.                                  TBUF=sendBuf[t++&0x0F];
  64.                                  TING=1;
  65.                         }
  66.                         while(!TEND);
  67.                 }
  68.                 t=0;
  69.                 RS485_DIR=0;
  70. }
  71. /*****************清空發送緩沖區*************************/
  72. void clear_receBuf()
  73. {
  74.     uint8 i;
  75.         for(i=0;i<5;i++)
  76.         {
  77.             receBuf[i]=0;
  78.         }
  79. }
  80. void main()
  81. {
  82.            delay();
  83.     clear_receBuf();
  84.     add= IapReadByte(0x01);//讀取存儲的值
  85.           if(add==0xff)
  86.           add=0x00;
  87.     ConfigUART1();
  88.           TR0=1;
  89.           EA=1;
  90.     while(1)
  91.         {  
  92.            if(REND)  //如果有接收
  93.            {
  94.              REND=0; //接收標志清零
  95.              receBuf[r++&0x0F]=RBUF;     //把接受的數據存儲到BUT數組中
  96.                          if(receBuf[0]!=0xaa){r=0;}
  97.                  if(r>=5)
  98.                  {        r=0;

  99.                     flag_zx=1;
  100.                  }
  101.            }
  102.            if(flag_zx==1)
  103.            {                     

  104.                 flag_zx=0;
  105.                     //0         1       2       3        4               
  106.                         //起始位   地址位  功能位   數據位  結束位
  107.                         if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add))          //如果開始位和結束位,還有地址都正確,進行下一步判斷
  108.                         {
  109.                            if(receBuf[2]==0x01)  //修改板子地址
  110.                            {
  111.                               add=receBuf[3];
  112.                                     IapEraseSector(0);  //擦除扇區
  113.             IapProgramByte(0x01,add);//寫入新的地址                           
  114.                            }
  115.                            else if(receBuf[2]==0x02)  //打開單路繼電器
  116.                            {
  117.                                        switch(receBuf[3])
  118.                                         {
  119.                                           case 0x01: COM1=0; break;
  120.                                                 case 0x02: COM2=0; break;
  121.                                                 case 0x03: COM3=0; break;
  122.                                                 case 0x04: COM4=0; break;
  123.                                                 default:break;
  124.                                         }
  125.                            }
  126.                            else if(receBuf[2]==0x03)  //關閉單路繼電器
  127.                            {
  128.                                        switch(receBuf[3])
  129.                                         {
  130.                                           case 0x01: COM1=1; break;
  131.                                                 case 0x02: COM2=1; break;
  132.                                                 case 0x03: COM3=1; break;
  133.                                                 case 0x04: COM4=1; break;
  134.                                                 default:break;
  135.                                         }                       
  136.                            }
  137.                            else if(receBuf[2]==0x04)  //打開全部繼電器
  138.                            {
  139.                                 if(receBuf[3]==0xff)
  140.                                 {
  141.                                             COM1=0; COM2=0; COM3=0;COM4=0;
  142.                                         }  
  143.                            }
  144.                            else if(receBuf[2]==0x05)  //關閉全部繼電器
  145.                            {
  146.                                 if(receBuf[3]==0x00)
  147.                                 {
  148.                                             COM1=1; COM2=1; COM3=1; COM4=1;
  149.                                         }                       
  150.                            }
  151.                            else if(receBuf[2]==0x06)  //查詢繼電器
  152.                            {
  153.                                         sendBuf[0]=0xaa;
  154.                                         sendBuf[1]=add;
  155.                                         sendBuf[2]=0x07;
  156.                                         //sendBuf[3]=0xfe;
  157.                                         sendBuf[4]=0xbb;        
  158.                                switch(receBuf[3])
  159.                                    {
  160.                                      case 0x01: if(COM1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  161.                                            case 0x02: if(COM2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  162.                                            case 0x03: if(COM3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  163.                                            case 0x04: if(COM4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  164.                                            default:break;
  165.                                    }  
  166.                                    senduart2();
  167.                            }
  168.                            else if(receBuf[2]==0x08)  //查詢輸入狀態
  169.                            {
  170.                                         sendBuf[0]=0xaa;
  171.                                         sendBuf[1]=add;
  172.                                         sendBuf[2]=0x09;
  173.                                         //sendBuf[3]=0xfe;
  174.                                         sendBuf[4]=0xbb;
  175.                                 
  176.                                switch(receBuf[3])
  177.                                    {
  178.                                      case 0x01: if(IN1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  179.                                            case 0x02: if(IN2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  180.                                            case 0x03: if(IN3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  181.                                            case 0x04: if(IN4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  182.                                            case 0x05: if(IN5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  183.                                            case 0x06: if(IN6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  184.                                            case 0x07: if(IN5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  185.                                            case 0x08: if(IN6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  186.                                            default:break;
  187.                                    }  
  188.                                         senduart2();
  189.                            }                          
  190.                         }
  191.                         if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
  192.                         {
  193.                               add=0x00;
  194.                                     IapEraseSector(0);  //擦除扇區
  195.             IapProgramByte(0x01,0x00);//寫入新的地址
  196.           sendBuf[0]=0xaa;
  197.                                         sendBuf[1]=add;
  198.                                         sendBuf[2]=0x00;
  199.                                         sendBuf[3]=0x00;
  200.                                         sendBuf[4]=0xbb;                                
  201.                                   senduart2();
  202.                         }
  203.                         clear_receBuf();
  204.                 }
  205. if((IN1==0)&&(bz1==0)){delay();if(IN1==0){bz1=1;if(TEND){TEND=0;TBUF='A';TING=1;}while(!TEND);}}
  206. if((IN1==1)&&(bz1==1)){delay();if(IN1==1){bz1=0;}}        
  207.         
  208. if((IN2==0)&&(bz2==0)){delay();if(IN2==0){bz2=1;if(TEND){TEND=0;TBUF='B';TING=1;}while(!TEND);}}
  209. if((IN2==1)&&(bz2==1)){delay();if(IN2==1){bz2=0;}}               

  210. if((IN3==0)&&(bz3==0)){delay();if(IN3==0){bz3=1;if(TEND){TEND=0;TBUF='C';TING=1;}while(!TEND);}}
  211. if((IN3==1)&&(bz3==1)){delay();if(IN3==1){bz3=0;}}        
  212.         
  213. if((IN4==0)&&(bz4==0)){delay();if(IN4==0){bz4=1;if(TEND){TEND=0;TBUF='D';TING=1;}while(!TEND);}}
  214. if((IN4==1)&&(bz4==1)){delay();if(IN4==1){bz4=0;}}        


  215. }
  216. }


  217. // /**********************************************************
  218. //放在主函數,定時0溢出中斷函數,
  219. //*********************/
  220. void tm0()interrupt 1 using 1
  221. {
  222. if(RING)
  223.   {
  224.    if(--RCNT==0)
  225.     {
  226.          RCNT=3;
  227.          if(--RBIT==0)
  228.         {
  229.                  RBUF=RDAT;
  230.                  RING=0;
  231.          REND=1;
  232.                 }
  233.                 else
  234.                 {
  235.                  RDAT>>=1;
  236.                  if(RXB)RDAT|=0X80;
  237.                 }

  238.     }
  239.   }
  240.     else if(!RXB)
  241.         {
  242.          RING=1;
  243.          RCNT=4;
  244.          RBIT=9;
  245.         }
  246.     if(--TCNT==0)
  247.         {
  248.         TCNT=3;


  249.         if(TING)
  250.         {
  251.           if(TBIT==0)
  252.           {
  253.           TXB=0;
  254.           TDAT=TBUF;
  255.           TBIT=9;
  256.           }
  257.           else
  258.           {
  259.           TDAT>>=1;
  260.           if(--TBIT==0)
  261.           {
  262.            TXB=1;
  263.            TING=0;
  264.            TEND=1;
  265.           }
  266.           else
  267.           {
  268.           TXB=CY;
  269.           }
  270.           }
  271.         }
  272.         }
  273. }
  274. void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 單片機 在 一 安全 狀態
  275.     IAP_CONTR = 0;           //
  276.         IAP_CMD = 0;           //
  277.         IAP_TRIG = 0;           //
  278.         IAP_ADDRH = 0x80;  //
  279.         IAP_ADDRL = 0;           //
  280. }
  281. uint8 IapReadByte(uint16 addr){//讀數據
  282.    uint8 dat;
  283.    IAP_CONTR = ENABLE_IAP;
  284.    IAP_CMD = CMD_READ;
  285.    IAP_ADDRL = addr;
  286.    IAP_ADDRH = addr >> 8;
  287.    IAP_TRIG = 0x5A;
  288.    IAP_TRIG = 0xA5;
  289.    _nop_();
  290.    dat = IAP_DATA;
  291.    IapIdle();
  292.    return dat;
  293. }
  294. void IapProgramByte(uint16 addr, uint8 dat){//寫數據
  295.    IAP_CONTR = ENABLE_IAP;
  296.    IAP_CMD = CMD_PROGRAM;
  297.    IAP_ADDRL = addr;
  298.    IAP_ADDRH = addr >> 8;
  299.    IAP_DATA = dat;
  300.    IAP_TRIG = 0x5A;
  301.    IAP_TRIG = 0xA5;
  302.    _nop_();
  303.    IapIdle();
  304. }
  305. void IapEraseSector(uint16 addr){//擦除數據
  306.    IAP_CONTR = ENABLE_IAP;
  307.    IAP_CMD = CMD_ERASE;
  308.    IAP_ADDRL = addr;
  309.    IAP_ADDRH = addr >> 8;
  310.    IAP_TRIG = 0x5A;
  311.    IAP_TRIG = 0xA5;
  312.    _nop_();
  313.    IapIdle();
  314. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:115923 發表于 2020-12-17 22:05 | 只看該作者
帶 控制,  帶保存功能. EPROM 讀/寫/擦 功能.
回復

使用道具 舉報

板凳
ID:328014 發表于 2020-12-20 04:21 | 只看該作者
好東東 樓主能上傳一下工程包嗎 原理圖
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品美女久久久久aⅴ国产馆 | 国产精品欧美精品 | 黄色在线观看国产 | a级免费观看视频 | 日韩在线观看网站 | 国产一级电影在线观看 | 亚洲精品视频在线看 | www.久| 国产成人小视频 | 久久美女视频 | 亚洲精品1| 久久久综合色 | 欧美日韩中文在线 | 久久成人免费 | 国产精品污www在线观看 | 日韩中文字幕在线视频观看 | 全免费a级毛片免费看视频免费下 | 综合久久综合久久 | 天天操夜夜操 | 九九视频在线观看视频6 | 亚洲日韩中文字幕一区 | www.av在线| 日韩精品视频在线免费观看 | 91在线精品一区二区 | 在线免费观看视频黄 | 国产黄色网址在线观看 | 亚洲欧美激情网 | 羞羞网站在线观看 | 国产高清在线精品一区二区三区 | 欧美色人 | 97人人超碰| 精品日韩| 国产一区二区自拍 | 一区二区日本 | 久久久综合网 | 韩国成人在线视频 | 日本精品视频一区二区三区四区 | 毛片毛片毛片毛片毛片 | 亚洲精品在线播放 | 亚洲欧美一区二区三区国产精品 | 亚洲+变态+欧美+另类+精品 |