单片机原理及系统课程设计.docx
- 文档编号:25720482
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:32
- 大小:158.19KB
单片机原理及系统课程设计.docx
《单片机原理及系统课程设计.docx》由会员分享,可在线阅读,更多相关《单片机原理及系统课程设计.docx(32页珍藏版)》请在冰豆网上搜索。
单片机原理及系统课程设计
1.1设计要求…………………………………………………………………………………..2
1课程设计的目的和意义
1.1设计要求
用六位数码实现数字时钟,显示时分秒。
1.2设计目的
灵活运用单片机的基础知识,依据课程设计容,能够完成从硬件电路图设计,到PCB制版,再到软件编程及系统调试实现系统功能,完成课程设计,加深对单片机基础知识的理解,并灵活运用,将各门知识综合应用。
能够上网查询器件资料,培养对新知识新技术的独立的学习能力和应用能力。
独立完成一个小的系统设计,从硬件设计到软件设计,增强分析问题、解决问题的能力,为日后的毕业设计及科研工作奠定良好的基础。
1.3设计意义
单片机课程设计过程中,我们通过查阅资料、硬件设计、程序设计、安装调试等环节,完成了一个涉及89S51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用。
使我们不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件、原理图绘制等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关软件及仪器设备的使用技能等方面得到较全面的锻炼和提高。
使我们增进对单片机的感性认识,加深对单片机理论方面的理解。
使我们了解和掌握单片机应用系统的软硬件设计过程、方法及实现,强化单片机应用电路的设计与分析能力。
提高我们在单片机应用方面的实践技能和科学作风;培育学生综合运用理论知识解决问题的能力,实现理论结合实际,学以致用的原则。
2系统方案设计及确定
本次课程设计,要求用单片机及6位LED数码管显示时、分、秒,以24<小>时计时方式运行,能整点提醒(短蜂鸣,次数代表整点时间),使用按键开关可实现时、分调整,秒表(或闹钟)/时钟功能转换,以及实现省电(关闭显示)功能。
1.时钟功能
利用单片机片定时器(如T0)产生1s计时,自行设定时钟计数单元地址,包括秒单元、分单元、时单元,最大计数值为23时59分59秒。
用6位LED数码管显示时、分、秒,以24<小>时计时方式运行;
使用按键开关可实现时、分调整,可增加“熄灭符”用于时间调整时的闪烁功能;
能整点提醒(短蜂鸣,次数代表整点时间);
可通过按键使系统进入省电状态(数码管不亮,时钟不停)。
2.秒表功能
能通过按键实现秒表/时钟功能之间的转换;
利用单片机部定时器(如T1)实现秒表的计时,自行设定秒表计数单元地址,包括10ms单元、秒单元、分单元,通过6位LED数码管显示,最大计数值为99分59.99秒。
可通过按键实现秒表的暂停、清零、启动。
3.闹钟功能
能通过按键实现闹钟/时钟功能之间的转换;
可通过按键设定闹钟时间,在定时闹铃时精确到分,可通过6位LED数码管显示闹钟设定时间。
可通过按键实现闹铃有效、无效,以及在设定闹钟后取消闹时功能。
在闹铃时,可通过按键开关使蜂鸣停止。
4.系统设计方案框图如下:
图2-1系统设计方案框图
3系统硬件设计
3.1AT89S51最小系统设计
单片机最小系统单片机,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,最小系统一般应该包括:
单片机、晶振电路、复位电路.
下面给出一个51单片机的最小系统电路图:
图3-151单片机最小系统原理图
3.1.1时钟电路硬件设计
时钟电路是计算机最核心的部分,它控制着计算机的工作。
AT89S51单片机部有一个高增益反相放大器,用于构成振荡器。
反相放大器的输入端为XTAL1,输出端为XTAL2,分别是单片机的19脚和18脚。
在XTAL1和XTAL2两端跨接石英晶体及两个电容就可以构成稳定的自激振荡器。
石英晶振起振后要能在XTAL2线上输出一个3V左右的正弦波,使片的OCS电路按石英晶振相同频率自激震荡。
通常,OCS的输出时钟频率fosc为0.5MHZ~16MHZ,典型值为12MHZ电容器C1和C2通常取30pF左右,对震荡频率有微调作用。
调节它们可以达到微调震荡周期fosc的目的。
时钟电路如下:
图3-2时钟电路电路图
3.1.2复位电路硬件设计
单片机的RST管脚为主机提供一个外部复位信号输入端口。
复位信号是高电平有效,高电平有效的持续时间应为2个机器周期以上。
单片机的复位方式有上电自动复位和手工复位两种。
图4-2所示是51系列单片机常用的上电复位电路,只要Vcc上升时间不超过1ms,它们都能很好地工作。
复位以后,单片机各部件恢复到初始状态。
电阻电容器件的参考值:
R1=200Ω,R2=1KΩ,C3=22μF。
RET按键可以选择专门的复位按键,也可以选择轻触开关。
复位电路如下
图3-3复位电路电路图
3.2键盘电路硬件设计
单片机中常见的键盘有独立式键盘和矩阵式键盘,独立式键盘适用于实现功能较少的场合、矩阵式键盘适用于功能复杂的场合。
本次课程设计,采用独立式键盘即可。
键盘电路如下:
图3-4键盘电路电路图
上拉电阻保证按键释放时,输入检测线上有稳定的高电平。
当某一按键按下时,对应的检测线就变成了低电平,与其他按键相连的检测线仍为高电平,只需读入I/O输入线的状态,判别哪一条I/O输入线为低电平,很容易识别哪个键被按下。
键的闭合与否,输出电压上就是呈现高电平或低电平。
高电平,表示键断开,低电平则表示键闭合,通过对电平的高低状态的检测,可确认按键按下以及按键释放与否。
为了确保对一次按键动作只确认一次按键有效,必须消除抖动的影响,去抖有硬件去抖和软件去抖,本次设计采用软件去抖。
3.3显示电路硬件设计
本次课程设计,采用LED数码管作为显示装置。
LED数码管有共阴极、共阳极两种结构,本次采用共阳极数码管。
共阳极LED数码管的发光二极管的阳极连接在一起,公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。
8段共阳极LED段码如下:
表3-18段共阳极LED段码表
显示字符
0
1
2
3
4
5
6
7
8
段码
C0H
F9H
A4H
B0H
99H
92H
82H
F8H
80H
显示字符
9
A
B
C
D
E
F
全灭
全亮
段码
90H
88H
83H
C6H
A1H
86H
8EH
FFH
00H
LED数码管有静态显示和动态显示两种显示方式。
静态显示方式,数码管亮度高、软件编程简单,但是需要占用大量的I/O口,一般在多位显示时不采用此种方法。
动态显示方式,数码管亮度稍低、软件编程复杂,但是占用的I/O口少,在显示多位数字的时候适合采用此种方法。
考虑到本次课程设计需要显示六位数字,故采用动态显示方式。
LED数码管段选、位选驱动电路均采用DM74LS244作为驱动芯片。
3.4蜂鸣器电路硬件设计
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、机、定时器等电子产品中作发声器件。
蜂鸣器的工作原理是,接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。
振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
本次课程设计中,由于单片机的I/O口驱动能力不够让蜂鸣器发出声音,所以我们通过三极管放大驱动电流,从而可以让蜂鸣器发出声音。
蜂鸣器电路如下:
图3-5蜂鸣器电路电路图
4系统软件设计
4.1系统主程序设计
程序中,采用按键1作为主功能切换键,按键2、按键3、按键4作为子功能控制键。
在主程序中,开始即进入定时器子程序,显示当前时间,并同时对按键1进行扫描。
如果按键1第一次被按下,则进入调整时间子程序,并同时对按键2、按键3、按键4进行扫描,此时按键2、按键3、按键4分别作为调整时、分、秒按钮使用;如果按键1第二次被按下,则进入秒表子程序,并同时对按键2、按键3、按键4进行扫描,按键2、按键3、按键4分作为秒表启动、暂停、停止并清理按钮使用;如果按键1第三次被按下,则进入闹钟子程序,并同时对按键2、按键3、按键4进行扫描,按键2、按键3、按键4分作为闹钟的启动/关闭、调整时、调整分按钮使用;如果按键1第四次被按下,则进入节能子程序,此时将不对按键2、按键3、按键4分进行扫描;如果按键1第五次被按下,则重新回到定时器子程序,如此循环。
主程序流程图
4.2定时器设计
在定时器子程序当中,采用定时器T0产生定时中断。
定时器T0工作于方式2,初值为TH0=0x9C,TL0=0x9C,时钟电路采用12MHZ晶振,所以每0.1ms产生一次中断,再在中断中对时间进位进行判断处理,使之产生较为精准的定时。
定时器子程序
4.3秒表设计
在秒表子程序当中,采用定时器T1产生定时中断。
定时器T1同意工作于方式2,初值为TH0=0x9C,TL0=0x9C,时钟电路采用12MHZ晶振,所以每0.1ms产生一次中断,再在中断中对时间进位进行判断处理,使之产生较为精准的定时。
秒表子程序
4.4闹钟设计
在闹钟子程序里,按键2被按下奇数次时,闹钟打开并在第一位数码管上显示标志位;按键2被按下偶数次时,闹钟关闭并熄灭第一位数码管上的标志位。
按下按键3,则定时时间的小时位加一;按下按键4,则定时时间的分钟位加一。
闹钟子程序
4.5其他主要子程序设计
在时钟设置子程序中,按键2被按下,则当前时间的小时位加一;按键3被按下,则当前时间的分钟位加一;按键4被按下,则当前时间的秒位被清零。
时钟设置子程序
当进入节能子程序时,数码管将全部被熄灭,此时按键2、按键3、按键4即使被按下也不采取任何操作。
节能子程序
其他说明:
当时间的小时位进一时,蜂鸣器将响起,响的“嘀”次数等于当前时间小时位的值。
当当前时间等于闹钟定时时间时,蜂鸣器将不断响起“嘀”声,按下按键1后,“嘀”声停止。
5系统调试
本次课程设计采用伟福仿真器进行程序的调试,下面介绍伟福仿真器的调试及使用。
进入WAVE软件后,第一步要进行仿真器设置,在仿真器选项卡中,仿真器为选择“E6000/S”,仿真头选择“POD-H8X5X”,CPU选择“89C51RX”;在目标文件选项卡中,将所有选项前均打钩,;在通讯设置选项卡中,将“使用伟福软件模拟器”的“√”勾掉,然后选择“COM1”口,点击“测试串行口”,测试成功后,就完成了所有的仿真器设置。
第二步,开始创建项目工程,在C盘根目录下创建“Project”文件夹,双击打开,再创建“program.c”文件。
注意,这里“Project”文件夹为工程项目所存放的文件夹,文件夹名必须是英文,汉字不能用。
“program.c”文件为程序源文件,若是用汇编语言,则相应的改为“program.asm”文件。
这里文件夹名和原文件名可以是任意英文字符。
点击菜单栏“文件(F)”“新建项目”找到刚才创建的源文件(以C语言源文件为例),点击“打开”,然后键入工程项目文件名字(以project为例,项目文件名可以任意),并点击“保存”保存。
双击左侧源文件“program.c”,此时即可开始编写程序了。
(WAVE6000集成开发软件是基于C语言核的,仅支持“/**/”注释方式,不支持“//”注释方式)。
最后介绍程序的编译及执行,点击菜单栏“项目”“编译”,无语法错误,编译通过。
点击菜单栏上“执行”“全速执行”,进行硬件仿真调试。
按停止按钮则退出调试状态。
本次课程设计,我主要是参考了郭天祥老师的一些例子程序,从而逐步掌握了有关单片机数码管动态显示、按键的扫描及去抖、时钟定时赋值等一些容。
然后根据老师的原理图,参照例子程序,利用C语言进行编程。
程序调试过程中难免出现各种各样的问题,通过请教老师、网络查询、同学之间相互帮助,都逐一得到了解决。
6总结
经过一段时间的课程设计,我们不仅对单片机的学习有了更多的认识和理解,而且又填补了很多以前的知识漏洞。
本次课程设计,收获最多的当然是单片机方面,但是同时我们又一次学习了C语言、Protel制图等,熟悉掌握了WAVE6000的使用。
课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程.回顾起此次课程设计,至今我仍感慨颇多。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,唯有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高我们自己的实际动手能力和独立思考的能力。
在设计的过程中,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的很多的不足,对以前所学过的知识理解得不够深刻,掌握得不够牢固,看到了自己基础知识还是不够扎实,实践经验还是比较缺乏,理论联系实际的能力还待急需提高。
通过这次课程设计之后,一定把以前所学过的知识重新温故。
在这个过程中,我真切的感到了,我又知道了很多,同时也掌握了很多以后在工作和生活中能真正用到的很多东西。
但是我不会因此而骄傲,相反以后我将会更加虚心,因为我知道这只是个简单的开始,以后还有很多的路要走。
参考文献
【1】《单片机原理与接口技术》[M].胡汉才.清华大学
【2】《MCS-51系列单片机原理及应用》[M].王瑾、杜波等.中国电力
【3】《新概念51单片机C语言教程》[M].郭天祥.电子工业
【4】《跟我学用单片机》[M].肖洪兵.航空航天大学
【5】《单片机实验与实践教程》[M].夏继强.航空航天大学,
【6】《ProtelDXP电路设计技术》[M].玉军.冶金工业
【7】《单片机应用设计200例.下(第一版)》[M].洪润.航空航天大学
【8】《C语言程序设计》[M].忠宝、董晓明.大学
附录
附录一程序清单
/*头文件*/
#include
#defineuintunsignedint
#defineucharunsignedchar
/*定义按键*/
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
/*定义蜂鸣器*/
sbitbell=P1^7;
/*定义数码管位控*/
sbitLED1=P2^5;
sbitLED2=P2^4;
sbitLED3=P2^3;
sbitLED4=P2^2;
sbitLED5=P2^1;
sbitLED6=P2^0;
/*定义变量*/
ucharmiao,fen,shi,shm,sec,min,nshi,nfen;
uchard1,d2,d3,d4,d5,d6,m1,m2,m3,m4,m5,m6,n1,n2,n3,n4;
uintnum,num1,num2,num3,ge,ss;
/*共阴极段选码(0-9)*/
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*延时函数*/
voiddelay(uintx)
{
uinti,j;
for(i=80;i>0;i--)
for(j=x;j>0;j--);
}
/*时钟显示函数*/
voiddisplay()
{
d1=shi/10;/*高低位分离*/
d2=shi%10;
d3=fen/10;
d4=fen%10;
d5=miao/10;
d6=miao%10;
LED1=1;/*时高位*/
P0=table[d1];
delay
(1);
LED1=0;
LED2=1;/*时低位*/
P0=table[d2];
delay
(1);
LED2=0;
LED2=1;/*时低位小数点显示*/
P0=0x80;
delay
(1);
LED2=0;
LED3=1;/*分高位*/
P0=table[d3];
delay
(1);
LED3=0;
LED4=1;/*分低位*/
P0=table[d4];
delay
(1);
LED4=0;
LED4=1;/*分低位小数点显示*/
P0=0x80;
delay
(1);
LED4=0;
LED5=1;/*秒高位*/
P0=table[d5];
delay
(1);
LED5=0;
LED6=1;/*秒低位*/
P0=table[d6];
delay
(1);
LED6=0;
}
/*时钟调整函数*/
voidtiaozheng()
{
if(key2==0)/*时+*/
{
delay(10);
if(key2==0)
{
while(!
key2);
shi++;
delay(20);
if(shi==24)
shi=0;
}
}
if(key3==0)/*分+*/
{
delay(10);
if(key3==0)
{
while(!
key3);
fen++;
delay(20);
if(fen==60)
fen=0;
}
}
if(key4==0)/*秒清零*/
{
delay(10);
if(key4==0)
{
miao=0;
}
}
}
/*时钟调整数码管闪烁显示函数*/
voiddisplay1()
{
d1=shi/10;
d2=shi%10;
d3=fen/10;
d4=fen%10;
d5=miao/10;
d6=miao%10;
if(ss==1)
{
LED1=1;/*时高位*/
P0=table[d1];
delay
(1);
LED1=0;
LED2=1;/*时低位*/
P0=table[d2];
delay
(1);
LED2=0;
LED2=1;/*时低位小数点显示*/
P0=0x80;
delay
(1);
LED2=0;
LED3=1;/*分高位*/
P0=table[d3];
delay
(1);
LED3=0;
LED4=1;/*分低位*/
P0=table[d4];
delay
(1);
LED4=0;
LED4=1;/*分低位小数点显示*/
P0=0x80;
delay
(1);
LED4=0;
LED5=1;/*秒高位*/
P0=table[d5];
delay
(1);
LED5=0;
LED6=1;/*秒低位*/
P0=table[d6];
delay
(1);
LED6=0;
}
}
/*整点报时功能函数*/
voidbaoshi()
{
if((fen==59)&(miao==59))/*整点报时功能*/
{
ucharbs;
bs=shi;
bs++;
while(bs>0)/*报时次数等于小时数*/
{
bs--;
bell=0;
delay(100);
bell=1;
delay(100);
}
}
}
/*秒表功能控制函数*/
voidmiaobiao()
{
if(key2==0)/*秒表开始计时*/
{
delay(10);
if(key2==0)
{
while(!
key2);
TR1=1;
}
}
if(key3==0)/*秒表暂停*/
{
delay(10);
if(key3==0)
{
while(!
key3);
TR1=0;
}
}
if(key4==0)/*秒表清零*/
{
delay(10);
if(key4==0)
{
while(!
key4);
TR1=0;
shm=0;
sec=0;
min=0;
}
}
}
/*秒表显示函数*/
voiddisplay2()
{
m1=min/10;
m2=min%10;
m3=sec/10;
m4=sec%10;
m5=shm/10;
m6=shm%10;
LED1=1;/*分高位*/
P0=table[m1];
delay
(1);
LED1=0;
LED2=1;/*分低位*/
P0=table[m2];
delay
(1);
LED2=0;
LED2=1;/*分低位小数点显示*/
P0=0x80;
delay
(1);
LED2=0;
LED3=1;/*秒高位*/
P0=table[m3];
delay
(1);
LED3=0;
LED4=1;/*秒低位*/
P0=table[m4];
delay
(1);
LED4=0;
LED4=1;/*秒低位小数点显示*/
P0=0x80;
delay
(1);
LED4=0;
LED5=1;/*10ms高位*/
P0=table[m5];
delay
(1);
LED5=0;
LED6=1;/*10ms低位*/
P0=table[m6];
delay
(1);
LED6=0;
}
/*闹钟设置功能函数*/
voidnaozhong()
{
if(key2==0)/*设置闹钟的开关*/
{
delay(10);
if(key2==0)
{
while(!
key2);
num2++;
if(num2==3)
{
num2=1;/*闹钟打开*/
}
}
}
if(key3==0)/*定点小时+*/
{
delay(10);
if(key3==0)
{
while(!
key3);
nshi++;
if(nshi==24)
{
nshi=0;
}
}
}
if(key4==0)/*定点分钟+*/
{
delay(10);
if(key4==0)
{
while(!
key4);
nfen++;
if(nfen==60)
{
nfen=0;
}
}
}
}
/*闹钟显示函数*/
voiddisplay3()
{
n1=nshi/10;
n2=nshi%10;
n3=nfen/10;
n4=nfen%10;
if(num2==1)/*第一位全显示表示闹钟打开*/
{
LED1=1;
P0=0xff;
delay
(1);
LED1=0;
}
if(num2==2)/*第一位全灭表示闹钟关闭*/
{
LED1=1;
P0=0x00;
delay
(1);
LED1=0;
}
LED3=1;/*小时高位*/
P0=table[n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 原理 系统 课程设计