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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC12C5A60S2單片機8路輸入輸出可編程晶體管控制通訊程序 帶具體要求

[復制鏈接]
跳轉到指定樓層
樓主
要求:
1. 8di 8do在上位機軟件上面能夠讀取
2. 485通信
3. 第一路DO 軟件上發送吸合指令,吸合XmsX為吸合時間可以在軟件上設定),然后自動斷開。
4. 第二路至第8DO 軟件設定開就開,設定關就關。
5. 通信協議和其他儀器儀表相干擾。
6. 波特率 9600 8 n 1
7. 能設置二十個參數在板子的中間寄存器
8. 232通信
9. 通信樣例:5a a5 13 82 00 00 0064*8
10. 其中 5A A5 是固定的后面參數由485參數設定
11. 第三位數值 13表示數據長度 表示13 后面有19字節16進制數字。如果設置位9則,發送指令為5a a5 09 82 00 00 0064*3 。(0064*3表示有30064,也就是十進制100)。此數值為多少,總字節長度+3為總發送數據。如為1316進制表示發送8個數值。為9表示發送3個數值。
12. 其中由第三位數值開始由上位機設定。
13. 可以設置的參數可以單獨設定,也可以多個參數同時設定。
14. 建議第一個參數為設置單脈沖ms時間(單獨設定)。后面可設置參數為數據長度,數值等(同時設定)。

電路原理圖如下:

八路輸入檢測命令:
上位機發送:AA 01 00 BB     
AA 報頭 01功能碼,代表查詢輸入狀態,00 無效,BB報尾
下位機返回:CC 01 00 DD
        CC 報頭 01功能碼,代表返回的是輸入狀態 ,00代表全開,11代表全關,DD報尾
八路輸出檢測命令:
上位機發送:AA 02 00 BB     
AA 報頭 02功能碼,代表查詢輸出狀態,00 無效,BB報尾
下位機返回:CC 02 00 DD
        CC 報頭 02功能碼,代表返回的是輸出狀態 ,00代表全開,11代表全關,DD報尾
八路輸出控制:
        上位機發送:AA 03 01 BB  01命令比較特殊,是吸合幾秒鐘自動斷開,所以第一路沒有關閉的指令,只有開的指令
AA 報頭 03功能碼,代表控制輸出開,01代表第一路,02代表第二路,…… BB報尾
        下位機返回:CC 03 01 DD
        CC 報頭 03功能碼,代表控制的路數控制開成功,01代表第一路,02代表第二路,……DD報尾
上位機發送:AA 04 01 BB
AA 報頭 04功能碼,代表控制輸出關,01代表第一路,02代表第二路,…… BB報尾
        下位機返回:CC 04 01 DD
        CC 報頭 04功能碼,代表控制的路數控制關成功,01代表第一路,02代表第二路,……DD報尾
設置第一路吸合的時間
        上位機發送: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為長度,十六進制的數值,轉換過來是19,代表后面的長度為19個字節
        該命令通過485發送,發送之后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重載值的高字節
  6. unsigned char T0RL = 0;  //T0重載值的低字節
  7. bit flagFrame = 0;  //幀接收完成標志,即接收到一幀新數據
  8. bit flagTxd = 0;    //單字節發送完成標志,用來替代TXD中斷標志位
  9. unsigned char cntRxd = 0;   //接收字節計數器
  10. unsigned char pdata bufRxd[100];  //接收字節緩沖區
  11. bit flagFrame2 = 0;  //幀接收完成標志,即接收到一幀新數據
  12. bit flagTxd2 = 0;    //單字節發送完成標志,用來替代TXD中斷標志位
  13. unsigned char cntRxd2 = 0;   //接收字節計數器
  14. unsigned char pdata bufRxd2[100];  //接收字節緩沖區
  15. void UartDriver();//串口驅動函數,監測數據幀的接收,調度功能函數,需在主循環中調用
  16. void UartAction(unsigned char *buf, unsigned char len);//在接收到的數據幀后添加換車換行符后發回
  17. void UartWrite(unsigned char *buf, unsigned char len);//串口數據寫入,即串口發送函數,buf-待發送數據的指針,len-指定的發送長度
  18. unsigned char UartRead(unsigned char *buf, unsigned char len);//串口數據讀取函數,buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
  19. void UartDriver2();//串口驅動函數,監測數據幀的接收,調度功能函數,需在主循環中調用
  20. void UartAction2(unsigned char *buf2, unsigned char len2);//在接收到的數據幀后添加換車換行符后發回
  21. void UartWrite2(unsigned char *buf2, unsigned char len2);//串口數據寫入,即串口發送函數,buf-待發送數據的指針,len-指定的發送長度
  22. unsigned char UartRead2(unsigned char *buf2, unsigned char len2);//串口數據讀取函數,buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
  23. void UartRxMonitor(unsigned char ms);//串口接收監控,由空閑時間判定幀結束,需在定時中斷中調用,ms-定時間隔
  24. void ConfigUART(unsigned int baud);//串口配置函數,baud-通信波特率
  25. void ConfigTimer0(unsigned int ms);//配置并啟動T0,ms-T0定時時間
  26. uchar Byte_Read(uint add);              //讀一字節,調用前需打開IAP 功能
  27. void Byte_Program(uint add, uint ch);  //字節編程,調用前需打開IAP 功能
  28. void Sector_Erase(uint add);            //擦除扇區
  29. void IAP_Disable();                       //關閉IAP 功能
  30. void Delay();
  31. #define ENABLE_ISP 0x81 //系統工作時鐘<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接口發送接收控制
  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){//在接收到的數據幀后添加換車換行符后發回
  62.                 UartWrite(buf, len);
  63. }
  64. void UartAction2(unsigned char *buf2, unsigned char len2){//在接收到的數據幀后添加換車換行符后發回
  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]){//按指令位執行操作
  103.                         case 0x01://查詢輸入狀態命令
  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://查詢輸出狀態命令
  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://輸出關控制
  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();  //調用串口驅動
  182.                 UartDriver2();  //調用串口驅動
  183.         }
  184. }
  185. void InterruptTimer0() interrupt 1{//T0中斷服務函數,執行串口接收監控
  186.     TH0 = T0RH;  //重新加載重載值
  187.     TL0 = T0RL;
  188.     UartRxMonitor(1);  //串口接收監控
  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{//串口中斷服務函數
  200.     if (RI) { //接收到新字節
  201.         RI = 0;  //清零接收中斷標志位
  202.         if (cntRxd < sizeof(bufRxd)) {//接收緩沖區尚未用完時,保存接收字節,并遞增計數器
  203.             bufRxd[cntRxd++] = SBUF;        // cntRxd++這個很重要,一開始 cntRxd < sizeof(bufRxd)當進入函數的次數增加,cntRxd慢慢變大,當傳入的數據不滿的時候就        用時間檢測,判斷是否是傳輸完成
  204.         }
  205.     }
  206.     if (TI) { //字節發送完畢
  207.         TI = 0;   //清零發送中斷標志位
  208.         flagTxd = 1;  //設置字節發送完成標志
  209.     }
  210. }
  211. void uart2_isr()  interrupt 8{//發送接收中斷函數
  212.         if( S2CON & 0x01 ){
  213.                 S2CON &= ~0x01;
  214.                 if (cntRxd2 < sizeof(bufRxd2)){ //接收緩沖區尚未用完時,保存接收字節,并遞增計數器
  215.             bufRxd2[cntRxd2++] = S2BUF;        // cntRxd++這個很重要,一開始 cntRxd < sizeof(bufRxd)當進入函數的次數增加,cntRxd慢慢變大,當傳入的數據不滿的時候就        用時間檢測,判斷是否是傳輸完成
  216.         }
  217.          }
  218.         if( S2CON & 0x02 ){
  219.                 S2CON &= ~0x02;
  220.                 flagTxd2 = 1;  //設置字節發送完成標志
  221.         b485Send=0;//發送完畢設置為接收
  222.     }
  223. }

  224. void ConfigTimer0(unsigned int ms){//配置并啟動T0,ms-T0定時時間
  225.     unsigned long tmp;  //臨時變量   
  226.     tmp = 11059200 / 12;      //定時器計數頻率
  227.     tmp = (tmp * ms) / 1000;  //計算所需的計數值
  228.     tmp = 65536 - tmp;        //計算定時器重載值
  229.     tmp = tmp + 33;           //補償中斷響應延時造成的誤差
  230.     T0RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節
  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){//串口配置函數,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,八位數據,可變波特率
  249.         AUXR1 = 0x00;  //1T工作方式
  250.          PCON  = 0x00;  //不倍增波特率
  251.          IP2   = 0x00;  //優先級默認
  252.          BRT   = 0XFD;  //設置波特率9600
  253.          AUXR  = 0x10;  //啟動波特率發生器
  254.         IE2   = 0x01;  //開串口2中斷        
  255. }
  256. void UartWrite(unsigned char *buf, unsigned char len){//串口數據寫入,即串口發送函數,buf-待發送數據的指針,len-指定的發送長度
  257.     while (len--){   //循環發送所有字節
  258.         flagTxd = 0;      //清零發送標志
  259.         SBUF = *buf++;    //發送一個字節數據
  260.         while (!flagTxd); //等待該字節發送完成
  261.     }
  262. }
  263. void UartWrite2(unsigned char *buf2, unsigned char len2){//串口數據寫入,即串口發送函數,buf-待發送數據的指針,len-指定的發送長度
  264.     while (len2--){   //循環發送所有字節
  265.         flagTxd2 = 0;      //清零發送標志
  266.                 b485Send=1;
  267.         S2BUF = *buf2++;    //發送一個字節數據
  268.         while (!flagTxd2); //等待該字節發送完成
  269.     }
  270. }
  271. unsigned char UartRead(unsigned char *buf, unsigned char len){//串口數據讀取函數,buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
  272.     unsigned char i;
  273.     if (len > cntRxd){  //指定讀取長度大于實際接收到的數據長度時,讀取長度設置為實際接收到的數據長度
  274.         len = cntRxd;
  275.     }
  276.     for (i=0; i<len; i++){  //拷貝接收到的數據到接收指針上
  277.         *buf++ = bufRxd[i];
  278.     }
  279.     cntRxd = 0;  //接收計數器清零
  280.     return len;  //返回實際讀取長度
  281. }
  282. void UartDriver(){//串口驅動函數,監測數據幀的接收,調度功能函數,需在主循環中調用
  283.     unsigned char len;
  284.     unsigned char pdata buf[40];
  285.     if (flagFrame){ //有命令到達時,讀取處理該命令
  286.         flagFrame = 0;
  287.         len = UartRead(buf, sizeof(buf)-2); //將接收到的命令讀取到緩沖區中
  288.         UartAction(buf, len);  //傳遞數據幀,調用動作執行函數
  289.     }
  290. }
  291. unsigned char UartRead2(unsigned char *buf2, unsigned char len2){//串口數據讀取函數,buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
  292.     unsigned char i;
  293.     if (len2 > cntRxd2){  //指定讀取長度大于實際接收到的數據長度時,讀取長度設置為實際接收到的數據長度
  294.         len2 = cntRxd2;
  295.     }
  296.     for (i=0; i<len2; i++){  //拷貝接收到的數據到接收指針上
  297.         *buf2++ = bufRxd2[i];
  298.     }
  299.     cntRxd2 = 0;  //接收計數器清零
  300.     return len2;  //返回實際讀取長度
  301. }
  302. void UartDriver2(){//串口驅動函數,監測數據幀的接收,調度功能函數,需在主循環中調用
  303.     unsigned char len2;
  304.     unsigned char pdata buf2[40];
  305.     if (flagFrame2){ //有命令到達時,讀取處理該命令
  306.         flagFrame2 = 0;
  307.         len2 = UartRead2(buf2, sizeof(buf2)-2); //將接收到的命令讀取到緩沖區中
  308.         UartAction2(buf2, len2);  //傳遞數據幀,調用動作執行函數
  309.     }
  310. }
  311. void UartRxMonitor(unsigned char ms){//串口接收監控,由空閑時間判定幀結束,需在定時中斷中調用,ms-定時間隔
  312.     static unsigned char cntbkp = 0;
  313.     static unsigned char idletmr = 0;
  314.     if (cntRxd > 0){  //接收計數器大于零時,監控總線空閑時間
  315.         if (cntbkp != cntRxd){  //接收計數器改變,即剛接收到數據時,清零空閑計時
  316.             cntbkp = cntRxd;
  317.             idletmr = 0;
  318.         }else{                   //接收計數器未改變,即總線空閑時,累積空閑時間
  319.             if (idletmr < 30){  //空閑計時小于30ms時,持續累加
  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. //讀一字節,調用前需打開IAP 功能,入口:DPTR = 字節地址,返回:A = 讀出字節
  345. uchar Byte_Read(uint add){
  346.     IAP_DATA = 0x00;
  347.     IAP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設置Flash 操作等待時間
  348.     IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字節讀命令

  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 觸發寄存器,每次都需如此
  354.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被觸發起動
  355.     _nop_();
  356.     //EA = 1;
  357.     IAP_Disable();  //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  358.                     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  359.     return (IAP_DATA);
  360. }

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

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

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

  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 觸發寄存器,每次都需如此
  386.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被觸發起動
  387.     _nop_();
  388.     //EA = 1;
  389.     IAP_Disable();  //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  390.                     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  391. }

  392. void IAP_Disable(){
  393.     //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  394.     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  395.     IAP_CONTR = 0;      //關閉IAP 功能
  396.     IAP_CMD   = 0;      //清命令寄存器,使命令寄存器無命令,此句可不用
  397.     IAP_TRIG  = 0;      //清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
  398.     IAP_ADDRH = 0;
  399.     IAP_ADDRL = 0;
  400. }
復制代碼
全部資料51hei下載地址:
Desktop.rar (85.38 KB, 下載次數: 33)
8入8出可編程場效應管PNP款原理圖及PCB圖.rar (420.52 KB, 下載次數: 38)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:105206 發表于 2020-4-16 23:16 | 只看該作者
謝謝分享,學習了。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 激情欧美日韩一区二区 | 久久久久国产 | 亚洲欧美综合 | 我要看黄色录像一级片 | 精品久久久久国产免费第一页 | 日韩欧美一二三区 | 久久久久国产 | 97av视频 | 超碰在线国产 | 日韩波多野结衣 | 激情综合五月 | 日本三级线观看 视频 | 日韩图区 | 一级黄色在线 | 精品视频一区二区三区在线观看 | www日本高清 | 久久精品中文字幕 | 综合精品在线 | 一区二区三区四区免费视频 | 久久久久久亚洲 | 香蕉视频在线播放 | 中文在线亚洲 | 久久久久久一区 | 日本久久久久久 | 欧美日韩国产中文字幕 | 日韩欧美大片在线观看 | aa级毛片毛片免费观看久 | 日韩视频1 | 粉嫩粉嫩芽的虎白女18在线视频 | 欧美一区二区三区四区视频 | 日本不卡一区二区三区 | 日韩成人一区 | 一级做a爰片性色毛片视频停止 | 欧美一区二区久久 | 中文字幕一级毛片 | 亚洲成人自拍 | 亚洲一区二区av | 日韩精品一区二区三区老鸭窝 | 成年免费大片黄在线观看岛国 | 九九精品视频在线 | 国产视频福利一区 |