本帖最后由 单恋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”文件夹: 

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控制某一路延时通断实例
3.2随机输出控制使用实例
3.4一对一输入输出点动控制程序
3.5一对一输入输出自锁控制实例
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; } /******************************************************************** 结束 *********************************************************************/ |