Usb轉串口下載線
圖1 啟動STC-ISP.exe
圖2 選單片機型號
圖3 加載HEX文件
圖4 選中需要下載的HEX文件
圖5 選擇和設定下載串口
圖6 設定單片機的工作模式
圖7 程序下載
/********************************************************************
程序說明:
當X00口與COM口接通后,對應的場效應Y00導通(即:輸出控制電源);
當X01口與COM口接通后,對應的場效應Y01導通(即:輸出控制電源);
當X02口與COM口接通后,對應的場效應Y02導通(即:輸出控制電源);
當X03口與COM口接通后,對應的場效應Y03導通(即:輸出控制電源);
當X04口與COM口接通后,對應的場效應Y04導通(即:輸出控制電源);
當X05口與COM口接通后,對應的場效應Y05導通(即:輸出控制電源);
當X06口與COM口接通后,對應的場效應Y06導通(即:輸出控制電源);
當X07口與COM口接通后,對應的場效應Y07導通(即:輸出控制電源);
*********************************************************************/
#include<STC12C5A60S2.h> //庫文件
#include <intrins.h>
#define uchar unsigned char//宏定義無符號字符型
#define uint unsigned int //宏定義無符號整型
/********************************************************************
初始定義
*********************************************************************/
/*定義八位數字量輸入為單片機P0口*/
sbit X00=P0^0;
sbit X01=P0^1;
sbit X02=P0^2;
sbit X03=P0^3;
sbit X04=P0^4;
sbit X05=P0^5;
sbit X06=P0^6;
sbit X07=P0^7;
/*定義八位數字量輸出IO口*/
sbit Y00=P4^4;
sbit Y01=P4^5;
sbit Y02=P4^1;
sbit Y03=P4^6;
sbit Y04=P5^0;
sbit Y05=P5^1;
sbit Y06=P2^7;
sbit Y07=P2^5;
/********************************************************************
延時函數
*********************************************************************/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=13;j>0;j--);
{;}
}
}
/********************************************************************
配置P4口
*********************************************************************/
void P4_init(void)
{
P4SW=0x70; //配置P4口
P4M0&=0x80;
P4M1&=0x80;
}
/********************************************************************
互鎖輸出處理函數
*********************************************************************/
void open_X3(uchar turm)
{
char i;
for(i=7;i>=0;i--)
{
turm=_crol_(turm,1);
switch(i)
{
case 0:Y00=turm&0x01;break
case 1:Y01=turm&0x01;break;
case 2:Y02=turm&0x01;break;
case 3:Y03=turm&0x01;break
case 4:Y04=turm&0x01;break;
case 5:Y05=turm&0x01;break;
case 6:Y06=turm&0x01;break
case 7:Y07=turm&0x01;break;
default:break;
}
}
}
/********************************************************************
主函數
*********************************************************************/
void main()
{
P4_init();
while(1)
{
if(X00==0)
{delay(100);while(!X00);open_X3(0xfe);} //Y00和被控電源地接通
if(X01==0)
{delay(100);while(!X01);open_X3(0xfd);} //Y01和被控電源地接通
if(X02==0)
{delay(100);while(!X02);open_X3(0xfb);} //Y02和被控電源地接通
if(X03==0)
{delay(100);while(!X03);open_X3(0xf7);} //Y03和被控電源地接通
if(X04==0)
{delay(100);while(!X04);open_X3(0xef);} //Y04和被控電源地接通
if(X05==0)
{delay(100);while(!X05);open_X3(0xdf);} //Y05和被控電源地接通
if(X06==0)
{delay(100);while(!X06);open_X3(0xbf);} //Y06和被控電源地接通
if(X07==0)
{delay(100);while(!X07);open_X3(0x7f);} //Y07和被控電源地接通
}
}
/********************************************************************
結束
*********************************************************************/
3.7上位機串口控制測試/********************************************************************
單片機與PC機采用9針串口,MAX232通訊,波特率默認為9600.
單片機接收PC機發送的十六進制碼表如下:
輸出控制
01、全開:PC發送0xFF;
02、全關:PC發送0X00;
************************************************************
03、第一路開:PC發送0x01;*********11、第一路關:PC發送0xF1;
04、第二路開:PC發送0x02;*********12、第二路關:PC發送0xF2;
05、第三路開:PC發送0x03;*********13、第三路關:PC發送0xF3;
06、第四路開:PC發送0x04;*********14、第四路關:PC發送0xF4;
07、第五路開:PC發送0x05;*********15、第五路關:PC發送0xF5;
08、第六路開:PC發送0x06;*********16、第六路關:PC發送0xF6;
09、第七路開:PC發送0x07;*********17、第七路關:PC發送0xF7;
10、第八路開:PC發送0x08;*********18、第八路關:PC發送0xF8;
************************************************************
輸入控制
************************************************************
03、第一路觸發:向PC發送0xA1
04、第二路觸發:向PC發送0xA2
05、第三路觸發:向PC發送0xA3
06、第四路觸發:向PC發送0xA4
07、第五路觸發:向PC發送0xA5
08、第六路觸發:向PC發送0xA6
09、第七路觸發:向PC發送0xA7
10、第八路觸發:向PC發送0xA8
************************************************************
*********************************************************************/
#include<STC12C5A60S2.H> //庫文件
#include <intrins.h>
#define uchar unsigned char//宏定義無符號字符型
#define uint unsigned int //宏定義無符號整型
/********************************************************************
初始定義
*********************************************************************/
unsigned char dat; //用于存儲單片機接收發送緩沖寄存器SBUF里面的內容
/*定義八位數字量輸入為單片機P0口*/
sbit X00=P0^0;
sbit X01=P0^1;
sbit X02=P0^2;
sbit X03=P0^3;
sbit X04=P0^4;
sbit X05=P0^5;
sbit X06=P0^6;
sbit X07=P0^7;
/*定義八位數字量輸出IO口*/
sbit Y00=P4^4;
sbit Y01=P4^5;
sbit Y02=P4^1;
sbit Y03=P4^6;
sbit Y04=P5^0;
sbit Y05=P5^1;
sbit Y06=P2^7;
sbit Y07=P2^6;
/********************************************************************
延時函數
*********************************************************************/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=250;j>0;j--);
{ ;
}
}
}
/********************************************************************
輸出處理函數
*********************************************************************/
void open_X3(uchar turm)
{
char i;
for(i=7;i>=0;i--)
{
turm=_crol_(turm,1);
switch(i)
{
case 0:Y00=turm&0x01;break;
case 1:Y01=turm&0x01;break;
case 2:Y02=turm&0x01;break;
case 3:Y03=turm&0x01;break;
case 4:Y04=turm&0x01;break;
case 5:Y05=turm&0x01;break;
case 6:Y06=turm&0x01;break;
case 7:Y07=turm&0x01;break;
default:break;
}
}
}
/********************************************************************
功能:串口初始化,波特率9600,方式1
*********************************************************************/
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
ES=1;
EA=1;
}
/********************************************************************
配置P4口
*********************************************************************/
void P4_init(void)
{
P4SW=0x70; //配置P4口
P4M0&=0x80;
P4M1&=0x80;
}
/********************************************************************
主函數
*********************************************************************/
void main()
{
Init_Com();//串口初始化
P4_init();
while(1)
{
if(X00==0) {delay(20);while(!X00);SBUF=0XA1;}
if(X01==0) {delay(20);while(!X01);SBUF=0XA2;}
if(X02==0) {delay(20);while(!X02);SBUF=0XA3;}
if(X03==0) {delay(20);while(!X03);SBUF=0XA4;}
if(X04==0) {delay(20);while(!X04);SBUF=0XA5;}
if(X05==0) {delay(20);while(!X05);SBUF=0XA6;}
if(X06==0) {delay(20);while(!X06);SBUF=0XA7;}
if(X07==0) {delay(20);while(!X07);SBUF=0XA8;}
switch(dat) //接收數據判斷
{
uchar k;
k=10;
case 0xff: open_X3(0x00);delay(k);break; // 全開
case 0x00: open_X3(0xff);delay(k);break; // 全關
case 0x01: Y00=0;delay(k);break; // 第一路開
case 0x02: Y01=0;delay(k);break; // 第二路開
case 0x03: Y02=0;delay(k);break; // 第三路開
case 0x04: Y03=0;delay(k);break; // 第四路開
case 0x05: Y04=0;delay(k);break; // 第五路開
case 0x06: Y05=0;delay(k);break; // 第六路開
case 0x07: Y06=0;delay(k);break; // 第七路開
case 0x08: Y07=0;delay(k);break; // 第八路開
case 0xF1: Y00=1;delay(k);break; // 第一路關
case 0xF2: Y01=1;delay(k);break; // 第二路關
case 0xF3: Y02=1;delay(k);break; // 第三路關
case 0xF4: Y03=1;delay(k);break; // 第四路關
case 0xF5: Y04=1;delay(k);break; // 第五路關
case 0xF6: Y05=1;delay(k);break; // 第六路關
case 0xF7: Y06=1;delay(k);break; // 第七路關
case 0xF8: Y07=1;delay(k);break; // 第八路關
default:break; // 跳出
}
}
}
/********************************************************************
串口中斷函數
*********************************************************************/
void commIntProc() interrupt 4
{
if(TI)
TI = 0;
if(RI)
RI = 0;
dat = SBUF; //接收數據SBUF賦與dat
}
/********************************************************************
結束
*********************************************************************/
/********************************************************************
單片機與PC機采用485連接.
單片機接收PC機發送的十六進制碼表如下:
輸出控制
01、全開:PC發送0xFF;
02、全關:PC發送0X00;
************************************************************
03、第一路開:PC發送0x01;*********11、第一路關:PC發送0xF1;
04、第二路開:PC發送0x02;*********12、第二路關:PC發送0xF2;
05、第三路開:PC發送0x03;*********13、第三路關:PC發送0xF3;
06、第四路開:PC發送0x04;*********14、第四路關:PC發送0xF4;
07、第五路開:PC發送0x05;*********15、第五路關:PC發送0xF5;
08、第六路開:PC發送0x06;*********16、第六路關:PC發送0xF6;
09、第七路開:PC發送0x07;*********17、第七路關:PC發送0xF7;
10、第八路開:PC發送0x08;*********18、第八路關:PC發送0xF8;
************************************************************
輸入控制
************************************************************
03、第一路觸發:向PC發送0xA1
04、第二路觸發:向PC發送0xA2
05、第三路觸發:向PC發送0xA3
06、第四路觸發:向PC發送0xA4
07、第五路觸發:向PC發送0xA5
08、第六路觸發:向PC發送0xA6
09、第七路觸發:向PC發送0xA7
10、第八路觸發:向PC發送0xA8
************************************************************
*********************************************************************/
#include<STC12C5A60S2.H> //庫文件
#include <intrins.h>
#define uchar unsigned char//宏定義無符號字符型
#define uint unsigned int //宏定義無符號整型
/********************************************************************
初始定義
*********************************************************************/
unsigned char dat; //用于存儲單片機接收發送緩沖寄存器SBUF里面的內容
/*定義八位數字量輸入為單片機P0口*/
sbit X00=P0^0;
sbit X01=P0^1;
sbit X02=P0^2;
sbit X03=P0^3;
sbit X04=P0^4;
sbit X05=P0^5;
sbit X06=P0^6;
sbit X07=P0^7;
/*定義八位數字量輸出IO口*/
sbit Y00=P4^4;
sbit Y01=P4^5;
sbit Y02=P4^1;
sbit Y03=P4^6;
sbit Y04=P5^0;
sbit Y05=P5^1;
sbit Y06=P2^7;
sbit Y07=P2^6;
sbit b485Send=P2^4; //485接口發送接收控制
/********************************************************************
延時函數
*********************************************************************/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=250;j>0;j--);
{ ;}
}
}
/********************************************************************
輸出處理函數
*********************************************************************/
void open_X3(uchar turm)
{
char i;
for(i=7;i>=0;i--)
{
turm=_crol_(turm,1);
switch(i)
{
case 0:Y00=turm&0x01;break;
case 1:Y01=turm&0x01;break;
case 2:Y02=turm&0x01;break;
case 3:Y03=turm&0x01;break;
case 4:Y04=turm&0x01;break;
case 5:Y05=turm&0x01;break;
case 6:Y06=turm&0x01;break;
case 7:Y07=turm&0x01;break;
default:break;
}
}
}
/********************************************************************
功能:串口初始化,波特率9600,方式1
*********************************************************************/
void Init_Com(void)
{
//485接口初始化
S2CON=0x50; //方式1,八位數據,可變波特率
AUXR1=0x00; //1T工作方式
BRT=0XFD; //設置波特率9600
AUXR=0x10; //啟動波特率發生器
EA=1; //開總中斷
ES=1; //開串口1中斷
IE2=0x01; //開串口2中斷
}
/********************************************************************
配置P4口
*********************************************************************/
void P4_init(void)
{
P4SW=0x70; //配置P4口
P4M0&=0x80;
P4M1&=0x80;
}
/********************************************************************
配置P4口
*********************************************************************/
void B485_send(uchar c)
{
b485Send=1;
S2BUF=c;
}
/********************************************************************
主函數
*********************************************************************/
void main()
{
Init_Com();//串口初始化
b485Send=0; //接收模式
P4_init();
while(1)
{
if(X00==0) {delay(20);while(!X00);B485_send(0XA1);}
if(X01==0) {delay(20);while(!X01);B485_send(0XA2);}
if(X02==0) {delay(20);while(!X02);B485_send(0XA3);}
if(X03==0) {delay(20);while(!X03);B485_send(0XA4);}
if(X04==0) {delay(20);while(!X04);B485_send(0XA5);}
if(X05==0) {delay(20);while(!X05);B485_send(0XA6);}
if(X06==0) {delay(20);while(!X06);B485_send(0XA7);}
if(X07==0) {delay(20);while(!X07);B485_send(0XA8);}
switch(dat) //接收數據判斷
{
uchar k;
k=10;
case 0xff: open_X3(0x00);delay(k);break; // 全開
case 0x00: open_X3(0xff);delay(k);break; // 全關
case 0x01: Y00=0;delay(k);break; // 第一路開
case 0x02: Y01=0;delay(k);break; // 第二路開
case 0x03: Y02=0;delay(k);break; // 第三路開
case 0x04: Y03=0;delay(k);break; // 第四路開
case 0x05: Y04=0;delay(k);break; // 第五路開
case 0x06: Y05=0;delay(k);break; // 第六路開
case 0x07: Y06=0;delay(k);break; // 第七路開
case 0x08: Y07=0;delay(k);break; // 第八路開
case 0xF1: Y00=1;delay(k);break; // 第一路關
case 0xF2: Y01=1;delay(k);break; // 第二路關
case 0xF3: Y02=1;delay(k);break; // 第三路關
case 0xF4: Y03=1;delay(k);break; // 第四路關
case 0xF5: Y04=1;delay(k);break; // 第五路關
case 0xF6: Y05=1;delay(k);break; // 第六路關
case 0xF7: Y06=1;delay(k);break; // 第七路關
case 0xF8: Y07=1;delay(k);break; // 第八路關
default:break; // 跳出
}
}
}
/********************************************************************
串口二(485) 發送接收中斷函數
*********************************************************************/
void uart2_isr() interrupt 8
{
if( S2CON & 0x01 )
{
S2CON &= ~0x01;
dat= S2BUF;
}
if( S2CON & 0x02 )
{
S2CON&=0xfd;
b485Send=0;//發送完畢設置為接收
}
}
/********************************************************************
結束
*********************************************************************/
3.9上位機232或485接口控制測試上位機控制界面(232或485接口均可以)
/********************************************************************
PC機與控制板采用485或者232連接都可以進行測試
單片機接收PC機發送的十六進制碼表如下:
輸出控制
01、全開:PC發送0xFF;
02、全關:PC發送0X00;
************************************************************
03、第一路開:PC發送0x01;*********11、第一路關:PC發送0xF1;
04、第二路開:PC發送0x02;*********12、第二路關:PC發送0xF2;
05、第三路開:PC發送0x03;*********13、第三路關:PC發送0xF3;
06、第四路開:PC發送0x04;*********14、第四路關:PC發送0xF4;
07、第五路開:PC發送0x05;*********15、第五路關:PC發送0xF5;
08、第六路開:PC發送0x06;*********16、第六路關:PC發送0xF6;
09、第七路開:PC發送0x07;*********17、第七路關:PC發送0xF7;
10、第八路開:PC發送0x08;*********18、第八路關:PC發送0xF8;
************************************************************
輸入控制
************************************************************
03、第一路觸發:向PC發送0xA1
04、第二路觸發:向PC發送0xA2
05、第三路觸發:向PC發送0xA3
06、第四路觸發:向PC發送0xA4
07、第五路觸發:向PC發送0xA5
08、第六路觸發:向PC發送0xA6
09、第七路觸發:向PC發送0xA7
10、第八路觸發:向PC發送0xA8
************************************************************
*********************************************************************/
#include<STC12C5A60S2.H> //庫文件
#include <intrins.h>
#define uchar unsigned char//宏定義無符號字符型
#define uint unsigned int //宏定義無符號整型
/********************************************************************
初始定義
*********************************************************************/
unsigned char dat; //用于存儲單片機接收發送緩沖寄存器SBUF里面的內容
/*定義八位數字量輸入為單片機P0口*/
sbit X00=P0^0;
sbit X01=P0^1;
sbit X02=P0^2;
sbit X03=P0^3;
sbit X04=P0^4;
sbit X05=P0^5;
sbit X06=P0^6;
sbit X07=P0^7;
/*定義八位數字量輸出IO口*/
sbit Y00=P4^4;
sbit Y01=P4^5;
sbit Y02=P4^1;
sbit Y03=P4^6;
sbit Y04=P5^0;
sbit Y05=P5^1;
sbit Y06=P2^7;
sbit Y07=P2^6;
sbit b485Send=P2^4; //485接口發送接收控制
/********************************************************************
延時函數
*********************************************************************/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=250;j>0;j--);
{ ;}
}
}
/********************************************************************
輸出處理函數
*********************************************************************/
void open_X3(uchar turm)
{
char i;
for(i=7;i>=0;i--)
{
turm=_crol_(turm,1);
switch(i)
{
case 0:Y00=turm&0x01;break;
case 1:Y01=turm&0x01;break;
case 2:Y02=turm&0x01;break;
case 3:Y03=turm&0x01;break;
case 4:Y04=turm&0x01;break;
case 5:Y05=turm&0x01;break;
case 6:Y06=turm&0x01;break;
case 7:Y07=turm&0x01;break;
default:break;
}
}
}
/********************************************************************
功能:串口初始化,波特率9600,方式1
*********************************************************************/
void Init_Com(void)
{
//串口初始化
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
ES=1; //開串口1中斷
//485接口初始化
S2CON=0x50; //方式1,八位數據,可變波特率
AUXR1=0x00; //1T工作方式
BRT=0XFD; //設置波特率9600
AUXR=0x10; //啟動波特率發生器
EA=1; //開總中斷
IE2=0x01; //開串口2中斷
}
/********************************************************************
配置P4口
*********************************************************************/
void P4_init(void)
{
P4SW=0x70; //配置P4口
P4M0&=0x80;
P4M1&=0x80;
}
/********************************************************************
配置P4口
*********************************************************************/
void B485_send(uchar c)
{
b485Send=1;
SBUF=S2BUF=c;
}
/********************************************************************
主函數
*********************************************************************/
void main()
{
Init_Com();//串口初始化
b485Send=0; //接收模式
P4_init();
while(1)
{
if(X00==0) {delay(20);while(!X00);B485_send(0XA1);}
if(X01==0) {delay(20);while(!X01);B485_send(0XA2);}
if(X02==0) {delay(20);while(!X02);B485_send(0XA3);}
if(X03==0) {delay(20);while(!X03);B485_send(0XA4);}
if(X04==0) {delay(20);while(!X04);B485_send(0XA5);}
if(X05==0) {delay(20);while(!X05);B485_send(0XA6);}
if(X06==0) {delay(20);while(!X06);B485_send(0XA7);}
if(X07==0) {delay(20);while(!X07);B485_send(0XA8);}
switch(dat) //接收數據判斷
{
uchar k;
k=10;
case 0xff: open_X3(0x00);delay(k);break; // 全開
case 0x00: open_X3(0xff);delay(k);break; // 全關
case 0x01: Y00=0;delay(k);break; // 第一路開
case 0x02: Y01=0;delay(k);break; // 第二路開
case 0x03: Y02=0;delay(k);break; // 第三路開
case 0x04: Y03=0;delay(k);break; // 第四路開
case 0x05: Y04=0;delay(k);break; // 第五路開
case 0x06: Y05=0;delay(k);break; // 第六路開
case 0x07: Y06=0;delay(k);break; // 第七路開
case 0x08: Y07=0;delay(k);break; // 第八路開
case 0xF1: Y00=1;delay(k);break; // 第一路關
case 0xF2: Y01=1;delay(k);break; // 第二路關
case 0xF3: Y02=1;delay(k);break; // 第三路關
case 0xF4: Y03=1;delay(k);break; // 第四路關
case 0xF5: Y04=1;delay(k);break; // 第五路關
case 0xF6: Y05=1;delay(k);break; // 第六路關
case 0xF7: Y06=1;delay(k);break; // 第七路關
case 0xF8: Y07=1;delay(k);break; // 第八路關
default:break; // 跳出
}
}
}
/********************************************************************
串口中斷函數
*********************************************************************/
void commIntProc() interrupt 4
{
if(TI)
TI = 0;
if(RI)
{
RI = 0;
dat = SBUF;
} //接收數據SBUF賦與dat
}
/********************************************************************
串口二(485) 發送接收中斷函數
*********************************************************************/
void uart2_isr() interrupt 8
{
if( S2CON & 0x01 )
{
S2CON &= ~0x01;
dat= S2BUF;
}
if( S2CON & 0x02 )
{
S2CON&=0xfd;
b485Send=0;//發送完畢設置為接收
}
}
/********************************************************************
結束
*********************************************************************/
3.10加密設定開機次數記憶/********************************************************************
程序說明:
每次上電,開機次數記憶值自動加1,當達到設定開機次數值時
將不再執行其他的任何操作,可用于工程催款要賬等。。
*********************************************************************/
#include<STC12C5A60S2.h> //庫文件
#include <intrins.h>
#define uchar unsigned char//宏定義無符號字符型
#define uint unsigned int //宏定義無符號整型
#define ENABLE_ISP 0x83 //系統工作時鐘<12MHz 時,對IAP_CONTR 寄存器設置此值
#define DEBUG_DATA 0x5A //本測試程序最終存儲在 EEPROM 單元的數值
#define DATA_FLASH_START_ADDRESS 0x00 //STC5Axx 系列 EEPROM 測試起始地址
uchar dat;//開機次數記憶值
/********************************************************************
eeprom相關函數聲明
*********************************************************************/void IAP_Disable();
uchar EEPROMReadByte(uint add); //讀一字節,調用前需打開IAP 功能
void EEPROMWriteByte(uint add, uchar ch); //字節編程,調用前需打開IAP 功能
void EEPROMSectorErase(uint add); //擦除扇區
/********************************************************************
初始定義
*********************************************************************/
/*定義八位數字量輸入為單片機P0口*/
sbit X00=P0^0;
sbit X01=P0^1;
sbit X02=P0^2;
sbit X03=P0^3;
sbit X04=P0^4;
sbit X05=P0^5;
sbit X06=P0^6;
sbit X07=P0^7;
/*定義八位數字量輸出IO口*/
sbit Y00=P4^4;
sbit Y01=P4^5;
sbit Y02=P4^1;
sbit Y03=P4^6;
sbit Y04=P5^0;
sbit Y05=P5^1;
sbit Y06=P2^7;
sbit Y07=P2^6;
/********************************************************************
延時函數
*********************************************************************/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=13;j>0;j--);
{;}
}
}
/********************************************************************
配置P4口
*********************************************************************/
void P4_init(void)
{
P4SW=0x70; //配置P4口
P4M0&=0x80;
P4M1&=0x80;
}
/********************************************************************
主函數
*********************************************************************/
void main()
{
P4_init();
dat=EEPROMReadByte(0); //從EERPOM的相對0地址讀取數據
dat++;
EEPROMSectorErase(0); //從EEPROM的相對0地址扇區擦除
EEPROMWriteByte(0,dat);
while(1)
{
if(dat<=10)
{
if(X00==0){delay(100);while(!X00);Y00=0;} //Y00和被控電源地接通
if(X01==0){delay(100);while(!X01);Y01=0;} //Y01和被控電源地接通
if(X02==0){delay(100);while(!X02);Y02=0;} //Y02和被控電源地接通
if(X03==0){delay(100);while(!X03);Y03=0;} //Y03和被控電源地接通
if(X04==0){delay(100);while(!X04);Y04=0;} //Y04和被控電源地接通
if(X05==0){delay(100);while(!X05);Y05=0;} //Y05和被控電源地接通
if(X06==0){delay(100);while(!X06);Y06=0;} //Y06和被控電源地接通
if(X07==0){delay(100);while(!X07);Y07=0;} //Y07和被控電源地接通 }
} //Y00和被控電源地接通
}
/**********************************************************
定義一個結構體
***********************************************************/
union union_temp16
{
uint un_temp16;
uchar un_temp8[2];
}my_unTemp16;
/**********************************************************
功能:讀一字節,調用前需打開IAP 功能,
入口:DPTR = 字節地址
返回:A = 讀出字節
***********************************************************/
uchar EEPROMReadByte(uint add)
{
IAP_DATA = 0x00;
IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設置Flash 操作等待時間
IAP_CMD = 0x01; //IAP/ISP/EEPROM 字節讀命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發起動
_nop_();
IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
//一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
return (IAP_DATA);
}
/**********************************************************
功能:字節編程,調用前需打開IAP 功能
入口:DPTR = 字節地址
返回:A= 須編程字節的數據
***********************************************************/
void EEPROMWriteByte(uint add, uchar ch)
{
IAP_CONTR = ENABLE_ISP; //打開 IAP 功能, 設置Flash 操作等待時間
IAP_CMD = 0x02; //IAP/ISP/EEPROM 字節編程命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
IAP_DATA = ch; //要編程的數據先送進IAP_DATA 寄存器
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發起動
_nop_();
IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
//一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
}
/**********************************************************
功能:擦除扇區
入口:DPTR = 扇區地址
***********************************************************/
void EEPROMSectorErase(uint add)
{
IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設置Flash 操作等待時間
IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇區擦除命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發起動
_nop_();
IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
//一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
}
/**********************************************************
關閉IAP功能
***********************************************************/
void IAP_Disable()
{
//關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
//一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
IAP_CONTR = 0; //關閉IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器無命令,此句可不用
IAP_TRIG = 0; //清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}
/********************************************************************
結束
*********************************************************************/
3.11掉電記憶測試程序/********************************************************************
程序說明:
觸發X00,Y00導通。此時,斷開電源,再次上電,Y00依舊導通
這就是所謂的掉電記憶,可以保存掉電前的狀態
*********************************************************************/
#include<STC12C5A60S2.h> //庫文件
#include <intrins.h>
#define uchar unsigned char//宏定義無符號字符型
#define uint unsigned int //宏定義無符號整型
#define ENABLE_ISP 0x83 //系統工作時鐘<12MHz 時,對IAP_CONTR 寄存器設置此值
#define DEBUG_DATA 0x5A //本測試程序最終存儲在 EEPROM 單元的數值
#define DATA_FLASH_START_ADDRESS 0x00 //STC5Axx 系列 EEPROM 測試起始地址
uchar dat;
/********************************************************************
eeprom相關函數聲明
*********************************************************************/void IAP_Disable();
uchar EEPROMReadByte(uint add); //讀一字節,調用前需打開IAP 功能
void EEPROMWriteByte(uint add, uchar ch); //字節編程,調用前需打開IAP 功能
void EEPROMSectorErase(uint add); //擦除扇區
/********************************************************************
初始定義
*********************************************************************/
/*定義八位數字量輸入為單片機P0口*/
sbit X00=P0^0;
sbit X01=P0^1;
sbit X02=P0^2;
sbit X03=P0^3;
sbit X04=P0^4;
sbit X05=P0^5;
sbit X06=P0^6;
sbit X07=P0^7;
/*定義八位數字量輸出IO口*/
sbit Y00=P4^4;
sbit Y01=P4^5;
sbit Y02=P4^1;
sbit Y03=P4^6;
sbit Y04=P5^0;
sbit Y05=P5^1;
sbit Y06=P2^7;
sbit Y07=P2^6;
/********************************************************************
延時函數
*********************************************************************/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=13;j>0;j--);
{;}
}
}
/********************************************************************
配置P4口
*********************************************************************/
void P4_init(void)
{
P4SW=0x70; //配置P4口
P4M0&=0x80;
P4M1&=0x80;
}
/********************************************************************
主函數
*********************************************************************/
void main()
{
P4_init();
dat=EEPROMReadByte(0); //從EERPOM的相對0地址讀取數據
Y00=dat&0x01;
while(1)
{
if(X00==0)
{
delay(100);
if(X00==0)
{
delay(100);
while(!X00);
Y00=!Y00;
dat=(uchar)Y00;
EEPROMSectorErase(0); //從EEPROM的相對0地址扇區擦除
EEPROMWriteByte(0,dat);
}
} //Y00和被控電源地接通
}
}
/**********************************************************
定義一個結構體
***********************************************************/
union union_temp16
{
uint un_temp16;
uchar un_temp8[2];
}my_unTemp16;
/**********************************************************
功能:讀一字節,調用前需打開IAP 功能,
入口:DPTR = 字節地址
返回:A = 讀出字節
***********************************************************/
uchar EEPROMReadByte(uint add)
{
IAP_DATA = 0x00;
IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設置Flash 操作等待時間
IAP_CMD = 0x01; //IAP/ISP/EEPROM 字節讀命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發起動
_nop_();
IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
//一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
return (IAP_DATA);
}
/**********************************************************
功能:字節編程,調用前需打開IAP 功能
入口:DPTR = 字節地址
返回:A= 須編程字節的數據
***********************************************************/
void EEPROMWriteByte(uint add, uchar ch)
{
IAP_CONTR = ENABLE_ISP; //打開 IAP 功能, 設置Flash 操作等待時間
IAP_CMD = 0x02; //IAP/ISP/EEPROM 字節編程命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
IAP_DATA = ch; //要編程的數據先送進IAP_DATA 寄存器
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發起動
_nop_();
IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
//一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
}
/**********************************************************
功能:擦除扇區
入口:DPTR = 扇區地址
***********************************************************/
void EEPROMSectorErase(uint add)
{
IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設置Flash 操作等待時間
IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇區擦除命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發起動
_nop_();
IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
//一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
}
/**********************************************************
關閉IAP功能
***********************************************************/
void IAP_Disable()
{
//關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
//一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
IAP_CONTR = 0; //關閉IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器無命令,此句可不用
IAP_TRIG = 0; //清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}
/********************************************************************
結束
*********************************************************************/
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |