標題: STC12C5A60S2單片機8路輸入輸出可編程晶體管控制通訊程序 帶具體要求 [打印本頁]
作者: zhangxinchun 時間: 2019-11-17 22:51
標題: STC12C5A60S2單片機8路輸入輸出可編程晶體管控制通訊程序 帶具體要求
要求:
1. 8di 和8do在上位機軟件上面能夠讀取
2. 485通信
3. 第一路DO 軟件上發(fā)送吸合指令,吸合Xms(X為吸合時間可以在軟件上設定),然后自動斷開。
4. 第二路至第8路DO ,軟件設定開就開,設定關(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表示有3個0064,也就是十進制100)。此數(shù)值為多少,總字節(jié)長度+3為總發(fā)送數(shù)據(jù)。如為13(16進制)表示發(fā)送8個數(shù)值。為9表示發(fā)送3個數(shù)值。
12. 其中由第三位數(shù)值開始由上位機設定。
13. 可以設置的參數(shù)可以單獨設定,也可以多個參數(shù)同時設定。
14. 建議第一個參數(shù)為設置單脈沖ms時間(單獨設定)。后面可設置參數(shù)為數(shù)據(jù)長度,數(shù)值等(同時設定)。
電路原理圖如下:
0.jpg (85.71 KB, 下載次數(shù): 60)
下載附件
2019-11-20 16:28 上傳
八路輸入檢測命令:
上位機發(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是報尾
單片機源程序如下:
- #include <STC12C5A60S2.H>
- #include <intrins.h>
- #define uchar unsigned char//宏定義無符號字符型
- #define uint unsigned int //宏定義無符號整型
- unsigned char T0RH = 0; //T0重載值的高字節(jié)
- unsigned char T0RL = 0; //T0重載值的低字節(jié)
- bit flagFrame = 0; //幀接收完成標志,即接收到一幀新數(shù)據(jù)
- bit flagTxd = 0; //單字節(jié)發(fā)送完成標志,用來替代TXD中斷標志位
- unsigned char cntRxd = 0; //接收字節(jié)計數(shù)器
- unsigned char pdata bufRxd[100]; //接收字節(jié)緩沖區(qū)
- bit flagFrame2 = 0; //幀接收完成標志,即接收到一幀新數(shù)據(jù)
- bit flagTxd2 = 0; //單字節(jié)發(fā)送完成標志,用來替代TXD中斷標志位
- unsigned char cntRxd2 = 0; //接收字節(jié)計數(shù)器
- unsigned char pdata bufRxd2[100]; //接收字節(jié)緩沖區(qū)
- void UartDriver();//串口驅(qū)動函數(shù),監(jiān)測數(shù)據(jù)幀的接收,調(diào)度功能函數(shù),需在主循環(huán)中調(diào)用
- void UartAction(unsigned char *buf, unsigned char len);//在接收到的數(shù)據(jù)幀后添加換車換行符后發(fā)回
- void UartWrite(unsigned char *buf, unsigned char len);//串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長度
- unsigned char UartRead(unsigned char *buf, unsigned char len);//串口數(shù)據(jù)讀取函數(shù),buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
- void UartDriver2();//串口驅(qū)動函數(shù),監(jiān)測數(shù)據(jù)幀的接收,調(diào)度功能函數(shù),需在主循環(huán)中調(diào)用
- void UartAction2(unsigned char *buf2, unsigned char len2);//在接收到的數(shù)據(jù)幀后添加換車換行符后發(fā)回
- void UartWrite2(unsigned char *buf2, unsigned char len2);//串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長度
- unsigned char UartRead2(unsigned char *buf2, unsigned char len2);//串口數(shù)據(jù)讀取函數(shù),buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
- void UartRxMonitor(unsigned char ms);//串口接收監(jiān)控,由空閑時間判定幀結(jié)束,需在定時中斷中調(diào)用,ms-定時間隔
- void ConfigUART(unsigned int baud);//串口配置函數(shù),baud-通信波特率
- void ConfigTimer0(unsigned int ms);//配置并啟動T0,ms-T0定時時間
- uchar Byte_Read(uint add); //讀一字節(jié),調(diào)用前需打開IAP 功能
- void Byte_Program(uint add, uint ch); //字節(jié)編程,調(diào)用前需打開IAP 功能
- void Sector_Erase(uint add); //擦除扇區(qū)
- void IAP_Disable(); //關(guān)閉IAP 功能
- void Delay();
- #define ENABLE_ISP 0x81 //系統(tǒng)工作時鐘<20MHz 時,對IAP_CONTR 寄存器設置此值
- unsigned char paths;
- char buf0add7;
- sbit ins01=P0^0;
- sbit ins02=P0^1;
- sbit ins03=P0^2;
- sbit ins04=P0^3;
- sbit ins05=P0^4;
- sbit ins06=P0^5;
- sbit ins07=P0^6;
- sbit ins08=P0^7;
- /*定義八位輸出為單片機P2口*/
- sbit out01=P2^6;
- sbit out02=P2^7;
- sbit out03=P5^1;
- sbit out04=P5^0;
- sbit out05=P4^6;
- sbit out06=P4^1;
- sbit out07=P4^5;
- sbit out08=P4^4;
- sbit b485Send=P2^4; //485接口發(fā)送接收控制
- unsigned char ck1=0x00;
- uint time1=0,time2=0;
- bit timef1=0;
- uchar num11=0,num12=0,num1=0;
- uchar num21=0,num22=0,num2=0;
- uchar num31=0,num32=0,num3=0;
- uchar num41=0,num42=0,num4=0;
- uchar time21=0,time22=0;
- uchar ls=0,ls1=0,ls2=0;
- void UartAction(unsigned char *buf, unsigned char len){//在接收到的數(shù)據(jù)幀后添加換車換行符后發(fā)回
- UartWrite(buf, len);
- }
- void UartAction2(unsigned char *buf2, unsigned char len2){//在接收到的數(shù)據(jù)幀后添加換車換行符后發(fā)回
- if((buf2[0]==0x5A)&&(buf2[1]==0xA5)){
- ls1=buf2[2]/10;
- ls2=buf2[2]%10;
- ls=ls1*10+ls2+3;
- if(len2==ls){
- UartWrite(buf2, len2);
- }
- }
- if((buf2[0]==0xAA)&&(buf2[1]==0x05)&&(buf2[7]==0xBB)&&(len2==8)){
- if(buf2[2]==0x01){
- num11=buf2[3]/10;
- num12=buf2[3]%10;
- num1=num11*10+num12;
- num21=buf2[4]/10;
- num22=buf2[4]%10;
- num2=num21*10+num22;
- num31=buf2[5]/10;
- num32=buf2[5]%10;
- num3=num31*10+num32;
- num41=buf2[6]/10;
- num42=buf2[6]%10;
- num4=num41*10+num42;
- time2=num1+num2+num3+num4;
- time21=time2/100;//把int型的值拆分到char型
- time22=time2%100;
- Sector_Erase(0);
- Byte_Program(0x01,time21);
- Byte_Program(0x02,time22);
- buf2[0]=0xCC;
- buf2[1]=0x05;
- buf2[2]=buf2[2];
- buf2[3]=0xDD;
- len2=4;
- UartWrite2(buf2, len2);
- }
- }
- if((buf2[0]==0xAA)&&(buf2[3]==0xBB)&&(len2==4)){
- switch (buf2[1]){//按指令位執(zhí)行操作
- case 0x01://查詢輸入狀態(tài)命令
- ck1=0xFF;
- if(ins01){ck1|=0x80;}else{ck1&=0x7f;}
- if(ins02){ck1|=0x40;}else{ck1&=0xbf;}
- if(ins03){ck1|=0x20;}else{ck1&=0xdf;}
- if(ins04){ck1|=0x10;}else{ck1&=0xef;}
- if(ins05){ck1|=0x08;}else{ck1&=0xf7;}
- if(ins06){ck1|=0x04;}else{ck1&=0xfb;}
- if(ins07){ck1|=0x02;}else{ck1&=0xfd;}
- if(ins08){ck1|=0x01;}else{ck1&=0xfe;}
- buf2[0]=0xCC;
- buf2[1]=0x01;
- buf2[2]=ck1;
- buf2[3]=0xDD;
- len2=4;
- UartWrite2(buf2, len2);
- break;
- case 0x02://查詢輸出狀態(tài)命令
- ck1=0xFF;
- if(out01){ck1|=0x80;}else{ck1&=0x7f;}
- if(out02){ck1|=0x40;}else{ck1&=0xbf;}
- if(out03){ck1|=0x20;}else{ck1&=0xdf;}
- if(out04){ck1|=0x10;}else{ck1&=0xef;}
- if(out05){ck1|=0x08;}else{ck1&=0xf7;}
- if(out06){ck1|=0x04;}else{ck1&=0xfb;}
- if(out07){ck1|=0x02;}else{ck1&=0xfd;}
- if(out08){ck1|=0x01;}else{ck1&=0xfe;}
- buf2[0]=0xCC;
- buf2[1]=0x02;
- buf2[2]=ck1;
- buf2[3]=0xDD;
- len2=4;
- UartWrite2(buf2, len2);
- break;
- case 0x03://輸出開控制
- if(buf2[2]==0x01){timef1=1;out01=0;}
- if(buf2[2]==0x02){out02=0;}
- if(buf2[2]==0x03){out03=0;}
- if(buf2[2]==0x04){out04=0;}
- if(buf2[2]==0x05){out05=0;}
- if(buf2[2]==0x06){out06=0;}
- if(buf2[2]==0x07){out07=0;}
- if(buf2[2]==0x08){out08=0;}
- buf2[0]=0xCC;
- buf2[1]=0x03;
- buf2[2]=buf2[2];
- buf2[3]=0xDD;
- len2=4;
- UartWrite2(buf2, len2);
- break;
- case 0x04://輸出關(guān)控制
- if(buf2[2]==0x02){out02=1;}
- if(buf2[2]==0x03){out03=1;}
- if(buf2[2]==0x04){out04=1;}
- if(buf2[2]==0x05){out05=1;}
- if(buf2[2]==0x06){out06=1;}
- if(buf2[2]==0x07){out07=1;}
- if(buf2[2]==0x08){out08=1;}
- buf2[0]=0xCC;
- buf2[1]=0x04;
- buf2[2]=buf2[2];
- buf2[3]=0xDD;
- len2=4;
- UartWrite2(buf2, len2);
- break;
- }
- }
- }
- void main(){
- P4SW|=0x70;
- b485Send=0; //接收模式
- EA = 1; //開總中斷
- ConfigTimer0(1); //配置T0定時1ms
- ConfigUART(9600); //配置波特率為9600
- time21=Byte_Read(0x01);//掉電存儲用到
- time22=Byte_Read(0x02);//掉電存儲用到
- time2=time21*100+time22;
- while(1){
- UartDriver(); //調(diào)用串口驅(qū)動
- UartDriver2(); //調(diào)用串口驅(qū)動
- }
- }
- void InterruptTimer0() interrupt 1{//T0中斷服務函數(shù),執(zhí)行串口接收監(jiān)控
- TH0 = T0RH; //重新加載重載值
- TL0 = T0RL;
- UartRxMonitor(1); //串口接收監(jiān)控
- if(timef1){
- out01=0;
- time1++;
- if(time1>time2){
- time1=0;
- timef1=0;
- out01=1;
- }
- }
- }
- void InterruptUART() interrupt 4{//串口中斷服務函數(shù)
- if (RI) { //接收到新字節(jié)
- RI = 0; //清零接收中斷標志位
- if (cntRxd < sizeof(bufRxd)) {//接收緩沖區(qū)尚未用完時,保存接收字節(jié),并遞增計數(shù)器
- bufRxd[cntRxd++] = SBUF; // cntRxd++這個很重要,一開始 cntRxd < sizeof(bufRxd)當進入函數(shù)的次數(shù)增加,cntRxd慢慢變大,當傳入的數(shù)據(jù)不滿的時候就 用時間檢測,判斷是否是傳輸完成
- }
- }
- if (TI) { //字節(jié)發(fā)送完畢
- TI = 0; //清零發(fā)送中斷標志位
- flagTxd = 1; //設置字節(jié)發(fā)送完成標志
- }
- }
- void uart2_isr() interrupt 8{//發(fā)送接收中斷函數(shù)
- if( S2CON & 0x01 ){
- S2CON &= ~0x01;
- if (cntRxd2 < sizeof(bufRxd2)){ //接收緩沖區(qū)尚未用完時,保存接收字節(jié),并遞增計數(shù)器
- bufRxd2[cntRxd2++] = S2BUF; // cntRxd++這個很重要,一開始 cntRxd < sizeof(bufRxd)當進入函數(shù)的次數(shù)增加,cntRxd慢慢變大,當傳入的數(shù)據(jù)不滿的時候就 用時間檢測,判斷是否是傳輸完成
- }
- }
- if( S2CON & 0x02 ){
- S2CON &= ~0x02;
- flagTxd2 = 1; //設置字節(jié)發(fā)送完成標志
- b485Send=0;//發(fā)送完畢設置為接收
- }
- }
- void ConfigTimer0(unsigned int ms){//配置并啟動T0,ms-T0定時時間
- unsigned long tmp; //臨時變量
- tmp = 11059200 / 12; //定時器計數(shù)頻率
- tmp = (tmp * ms) / 1000; //計算所需的計數(shù)值
- tmp = 65536 - tmp; //計算定時器重載值
- tmp = tmp + 33; //補償中斷響應延時造成的誤差
- T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節(jié)
- T0RL = (unsigned char)tmp;
- TMOD &= 0xF0; //清零T0的控制位
- TMOD |= 0x01; //配置T0為模式1
- TH0 = T0RH; //加載T0重載值
- TL0 = T0RL;
- ET0 = 1; //使能T0中斷
- TR0 = 1; //啟動T0
- }
- void ConfigUART(unsigned int baud){//串口配置函數(shù),baud-通信波特率
- SCON = 0x50; //配置串口為模式1
- TMOD &= 0x0F; //清零T1的控制位
- TMOD |= 0x20; //配置T1為模式2
- TH1 = 256 - (11059200/12/32)/baud; //計算T1重載值
- TL1 = TH1; //初值等于重載值
- ET1 = 0; //禁止T1中斷
- ES = 1; //使能串口中斷
- TR1 = 1; //啟動T1
- S2CON = 0x50; //方式1,八位數(shù)據(jù),可變波特率
- AUXR1 = 0x00; //1T工作方式
- PCON = 0x00; //不倍增波特率
- IP2 = 0x00; //優(yōu)先級默認
- BRT = 0XFD; //設置波特率9600
- AUXR = 0x10; //啟動波特率發(fā)生器
- IE2 = 0x01; //開串口2中斷
- }
- void UartWrite(unsigned char *buf, unsigned char len){//串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長度
- while (len--){ //循環(huán)發(fā)送所有字節(jié)
- flagTxd = 0; //清零發(fā)送標志
- SBUF = *buf++; //發(fā)送一個字節(jié)數(shù)據(jù)
- while (!flagTxd); //等待該字節(jié)發(fā)送完成
- }
- }
- void UartWrite2(unsigned char *buf2, unsigned char len2){//串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長度
- while (len2--){ //循環(huán)發(fā)送所有字節(jié)
- flagTxd2 = 0; //清零發(fā)送標志
- b485Send=1;
- S2BUF = *buf2++; //發(fā)送一個字節(jié)數(shù)據(jù)
- while (!flagTxd2); //等待該字節(jié)發(fā)送完成
- }
- }
- unsigned char UartRead(unsigned char *buf, unsigned char len){//串口數(shù)據(jù)讀取函數(shù),buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
- unsigned char i;
- if (len > cntRxd){ //指定讀取長度大于實際接收到的數(shù)據(jù)長度時,讀取長度設置為實際接收到的數(shù)據(jù)長度
- len = cntRxd;
- }
- for (i=0; i<len; i++){ //拷貝接收到的數(shù)據(jù)到接收指針上
- *buf++ = bufRxd[i];
- }
- cntRxd = 0; //接收計數(shù)器清零
- return len; //返回實際讀取長度
- }
- void UartDriver(){//串口驅(qū)動函數(shù),監(jiān)測數(shù)據(jù)幀的接收,調(diào)度功能函數(shù),需在主循環(huán)中調(diào)用
- unsigned char len;
- unsigned char pdata buf[40];
- if (flagFrame){ //有命令到達時,讀取處理該命令
- flagFrame = 0;
- len = UartRead(buf, sizeof(buf)-2); //將接收到的命令讀取到緩沖區(qū)中
- UartAction(buf, len); //傳遞數(shù)據(jù)幀,調(diào)用動作執(zhí)行函數(shù)
- }
- }
- unsigned char UartRead2(unsigned char *buf2, unsigned char len2){//串口數(shù)據(jù)讀取函數(shù),buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
- unsigned char i;
- if (len2 > cntRxd2){ //指定讀取長度大于實際接收到的數(shù)據(jù)長度時,讀取長度設置為實際接收到的數(shù)據(jù)長度
- len2 = cntRxd2;
- }
- for (i=0; i<len2; i++){ //拷貝接收到的數(shù)據(jù)到接收指針上
- *buf2++ = bufRxd2[i];
- }
- cntRxd2 = 0; //接收計數(shù)器清零
- return len2; //返回實際讀取長度
- }
- void UartDriver2(){//串口驅(qū)動函數(shù),監(jiān)測數(shù)據(jù)幀的接收,調(diào)度功能函數(shù),需在主循環(huán)中調(diào)用
- unsigned char len2;
- unsigned char pdata buf2[40];
- if (flagFrame2){ //有命令到達時,讀取處理該命令
- flagFrame2 = 0;
- len2 = UartRead2(buf2, sizeof(buf2)-2); //將接收到的命令讀取到緩沖區(qū)中
- UartAction2(buf2, len2); //傳遞數(shù)據(jù)幀,調(diào)用動作執(zhí)行函數(shù)
- }
- }
- void UartRxMonitor(unsigned char ms){//串口接收監(jiān)控,由空閑時間判定幀結(jié)束,需在定時中斷中調(diào)用,ms-定時間隔
- static unsigned char cntbkp = 0;
- static unsigned char idletmr = 0;
- if (cntRxd > 0){ //接收計數(shù)器大于零時,監(jiān)控總線空閑時間
- if (cntbkp != cntRxd){ //接收計數(shù)器改變,即剛接收到數(shù)據(jù)時,清零空閑計時
- cntbkp = cntRxd;
- idletmr = 0;
- }else{ //接收計數(shù)器未改變,即總線空閑時,累積空閑時間
- if (idletmr < 30){ //空閑計時小于30ms時,持續(xù)累加
- idletmr += ms;
- if (idletmr >= 30){ //空閑時間達到30ms時,即判定為一幀接收完畢
- flagFrame = 1; //設置幀接收完成標志
- }
- }
- }
- }else if(cntRxd2 > 0){
- if (cntbkp != cntRxd2){
- cntbkp = cntRxd2;
- idletmr = 0;
- }else{
- if (idletmr < 30){
- idletmr += ms;
- if (idletmr >= 30){
- flagFrame2 = 1; }}
- }
- }else{
- cntbkp = 0;
- }
- }
- union union_temp16{
- uint un_temp16;
- uchar un_temp8[2];
- }my_unTemp16;
- //讀一字節(jié),調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址,返回:A = 讀出字節(jié)
- uchar Byte_Read(uint add){
- IAP_DATA = 0x00;
- IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設置Flash 操作等待時間
- IAP_CMD = 0x01; //IAP/ISP/EEPROM 字節(jié)讀命令
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
- //EA = 0;
- IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動
- _nop_();
- //EA = 1;
- IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
- //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
- return (IAP_DATA);
- }
- //字節(jié)編程,調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址, A= 須編程字節(jié)的數(shù)據(jù)
- void Byte_Program(uint add, uint ch){
- IAP_CONTR = ENABLE_ISP; //打開 IAP 功能, 設置Flash 操作等待時間
- IAP_CMD = 0x02; //IAP/ISP/EEPROM 字節(jié)編程命令
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
- IAP_DATA = ch; //要編程的數(shù)據(jù)先送進IAP_DATA 寄存器
- //EA = 0;
- IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動
- _nop_();
- //EA = 1;
- IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
- //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
- }
- //擦除扇區(qū), 入口:DPTR = 扇區(qū)地址
- void Sector_Erase(uint add){
- IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設置Flash 操作等待時間
- IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇區(qū)擦除命令
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
- //EA = 0;
- IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動
- _nop_();
- //EA = 1;
- IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
- //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
- }
- void IAP_Disable(){
- //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
- //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
- IAP_CONTR = 0; //關(guān)閉IAP 功能
- IAP_CMD = 0; //清命令寄存器,使命令寄存器無命令,此句可不用
- IAP_TRIG = 0; //清命令觸發(fā)寄存器,使命令觸發(fā)寄存器無觸發(fā),此句可不用
- IAP_ADDRH = 0;
- IAP_ADDRL = 0;
- }
復制代碼 全部資料51hei下載地址:
Desktop.rar
(85.38 KB, 下載次數(shù): 33)
2019-11-17 22:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
8入8出可編程場效應管PNP款原理圖及PCB圖.rar
(420.52 KB, 下載次數(shù): 38)
2019-11-17 22:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: 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丝袜在线播放
|
一区二区欧美在线
|
国产精品久久久久久婷婷天堂
|
亚洲精品久久久久久久久久久
|