资源描述
信息与电气工程学院
课程设计说明书
(2012 /2013学年第 二 学期)
课程名称 : 单片机原理及接口技术
题 目 : 简易多彩广告灯控制设计
专业班级 : 自动化10-03
学生姓名 :
学 号: 1004103
指导教师 : 苗敬利、杨怡君等
设计周数 : 2周
设计成绩 :
2013年 6 月 26 日
目 录
1、 课程设计目的
1.1原始数据及主要任务…………………………………………………………………2
1.2技术要求………………………………………………………………………………2
2、课程设计正文
2.1 硬件设计………………………………………………………………………………2
2.1.1确定硬件电路总体设计方案……………………………………………………2
2.1.2单元电路设计……………………………………………………………………3
2.1.2.1时钟电路……………………………………………………………………3
2.1.2.2复位电路……………………………………………………………………3
2.1.2.3键盘输入电路………………………………………………………………4
2.1.2.4数字显示电路………………………………………………………………5
2.1.2.5广告灯电路…………………………………………………………………5
2.1.2.6总电路图……………………………………………………………………6
2.1.3 系统调试…………………………………………………………………………7
2.2 软件设计………………………………………………………………………………7
2.2.1系统分析…………………………………………………………………………7
2.2.2 系统设计…………………………………………………………………………8
2.2.2.1 按键确认程序………………………………………………………………8
2.2.2.2 数码管显示程序……………………………………………………………8
2.2.2.3延时程序……………………………………………………………………8
2.2.2.4.四种广告灯控制程序………………………………………………………8
2.2.3系统实施…………………………………………………………………………9
3、 课程设计总结……………………………………………………………………………17
4、 参考文献…………………………………………………………………………………18
1、课程设计目的
1.1 原始数据及主要任务
设计并制作出一个以单片机为核心的彩灯闪烁控制系统:(1)确定总体设计方案(2)、设计键盘输入电路(3)、设计显示电路(4)、合理分配地址,编写系统程序(5)、利用Protel设计硬件电路原理图和PCB图(6)、软硬件联机调试
1.2 技术要求
设计一个以MCS-51单片机为核心的简易多彩广告灯闪烁控制系统,2位数码管显示闪烁控制方案,分别显示01、02、03、和10号方案,初始化为00,彩灯灭;2个控制按键,一个加一数字键,一个确定键,循环10个花型的方案。方案01为左循环亮一秒闪烁;方案02为右循环亮一秒闪烁;方案03为“100000000、11000000…11111111”递增间隔1秒闪烁;方案10为“01010101,10101010”间隔一秒闪烁;其余方案灯灭。
2、 课程设计正文
2.1硬件设计
2.1.1确定硬件电路总体设计方案
根据设计要求,首先确定硬件的主要组成部分,主要包括了单片机最小系统中的时钟电路、复位电路和本课设需要的按键控制电路、LED灯显示电路、广告灯方案显示电路,最后由5V直流电源对各部分电路提供电源。总的设计框图如图1。
AT89C51
时钟电路
复位电路
直流5V供电电路
按键控制电路
LED灯显示电路
方案显示电路
图1 硬件设计总框图
2.1.2单元电路设计
2.1.2.1时钟电路
时钟电路提供的时钟信号是单片机工作时必须的控制信号,只有正确的提供了时钟信号,单片机才能严格按照时序执行指令进行工作。时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路设计有两种方式,一种是内部时钟方式,另一种事外部时钟方式。本课设采用的是内部时钟方式。
内部是中方式的时钟电路由一个6MHz的晶振和两个30pF的电容组成,时钟电路的电路图如图2。
图2 时钟电路
2.1.2.2复位电路
复位是单片机的初始化操作,除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态,为摆脱死锁状态,也需要复位按键使RST引脚为高电平使单片机复位。
本课设采用51单片机典型手动复位电路,电路由一个200Ω的电阻、一个1KΩ的电阻和一个22uF的极性电容组成。当按下复位键后复位口RST变为高电平,经过两个机器周期单片机复位,单片机从地址为0000H处重新执行程序。复位电路的电路图如图3。
图3 复位电路
2.1.2.3键盘输入电路
本课设的键盘输入电路由一个加一键和一个确定键组成,每个按键都接一个1KΩ的上拉电阻。
加一键控制方案类型,并通过显示电路的显示,共有10种方案类型,其中第01、02、03、10号方案对应有相应的广告灯显示方案,其余为广告灯全灭。确定键确定方案让广告灯开始闪亮。键盘输入电路如图4.
图4 键盘输入电路
2.1.2.4数字显示电路
数字显示电路主要有两个共阳极数码管组成,采用静态显示方案,将共阳极数码管的段码由P0、P2口输出,驱动数码管显示。每条支路加一个200Ω的限流电阻。
显示电路复位后显示00,当不断按下加一键是,数码管分别显示01、02、03、04、05、06、07、08、09、10,分别对应十种相应的显示方案。显示电路电路图如图5.
图5 数字显示电路
2.1.2.5广告灯电路
广告灯电路为本课设主要控制的电路,由八个发光二极管组成,每个发光二极管接一个200Ω的限流电阻。广告灯电路如图6.
当确定键按下后,广告灯即开始按照数码管显示的数字显示不同的闪亮方案,其中方案01为左循环亮一秒闪烁;方案02为右循环亮一秒闪烁;方案03为“100000000、11000000…11111111”递增间隔1秒闪烁;方案10为“01010101,10101010”间隔一秒闪烁;其余方案灯灭。
图6 广告灯电路
2.1.2.6总电路图
总电路如图7.
图7 总电路图
2.1.3 系统调试
首先在proteus中画好电路图,加载程序查看仿真效果。对不满足要求的地方,首先检察设计思路是否正确,在设计思路正确的前提下针对错误的类型检察硬件的选择和对应软件的设计是否正确,发现错误后首先考虑是否可以通过改变软件来实现,软件不能实现的再考虑改变硬件电路实现。
本课设在仿真调试中遇到的难点主要是对加一键的确定,由于在方案运行时要求加一键仍然有效,而每种方案中的延时程序与按键的延时去抖程序相互交错,给确定加一键的一次有效按下带来了很大的困难,经常出现按时间短了没有效果,按时间长了又会确认两次的情况。最后几经修改才打到了要求的效果,当上一种方案正在运行时,按下加一键不要松开,等广告灯全灭后再松开,可使加一键每次都成功确认一次。
在硬件实物做好后,加载程序调试,对与仿真情况不符的电路检察焊接情况和硬件的好坏。最后对操作的流畅性进行完善,使硬件电路易于操作,不会出现错误判断。
在硬件调试时,本课设遇到的困难主要是由于查阅资料时的疏漏我们把数码管的c脚和e脚接反了,导致数字无法正常输出。由于硬件电路已经完成,要改动是比较复杂的。后来在研究是发现,所谓的数码管段码其实是人为规定的,变动硬件中的c脚和e脚与变动程序中的c、e两脚对应的电平是一样,所以我将书中的共阳极数码管段码“根据”我们电路进行了修改,换了c、e对应的电平。重新编译加载后,果然显示正常了,从而避免了对硬件的修改。
2.2软件设计
2.2.1系统分析
本课设的程序主要分为按键确认、延时、数码管显示和四种广告灯控制几部分。
按键确认采用典型的延时去抖法,是按键每次按下都只被有效确认一次。延时程序主要用于去抖和广告灯闪亮间隔的控制,数码管显示则是给相应的P口赋值段码。四种广告灯控制用于控制8个发光二极管的闪亮顺序和个数。程序设计的总框图如图8.
开始
判断有无加一键按下
调用显示方案
调用LED显示方案
判断有无确定键按下
图8 程序设计总框图
2.2.2 系统设计
2.2.2.1 按键确认程序
通过void key_detect()子函数采集相应的P口的电平判断按键是否按下,程序见系统实施中的源程序。
2.2.2.2 数码管显示程序
通过void display(void)子函数来显示相应的方案数,程序见系统实施中的源程序。
2.2.2.3延时程序
通过void delay(unsigned int )子函数来完成延时功能,程序见系统实施中的源程序。
2.2.2.4.四种广告灯控制程序
通过分别调用void right_loop()、void left_loop()、void other_program()、void ji_ou()四种子函数来显示相应的闪烁方案,程序见系统实施中的源程序。
2.2.3系统实施
本课设所用源程序如下:
#include<reg52.h>
#include<intrins.h>
unsigned char code
table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned int flag = 0;
void key_detect(void);
void display(void);
void delay(unsigned int );
void right_loop();
void left_loop();
void other_program();
void increase();
void ji_ou();
sbit k1=P0^0; //加一键
sbit k2=P0^1; //确定键
void main()
{
while(1)
{
key_detect();
if(flag==11)
{ flag=0;
}
display();
}
}
/****************************************
函数功能:实现任务一:
流水灯左循环亮1秒闪烁
****************************************/
void left_loop()
{
unsigned char temp;
temp=0x7f;
while(1)
{
temp=_crol_(temp,1);
delay(100);
P1=temp;
delay(100);
P1=0xff;
if(k1==0)
{
P1=0xff; //灯全灭
delay(20);
if(k1==0)
{
P1=0xff;
flag++;
delay(10);
}
while(!k1); //检测是否松开按键r
delay(20);
while(!k1);
break;
}
}
}
/****************************************
函数功能:实现任务二:
流水灯右循环亮1秒闪烁
****************************************/
void right_loop()
{
unsigned char temp;
temp=0xfe;
while(1)
{
temp=_cror_(temp,1);
delay(100);
P1=temp;
delay(100);
P1=0xff;
if(k1==0)
{
delay(20);
if(k1==0)
{
P1=0xff;
flag++;
delay(10);
}
while(!k1); //检测是否松开按键r
delay(20);
while(!k1);
break;
}
}
}
/******************************************
函数功能:所有灯灭
******************************************/
void other_program()
{
P1=0xff;
delay(10);
if(k1==0)
{
delay(10);
if(k1==0)
{
P1=0xff;
flag++;
delay(10);
}
while(!k1); //检测是否松开按键r
delay(20);
while(!k1);
}
}
/*******************************************
函数功能:实现任务三:
递增间隔1秒闪烁
*******************************************/
void increase()
{
unsigned int i = 0;
unsigned char a[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
while(1){
if(i>8){
i=0;
}
P1=a[i];
delay(100);
P1=0xff;
delay(100);
i++;
if(k1==0)
{
delay(10);
if(k1==0)
{
P1=0xff;
flag++;
delay(10);
}
while(!k1); //检测是否松开按键r
delay(20);
while(!k1);
break;
}
}
}
/********************************************
函数功能:实现任务十:
实现奇偶间隔1秒闪烁
********************************************/
void ji_ou()
{
unsigned char a[]={0x55,0xaa};
unsigned int i = 0;
while(1){
if(i>1){
i=0;
}
P1=a[i];
delay(100);
P1=0xff;
delay(100);
i++;
if(k1==0)
{
delay(10);
if(k1==0)
{
P1=0xff;
flag++;
delay(10);
}
while(!k1); //检测是否松开按键
delay(20);
while(!k1);
break;
}
}
}
/****************************************************
函数功能:数码管上的显示
****************************************************/
void display(void) //显示函数
{
unsigned int shi,ge;
shi=flag/10;//取十位
ge=flag%10; //取个位
P2=table[shi]; //送十位数
delay(1);
P3=table[ge]; //送个位数
delay(1);
}
/***********************************************************************************************************************
函数功能:按键检测
***********************************************************************************************************************/
void key_detect()
{
if(k1==0)
{
delay(10);
if(k1==0)
{
flag++;
}
while(!k1); //检测是否松开按键r
}
else if(k2==0)
{
delay(10);
if(k2==0)
{
switch(flag)
{
case 1:left_loop(); break;
case 2:right_loop();break;
case 3:increase();break;
case 10:ji_ou();break;
default:other_program();
}
}
while(!k2); //检测是否松开按键r
}
}
/*********************************************
函数功能:延时
入口参数:z
*********************************************/
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=619;y>0;y--);
}
3、课程设计总结
经过了两周的忙碌,课程设计圆满结束了,我在本次课程设计中主要负责程序的编写和调试。刚开始看到课设要求时,感到完全无法下手,不知道该怎么把平时所学的每个元件的知识与要求联系起来,后来经过和其他组员商量,决定先画出程序流程图,再从流程图入手逐步找的每个环对应的元件。
本课设所用程序为C语言,主要利用对加一按键的判断对标志变量flag进行从1到10轮赋值,其中对按键的判断中用到了典型的延时去抖程序。利用得到的flag值确定数码管的段码,将段码直接赋给P口,控制数码管的显示。然后再判断确定键按下后利用switch开关语句对flag进行判断,调用对应的广告灯子程序,控制P口的电平变化,来实现广告流水灯的控制。在程序调试过程中,深切体会到了细节决定成败这句话的正确性,平时再使用产品时总觉得道理很简单,觉得按一下按键就是让某个电路接通,可真正自己设计时才发现用程序去确定一次按键是要考虑很多因素的,就连断开的一瞬间也得考虑到,利用这个电平变化来控制程序走向。每一点疏漏都会使目标无法完成,幸好有可以利用proteus进行仿真,可以最大程度上减少对硬件的修改。
在最后的调试中我还体会到了了解元器件原理的重要性,由于查阅资料时的疏漏我们把数码管的c脚和e脚接反了,导致数字无法正常输出。由于硬件电路已经完成,要改动是比较复杂的。后来在研究是发现,所谓的数码管段码其实是人为规定的,变动硬件中的c脚和e脚与变动程序中的c、e两脚对应的电平是一样,所以我将书中的共阳极段码“根据”我们电路进行了修改,换了c、e对应的电平。重新编译加载后,果然显示正常了,从而避免了对硬件的修改。
通过本次课程设计,我对单片机的工作原理及编程方法有了更深的了解,对与之配套的硬件电路也有了全新的认识。
4、参考文献
[1] 李朝青.单片机原理及接口技术(简明修订版).杭州:北京航空航天大学出版社,1998
[2] 李广弟.单片机基础[M].北京:北京航空航天大学出版社,1994
[3] 阎石.数字电子技术基础(第三版). 北京:高等教育出版社,1989
[4] 何立民.单片机应用技术大全.北京:北京航空航天大学出版社, 1994
[5] 张毅刚. 单片机原理及接口技术.哈尔滨:哈尔滨工业大学出版社,1990
[6] 谭浩强.单片机课程设计. 北京:清华大学出版社,1989
[7] 张义,陈敌北.例说8051.人民邮电出版社
[8] 肖婧.单片机入门与趣味实验设计.北京:北京航空航天大学出版社,2008
[9] 胡汉才. 单片机原理及其接口技术.北京:清华大学出版社,2002
课程设计
评 语
课程设计
成 绩
指导教师
(签字)
年 月 日
19/20
展开阅读全文