基于KeilC51和Proteus花样流水灯系统的设计
谭艳春 朱又敏 刘目磊
摘 要:单片机技术日益成熟,已广泛应用于工业自动化、交通控制、智能仪表等众多领域。为了进一步研究并拓展单片机的应用,本文利用80C51单片机、KeilC51和Proteus软件对花样流水灯系统进行了完整的软硬件开发与设计。Proteus在线仿真验证了系统设计的稳定性和正确性。该系统的框架结构具有良好的可移植性,可根据实际需求生成不同的智能派生产品,具有较强的实际指导意义和应用价值。
关键词:KeilC51;Proteus;单片机;LED流水灯;系统设计
中图分类号:TP399 文献标识码:A
文章编号:2096-1472(2018)-11-14-03
1 引言(Introduction)
单片机无论从组成还是逻辑功能上都具有微机系统的特性,是一门实践性很强的软硬件结合的技术,且体积小巧,因此可以嵌入到各种应用系统中作为指挥决策中心,实现系统的智能化[1-3]。目前比较流行的单片机仿真软件和集成开发软件分别为Proteus和Keil。
Proteus不仅具有其他EDA工具软件的仿真功能,还能仿真单片机及外围器件,是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等。Keil是德国Keil Software公司出品的单片机集成开发环境,该软件支持51单片机的所有兼容机,它包括了C编译器、宏汇编、连接器、库管理及一个功能强大的仿真调试器在内的所有开发模块[4-7]。
2 硬件电路设计(Design of hardware circuit)
该系统的硬件电路主要包括时钟电路(采用内部时钟方式,晶振频率为12MHz)、复位电路、输入和输出电路四部分。其中输入电路是四个按钮开关K1—K4,并通过四输入与门74AS21将按键信息从外部中断引脚0(P3.2)读入系统,以触发中断,让CPU及时响应按键操作。由于80C51单片机P0口的内部电路结构问题,P0口作为I/O时必须接上拉电阻。输出部分由八个共阳型发光二极管及限流电阻(200Ω)组成。利用Proteus仿真软件生成的硬件电路如图1所示。
按钮开关K1—K4对应的功能如下。
(1)K1:启动按钮,当K1按下时,流水灯自上而下,又自下而上轮流被点亮,即D1→D2→D3…D8→D7→D6→D5…D1,反复重复,直到有新的按鍵按下,闪烁间隔是50ms。简记为模式1方式。
(2)K2:当K2按下时,流水灯自上而下,又自下而上间隔被点亮,即D1→D3→D5→D7→D8→D6→D4→D2,反复重复,直到有新的按键按下,闪烁间隔是50ms。简记为模式2方式。
(3)K3:当K3按下时,D1、D3、D5和D7同时被点亮,然后D2、D6、D4、D8同时被点亮,反复重复,直到有新的按键按下,间隔是1s。简记为模式3方式。
(4)K4:关闭按钮,当K4按下时,流水灯D1—D8同时被点亮,闪烁三次(间隔为100ms)后,全部熄灭。简记为模式4方式。
3 KeilC51环境下的编程(Programming in the KeilC51)
3.1 软件编程要点分析
(1)通过P0口的低四位引脚将按键信息读取进来,由电路连接方式可知,无按键按下时,四个引脚全部为高电平,若有按键按下,对应的引脚将由高电平变为低电平。可利用指令P0&0x0f获取P0口低四位引脚电平的变化信息。
(2)定义位变量on_off、style1、style2,根据这三个位电平的变化来控制程序的转移。这里需用到关键字bit,而不是sbit,虽然二者都可以进行位定义,区别在于sbit只能用来对特殊功能寄存器的位进行定义,如以下写法bit on_off;sbit botton1=P3^2是正确的,而sbit on_off;bit botton1=P3^2是错误的。
(3)P2口接的是共阳极LED发光二级管,因此只有对应引脚输出低电平时等才会被点亮,可将D1、D2、D3…D8被点亮时P2口对应的输出放到一个数组中,即led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}。
(4)该系统可通过查询法和中断法两种思路来实现。与查询法相比,中断法具有以下优点:首先,只有在按键按下时,CPU才执行相关的中断程序,而其他时间是不占用CPU的时间;其次,中断法可以更及时快速地响应按键操作。因此,为了提高CPU的工作效率,本系统采用中断扫描方式进行设计实现。
(5)关于中断方式的几点说明:(1)要使用外部中断,必须将中断允许打开,即对中断允许寄存器IE进行正确设置。IE的字节地址为A8H,所以即可以字节操作,又可以位操作,如要开启外部中断0,即可写IE=0x81H,也可写EX0=1,EA=1,二者的作用是等同的。(2)外部中断包括电平触发(ITx=0)(外部中断源接P3.2脚时,x=0;外部中断源接P3.3脚时,x=1)和边沿触发(ITx=1)两种触发方式。其中边沿触发的外部中断请求,在CPU响应中断后,自动由硬件对中断请求标志位EIx清0,即系统自动撤销中断请求;而电平触发的外部中断请求,硬件不能自动对中断请求标志位EIx清0,必须在撤销P3.2或P3.3引脚上的低电平后,再利用软件对中断请求标志位清0,比较繁琐。因此本系统采用边沿触发方式。
3.2 程序流程图
该系统的程序流程图如图2所示。
3.3 系统源代码
该花样流水灯系统的完整源代码如下:
#include;头文件reg51.h或reg52.h中包含了对8051型单片机特殊功能寄存器(SFR)名的集中说明。
Unsigned char led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(unsigned char time);//延时函数的声明
bit on_off=0, style1=0, style2=0;//定义位控制变量
button() interrupt 0{ //中断0函数
switch(P0&0x0f) {
case 0x0e: on_off=1, style1=1;break; //模式1方式的启动条件
case 0x0d: on_off=1, style1=0; style2=1;break; //模式2方式的启动条件
case 0x0b: on_off=1, style1=0;style2=0;break; //模式3方式的启动条件
case 0x07: on_off=0;break; //模式4方式的启动条件
}}
void main() {
char i;
IT0=1;EX0=1;EA=1; //边沿触发、外部中断0允许、总中断允许
while(1) {
if (on_off)
if (style1) //模式1运行方式
for (i=0;i<=7;i++) {
P2=led[i];
delay(5);
}
for (i=6;i<=0;i--) {
P2=led[i];
delay(5);
}
else if (style2) //模式2运行方式
for (i=0;i<=7&i;%2==0;i++) {
P2=led[i];
delay(5);
}
for (i=7;i<=0&i;%2!=0;i--) {
P2=led[i];
delay(5);
}
else //模式3运行方式
P2=0x55;
delay(100);
P2=0xaa;
delay(100);
else //模式4运行方式
for (i=3;i<0;i--) {
P2=0x00;
delay(10);
P2=0xff;
}}}
void delay(unsigned char time) { //定义延时函数
unsigned int i;
for(;time>0;time--)
for(i=10000;i>0;i--);
}
3.4 系统的拓展
该系统的框架结构具有良好的可移植性,可根据实际需求生成不同的智能派生产品,主要可从流水灯的控制开关、闪烁节奏、闪烁花样三个方面进行改变。
(1)流水灯控制开关的改变
首先控制开关的数量可以根据实际需要进行增减。80C51一共有四组I/O口P0、P1、P2、P3,它们的地址分别为80H、90H、A0H、B0H,都是8的整数倍,因此这32个引脚全部可以位操作。若是独立按键,最多可以接(32—N)个;若是接行列式键盘开关,最多可以扩充为(32—N)2个,其中N为流水灯的数量。
其次控制开关的作用完全可以通过修改源代码进行改变,无需进行硬件变动。
(2)流水灯闪烁节奏的改变
基本延时函数delay(unsigned char time)的定时时间为10000*机器周期,若采用12MHz晶振,机器周期则为1us,即delay(1)=10ms,delay(50)=500ms,delay(t)=10*tms。因此通过简单的调用delay(t)函数并根据需要修改t的取值即可改变流水灯闪烁的快慢。
(3)流水灯闪烁花样的改变
首先流水灯的数量可以根据实际需要进行增减,这点与控制开关相类似,不再累述。其次流水灯的闪烁花样亦可通过修改源代码实现。
4 程序加载及仿真演示(Program loading and simulation demonstration)
将调试过无语法错误的代码文件*.HEX加载到Proteus原理图的80C51单片机中,运行后,依次按下K1—K4,可以观察到与预期一致的流水灯效果。由于文本的限制,无法展示系统运行的动态过程,故略。
5 结论(Conclusion)
本文设计的花样流水灯系统可以根据输入信息的不同,按照预先设定的花样(如灯亮持续时间、流向等)进行显示。该流水灯系统可以应用到装饰、交通等生活中许多领域,并可以根据实际需求进行修改。借助这种通用框架结构,很容易生成不同的智能派生产品,以适应不同的应用场合。因此该系统具有较强的实际指导意义和应用价值。
参考文献(References)
[1] 曾宇,宋永端,王弼堃.基于Proteus和Keil軟件的温室环境监测系统开发[J].农业工程学报,2012,28(14):177-183.
[2] 单纯,荆高鹏,胡昌振,等.基于漏洞知识库的8031单片机系统软件漏洞检测算法[J].北京理工大学学报,2017,37(4):371-375.
[3] 吴可汗,何怡刚.基于单片机的低功耗电能收集充电器设计[J].电工技术学报,2013,28(S2):185-188.
[4] 于博,杨晓庆.基于Keil C51与Proteus仿真联合的单片机应用研究[J].软件工程师,2015,18(9):51-52.
[5] 林立等.单片机原理及应用——基于Proteus和Keil C[M].北京:电子工业出版社,2018.
[6] 徐磊,申红军,蔡亚永.单片机开发Keil C51与Proteus仿真联合应用研究[J].电子设计工程,2013(9):178-181.
[7] 杜树春.基于Proteus和Keil C51的单片机设计与仿真[M].北京:电子工业出版社,2012.
作者简介:
谭艳春(1980-),女,硕士,讲师.研究领域:系统设计,信号处理.
朱又敏(1966-),男,硕士,工程师.研究领域:射频通信.本文通讯作者.
刘目磊(1980-),男,本科,工程师.研究领域:雷达系统设计及故障分析.
摘 要:单片机技术日益成熟,已广泛应用于工业自动化、交通控制、智能仪表等众多领域。为了进一步研究并拓展单片机的应用,本文利用80C51单片机、KeilC51和Proteus软件对花样流水灯系统进行了完整的软硬件开发与设计。Proteus在线仿真验证了系统设计的稳定性和正确性。该系统的框架结构具有良好的可移植性,可根据实际需求生成不同的智能派生产品,具有较强的实际指导意义和应用价值。
关键词:KeilC51;Proteus;单片机;LED流水灯;系统设计
中图分类号:TP399 文献标识码:A
文章编号:2096-1472(2018)-11-14-03
1 引言(Introduction)
单片机无论从组成还是逻辑功能上都具有微机系统的特性,是一门实践性很强的软硬件结合的技术,且体积小巧,因此可以嵌入到各种应用系统中作为指挥决策中心,实现系统的智能化[1-3]。目前比较流行的单片机仿真软件和集成开发软件分别为Proteus和Keil。
Proteus不仅具有其他EDA工具软件的仿真功能,还能仿真单片机及外围器件,是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等。Keil是德国Keil Software公司出品的单片机集成开发环境,该软件支持51单片机的所有兼容机,它包括了C编译器、宏汇编、连接器、库管理及一个功能强大的仿真调试器在内的所有开发模块[4-7]。
2 硬件电路设计(Design of hardware circuit)
该系统的硬件电路主要包括时钟电路(采用内部时钟方式,晶振频率为12MHz)、复位电路、输入和输出电路四部分。其中输入电路是四个按钮开关K1—K4,并通过四输入与门74AS21将按键信息从外部中断引脚0(P3.2)读入系统,以触发中断,让CPU及时响应按键操作。由于80C51单片机P0口的内部电路结构问题,P0口作为I/O时必须接上拉电阻。输出部分由八个共阳型发光二极管及限流电阻(200Ω)组成。利用Proteus仿真软件生成的硬件电路如图1所示。
按钮开关K1—K4对应的功能如下。
(1)K1:启动按钮,当K1按下时,流水灯自上而下,又自下而上轮流被点亮,即D1→D2→D3…D8→D7→D6→D5…D1,反复重复,直到有新的按鍵按下,闪烁间隔是50ms。简记为模式1方式。
(2)K2:当K2按下时,流水灯自上而下,又自下而上间隔被点亮,即D1→D3→D5→D7→D8→D6→D4→D2,反复重复,直到有新的按键按下,闪烁间隔是50ms。简记为模式2方式。
(3)K3:当K3按下时,D1、D3、D5和D7同时被点亮,然后D2、D6、D4、D8同时被点亮,反复重复,直到有新的按键按下,间隔是1s。简记为模式3方式。
(4)K4:关闭按钮,当K4按下时,流水灯D1—D8同时被点亮,闪烁三次(间隔为100ms)后,全部熄灭。简记为模式4方式。
3 KeilC51环境下的编程(Programming in the KeilC51)
3.1 软件编程要点分析
(1)通过P0口的低四位引脚将按键信息读取进来,由电路连接方式可知,无按键按下时,四个引脚全部为高电平,若有按键按下,对应的引脚将由高电平变为低电平。可利用指令P0&0x0f获取P0口低四位引脚电平的变化信息。
(2)定义位变量on_off、style1、style2,根据这三个位电平的变化来控制程序的转移。这里需用到关键字bit,而不是sbit,虽然二者都可以进行位定义,区别在于sbit只能用来对特殊功能寄存器的位进行定义,如以下写法bit on_off;sbit botton1=P3^2是正确的,而sbit on_off;bit botton1=P3^2是错误的。
(3)P2口接的是共阳极LED发光二级管,因此只有对应引脚输出低电平时等才会被点亮,可将D1、D2、D3…D8被点亮时P2口对应的输出放到一个数组中,即led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}。
(4)该系统可通过查询法和中断法两种思路来实现。与查询法相比,中断法具有以下优点:首先,只有在按键按下时,CPU才执行相关的中断程序,而其他时间是不占用CPU的时间;其次,中断法可以更及时快速地响应按键操作。因此,为了提高CPU的工作效率,本系统采用中断扫描方式进行设计实现。
(5)关于中断方式的几点说明:(1)要使用外部中断,必须将中断允许打开,即对中断允许寄存器IE进行正确设置。IE的字节地址为A8H,所以即可以字节操作,又可以位操作,如要开启外部中断0,即可写IE=0x81H,也可写EX0=1,EA=1,二者的作用是等同的。(2)外部中断包括电平触发(ITx=0)(外部中断源接P3.2脚时,x=0;外部中断源接P3.3脚时,x=1)和边沿触发(ITx=1)两种触发方式。其中边沿触发的外部中断请求,在CPU响应中断后,自动由硬件对中断请求标志位EIx清0,即系统自动撤销中断请求;而电平触发的外部中断请求,硬件不能自动对中断请求标志位EIx清0,必须在撤销P3.2或P3.3引脚上的低电平后,再利用软件对中断请求标志位清0,比较繁琐。因此本系统采用边沿触发方式。
3.2 程序流程图
该系统的程序流程图如图2所示。
3.3 系统源代码
该花样流水灯系统的完整源代码如下:
#include
Unsigned char led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(unsigned char time);//延时函数的声明
bit on_off=0, style1=0, style2=0;//定义位控制变量
button() interrupt 0{ //中断0函数
switch(P0&0x0f) {
case 0x0e: on_off=1, style1=1;break; //模式1方式的启动条件
case 0x0d: on_off=1, style1=0; style2=1;break; //模式2方式的启动条件
case 0x0b: on_off=1, style1=0;style2=0;break; //模式3方式的启动条件
case 0x07: on_off=0;break; //模式4方式的启动条件
}}
void main() {
char i;
IT0=1;EX0=1;EA=1; //边沿触发、外部中断0允许、总中断允许
while(1) {
if (on_off)
if (style1) //模式1运行方式
for (i=0;i<=7;i++) {
P2=led[i];
delay(5);
}
for (i=6;i<=0;i--) {
P2=led[i];
delay(5);
}
else if (style2) //模式2运行方式
for (i=0;i<=7&i;%2==0;i++) {
P2=led[i];
delay(5);
}
for (i=7;i<=0&i;%2!=0;i--) {
P2=led[i];
delay(5);
}
else //模式3运行方式
P2=0x55;
delay(100);
P2=0xaa;
delay(100);
else //模式4运行方式
for (i=3;i<0;i--) {
P2=0x00;
delay(10);
P2=0xff;
}}}
void delay(unsigned char time) { //定义延时函数
unsigned int i;
for(;time>0;time--)
for(i=10000;i>0;i--);
}
3.4 系统的拓展
该系统的框架结构具有良好的可移植性,可根据实际需求生成不同的智能派生产品,主要可从流水灯的控制开关、闪烁节奏、闪烁花样三个方面进行改变。
(1)流水灯控制开关的改变
首先控制开关的数量可以根据实际需要进行增减。80C51一共有四组I/O口P0、P1、P2、P3,它们的地址分别为80H、90H、A0H、B0H,都是8的整数倍,因此这32个引脚全部可以位操作。若是独立按键,最多可以接(32—N)个;若是接行列式键盘开关,最多可以扩充为(32—N)2个,其中N为流水灯的数量。
其次控制开关的作用完全可以通过修改源代码进行改变,无需进行硬件变动。
(2)流水灯闪烁节奏的改变
基本延时函数delay(unsigned char time)的定时时间为10000*机器周期,若采用12MHz晶振,机器周期则为1us,即delay(1)=10ms,delay(50)=500ms,delay(t)=10*tms。因此通过简单的调用delay(t)函数并根据需要修改t的取值即可改变流水灯闪烁的快慢。
(3)流水灯闪烁花样的改变
首先流水灯的数量可以根据实际需要进行增减,这点与控制开关相类似,不再累述。其次流水灯的闪烁花样亦可通过修改源代码实现。
4 程序加载及仿真演示(Program loading and simulation demonstration)
将调试过无语法错误的代码文件*.HEX加载到Proteus原理图的80C51单片机中,运行后,依次按下K1—K4,可以观察到与预期一致的流水灯效果。由于文本的限制,无法展示系统运行的动态过程,故略。
5 结论(Conclusion)
本文设计的花样流水灯系统可以根据输入信息的不同,按照预先设定的花样(如灯亮持续时间、流向等)进行显示。该流水灯系统可以应用到装饰、交通等生活中许多领域,并可以根据实际需求进行修改。借助这种通用框架结构,很容易生成不同的智能派生产品,以适应不同的应用场合。因此该系统具有较强的实际指导意义和应用价值。
参考文献(References)
[1] 曾宇,宋永端,王弼堃.基于Proteus和Keil軟件的温室环境监测系统开发[J].农业工程学报,2012,28(14):177-183.
[2] 单纯,荆高鹏,胡昌振,等.基于漏洞知识库的8031单片机系统软件漏洞检测算法[J].北京理工大学学报,2017,37(4):371-375.
[3] 吴可汗,何怡刚.基于单片机的低功耗电能收集充电器设计[J].电工技术学报,2013,28(S2):185-188.
[4] 于博,杨晓庆.基于Keil C51与Proteus仿真联合的单片机应用研究[J].软件工程师,2015,18(9):51-52.
[5] 林立等.单片机原理及应用——基于Proteus和Keil C[M].北京:电子工业出版社,2018.
[6] 徐磊,申红军,蔡亚永.单片机开发Keil C51与Proteus仿真联合应用研究[J].电子设计工程,2013(9):178-181.
[7] 杜树春.基于Proteus和Keil C51的单片机设计与仿真[M].北京:电子工业出版社,2012.
作者简介:
谭艳春(1980-),女,硕士,讲师.研究领域:系统设计,信号处理.
朱又敏(1966-),男,硕士,工程师.研究领域:射频通信.本文通讯作者.
刘目磊(1980-),男,本科,工程师.研究领域:雷达系统设计及故障分析.