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

標題: STC12C5A60S2單片機8路輸入輸出可編程晶體管控制通訊程序 帶具體要求 [打印本頁]

作者: zhangxinchun    時間: 2019-11-17 22:51
標題: STC12C5A60S2單片機8路輸入輸出可編程晶體管控制通訊程序 帶具體要求
要求:
1. 8di 8do在上位機軟件上面能夠讀取
2. 485通信
3. 第一路DO 軟件上發(fā)送吸合指令,吸合XmsX為吸合時間可以在軟件上設定),然后自動斷開。
4. 第二路至第8DO 軟件設定開就開,設定關(guān)就關(guān)。
5. 通信協(xié)議和其他儀器儀表相干擾。
6. 波特率 9600 8 n 1
7. 能設置二十個參數(shù)在板子的中間寄存器
8. 232通信
9. 通信樣例:5a a5 13 82 00 00 0064*8
10. 其中 5A A5 是固定的后面參數(shù)由485參數(shù)設定
11. 第三位數(shù)值 13表示數(shù)據(jù)長度 表示13 后面有19字節(jié)16進制數(shù)字。如果設置位9則,發(fā)送指令為5a a5 09 82 00 00 0064*3 。(0064*3表示有30064,也就是十進制100)。此數(shù)值為多少,總字節(jié)長度+3為總發(fā)送數(shù)據(jù)。如為1316進制表示發(fā)送8個數(shù)值。為9表示發(fā)送3個數(shù)值。
12. 其中由第三位數(shù)值開始由上位機設定。
13. 可以設置的參數(shù)可以單獨設定,也可以多個參數(shù)同時設定。
14. 建議第一個參數(shù)為設置單脈沖ms時間(單獨設定)。后面可設置參數(shù)為數(shù)據(jù)長度,數(shù)值等(同時設定)。

電路原理圖如下:

八路輸入檢測命令:
上位機發(fā)送:AA 01 00 BB     
AA 報頭 01功能碼,代表查詢輸入狀態(tài),00 無效,BB報尾
下位機返回:CC 01 00 DD
        CC 報頭 01功能碼,代表返回的是輸入狀態(tài) ,00代表全開,11代表全關(guān),DD報尾
八路輸出檢測命令:
上位機發(fā)送:AA 02 00 BB     
AA 報頭 02功能碼,代表查詢輸出狀態(tài),00 無效,BB報尾
下位機返回:CC 02 00 DD
        CC 報頭 02功能碼,代表返回的是輸出狀態(tài) ,00代表全開,11代表全關(guān),DD報尾
八路輸出控制:
        上位機發(fā)送:AA 03 01 BB  01命令比較特殊,是吸合幾秒鐘自動斷開,所以第一路沒有關(guān)閉的指令,只有開的指令
AA 報頭 03功能碼,代表控制輸出開,01代表第一路,02代表第二路,…… BB報尾
        下位機返回:CC 03 01 DD
        CC 報頭 03功能碼,代表控制的路數(shù)控制開成功,01代表第一路,02代表第二路,……DD報尾
上位機發(fā)送:AA 04 01 BB
AA 報頭 04功能碼,代表控制輸出關(guān),01代表第一路,02代表第二路,…… BB報尾
        下位機返回:CC 04 01 DD
        CC 報頭 04功能碼,代表控制的路數(shù)控制關(guān)成功,01代表第一路,02代表第二路,……DD報尾
設置第一路吸合的時間
        上位機發(fā)送:AA 05 01 00 00 00 09 BB
                AA 報頭 05功能碼,01代表設置第一路吸合的時間 00 00 00 09
代表一共9毫秒的,00 00 FF FF 代表510毫秒 FF FF FF FF 代表1020毫秒 BB報尾 時間四個十六進制輸相加
下位機返回:CC 05 01 DD
        CC 報頭 05功能碼,代表設置時間成功,01代表第一路……DD報尾

單片機485輸入232輸出
        5a a5 13 82 00 00 00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 64
        5a a5 為報頭
        13為長度,十六進制的數(shù)值,轉(zhuǎn)換過來是19,代表后面的長度為19個字節(jié)
        該命令通過485發(fā)送,發(fā)送之后232直接傳出

00 00 00 09
代表1000毫秒 BB是報尾

單片機源程序如下:
  1. #include <STC12C5A60S2.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char//宏定義無符號字符型
  4. #define uint unsigned int  //宏定義無符號整型
  5. unsigned char T0RH = 0;  //T0重載值的高字節(jié)
  6. unsigned char T0RL = 0;  //T0重載值的低字節(jié)
  7. bit flagFrame = 0;  //幀接收完成標志,即接收到一幀新數(shù)據(jù)
  8. bit flagTxd = 0;    //單字節(jié)發(fā)送完成標志,用來替代TXD中斷標志位
  9. unsigned char cntRxd = 0;   //接收字節(jié)計數(shù)器
  10. unsigned char pdata bufRxd[100];  //接收字節(jié)緩沖區(qū)
  11. bit flagFrame2 = 0;  //幀接收完成標志,即接收到一幀新數(shù)據(jù)
  12. bit flagTxd2 = 0;    //單字節(jié)發(fā)送完成標志,用來替代TXD中斷標志位
  13. unsigned char cntRxd2 = 0;   //接收字節(jié)計數(shù)器
  14. unsigned char pdata bufRxd2[100];  //接收字節(jié)緩沖區(qū)
  15. void UartDriver();//串口驅(qū)動函數(shù),監(jiān)測數(shù)據(jù)幀的接收,調(diào)度功能函數(shù),需在主循環(huán)中調(diào)用
  16. void UartAction(unsigned char *buf, unsigned char len);//在接收到的數(shù)據(jù)幀后添加換車換行符后發(fā)回
  17. void UartWrite(unsigned char *buf, unsigned char len);//串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長度
  18. unsigned char UartRead(unsigned char *buf, unsigned char len);//串口數(shù)據(jù)讀取函數(shù),buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
  19. void UartDriver2();//串口驅(qū)動函數(shù),監(jiān)測數(shù)據(jù)幀的接收,調(diào)度功能函數(shù),需在主循環(huán)中調(diào)用
  20. void UartAction2(unsigned char *buf2, unsigned char len2);//在接收到的數(shù)據(jù)幀后添加換車換行符后發(fā)回
  21. void UartWrite2(unsigned char *buf2, unsigned char len2);//串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長度
  22. unsigned char UartRead2(unsigned char *buf2, unsigned char len2);//串口數(shù)據(jù)讀取函數(shù),buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
  23. void UartRxMonitor(unsigned char ms);//串口接收監(jiān)控,由空閑時間判定幀結(jié)束,需在定時中斷中調(diào)用,ms-定時間隔
  24. void ConfigUART(unsigned int baud);//串口配置函數(shù),baud-通信波特率
  25. void ConfigTimer0(unsigned int ms);//配置并啟動T0,ms-T0定時時間
  26. uchar Byte_Read(uint add);              //讀一字節(jié),調(diào)用前需打開IAP 功能
  27. void Byte_Program(uint add, uint ch);  //字節(jié)編程,調(diào)用前需打開IAP 功能
  28. void Sector_Erase(uint add);            //擦除扇區(qū)
  29. void IAP_Disable();                       //關(guān)閉IAP 功能
  30. void Delay();
  31. #define ENABLE_ISP 0x81 //系統(tǒng)工作時鐘<20MHz 時,對IAP_CONTR 寄存器設置此值
  32. unsigned char paths;
  33. char buf0add7;

  34. sbit ins01=P0^0;
  35. sbit ins02=P0^1;
  36. sbit ins03=P0^2;
  37. sbit ins04=P0^3;
  38. sbit ins05=P0^4;
  39. sbit ins06=P0^5;
  40. sbit ins07=P0^6;
  41. sbit ins08=P0^7;

  42. /*定義八位輸出為單片機P2口*/
  43. sbit out01=P2^6;
  44. sbit out02=P2^7;
  45. sbit out03=P5^1;
  46. sbit out04=P5^0;
  47. sbit out05=P4^6;
  48. sbit out06=P4^1;
  49. sbit out07=P4^5;
  50. sbit out08=P4^4;
  51. sbit b485Send=P2^4;        //485接口發(fā)送接收控制
  52. unsigned char ck1=0x00;
  53. uint time1=0,time2=0;
  54. bit timef1=0;
  55. uchar num11=0,num12=0,num1=0;
  56. uchar num21=0,num22=0,num2=0;
  57. uchar num31=0,num32=0,num3=0;
  58. uchar num41=0,num42=0,num4=0;
  59. uchar time21=0,time22=0;
  60. uchar ls=0,ls1=0,ls2=0;
  61. void UartAction(unsigned char *buf, unsigned char len){//在接收到的數(shù)據(jù)幀后添加換車換行符后發(fā)回
  62.                 UartWrite(buf, len);
  63. }
  64. void UartAction2(unsigned char *buf2, unsigned char len2){//在接收到的數(shù)據(jù)幀后添加換車換行符后發(fā)回
  65.         if((buf2[0]==0x5A)&&(buf2[1]==0xA5)){
  66.                         ls1=buf2[2]/10;
  67.                         ls2=buf2[2]%10;
  68.                         ls=ls1*10+ls2+3;
  69.                         if(len2==ls){               
  70.                                 UartWrite(buf2, len2);
  71.                         }
  72.         }
  73.         if((buf2[0]==0xAA)&&(buf2[1]==0x05)&&(buf2[7]==0xBB)&&(len2==8)){
  74.                 if(buf2[2]==0x01){
  75.                         num11=buf2[3]/10;
  76.                         num12=buf2[3]%10;
  77.                         num1=num11*10+num12;
  78.                         num21=buf2[4]/10;
  79.                         num22=buf2[4]%10;
  80.                         num2=num21*10+num22;
  81.                         num31=buf2[5]/10;
  82.                         num32=buf2[5]%10;
  83.                         num3=num31*10+num32;
  84.                         num41=buf2[6]/10;
  85.                         num42=buf2[6]%10;
  86.                         num4=num41*10+num42;               
  87.                         time2=num1+num2+num3+num4;
  88.                         time21=time2/100;//把int型的值拆分到char型
  89.                         time22=time2%100;
  90.                                 Sector_Erase(0);              
  91.                                 Byte_Program(0x01,time21);
  92.                                 Byte_Program(0x02,time22);
  93.                                 buf2[0]=0xCC;
  94.                                 buf2[1]=0x05;
  95.                                 buf2[2]=buf2[2];
  96.                                 buf2[3]=0xDD;
  97.                                 len2=4;
  98.                                 UartWrite2(buf2, len2);
  99.                 }
  100.         }
  101.         if((buf2[0]==0xAA)&&(buf2[3]==0xBB)&&(len2==4)){
  102.                 switch (buf2[1]){//按指令位執(zhí)行操作
  103.                         case 0x01://查詢輸入狀態(tài)命令
  104.                         ck1=0xFF;
  105.                                 if(ins01){ck1|=0x80;}else{ck1&=0x7f;}
  106.                                 if(ins02){ck1|=0x40;}else{ck1&=0xbf;}
  107.                                 if(ins03){ck1|=0x20;}else{ck1&=0xdf;}
  108.                                 if(ins04){ck1|=0x10;}else{ck1&=0xef;}
  109.                         if(ins05){ck1|=0x08;}else{ck1&=0xf7;}
  110.                                 if(ins06){ck1|=0x04;}else{ck1&=0xfb;}
  111.                         if(ins07){ck1|=0x02;}else{ck1&=0xfd;}
  112.                                 if(ins08){ck1|=0x01;}else{ck1&=0xfe;}
  113.                                 buf2[0]=0xCC;
  114.                                 buf2[1]=0x01;
  115.                                 buf2[2]=ck1;
  116.                                 buf2[3]=0xDD;
  117.                                 len2=4;
  118.                                 UartWrite2(buf2, len2);
  119.                                 break;
  120.                         case 0x02://查詢輸出狀態(tài)命令
  121.                         ck1=0xFF;
  122.                                 if(out01){ck1|=0x80;}else{ck1&=0x7f;}
  123.                                 if(out02){ck1|=0x40;}else{ck1&=0xbf;}
  124.                                 if(out03){ck1|=0x20;}else{ck1&=0xdf;}
  125.                                 if(out04){ck1|=0x10;}else{ck1&=0xef;}
  126.                         if(out05){ck1|=0x08;}else{ck1&=0xf7;}
  127.                                 if(out06){ck1|=0x04;}else{ck1&=0xfb;}
  128.                         if(out07){ck1|=0x02;}else{ck1&=0xfd;}
  129.                                 if(out08){ck1|=0x01;}else{ck1&=0xfe;}
  130.                                 buf2[0]=0xCC;
  131.                                 buf2[1]=0x02;
  132.                                 buf2[2]=ck1;
  133.                                 buf2[3]=0xDD;
  134.                                 len2=4;
  135.                                 UartWrite2(buf2, len2);
  136.                                 break;
  137.                         case 0x03://輸出開控制
  138.                         if(buf2[2]==0x01){timef1=1;out01=0;}
  139.                         if(buf2[2]==0x02){out02=0;}
  140.                         if(buf2[2]==0x03){out03=0;}
  141.                         if(buf2[2]==0x04){out04=0;}
  142.                         if(buf2[2]==0x05){out05=0;}
  143.                         if(buf2[2]==0x06){out06=0;}
  144.                         if(buf2[2]==0x07){out07=0;}
  145.                         if(buf2[2]==0x08){out08=0;}
  146.                                 buf2[0]=0xCC;
  147.                                 buf2[1]=0x03;
  148.                                 buf2[2]=buf2[2];
  149.                                 buf2[3]=0xDD;
  150.                                 len2=4;
  151.                                 UartWrite2(buf2, len2);
  152.                                 break;
  153.                         case 0x04://輸出關(guān)控制
  154.                         if(buf2[2]==0x02){out02=1;}
  155.                         if(buf2[2]==0x03){out03=1;}
  156.                         if(buf2[2]==0x04){out04=1;}
  157.                         if(buf2[2]==0x05){out05=1;}
  158.                         if(buf2[2]==0x06){out06=1;}
  159.                         if(buf2[2]==0x07){out07=1;}
  160.                         if(buf2[2]==0x08){out08=1;}
  161.                                 buf2[0]=0xCC;
  162.                                 buf2[1]=0x04;
  163.                                 buf2[2]=buf2[2];
  164.                                 buf2[3]=0xDD;
  165.                                 len2=4;
  166.                                 UartWrite2(buf2, len2);
  167.                                 break;
  168.                 }               
  169.         }
  170. }
  171. void main(){
  172.         P4SW|=0x70;
  173.     b485Send=0; //接收模式
  174.         EA = 1;            //開總中斷
  175.     ConfigTimer0(1);   //配置T0定時1ms
  176.     ConfigUART(9600);  //配置波特率為9600
  177.         time21=Byte_Read(0x01);//掉電存儲用到
  178.         time22=Byte_Read(0x02);//掉電存儲用到
  179.         time2=time21*100+time22;
  180.         while(1){
  181.                 UartDriver();  //調(diào)用串口驅(qū)動
  182.                 UartDriver2();  //調(diào)用串口驅(qū)動
  183.         }
  184. }
  185. void InterruptTimer0() interrupt 1{//T0中斷服務函數(shù),執(zhí)行串口接收監(jiān)控
  186.     TH0 = T0RH;  //重新加載重載值
  187.     TL0 = T0RL;
  188.     UartRxMonitor(1);  //串口接收監(jiān)控
  189.         if(timef1){
  190.                 out01=0;
  191.                 time1++;
  192.                 if(time1>time2){
  193.                         time1=0;
  194.                         timef1=0;
  195.                         out01=1;
  196.                 }
  197.         }
  198. }
  199. void InterruptUART() interrupt 4{//串口中斷服務函數(shù)
  200.     if (RI) { //接收到新字節(jié)
  201.         RI = 0;  //清零接收中斷標志位
  202.         if (cntRxd < sizeof(bufRxd)) {//接收緩沖區(qū)尚未用完時,保存接收字節(jié),并遞增計數(shù)器
  203.             bufRxd[cntRxd++] = SBUF;        // cntRxd++這個很重要,一開始 cntRxd < sizeof(bufRxd)當進入函數(shù)的次數(shù)增加,cntRxd慢慢變大,當傳入的數(shù)據(jù)不滿的時候就        用時間檢測,判斷是否是傳輸完成
  204.         }
  205.     }
  206.     if (TI) { //字節(jié)發(fā)送完畢
  207.         TI = 0;   //清零發(fā)送中斷標志位
  208.         flagTxd = 1;  //設置字節(jié)發(fā)送完成標志
  209.     }
  210. }
  211. void uart2_isr()  interrupt 8{//發(fā)送接收中斷函數(shù)
  212.         if( S2CON & 0x01 ){
  213.                 S2CON &= ~0x01;
  214.                 if (cntRxd2 < sizeof(bufRxd2)){ //接收緩沖區(qū)尚未用完時,保存接收字節(jié),并遞增計數(shù)器
  215.             bufRxd2[cntRxd2++] = S2BUF;        // cntRxd++這個很重要,一開始 cntRxd < sizeof(bufRxd)當進入函數(shù)的次數(shù)增加,cntRxd慢慢變大,當傳入的數(shù)據(jù)不滿的時候就        用時間檢測,判斷是否是傳輸完成
  216.         }
  217.          }
  218.         if( S2CON & 0x02 ){
  219.                 S2CON &= ~0x02;
  220.                 flagTxd2 = 1;  //設置字節(jié)發(fā)送完成標志
  221.         b485Send=0;//發(fā)送完畢設置為接收
  222.     }
  223. }

  224. void ConfigTimer0(unsigned int ms){//配置并啟動T0,ms-T0定時時間
  225.     unsigned long tmp;  //臨時變量   
  226.     tmp = 11059200 / 12;      //定時器計數(shù)頻率
  227.     tmp = (tmp * ms) / 1000;  //計算所需的計數(shù)值
  228.     tmp = 65536 - tmp;        //計算定時器重載值
  229.     tmp = tmp + 33;           //補償中斷響應延時造成的誤差
  230.     T0RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節(jié)
  231.     T0RL = (unsigned char)tmp;
  232.     TMOD &= 0xF0;   //清零T0的控制位
  233.     TMOD |= 0x01;   //配置T0為模式1
  234.     TH0 = T0RH;     //加載T0重載值
  235.     TL0 = T0RL;
  236.     ET0 = 1;        //使能T0中斷
  237.     TR0 = 1;        //啟動T0
  238. }
  239. void ConfigUART(unsigned int baud){//串口配置函數(shù),baud-通信波特率
  240.     SCON  = 0x50;  //配置串口為模式1
  241.     TMOD &= 0x0F;  //清零T1的控制位
  242.     TMOD |= 0x20;  //配置T1為模式2
  243.     TH1 = 256 - (11059200/12/32)/baud;  //計算T1重載值
  244.     TL1 = TH1;     //初值等于重載值
  245.     ET1 = 0;       //禁止T1中斷
  246.     ES  = 1;       //使能串口中斷
  247.     TR1 = 1;       //啟動T1
  248.         S2CON = 0x50;  //方式1,八位數(shù)據(jù),可變波特率
  249.         AUXR1 = 0x00;  //1T工作方式
  250.          PCON  = 0x00;  //不倍增波特率
  251.          IP2   = 0x00;  //優(yōu)先級默認
  252.          BRT   = 0XFD;  //設置波特率9600
  253.          AUXR  = 0x10;  //啟動波特率發(fā)生器
  254.         IE2   = 0x01;  //開串口2中斷        
  255. }
  256. void UartWrite(unsigned char *buf, unsigned char len){//串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長度
  257.     while (len--){   //循環(huán)發(fā)送所有字節(jié)
  258.         flagTxd = 0;      //清零發(fā)送標志
  259.         SBUF = *buf++;    //發(fā)送一個字節(jié)數(shù)據(jù)
  260.         while (!flagTxd); //等待該字節(jié)發(fā)送完成
  261.     }
  262. }
  263. void UartWrite2(unsigned char *buf2, unsigned char len2){//串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長度
  264.     while (len2--){   //循環(huán)發(fā)送所有字節(jié)
  265.         flagTxd2 = 0;      //清零發(fā)送標志
  266.                 b485Send=1;
  267.         S2BUF = *buf2++;    //發(fā)送一個字節(jié)數(shù)據(jù)
  268.         while (!flagTxd2); //等待該字節(jié)發(fā)送完成
  269.     }
  270. }
  271. unsigned char UartRead(unsigned char *buf, unsigned char len){//串口數(shù)據(jù)讀取函數(shù),buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
  272.     unsigned char i;
  273.     if (len > cntRxd){  //指定讀取長度大于實際接收到的數(shù)據(jù)長度時,讀取長度設置為實際接收到的數(shù)據(jù)長度
  274.         len = cntRxd;
  275.     }
  276.     for (i=0; i<len; i++){  //拷貝接收到的數(shù)據(jù)到接收指針上
  277.         *buf++ = bufRxd[i];
  278.     }
  279.     cntRxd = 0;  //接收計數(shù)器清零
  280.     return len;  //返回實際讀取長度
  281. }
  282. void UartDriver(){//串口驅(qū)動函數(shù),監(jiān)測數(shù)據(jù)幀的接收,調(diào)度功能函數(shù),需在主循環(huán)中調(diào)用
  283.     unsigned char len;
  284.     unsigned char pdata buf[40];
  285.     if (flagFrame){ //有命令到達時,讀取處理該命令
  286.         flagFrame = 0;
  287.         len = UartRead(buf, sizeof(buf)-2); //將接收到的命令讀取到緩沖區(qū)中
  288.         UartAction(buf, len);  //傳遞數(shù)據(jù)幀,調(diào)用動作執(zhí)行函數(shù)
  289.     }
  290. }
  291. unsigned char UartRead2(unsigned char *buf2, unsigned char len2){//串口數(shù)據(jù)讀取函數(shù),buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
  292.     unsigned char i;
  293.     if (len2 > cntRxd2){  //指定讀取長度大于實際接收到的數(shù)據(jù)長度時,讀取長度設置為實際接收到的數(shù)據(jù)長度
  294.         len2 = cntRxd2;
  295.     }
  296.     for (i=0; i<len2; i++){  //拷貝接收到的數(shù)據(jù)到接收指針上
  297.         *buf2++ = bufRxd2[i];
  298.     }
  299.     cntRxd2 = 0;  //接收計數(shù)器清零
  300.     return len2;  //返回實際讀取長度
  301. }
  302. void UartDriver2(){//串口驅(qū)動函數(shù),監(jiān)測數(shù)據(jù)幀的接收,調(diào)度功能函數(shù),需在主循環(huán)中調(diào)用
  303.     unsigned char len2;
  304.     unsigned char pdata buf2[40];
  305.     if (flagFrame2){ //有命令到達時,讀取處理該命令
  306.         flagFrame2 = 0;
  307.         len2 = UartRead2(buf2, sizeof(buf2)-2); //將接收到的命令讀取到緩沖區(qū)中
  308.         UartAction2(buf2, len2);  //傳遞數(shù)據(jù)幀,調(diào)用動作執(zhí)行函數(shù)
  309.     }
  310. }
  311. void UartRxMonitor(unsigned char ms){//串口接收監(jiān)控,由空閑時間判定幀結(jié)束,需在定時中斷中調(diào)用,ms-定時間隔
  312.     static unsigned char cntbkp = 0;
  313.     static unsigned char idletmr = 0;
  314.     if (cntRxd > 0){  //接收計數(shù)器大于零時,監(jiān)控總線空閑時間
  315.         if (cntbkp != cntRxd){  //接收計數(shù)器改變,即剛接收到數(shù)據(jù)時,清零空閑計時
  316.             cntbkp = cntRxd;
  317.             idletmr = 0;
  318.         }else{                   //接收計數(shù)器未改變,即總線空閑時,累積空閑時間
  319.             if (idletmr < 30){  //空閑計時小于30ms時,持續(xù)累加
  320.                 idletmr += ms;
  321.                 if (idletmr >= 30){  //空閑時間達到30ms時,即判定為一幀接收完畢
  322.                     flagFrame = 1;  //設置幀接收完成標志
  323.                 }
  324.             }
  325.         }
  326.     }else if(cntRxd2 > 0){
  327.         if (cntbkp != cntRxd2){
  328.             cntbkp = cntRxd2;
  329.             idletmr = 0;
  330.         }else{
  331.             if (idletmr < 30){
  332.                 idletmr += ms;
  333.                 if (idletmr >= 30){  
  334.                     flagFrame2 = 1; }}
  335.         }               
  336.         }else{
  337.         cntbkp = 0;
  338.     }
  339. }
  340. union union_temp16{
  341.     uint un_temp16;
  342.     uchar  un_temp8[2];
  343. }my_unTemp16;
  344. //讀一字節(jié),調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址,返回:A = 讀出字節(jié)
  345. uchar Byte_Read(uint add){
  346.     IAP_DATA = 0x00;
  347.     IAP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設置Flash 操作等待時間
  348.     IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字節(jié)讀命令

  349.     my_unTemp16.un_temp16 = add;
  350.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //設置目標單元地址的高8 位地址
  351.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //設置目標單元地址的低8 位地址

  352.     //EA = 0;
  353.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
  354.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動
  355.     _nop_();
  356.     //EA = 1;
  357.     IAP_Disable();  //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
  358.                     //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
  359.     return (IAP_DATA);
  360. }

  361. //字節(jié)編程,調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址, A= 須編程字節(jié)的數(shù)據(jù)
  362. void Byte_Program(uint add, uint ch){
  363.     IAP_CONTR = ENABLE_ISP;         //打開 IAP 功能, 設置Flash 操作等待時間
  364.     IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字節(jié)編程命令

  365.     my_unTemp16.un_temp16 = add;
  366.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //設置目標單元地址的高8 位地址
  367.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //設置目標單元地址的低8 位地址

  368.     IAP_DATA = ch;                  //要編程的數(shù)據(jù)先送進IAP_DATA 寄存器
  369.     //EA = 0;
  370.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
  371.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動
  372.     _nop_();
  373.     //EA = 1;
  374.     IAP_Disable();  //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
  375.                     //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
  376. }

  377. //擦除扇區(qū), 入口:DPTR = 扇區(qū)地址
  378. void Sector_Erase(uint add){
  379.     IAP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設置Flash 操作等待時間
  380.     IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇區(qū)擦除命令

  381.     my_unTemp16.un_temp16 = add;
  382.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //設置目標單元地址的高8 位地址
  383.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //設置目標單元地址的低8 位地址

  384.     //EA = 0;
  385.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
  386.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動
  387.     _nop_();
  388.     //EA = 1;
  389.     IAP_Disable();  //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
  390.                     //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
  391. }

  392. void IAP_Disable(){
  393.     //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
  394.     //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
  395.     IAP_CONTR = 0;      //關(guān)閉IAP 功能
  396.     IAP_CMD   = 0;      //清命令寄存器,使命令寄存器無命令,此句可不用
  397.     IAP_TRIG  = 0;      //清命令觸發(fā)寄存器,使命令觸發(fā)寄存器無觸發(fā),此句可不用
  398.     IAP_ADDRH = 0;
  399.     IAP_ADDRL = 0;
  400. }
復制代碼
全部資料51hei下載地址:
Desktop.rar (85.38 KB, 下載次數(shù): 33)
8入8出可編程場效應管PNP款原理圖及PCB圖.rar (420.52 KB, 下載次數(shù): 38)

作者: jubaolun    時間: 2020-4-16 23:16
謝謝分享,學習了。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲区视频| 久久99久久久久 | 国产精品久久久久久久午夜 | 国产成人高清视频 | 欧美日韩一区二区三区视频 | 国产午夜视频 | 蜜桃免费一区二区三区 | 成人免费观看男女羞羞视频 | 秋霞国产 | 超碰在线人 | 一级片av| 欧美综合久久 | 成人精品毛片国产亚洲av十九禁 | 丁香一区二区 | 国产成在线观看免费视频 | 中日av | 爱爱视频在线观看 | 91中文字幕在线观看 | 中文字幕免费 | 色婷婷国产精品综合在线观看 | 亚洲成人一区 | 亚洲成人一区二区 | 国产亚洲网站 | 免费在线观看黄网站 | 亚洲成人999 | 精品视频亚洲 | 欧美成ee人免费视频 | 91麻豆精品国产91久久久久久久久 | 亚洲综合二区 | 欧美性精品 | 亚洲第一区国产精品 | 亚洲成人自拍网 | 91久色| 欧美激情久久久久久 | 免费观看一级毛片视频 | 99热这里都是精品 | 午夜网 | 国产91丝袜在线播放 | 一区二区欧美在线 | 国产精品久久久久久婷婷天堂 | 亚洲精品久久久久久久久久久 |