找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5275|回复: 1
打印 上一主题 下一主题
收起左侧

Keil uVision4编程与下载教程 单片机八入八出场效应管开发板入门

[复制链接]
跳转到指定楼层
楼主
ID:69798 发表于 2018-2-24 19:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 单恋diy 于 2018-2-24 19:31 编辑

此开发板的源码与详细资料下载地址(含vb.net上位机源代码与单片机源码):
http://www.51hei.com/bbs/dpj-107734-1.html

开发板编程入门教学


2.1 Keil uVision4简介
使用汇编语言或C语言要使用编译器,以便把写好的程序编译为机器码,才能把HEX可执行文件写入单片机内。KEIL uVISION是众多单片机应用开发软件中最优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,甚至ARM,它集编辑,编译,仿真等于一体,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。
   KEIL uVision4比起uVision3或是uVision2界面感觉舒服一些,增加了一些功能暂且不去研究,毕竟大家都喜欢用新的软件,感叹发展太快了,很多人连uVision2都没有摸透,呵呵。安装的方法和普通软件差不多,这里就不做介绍了。另外提醒大家不要崇拜汉化版软件,还是E文的干净没有BUG!
2.2 keil软件建一个简单工程
在这里以51单片机并结合C程序为例(汇编操作方法类似,唯一不同的是汇编源程序文件名后缀为“.ASM ”),图文描述工程项目的创建和使用方法:
1.首先我们要养成一个习惯:最好先建立一个空文件夹,把您的工程文件放到里面,以避免和其他文件混合,如下图笔者先创建了一个名为“Mytest”文件夹:

2.点击桌面上的Keil uVision4图标,出现启动画面:

3.点击“project --- New uVision Project”新建一个工程:

4.在对话框,选择放在刚才建立的“Mytest”文件夹下,给这个工程取个名后保存,不需要填后缀,注意默认的工程后缀与uVision3及uVision2版本不同了,为uvporj

5.弹出一个框,在CPU类型下我们找到并选中“Atmel”下的AT89S51或52:

6.以上工程创建完毕,接下来开始建立一个源程序文本:

7.在下面空白区别写入或复制一个完整的C程序:

8.输入源程序文件名名称,在这里笔者示例输入“test”,这个名称,同样大家可以随便命名。
注意:如果您想用汇编语言,要带后缀名一定是“test . asm”,如果是C语言,则是“test . c”,然后保存

9.接下来需要把刚创建的源程序文件加入到工程项目文件中,大家在点“ADD”按钮时会感到奇怪,怎么对话框不会消失呢?不管它,直接点击“Close”关闭就行了,此时大家可以看到程序文本字体颜色已发生了变化:

10.最后还要有设置一下,按下图设置晶振,建议初学者修改成12M,因12MHZ方便计算指令时间:

11.在Output栏选中Create HEX File,使编译器输出单片机需要的HEX文件:

12.工程项目创建和设置全部完成!点击保持并编译(下图):

查看工程文件夹内容:

以上图文描述的是KEIL uVISION的使用入门,这些是单片机基础知识和基本操作必备的。KEIL uVISION拥有强大的功能,还有仿真、调试等功能,在此不一一详解,建议读者找本书好好学习一下,真正到开发时还是要用到的
2.3 下载程序方法
1.使用USB转RS232串口线,(电脑上有串口可以用串口下载)如下图所示,电脑需安装ch340驱动,提供安装视频教程,安装成功后,即可安照下列步骤下载程序

             Usb转串口下载线

2.运行STC-ISP.exe程序,启动下载软件图1,此软件为绿色软件,无需安装,将程序目录拷贝至任意位置运行即可。

图1 启动STC-ISP.exe

3.选择对应的单片机型号,在STC-ISP软件左侧的“步骤1”中选择用户使用的单片机(图2)。本开发板使用的是STC12C5A60S2单片机

图2 选单片机型号

4.选择需要下载进单片机的.HEX文件,点击“步骤2”中的“打开程序文件”按钮(图3),弹出打开文件对话框(图4),选中需要下载的.HEX文件。

图3 加载HEX文件

图4 选中需要下载的HEX文件

5.设定单片机下载时使用的串行通讯端口(图5)。在“步骤3”中选中用户使用的下载串口,(右击“我的电脑”-“属性”-“设备管理器”-“端口COM”查看usb转串口线所使用的COM口),波特率请根据实际需求做对应调整。

图5 选择和设定下载串口

6.设定单片机的工作模式(图6)。由于STC单片机有许多其它的工作模式可供选择,因此,宏晶科技在“步骤4”中提供了一些单片机工作模式选项,一般无需做更动,按照默认设定使用就可以了,如有特殊需求,可参看单片机的器件手册。

图6 设定单片机的工作模式

7.下载程序。下载之前先确认目标板是否断电,因为STC单片机的下载的时候需要在单片机“冷启动”时进行。目标板断电后,点击“步骤5”中的“download/下载”,此时STC-ISP软件将尝试和单片机握手,此时给目标板上电,如果一切正常,下载过程将正常开始,STC-ISP软件的左下方的信息窗口中将给出对应的提示信息(图7)。

图7 程序下载



3 开发板应用实例
3.1控制某一路延时通断实例

  1. /********************************************************************
  2. 程序说明:
  3. 继电器K1闭合约0.2秒后,继电器断开,然后延时约0.2秒再次闭合依次循环!
  4. *********************************************************************/

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

  6. #define uchar unsigned char//宏定义无符号字符型

  7. #define uint unsigned int  //宏定义无符号整型

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

  9.                             初始定义

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

  11. /*定义八位数字量输入为单片机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. /*定义八位数字量输出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.                             延时函数

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

  32. void delay(uchar t) //当t等于20时,大概延时0.2秒;当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.                             主函数

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

  51. void main()

  52. {

  53.    P4_init();

  54.    while(1)

  55.   {

  56. Y00=0;   //控制第一路输出导通

  57. delay(200); //调用延时函数

  58. Y00=1;   //控制第一路输出断开

  59. delay(200); //调用延时函数

  60.   }

  61. }

  62.             

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

  64.                               结束

  65. *********************************************************************/
复制代码

3.2随机输出控制使用实例
  1. /********************************************************************

  2. 程序说明:

  3. 开关管Y00导通约0.2秒后,断开,同时Y01吸合,然后延时约0.2秒,

  4. 继电器Y01断开,同时Y02吸合,依次八个开关管轮换导通与断开!



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

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

  7. #include <intrins.h>

  8. #define uchar unsigned char//宏定义无符号字符型

  9. #define uint unsigned int  //宏定义无符号整型

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

  11.                             初始定义

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

  13. /*定义八位数字量输入为单片机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. /*定义八位数字量输出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.                             延时函数

  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.                             主函数

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

  53. void main()

  54. {

  55.   P4_init();

  56.   while(1)

  57.   {

  58. Y00=0;              //开关管Y00导通

  59. delay(200);  //调用延时函数

  60. Y00=1;              //开关管Y00断开

  61. Y01=0;              //开关管Y01导通

  62. delay(200);  //调用延时函数

  63. Y01=1;      //开关管Y01断开

  64. Y02=0;      //开关管Y02导通

  65. delay(200);  //调用延时函数

  66. Y02=1;     //开关管Y02断开

  67. Y03=0;     //开关管Y03导通

  68. delay(200);  //调用延时函数

  69. Y03=1;     //开关管Y03断开

  70. Y04=0;     //开关管Y04导通

  71. delay(200);  //调用延时函数

  72. Y04=1;     //开关管Y04断开

  73. Y05=0;     //开关管Y05导通

  74. delay(200);  //调用延时函数

  75. Y05=1;              //开关管Y05断开

  76. Y06=0;      //开关管Y06导通

  77. delay(200);  //调用延时函数

  78. Y06=1;     //开关管Y06断开

  79. Y07=0;    //开关管Y07导通

  80. delay(200);  //调用延时函数

  81. Y07=1;   //开关管Y07断开

  82. }

  83. }            

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

  85.                               结束

  86. *********************************************************************/
复制代码


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. /*定义八位数字量输入为单片机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. /*定义八位数字量输出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.                             延时函数

  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.                             主函数

  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.                               结束

  76. *********************************************************************/
复制代码


3.5一对一输入输出自锁控制实例

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

  2. 程序说明:

  3. 当X00口与COM口接通后,对应的场效应Y00导通(即:输出控制电源);

  4. 当X01口与COM口接通后,对应的场效应Y01导通(即:输出控制电源);

  5. 当X02口与COM口接通后,对应的场效应Y02导通(即:输出控制电源);

  6. 当X03口与COM口接通后,对应的场效应Y03导通(即:输出控制电源);

  7. 当X04口与COM口接通后,对应的场效应Y04导通(即:输出控制电源);

  8. 当X05口与COM口接通后,对应的场效应Y05导通(即:输出控制电源);

  9. 当X06口与COM口接通后,对应的场效应Y06导通(即:输出控制电源);

  10. 当X07口与COM口接通后,对应的场效应Y07导通(即:输出控制电源);

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

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

  13. #define uchar unsigned char//宏定义无符号字符型

  14. #define uint unsigned int  //宏定义无符号整型

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

  16.                             初始定义

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

  18. /*定义八位数字量输入为单片机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. /*定义八位数字量输出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.                             延时函数

  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.                             主函数

  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.                               结束

  77. *********************************************************************/
复制代码

3.6一对一输入输出互锁控制实例

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

程序说明:

当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

}               

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

                              结束

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



3.8上位机485接口控制测试

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

单片机与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;

}            

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

                              结束

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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表