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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5783|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

Keil uVision4編程與下載教程 單片機八入八出場效應(yīng)管開發(fā)板入門

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:69798 發(fā)表于 2018-2-24 19:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 單戀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”文件夾:

2.點擊桌面上的Keil uVision4圖標(biāo),出現(xiàn)啟動畫面:

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控制某一路延時通斷實例

  1. /********************************************************************
  2. 程序說明:
  3. 繼電器K1閉合約0.2秒后,繼電器斷開,然后延時約0.2秒再次閉合依次循環(huán)!
  4. *********************************************************************/

  5. #include<STC12C5A60S2.h>                       //庫文件

  6. #define uchar unsigned char//宏定義無符號字符型

  7. #define uint unsigned int  //宏定義無符號整型

  8. /********************************************************************

  9.                             初始定義

  10. *********************************************************************/

  11. /*定義八位數(shù)字量輸入為單片機P0口*/

  12. sbit X00=P0^0;

  13. sbit X01=P0^1;

  14. sbit X02=P0^2;

  15. sbit X03=P0^3;

  16. sbit X04=P0^4;

  17. sbit X05=P0^5;

  18. sbit X06=P0^6;

  19. sbit X07=P0^7;

  20. /*定義八位數(shù)字量輸出IO口*/

  21. sbit Y00=P4^4;

  22. sbit Y01=P4^5;

  23. sbit Y02=P4^1;

  24. sbit Y03=P4^6;

  25. sbit Y04=P5^0;

  26. sbit Y05=P5^1;

  27. sbit Y06=P2^7;

  28. sbit Y07=P2^6;

  29. /********************************************************************

  30.                             延時函數(shù)

  31. *********************************************************************/

  32. void delay(uchar t) //當(dāng)t等于20時,大概延時0.2秒;當(dāng)t等于10時,大概延時0.1秒;

  33. {

  34. uchar m,n,s;

  35. for(m=t;m>0;m--)

  36. for(n=20;n>0;n--)

  37. for(s=248;s>0;s--);

  38. }

  39. /********************************************************************

  40.                             配置P4口

  41. *********************************************************************/

  42. void P4_init(void)

  43. {

  44.     P4SW=0x70;   //配置P4口

  45.     P4M0&=0x80;            

  46.     P4M1&=0x80;

  47. }

  48. /********************************************************************

  49.                             主函數(shù)

  50. *********************************************************************/

  51. void main()

  52. {

  53.    P4_init();

  54.    while(1)

  55.   {

  56. Y00=0;   //控制第一路輸出導(dǎo)通

  57. delay(200); //調(diào)用延時函數(shù)

  58. Y00=1;   //控制第一路輸出斷開

  59. delay(200); //調(diào)用延時函數(shù)

  60.   }

  61. }

  62.             

  63. /********************************************************************

  64.                               結(jié)束

  65. *********************************************************************/
復(fù)制代碼

3.2隨機輸出控制使用實例
  1. /********************************************************************

  2. 程序說明:

  3. 開關(guān)管Y00導(dǎo)通約0.2秒后,斷開,同時Y01吸合,然后延時約0.2秒,

  4. 繼電器Y01斷開,同時Y02吸合,依次八個開關(guān)管輪換導(dǎo)通與斷開!



  5. *********************************************************************/

  6. #include<STC12C5A60S2.h>                       //庫文件

  7. #include <intrins.h>

  8. #define uchar unsigned char//宏定義無符號字符型

  9. #define uint unsigned int  //宏定義無符號整型

  10. /********************************************************************

  11.                             初始定義

  12. *********************************************************************/

  13. /*定義八位數(shù)字量輸入為單片機P0口*/

  14. sbit X00=P0^0;

  15. sbit X01=P0^1;

  16. sbit X02=P0^2;

  17. sbit X03=P0^3;

  18. sbit X04=P0^4;

  19. sbit X05=P0^5;

  20. sbit X06=P0^6;

  21. sbit X07=P0^7;

  22. /*定義八位數(shù)字量輸出IO口*/

  23. sbit Y00=P4^4;

  24. sbit Y01=P4^5;

  25. sbit Y02=P4^1;

  26. sbit Y03=P4^6;

  27. sbit Y04=P5^0;

  28. sbit Y05=P5^1;

  29. sbit Y06=P2^7;

  30. sbit Y07=P2^6;

  31. /********************************************************************

  32.                             延時函數(shù)

  33. *********************************************************************/

  34. void delay(uchar t)            

  35. {

  36.               uchar m,n,s;

  37.               for(m=t;m>0;m--)

  38.               for(n=20;n>0;n--)

  39.               for(s=248;s>0;s--);

  40. }

  41. /********************************************************************

  42.                             配置P4口

  43. *********************************************************************/

  44. void P4_init(void)

  45. {

  46.     P4SW=0x70;   //配置P4口

  47.     P4M0&=0x80;            

  48.     P4M1&=0x80;

  49. }

  50. /********************************************************************

  51.                             主函數(shù)

  52. *********************************************************************/

  53. void main()

  54. {

  55.   P4_init();

  56.   while(1)

  57.   {

  58. Y00=0;              //開關(guān)管Y00導(dǎo)通

  59. delay(200);  //調(diào)用延時函數(shù)

  60. Y00=1;              //開關(guān)管Y00斷開

  61. Y01=0;              //開關(guān)管Y01導(dǎo)通

  62. delay(200);  //調(diào)用延時函數(shù)

  63. Y01=1;      //開關(guān)管Y01斷開

  64. Y02=0;      //開關(guān)管Y02導(dǎo)通

  65. delay(200);  //調(diào)用延時函數(shù)

  66. Y02=1;     //開關(guān)管Y02斷開

  67. Y03=0;     //開關(guān)管Y03導(dǎo)通

  68. delay(200);  //調(diào)用延時函數(shù)

  69. Y03=1;     //開關(guān)管Y03斷開

  70. Y04=0;     //開關(guān)管Y04導(dǎo)通

  71. delay(200);  //調(diào)用延時函數(shù)

  72. Y04=1;     //開關(guān)管Y04斷開

  73. Y05=0;     //開關(guān)管Y05導(dǎo)通

  74. delay(200);  //調(diào)用延時函數(shù)

  75. Y05=1;              //開關(guān)管Y05斷開

  76. Y06=0;      //開關(guān)管Y06導(dǎo)通

  77. delay(200);  //調(diào)用延時函數(shù)

  78. Y06=1;     //開關(guān)管Y06斷開

  79. Y07=0;    //開關(guān)管Y07導(dǎo)通

  80. delay(200);  //調(diào)用延時函數(shù)

  81. Y07=1;   //開關(guān)管Y07斷開

  82. }

  83. }            

  84. /********************************************************************

  85.                               結(jié)束

  86. *********************************************************************/
復(fù)制代碼


3.4一對一輸入輸出點動控制程序

  1. *********************************************************************/

  2. #include<STC12C5A60S2.h>                       //庫文件

  3. #include <intrins.h>

  4. #define uchar unsigned char//宏定義無符號字符型

  5. #define uint unsigned int  //宏定義無符號整型

  6. /********************************************************************

  7.                             初始定義

  8. *********************************************************************/

  9. /*定義八位數(shù)字量輸入為單片機P0口*/

  10. sbit X00=P0^0;

  11. sbit X01=P0^1;

  12. sbit X02=P0^2;

  13. sbit X03=P0^3;

  14. sbit X04=P0^4;

  15. sbit X05=P0^5;

  16. sbit X06=P0^6;

  17. sbit X07=P0^7;

  18. /*定義八位數(shù)字量輸出IO口*/

  19. sbit Y00=P4^4;

  20. sbit Y01=P4^5;

  21. sbit Y02=P4^1;

  22. sbit Y03=P4^6;

  23. sbit Y04=P5^0;

  24. sbit Y05=P5^1;

  25. sbit Y06=P2^7;

  26. sbit Y07=P2^6;

  27. /********************************************************************

  28.                             延時函數(shù)

  29. *********************************************************************/

  30. void delay(uchar t)

  31. {

  32.   uchar i,j;

  33.    for(i=0;i<t;i++)

  34.    {

  35.       for(j=13;j>0;j--);

  36. {;}

  37.    }

  38. }

  39. /********************************************************************

  40.                             配置P4口

  41. *********************************************************************/

  42. void P4_init(void)

  43. {

  44.     P4SW=0x70;   //配置P4口

  45.     P4M0&=0x80;            

  46.     P4M1&=0x80;

  47. }

  48. /********************************************************************

  49.                             主函數(shù)

  50. *********************************************************************/

  51. void main()

  52. {

  53.   P4_init();

  54.   while(1)

  55.   {

  56. if(X00==0)

  57. {delay(100);Y00=0;while(!X00);Y00=1;} //Y00和被控電源地接通

  58. if(X01==0)

  59. {delay(100);Y01=0;while(!X01);Y01=1;} //Y01和被控電源地接通

  60. if(X02==0)

  61. {delay(100);Y02=0;while(!X02);Y02=1;} //Y02和被控電源地接通

  62. if(X03==0)

  63. {delay(100);Y03=0;while(!X03);Y03=1;} //Y03和被控電源地接通

  64. if(X04==0)

  65. {delay(100);Y04=0;while(!X04);Y04=1;} //Y04和被控電源地接通

  66. if(X05==0)

  67. {delay(100);Y05=0;while(!X05);Y05=1;} //Y05和被控電源地接通

  68. if(X06==0)

  69. {delay(100);Y06=0;while(!X06);Y06=1;} //Y06和被控電源地接通

  70. if(X07==0)

  71. {delay(100);Y07=0;while(!X07);Y07=1;} //Y07和被控電源地接通

  72. }

  73. }            

  74. /********************************************************************

  75.                               結(jié)束

  76. *********************************************************************/
復(fù)制代碼


3.5一對一輸入輸出自鎖控制實例

  1. /********************************************************

  2. 程序說明:

  3. 當(dāng)X00口與COM口接通后,對應(yīng)的場效應(yīng)Y00導(dǎo)通(即:輸出控制電源);

  4. 當(dāng)X01口與COM口接通后,對應(yīng)的場效應(yīng)Y01導(dǎo)通(即:輸出控制電源);

  5. 當(dāng)X02口與COM口接通后,對應(yīng)的場效應(yīng)Y02導(dǎo)通(即:輸出控制電源);

  6. 當(dāng)X03口與COM口接通后,對應(yīng)的場效應(yīng)Y03導(dǎo)通(即:輸出控制電源);

  7. 當(dāng)X04口與COM口接通后,對應(yīng)的場效應(yīng)Y04導(dǎo)通(即:輸出控制電源);

  8. 當(dāng)X05口與COM口接通后,對應(yīng)的場效應(yīng)Y05導(dǎo)通(即:輸出控制電源);

  9. 當(dāng)X06口與COM口接通后,對應(yīng)的場效應(yīng)Y06導(dǎo)通(即:輸出控制電源);

  10. 當(dāng)X07口與COM口接通后,對應(yīng)的場效應(yīng)Y07導(dǎo)通(即:輸出控制電源);

  11. **********************************************************/

  12. #include<STC12C5A60S2.h>                       //庫文件

  13. #define uchar unsigned char//宏定義無符號字符型

  14. #define uint unsigned int  //宏定義無符號整型

  15. /********************************************************************

  16.                             初始定義

  17. *********************************************************************/

  18. /*定義八位數(shù)字量輸入為單片機P0口*/

  19. sbit X00=P0^0;

  20. sbit X01=P0^1;

  21. sbit X02=P0^2;

  22. sbit X03=P0^3;

  23. sbit X04=P0^4;

  24. sbit X05=P0^5;

  25. sbit X06=P0^6;

  26. sbit X07=P0^7;

  27. /*定義八位數(shù)字量輸出IO口*/

  28. sbit Y00=P4^4;  //硬件的p2.6口有問題,測試時把p2.5和p2.6短接了

  29. sbit Y01=P4^5;

  30. sbit Y02=P4^1;

  31. sbit Y03=P4^6;

  32. sbit Y04=P5^0;

  33. sbit Y05=P5^1;

  34. sbit Y06=P2^7;

  35. sbit Y07=P2^5;

  36. /********************************************************************

  37.                             延時函數(shù)

  38. *********************************************************************/

  39. void delay(uchar t)

  40. {

  41.   uchar i,j;

  42.    for(i=0;i<t;i++)

  43.    {

  44.      for(j=13;j>0;j--);

  45. { ;}

  46.    }

  47. }

  48. /********************************************************************

  49.                             配置P4口

  50. *********************************************************************/

  51. void P4_init(void)

  52. {

  53.     P4SW=0x70;   //配置P4口

  54.     P4M0&=0x80;            

  55.     P4M1&=0x80;

  56. }

  57. /********************************************************************

  58.                             主函數(shù)

  59. *********************************************************************/

  60. void main()

  61. {

  62.    P4_init();

  63.    while(1)

  64.    {

  65. if(X00==0){delay(100);while(!X00);Y00=0;} //Y00和被控電源地接通

  66. if(X01==0){delay(100);while(!X01);Y01=0;} //Y01和被控電源地接通

  67. if(X02==0){delay(100);while(!X02);Y02=0;} //Y02和被控電源地接通

  68. if(X03==0){delay(100);while(!X03);Y03=0;} //Y03和被控電源地接通

  69. if(X04==0){delay(100);while(!X04);Y04=0;} //Y04和被控電源地接通

  70. if(X05==0){delay(100);while(!X05);Y05=0;} //Y05和被控電源地接通

  71. if(X06==0){delay(100);while(!X06);Y06=0;} //Y06和被控電源地接通

  72. if(X07==0){delay(100);while(!X07);Y07=0;} //Y07和被控電源地接通

  73.    }

  74. }            

  75. /********************************************************************

  76.                               結(jié)束

  77. *********************************************************************/
復(fù)制代碼

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é)束

*********************************************************************/

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 97伊人 | 日韩中文字幕av | 狠狠操电影 | 国产成人一区二 | 奇米av | 91成人小视频 | 日韩在线不卡 | 久久精品aaa | 日韩在线大片 | 亚欧洲精品在线视频免费观看 | 亚洲国产成人av好男人在线观看 | 成年网站在线观看 | 红桃成人在线 | 成人精品啪啪欧美成 | 免费在线成人 | av在线电影网站 | 国产精品一区二区不卡 | 亚洲成人精选 | 五月天婷婷综合 | 久久视频精品在线 | 国产精品成人一区二区三区夜夜夜 | 97色免费视频 | 在线免费看91 | 黑人巨大精品欧美一区二区免费 | 久久中文免费视频 | 国产精品永久免费观看 | 欧美三区视频 | 久久久精品一区二区三区四季av | 久久亚洲春色中文字幕久久久 | 亚洲一区 | 亚洲国产精品一区在线观看 | 久草网址 | 另类在线 | 精品国产免费人成在线观看 | 日韩视频国产 | 亚洲3级| 伊人久麻豆社区 | 国产1区2区3区 | 亚洲精品一区二区二区 | 青娱乐国产 | 国产成人精品福利 |