本帖最后由 單戀diy 于 2018-2-24 19:31 編輯
此開發(fā)板的源碼與詳細(xì)資料下載地址(含vb.net上位機源代碼與單片機源碼):
http://www.zg4o1577.cn/bbs/dpj-107734-1.html
開發(fā)板編程入門教學(xué)
2.1 Keil uVision4簡介使用匯編語言或C語言要使用編譯器,以便把寫好的程序編譯為機器碼,才能把HEX可執(zhí)行文件寫入單片機內(nèi)。KEIL uVISION是眾多單片機應(yīng)用開發(fā)軟件中最優(yōu)秀的軟件之一,它支持眾多不同公司的MCS51架構(gòu)的芯片,甚至ARM,它集編輯,編譯,仿真等于一體,它的界面和常用的微軟VC++的界面相似,界面友好,易學(xué)易用,在調(diào)試程序,軟件仿真方面也有很強大的功能。因此很多開發(fā)51應(yīng)用的工程師或普通的單片機愛好者,都對它十分喜歡。 KEIL uVision4比起uVision3或是uVision2界面感覺舒服一些,增加了一些功能暫且不去研究,畢竟大家都喜歡用新的軟件,感嘆發(fā)展太快了,很多人連uVision2都沒有摸透,呵呵。安裝的方法和普通軟件差不多,這里就不做介紹了。另外提醒大家不要崇拜漢化版軟件,還是E文的干凈沒有BUG! 2.2 用keil軟件建一個簡單工程在這里以51單片機并結(jié)合C程序為例(匯編操作方法類似,唯一不同的是匯編源程序文件名后綴為“.ASM ”),圖文描述工程項目的創(chuàng)建和使用方法: 1.首先我們要養(yǎng)成一個習(xí)慣:最好先建立一個空文件夾,把您的工程文件放到里面,以避免和其他文件混合,如下圖筆者先創(chuàng)建了一個名為“Mytest”文件夾: 

3.點擊“project --- New uVision Project”新建一個工程: 
4.在對話框,選擇放在剛才建立的“Mytest”文件夾下,給這個工程取個名后保存,不需要填后綴,注意默認(rèn)的工程后綴與uVision3及uVision2版本不同了,為uvporj 
5.彈出一個框,在CPU類型下我們找到并選中“Atmel”下的AT89S51或52: 
6.以上工程創(chuàng)建完畢,接下來開始建立一個源程序文本: 
7.在下面空白區(qū)別寫入或復(fù)制一個完整的C程序: 
8.輸入源程序文件名名稱,在這里筆者示例輸入“test”,這個名稱,同樣大家可以隨便命名。 注意:如果您想用匯編語言,要帶后綴名一定是“test . asm”,如果是C語言,則是“test . c”,然后保存: 
9.接下來需要把剛創(chuàng)建的源程序文件加入到工程項目文件中,大家在點“ADD”按鈕時會感到奇怪,怎么對話框不會消失呢?不管它,直接點擊“Close”關(guān)閉就行了,此時大家可以看到程序文本字體顏色已發(fā)生了變化: 
10.最后還要有設(shè)置一下,按下圖設(shè)置晶振,建議初學(xué)者修改成12M,因12MHZ方便計算指令時間: 
11.在Output欄選中Create HEX File,使編譯器輸出單片機需要的HEX文件: 
12.工程項目創(chuàng)建和設(shè)置全部完成!點擊保持并編譯(下圖): 
查看工程文件夾內(nèi)容: 
以上圖文描述的是KEIL uVISION的使用入門,這些是單片機基礎(chǔ)知識和基本操作必備的。KEIL uVISION擁有強大的功能,還有仿真、調(diào)試等功能,在此不一一詳解,建議讀者找本書好好學(xué)習(xí)一下,真正到開發(fā)時還是要用到的。 2.3 下載程序方法1.使用USB轉(zhuǎn)RS232串口線,(電腦上有串口可以用串口下載)如下圖所示,電腦需安裝ch340驅(qū)動,提供安裝視頻教程,安裝成功后,即可安照下列步驟下載程序 
Usb轉(zhuǎn)串口下載線
2.運行STC-ISP.exe程序,啟動下載軟件圖1,此軟件為綠色軟件,無需安裝,將程序目錄拷貝至任意位置運行即可。 
圖1 啟動STC-ISP.exe 3.選擇對應(yīng)的單片機型號,在STC-ISP軟件左側(cè)的“步驟1”中選擇用戶使用的單片機(圖2)。本開發(fā)板使用的是STC12C5A60S2單片機 
圖2 選單片機型號 4.選擇需要下載進單片機的.HEX文件,點擊“步驟2”中的“打開程序文件”按鈕(圖3),彈出打開文件對話框(圖4),選中需要下載的.HEX文件。 
圖3 加載HEX文件 
圖4 選中需要下載的HEX文件 5.設(shè)定單片機下載時使用的串行通訊端口(圖5)。在“步驟3”中選中用戶使用的下載串口,(右擊“我的電腦”-“屬性”-“設(shè)備管理器”-“端口COM”查看usb轉(zhuǎn)串口線所使用的COM口),波特率請根據(jù)實際需求做對應(yīng)調(diào)整。 
圖5 選擇和設(shè)定下載串口 6.設(shè)定單片機的工作模式(圖6)。由于STC單片機有許多其它的工作模式可供選擇,因此,宏晶科技在“步驟4”中提供了一些單片機工作模式選項,一般無需做更動,按照默認(rèn)設(shè)定使用就可以了,如有特殊需求,可參看單片機的器件手冊。 
圖6 設(shè)定單片機的工作模式 7.下載程序。下載之前先確認(rèn)目標(biāo)板是否斷電,因為STC單片機的下載的時候需要在單片機“冷啟動”時進行。目標(biāo)板斷電后,點擊“步驟5”中的“download/下載”,此時STC-ISP軟件將嘗試和單片機握手,此時給目標(biāo)板上電,如果一切正常,下載過程將正常開始,STC-ISP軟件的左下方的信息窗口中將給出對應(yīng)的提示信息(圖7)。 
圖7 程序下載
3 開發(fā)板應(yīng)用實例
3.1控制某一路延時通斷實例
3.2隨機輸出控制使用實例
3.4一對一輸入輸出點動控制程序
3.5一對一輸入輸出自鎖控制實例
3.6一對一輸入輸出互鎖控制實例/******************************************************************** 程序說明: 當(dāng)X00口與COM口接通后,對應(yīng)的場效應(yīng)Y00導(dǎo)通(即:輸出控制電源); 當(dāng)X01口與COM口接通后,對應(yīng)的場效應(yīng)Y01導(dǎo)通(即:輸出控制電源); 當(dāng)X02口與COM口接通后,對應(yīng)的場效應(yīng)Y02導(dǎo)通(即:輸出控制電源); 當(dāng)X03口與COM口接通后,對應(yīng)的場效應(yīng)Y03導(dǎo)通(即:輸出控制電源); 當(dāng)X04口與COM口接通后,對應(yīng)的場效應(yīng)Y04導(dǎo)通(即:輸出控制電源); 當(dāng)X05口與COM口接通后,對應(yīng)的場效應(yīng)Y05導(dǎo)通(即:輸出控制電源); 當(dāng)X06口與COM口接通后,對應(yīng)的場效應(yīng)Y06導(dǎo)通(即:輸出控制電源); 當(dāng)X07口與COM口接通后,對應(yīng)的場效應(yīng)Y07導(dǎo)通(即:輸出控制電源);
*********************************************************************/ #include<STC12C5A60S2.h> //庫文件 #include <intrins.h> #define uchar unsigned char//宏定義無符號字符型 #define uint unsigned int //宏定義無符號整型 /******************************************************************** 初始定義 *********************************************************************/ /*定義八位數(shù)字量輸入為單片機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; /*定義八位數(shù)字量輸出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; /******************************************************************** 延時函數(shù) *********************************************************************/ 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; } /******************************************************************** 互鎖輸出處理函數(shù) *********************************************************************/ 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; } } } /******************************************************************** 主函數(shù) *********************************************************************/ 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和被控電源地接通 } }
/******************************************************************** 結(jié)束 *********************************************************************/ 3.7上位機串口控制測試/******************************************************************** 單片機與PC機采用9針串口,MAX232通訊,波特率默認(rèn)為9600. 單片機接收PC機發(fā)送的十六進制碼表如下: 輸出控制 01、全開:PC發(fā)送0xFF; 02、全關(guān):PC發(fā)送0X00; ************************************************************ 03、第一路開:PC發(fā)送0x01;*********11、第一路關(guān):PC發(fā)送0xF1; 04、第二路開:PC發(fā)送0x02;*********12、第二路關(guān):PC發(fā)送0xF2; 05、第三路開:PC發(fā)送0x03;*********13、第三路關(guān):PC發(fā)送0xF3; 06、第四路開:PC發(fā)送0x04;*********14、第四路關(guān):PC發(fā)送0xF4; 07、第五路開:PC發(fā)送0x05;*********15、第五路關(guān):PC發(fā)送0xF5; 08、第六路開:PC發(fā)送0x06;*********16、第六路關(guān):PC發(fā)送0xF6; 09、第七路開:PC發(fā)送0x07;*********17、第七路關(guān):PC發(fā)送0xF7; 10、第八路開:PC發(fā)送0x08;*********18、第八路關(guān):PC發(fā)送0xF8; ************************************************************ 輸入控制 ************************************************************ 03、第一路觸發(fā):向PC發(fā)送0xA1 04、第二路觸發(fā):向PC發(fā)送0xA2 05、第三路觸發(fā):向PC發(fā)送0xA3 06、第四路觸發(fā):向PC發(fā)送0xA4 07、第五路觸發(fā):向PC發(fā)送0xA5 08、第六路觸發(fā):向PC發(fā)送0xA6 09、第七路觸發(fā):向PC發(fā)送0xA7 10、第八路觸發(fā):向PC發(fā)送0xA8 ************************************************************ *********************************************************************/ #include<STC12C5A60S2.H> //庫文件 #include <intrins.h> #define uchar unsigned char//宏定義無符號字符型 #define uint unsigned int //宏定義無符號整型 /******************************************************************** 初始定義 *********************************************************************/
unsigned char dat; //用于存儲單片機接收發(fā)送緩沖寄存器SBUF里面的內(nèi)容 /*定義八位數(shù)字量輸入為單片機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; /*定義八位數(shù)字量輸出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; /******************************************************************** 延時函數(shù) *********************************************************************/ void delay(uchar t) { uchar i,j; for(i=0;i<t;i++) { for(j=250;j>0;j--); { ; } } } /******************************************************************** 輸出處理函數(shù) *********************************************************************/ 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; } /******************************************************************** 主函數(shù) *********************************************************************/ 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) //接收數(shù)據(jù)判斷 { uchar k; k=10; case 0xff: open_X3(0x00);delay(k);break; // 全開 case 0x00: open_X3(0xff);delay(k);break; // 全關(guān) 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; // 第一路關(guān) case 0xF2: Y01=1;delay(k);break; // 第二路關(guān) case 0xF3: Y02=1;delay(k);break; // 第三路關(guān) case 0xF4: Y03=1;delay(k);break; // 第四路關(guān) case 0xF5: Y04=1;delay(k);break; // 第五路關(guān) case 0xF6: Y05=1;delay(k);break; // 第六路關(guān) case 0xF7: Y06=1;delay(k);break; // 第七路關(guān) case 0xF8: Y07=1;delay(k);break; // 第八路關(guān) default:break; // 跳出 } } } /******************************************************************** 串口中斷函數(shù) *********************************************************************/ void commIntProc() interrupt 4 { if(TI) TI = 0; if(RI) RI = 0; dat = SBUF; //接收數(shù)據(jù)SBUF賦與dat } /******************************************************************** 結(jié)束 *********************************************************************/
3.8上位機485接口控制測試/******************************************************************** 單片機與PC機采用485連接. 單片機接收PC機發(fā)送的十六進制碼表如下: 輸出控制 01、全開:PC發(fā)送0xFF; 02、全關(guān):PC發(fā)送0X00; ************************************************************ 03、第一路開:PC發(fā)送0x01;*********11、第一路關(guān):PC發(fā)送0xF1; 04、第二路開:PC發(fā)送0x02;*********12、第二路關(guān):PC發(fā)送0xF2; 05、第三路開:PC發(fā)送0x03;*********13、第三路關(guān):PC發(fā)送0xF3; 06、第四路開:PC發(fā)送0x04;*********14、第四路關(guān):PC發(fā)送0xF4; 07、第五路開:PC發(fā)送0x05;*********15、第五路關(guān):PC發(fā)送0xF5; 08、第六路開:PC發(fā)送0x06;*********16、第六路關(guān):PC發(fā)送0xF6; 09、第七路開:PC發(fā)送0x07;*********17、第七路關(guān):PC發(fā)送0xF7; 10、第八路開:PC發(fā)送0x08;*********18、第八路關(guān):PC發(fā)送0xF8; ************************************************************ 輸入控制 ************************************************************ 03、第一路觸發(fā):向PC發(fā)送0xA1 04、第二路觸發(fā):向PC發(fā)送0xA2 05、第三路觸發(fā):向PC發(fā)送0xA3 06、第四路觸發(fā):向PC發(fā)送0xA4 07、第五路觸發(fā):向PC發(fā)送0xA5 08、第六路觸發(fā):向PC發(fā)送0xA6 09、第七路觸發(fā):向PC發(fā)送0xA7 10、第八路觸發(fā):向PC發(fā)送0xA8 ************************************************************ *********************************************************************/ #include<STC12C5A60S2.H> //庫文件 #include <intrins.h> #define uchar unsigned char//宏定義無符號字符型 #define uint unsigned int //宏定義無符號整型 /******************************************************************** 初始定義 *********************************************************************/
unsigned char dat; //用于存儲單片機接收發(fā)送緩沖寄存器SBUF里面的內(nèi)容 /*定義八位數(shù)字量輸入為單片機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; /*定義八位數(shù)字量輸出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接口發(fā)送接收控制 /******************************************************************** 延時函數(shù) *********************************************************************/ void delay(uchar t) { uchar i,j; for(i=0;i<t;i++) { for(j=250;j>0;j--); { ;} } } /******************************************************************** 輸出處理函數(shù) *********************************************************************/ 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,八位數(shù)據(jù),可變波特率 AUXR1=0x00; //1T工作方式 BRT=0XFD; //設(shè)置波特率9600 AUXR=0x10; //啟動波特率發(fā)生器 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; } /******************************************************************** 主函數(shù) *********************************************************************/ 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) //接收數(shù)據(jù)判斷 { uchar k; k=10; case 0xff: open_X3(0x00);delay(k);break; // 全開 case 0x00: open_X3(0xff);delay(k);break; // 全關(guān)
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; // 第一路關(guān) case 0xF2: Y01=1;delay(k);break; // 第二路關(guān) case 0xF3: Y02=1;delay(k);break; // 第三路關(guān) case 0xF4: Y03=1;delay(k);break; // 第四路關(guān) case 0xF5: Y04=1;delay(k);break; // 第五路關(guān) case 0xF6: Y05=1;delay(k);break; // 第六路關(guān) case 0xF7: Y06=1;delay(k);break; // 第七路關(guān) case 0xF8: Y07=1;delay(k);break; // 第八路關(guān) default:break; // 跳出 } } }
/******************************************************************** 串口二(485) 發(fā)送接收中斷函數(shù) *********************************************************************/ void uart2_isr() interrupt 8 { if( S2CON & 0x01 ) { S2CON &= ~0x01; dat= S2BUF; } if( S2CON & 0x02 ) { S2CON&=0xfd; b485Send=0;//發(fā)送完畢設(shè)置為接收 } } /******************************************************************** 結(jié)束 *********************************************************************/ 3.9上位機232或485接口控制測試
上位機控制界面(232或485接口均可以) /******************************************************************** PC機與控制板采用485或者232連接都可以進行測試
單片機接收PC機發(fā)送的十六進制碼表如下: 輸出控制 01、全開:PC發(fā)送0xFF; 02、全關(guān):PC發(fā)送0X00; ************************************************************ 03、第一路開:PC發(fā)送0x01;*********11、第一路關(guān):PC發(fā)送0xF1; 04、第二路開:PC發(fā)送0x02;*********12、第二路關(guān):PC發(fā)送0xF2; 05、第三路開:PC發(fā)送0x03;*********13、第三路關(guān):PC發(fā)送0xF3; 06、第四路開:PC發(fā)送0x04;*********14、第四路關(guān):PC發(fā)送0xF4; 07、第五路開:PC發(fā)送0x05;*********15、第五路關(guān):PC發(fā)送0xF5; 08、第六路開:PC發(fā)送0x06;*********16、第六路關(guān):PC發(fā)送0xF6; 09、第七路開:PC發(fā)送0x07;*********17、第七路關(guān):PC發(fā)送0xF7; 10、第八路開:PC發(fā)送0x08;*********18、第八路關(guān):PC發(fā)送0xF8; ************************************************************ 輸入控制 ************************************************************ 03、第一路觸發(fā):向PC發(fā)送0xA1 04、第二路觸發(fā):向PC發(fā)送0xA2 05、第三路觸發(fā):向PC發(fā)送0xA3 06、第四路觸發(fā):向PC發(fā)送0xA4 07、第五路觸發(fā):向PC發(fā)送0xA5 08、第六路觸發(fā):向PC發(fā)送0xA6 09、第七路觸發(fā):向PC發(fā)送0xA7 10、第八路觸發(fā):向PC發(fā)送0xA8 ************************************************************ *********************************************************************/ #include<STC12C5A60S2.H> //庫文件 #include <intrins.h> #define uchar unsigned char//宏定義無符號字符型 #define uint unsigned int //宏定義無符號整型 /******************************************************************** 初始定義 *********************************************************************/
unsigned char dat; //用于存儲單片機接收發(fā)送緩沖寄存器SBUF里面的內(nèi)容 /*定義八位數(shù)字量輸入為單片機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; /*定義八位數(shù)字量輸出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接口發(fā)送接收控制 /******************************************************************** 延時函數(shù) *********************************************************************/ void delay(uchar t) { uchar i,j; for(i=0;i<t;i++) { for(j=250;j>0;j--); { ;} } } /******************************************************************** 輸出處理函數(shù) *********************************************************************/ 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,八位數(shù)據(jù),可變波特率 AUXR1=0x00; //1T工作方式 BRT=0XFD; //設(shè)置波特率9600 AUXR=0x10; //啟動波特率發(fā)生器 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; } /******************************************************************** 主函數(shù) *********************************************************************/ 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) //接收數(shù)據(jù)判斷 { uchar k; k=10; case 0xff: open_X3(0x00);delay(k);break; // 全開 case 0x00: open_X3(0xff);delay(k);break; // 全關(guān)
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; // 第一路關(guān) case 0xF2: Y01=1;delay(k);break; // 第二路關(guān) case 0xF3: Y02=1;delay(k);break; // 第三路關(guān) case 0xF4: Y03=1;delay(k);break; // 第四路關(guān) case 0xF5: Y04=1;delay(k);break; // 第五路關(guān) case 0xF6: Y05=1;delay(k);break; // 第六路關(guān) case 0xF7: Y06=1;delay(k);break; // 第七路關(guān) case 0xF8: Y07=1;delay(k);break; // 第八路關(guān) default:break; // 跳出 } } } /******************************************************************** 串口中斷函數(shù) *********************************************************************/ void commIntProc() interrupt 4 { if(TI) TI = 0; if(RI) { RI = 0; dat = SBUF; } //接收數(shù)據(jù)SBUF賦與dat } /******************************************************************** 串口二(485) 發(fā)送接收中斷函數(shù) *********************************************************************/ void uart2_isr() interrupt 8 { if( S2CON & 0x01 ) { S2CON &= ~0x01; dat= S2BUF; } if( S2CON & 0x02 ) { S2CON&=0xfd; b485Send=0;//發(fā)送完畢設(shè)置為接收 } } /******************************************************************** 結(jié)束 *********************************************************************/ 3.10加密設(shè)定開機次數(shù)記憶/******************************************************************** 程序說明: 每次上電,開機次數(shù)記憶值自動加1,當(dāng)達到設(shè)定開機次數(shù)值時 將不再執(zhí)行其他的任何操作,可用于工程催款要賬等。。
*********************************************************************/ #include<STC12C5A60S2.h> //庫文件 #include <intrins.h> #define uchar unsigned char//宏定義無符號字符型 #define uint unsigned int //宏定義無符號整型
#define ENABLE_ISP 0x83 //系統(tǒng)工作時鐘<12MHz 時,對IAP_CONTR 寄存器設(shè)置此值 #define DEBUG_DATA 0x5A //本測試程序最終存儲在 EEPROM 單元的數(shù)值 #define DATA_FLASH_START_ADDRESS 0x00 //STC5Axx 系列 EEPROM 測試起始地址
uchar dat;//開機次數(shù)記憶值 /******************************************************************** eeprom相關(guān)函數(shù)聲明 *********************************************************************/void IAP_Disable(); uchar EEPROMReadByte(uint add); //讀一字節(jié),調(diào)用前需打開IAP 功能 void EEPROMWriteByte(uint add, uchar ch); //字節(jié)編程,調(diào)用前需打開IAP 功能 void EEPROMSectorErase(uint add); //擦除扇區(qū) /******************************************************************** 初始定義 *********************************************************************/ /*定義八位數(shù)字量輸入為單片機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; /*定義八位數(shù)字量輸出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; /******************************************************************** 延時函數(shù) *********************************************************************/ 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; } /******************************************************************** 主函數(shù) *********************************************************************/ void main() { P4_init(); dat=EEPROMReadByte(0); //從EERPOM的相對0地址讀取數(shù)據(jù) dat++; EEPROMSectorErase(0); //從EEPROM的相對0地址扇區(qū)擦除 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和被控電源地接通 } /********************************************************** 定義一個結(jié)構(gòu)體 ***********************************************************/ union union_temp16 { uint un_temp16; uchar un_temp8[2]; }my_unTemp16; /********************************************************** 功能:讀一字節(jié),調(diào)用前需打開IAP 功能, 入口:DPTR = 字節(jié)地址 返回:A = 讀出字節(jié) ***********************************************************/ uchar EEPROMReadByte(uint add) { IAP_DATA = 0x00; IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設(shè)置Flash 操作等待時間 IAP_CMD = 0x01; //IAP/ISP/EEPROM 字節(jié)讀命令
my_unTemp16.un_temp16 = add; IAP_ADDRH = my_unTemp16.un_temp8[0]; //設(shè)置目標(biāo)單元地址的高8 位地址 IAP_ADDRL = my_unTemp16.un_temp8[1]; //設(shè)置目標(biāo)單元地址的低8 位地址
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此 IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動 _nop_(); 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 EEPROMWriteByte(uint add, uchar ch) { IAP_CONTR = ENABLE_ISP; //打開 IAP 功能, 設(shè)置Flash 操作等待時間 IAP_CMD = 0x02; //IAP/ISP/EEPROM 字節(jié)編程命令
my_unTemp16.un_temp16 = add; IAP_ADDRH = my_unTemp16.un_temp8[0]; //設(shè)置目標(biāo)單元地址的高8 位地址 IAP_ADDRL = my_unTemp16.un_temp8[1]; //設(shè)置目標(biāo)單元地址的低8 位地址
IAP_DATA = ch; //要編程的數(shù)據(jù)先送進IAP_DATA 寄存器 IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此 IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動 _nop_(); IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài), //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān) } /********************************************************** 功能:擦除扇區(qū) 入口:DPTR = 扇區(qū)地址 ***********************************************************/ void EEPROMSectorErase(uint add) { IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設(shè)置Flash 操作等待時間 IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇區(qū)擦除命令
my_unTemp16.un_temp16 = add; IAP_ADDRH = my_unTemp16.un_temp8[0]; //設(shè)置目標(biāo)單元地址的高8 位地址 IAP_ADDRL = my_unTemp16.un_temp8[1]; //設(shè)置目標(biāo)單元地址的低8 位地址
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此 IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動 _nop_(); IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài), //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān) } /********************************************************** 關(guān)閉IAP功能 ***********************************************************/ 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; } /******************************************************************** 結(jié)束 *********************************************************************/ 3.11掉電記憶測試程序/******************************************************************** 程序說明: 觸發(fā)X00,Y00導(dǎo)通。此時,斷開電源,再次上電,Y00依舊導(dǎo)通 這就是所謂的掉電記憶,可以保存掉電前的狀態(tài)
*********************************************************************/ #include<STC12C5A60S2.h> //庫文件 #include <intrins.h> #define uchar unsigned char//宏定義無符號字符型 #define uint unsigned int //宏定義無符號整型
#define ENABLE_ISP 0x83 //系統(tǒng)工作時鐘<12MHz 時,對IAP_CONTR 寄存器設(shè)置此值 #define DEBUG_DATA 0x5A //本測試程序最終存儲在 EEPROM 單元的數(shù)值 #define DATA_FLASH_START_ADDRESS 0x00 //STC5Axx 系列 EEPROM 測試起始地址
uchar dat; /******************************************************************** eeprom相關(guān)函數(shù)聲明 *********************************************************************/void IAP_Disable(); uchar EEPROMReadByte(uint add); //讀一字節(jié),調(diào)用前需打開IAP 功能 void EEPROMWriteByte(uint add, uchar ch); //字節(jié)編程,調(diào)用前需打開IAP 功能 void EEPROMSectorErase(uint add); //擦除扇區(qū) /******************************************************************** 初始定義 *********************************************************************/ /*定義八位數(shù)字量輸入為單片機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; /*定義八位數(shù)字量輸出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; /******************************************************************** 延時函數(shù) *********************************************************************/ 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; } /******************************************************************** 主函數(shù) *********************************************************************/ void main() { P4_init(); dat=EEPROMReadByte(0); //從EERPOM的相對0地址讀取數(shù)據(jù) 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地址扇區(qū)擦除 EEPROMWriteByte(0,dat); } } //Y00和被控電源地接通
} } /********************************************************** 定義一個結(jié)構(gòu)體 ***********************************************************/ union union_temp16 { uint un_temp16; uchar un_temp8[2]; }my_unTemp16; /********************************************************** 功能:讀一字節(jié),調(diào)用前需打開IAP 功能, 入口:DPTR = 字節(jié)地址 返回:A = 讀出字節(jié) ***********************************************************/ uchar EEPROMReadByte(uint add) { IAP_DATA = 0x00; IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設(shè)置Flash 操作等待時間 IAP_CMD = 0x01; //IAP/ISP/EEPROM 字節(jié)讀命令
my_unTemp16.un_temp16 = add; IAP_ADDRH = my_unTemp16.un_temp8[0]; //設(shè)置目標(biāo)單元地址的高8 位地址 IAP_ADDRL = my_unTemp16.un_temp8[1]; //設(shè)置目標(biāo)單元地址的低8 位地址
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此 IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動 _nop_(); 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 EEPROMWriteByte(uint add, uchar ch) { IAP_CONTR = ENABLE_ISP; //打開 IAP 功能, 設(shè)置Flash 操作等待時間 IAP_CMD = 0x02; //IAP/ISP/EEPROM 字節(jié)編程命令
my_unTemp16.un_temp16 = add; IAP_ADDRH = my_unTemp16.un_temp8[0]; //設(shè)置目標(biāo)單元地址的高8 位地址 IAP_ADDRL = my_unTemp16.un_temp8[1]; //設(shè)置目標(biāo)單元地址的低8 位地址
IAP_DATA = ch; //要編程的數(shù)據(jù)先送進IAP_DATA 寄存器 IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此 IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動 _nop_(); IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài), //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān) } /********************************************************** 功能:擦除扇區(qū) 入口:DPTR = 扇區(qū)地址 ***********************************************************/ void EEPROMSectorErase(uint add) { IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設(shè)置Flash 操作等待時間 IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇區(qū)擦除命令
my_unTemp16.un_temp16 = add; IAP_ADDRH = my_unTemp16.un_temp8[0]; //設(shè)置目標(biāo)單元地址的高8 位地址 IAP_ADDRL = my_unTemp16.un_temp8[1]; //設(shè)置目標(biāo)單元地址的低8 位地址
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此 IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動 _nop_(); IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài), //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān) } /********************************************************** 關(guān)閉IAP功能 ***********************************************************/ 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; } /******************************************************************** 結(jié)束 *********************************************************************/ |