89C52单片机课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 设计任务及要求
1.1 设计任务
(1)完成基本焊接任务
(2)单片机开发板功能正确
(3)完成指定的实验
(4)完成课程设计报告
1.2 要求
(1)元件面:元器件位置正确、排列整齐有序,元件整形恰当。
焊接面:整洁、清爽,焊点圆润、无虚焊,引脚修整合适。
(2)能够下载程序、运行演示程序。
(3)完成3个程序的编写、下载及演示功能。
(4)报告格式规范、文字流畅、思路清晰。
2.方案设计与论证
2.1 方案设计
方案一:仿照周立功实验箱自行设计电路,然后完成焊接,实现各功能。
单片机仿真器、编程器、实验仪三合一综合开发平台方案二:采用JB-MCS 51-V8.0电路板,直接焊接相关元器件并实现各功能。
2.2论证
经验证实验平台所需元器件无法找齐,且体积过大不便于携带等原因,最终决定采用方案二。
3.单元电路原理
各单元电路原理图4.总原理图及元器件清单
4.1 总原理图
4.2 元器件清单
5 硬件安装与调试
在安装硬件的过程中要注意硬件的排列有序,焊点圆润、无虚焊,引脚修剪整齐。
在硬件安装完毕后,对作品进行调试。
通过STC软件对作品进行调试以及程序的下载,具体步骤如下:
(1)选择单片机型号
(2)选择程序
(3)选择串口,安装USB驱动程序后,可在设备管理器中看到多出的串口(每台电脑不一样)。
然后在软件中选择相应的串口
(4)选择波特率,一般情况下这都是默认的,最高波特率选择115200,最低波特率选择1200。
(5)以上步骤完成后,就点击Download/下载,按左下角的提示进行操作。
6.各实验具体操作和相关解释
6.1跑马灯试验
6.1.1系统概述
通过模式键来改变单片机的工作模式,进行程序控制,一共有八个模式。
LED 等工作在不同的模式下,有不同的现象。
加速减速开关来控制灯泡的闪亮快慢。
复位电路用来初始化芯片的工作状态。
控制电路是整个电路的核心,主要由单片机
来完成。
89C52 RC的管脚如图所示。
单片机执行
指令是在时钟脉冲控制下进行的。
因此单片机必
须外接振荡器构成时钟电路才能正常工作。
另外,
还应在单片机的RES端外接电阻电容构成复位电
路,当单片机运行错误时可以给一个复位信号使
其复位。
单片机对接口电路的控制是由软件向单片机的I/O口来实现的。
89C52 RC单片机内部有两个定时/计数器,可以用其中一个定时/计数器来对时间进行计数,而另一个可以对显示器的显示延时进行定时并通过中断把相应的数据通过I/O口送给显示器显示。
同时通过对外部按键的状态判断来进行时间的调整。
6.1.2 单元电路设计与分析
1、时钟电路
单片机执行指令是在脉冲控制下进行的,因此时钟信号是单片机的基本工作条件。
时钟可以由内部和外部两种方式产生,本设计采用内部方式。
如图所示,在XTAL1和XTAL2引脚上外接定时元件。
定时元件通常采用振荡器和电容组成的并联谐振电路。
X1为振荡器,C1、C2为电容。
振荡的主要频率决定于晶振,电容对振荡频率起微调作用。
其中,晶振选择
12MHz
2、复位电路
一个时钟周期为振荡周期的2倍,12个时钟周期构成一个机器周期。
在RES 引脚上输入一个超过两个机器周期的高电平信号,单片机就可以复位。
时钟频率为12MHz ,则有效的复位信号至少应保持2us 以上。
下图为单片机的复位电路
3.C 语言编程如下:
#include<reg51.h>
#define uchar unsiged char
char k=0;unsigned int i,t=45000,j;sbit p3_0=P3^0;
code char tab[9]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f}; int0()interrupt 0
{ while(1){
k++;
if(k<9) P1=tab[k];
else { k=0;P1=0x3f;}
if(k==0) {P0=0xff;P2=0xff;}
if(k==1){P0=0xfc;P2=0xff;}
if(k==2){P0=0xf3;P2=0xff;}
if(k==3){P0=0xcf;P2=0xff;}
if(k==4){P0=0x3f;P2=0xff;}
if(k==5){P0=0xff;P2=0xfc;}
if(k==6){P0=0xff;P2=0xf3;}
if(k==7){P0=0xff;P2=0xcf;}
if(k==8){P0=0xff;P2=0x3f;}
}}
int1()interrupt 2
{while(1)
{
for(j=0;j<16;j++)
{
if(j<=7)
{
P2=0xff;
P0<<=1;
if(j!=0){P0=P0|0x01;}
for(t=0;t<=20000-1000*j;t++);
}
if(j>7) {P0=0xff;
P2<<=1;
if(j!=8){P2=P2|0x01;}
for(t=0;t<=20000-1000*j;t++);}
}
}
}
main()
{
EA=1;
EX1=1;
IT1=1;
EX0=1;
IT0=1;
p3_0=0;
if(p3_0==1)
{ while(1){
{ for(j=0;j<16;j++)
{
if(j<=7)
{
P2=0xff;
P0<<=1;
if(j!=0){P0=P0|0x01;}
for(t=0;t<=3000+1000*j;t++);
}
if(j>7) {P0=0xff;
P2<<=1;
if(j!=8){P2=P2|0x01;}
for(t=0;t<=3000+1000*j;t++);}
}}
}
}
}
6.1.3电路的安装与调试
程序调试完成后直接运行,可看到8只LED灯的走马灯效果。
通过这个仿真可以直观地看到按键对程序的控制、走马灯运行的结果,效果非常好。
本课程设计中用到了单片机的I/0、定时器中断等硬件功能,同时涉及到软件查询定时、中断程序、按键控制、数码管动态显示等主要程序的设计方法。
程序开始先使P1口为低电平,熄灭各LED,随后系统进入键盘检测循环,当检测到某个键被按下,则转到该键对应的程序处执行。
按键处理执行程序各自的功能后,每循环一次后检测S1是否按下,如果按下,各LED熄灭,重新进入检测循环,否则继续循环。
6.2计数器实验
6.2.1系统软件程序
OUTBIT equ 0e101h
CLK164 equ 0e102h ; 段控制口(接164时钟位)
DA T164 equ 0e102h ; 段控制口(接164数据位)
LEDBuf equ 40h
IN equ 0e103h
ORG 0000h
MOV SP,#60H
MOV DPTR,#0e100H ;8155初始化
MOV A,#03H
MOVX @DPTR,A
MOV TMOD,#05H ;定时器初始化
MOV TH0,#00H
MOV TL0,#00H
SETB TR0
LOOP0: MOV R2,TH0
MOV R3,TL0
LCALL LOOP1
MOV R0,#40H
MOV A,R6
LCALL PTDS
MOV A,R5
LCALL PTDS
MOV A,R4
LCALL PTDS
LCALL DISPLAY
SJMP LOOP0
LOOP1: CLR A ;二转十子程序MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#10H
LOOP2: CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ R7,LOOP2
RET
PTDS: MOV R1,A ;拆字子程序ACALL PTDS1
MOV A,R1
SW AP A
PTDS1: ANL A,#0FH
MOV @R0,A
INC R0
RET
Delay:
mov r7, #0 ; 延时子程序DelayLoop:
djnz r7, DelayLoop
djnz r6, DelayLoop
ret
DISPLAY:setb 0d3h
mov r0, #LEDBuf
mov r1, #6 ; 共6个八段管
mov r2, #00000001b ; 从左边开始显示Loop:
mov dptr, #OUTBIT
mov a, #00h
movx @dptr, a ; 关所有八段管
mov a, @r0
mov dptr,#LEDmap
movc a,@a+dptr
mov B, #8 ; 送164
DLP:
rlc a
mov r3, a
mov acc.0, c
anl a,#0fdh
mov dptr, #DA T164
movx @dptr, a
mov dptr, #CLK164
orl a,#02h
movx @dptr, a
anl a,#0fDh
movx @dptr, a
mov a, r3
djnz B, DLP
mov dptr, #OUTBIT
mov a, r2
movx @dptr, a ; 显示一位八段管
mov r6, #1
call Delay
mov a, r2 ; 显示下一位
rl a
mov r2, a
inc r0
djnz r1, Loop
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 关所有八段管
clr 0d3h
ret
LEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
END
6.2.2 系统软、硬件调试过程
将十进制数改为十六进制数
IOOP0:MOV R2,TH0
MOV R3,TL0
MOV R0,LEDBuf
MOV A,R3
LCALL PTDS
MOV A,R2
LCALL PTDS
LCALL DISPLAY
当工作在定时方式时,计数脉冲来自单片机的内部,每个机器周期使计数器加1,由于计数脉冲的频率是固定的(即每个脉冲为1个机器周期的时间),故可通过设定计数值来实现定时功能。
当工作在计数方式时,计数脉冲来自单片机的引脚,每当引脚上出现一个有1到0的电平变化时,计数器的值加1,从而实现计数功能。
可以通过编程来指定时技术计数器的功能,以及他的工作方式。
读取计数器的当前值时,应读3次。
这样可以避免在第一次读完后,二次读完钱,由于低位溢出向高位进行时的错误。
6.3抢答器实验
6.3.1.程序
org 0000h 初始地址
ajmp main ;跳入main
org 0003h
ajmp start ;跳入start
org 000bh
ajmp time ;跳入time
org 0030h
main: mov tmod,#1 ;主程序
mov th0,#0b1h ;定时期高八位赋值
mov tl0,#0e0h ;定时期低八位赋值
mov ie, #83h ;申请中断控制数
setb tr0 ;开定时期
mov r3,#0 ;工作寄存器赋值
mov r4,#0 ;工作寄存器赋值
mov 30h,#0
mov 31h,#0
mov 32h,#0
;显示子程序
disp: mov sp,5fh ;堆栈指针
mov a,#03h
mov dptr,#0ff20h ;初值
movx @dptr,a
loop: mov r5,#1
mov r0,#30h
mov a,r5
loop1: mov dptr,#0ff21h ;A口输出
movx @dptr,a
mov dptr,#0ff22h ;B口输出
mov a,@r0
add a,#0eh
movc a,@a+pc ;查表
movx @dptr,a
acall dlay ;调用延时程序
inc r0
mov a,r5
jb acc.2,ld ;判断
rl a ;a值左移
mov r5,a
ajmp loop1 ;跳回loop1
ld: sjmp loop ;跳回loop
table: ;数据表
db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0c8h
dlay: mov r7,#02h ;延时子程序1.02ms
dl1: mov r6,#0ffh
dl2: djnz r6,dl2
djnz r7,dl1
ret
time: mov th0,#0b1h ;判断有人抢答
mov tl0,#0e0h
push psw ;压栈保存
push acc
mov a,#0fh
orl p1,a
mov a,p1
anl a,#0fh
cjne a,#0,go_on ;判断a值,a=0,继续程序;a≠0,跳转go_on inc r3 ; r3+1
cjne r3,#25,back ;判断r3与25大小,r3=25,继续程序;r3≠25,
跳转到back
mov r3,#0
inc r4 ;r4+1
mov a,r4
mov b,#10
div ab
mov 31h,a
mov 30h,b
cjne r4,#20,back
cpl p1.7
mov 32h,#10
clr tr0
sjmp back
go_on: clr tr0 ;判断谁抢答jnb acc.0,two
mov 32h,#01h
sjmp back
two: jnb acc.1,three
mov 32h,#02h
sjmp back
three: jnb acc.2,four
mov 32h,#03h
sjmp back
four: mov 32h,#04h
back: pop acc
pop psw
reti
start: setb tr0 ;中断后,继续记时reti
end
6.3.2.
6.3
.3.把单片机中需要的连线进行正确的连接,检查无误后开始运行程
序。
6.3.4运行程序,开始计时,当有人抢答时,看LED数码管是不是分别显示抢答人号码和时间,时间及号码均显示,看时间是不是停止加时,给一个脉冲后,说明刚才强答的回答不正确可继续抢答,这时时间应累加记时,若到达20S后,显示最后一个强答人的号码。
无人答对时,显示无人抢答。
7.心得体会
我是工学专业的学生,设计是我们将来必需的技能,这次课程设计恰恰给我
们提供了一个应用自己所学知识的机会,从到图书馆查找资料到对电路的设计以
及程序的编写,对电路的仿真再到最后电路的成型,都对我所学的知识进行了检
验。
我深刻的体会到在设计过程中,需要反复实践,其过程很可能相当烦琐,
有时花很长时间设计出来的电路还是需要重做,那时心中未免有点灰心,有时还
特别想放弃,此时更加需要静下心,查找原因。
通过这次单片机课程设计,我体会到了单片机在现代电子产品中的广泛用途和强大功能,复习了老师上课讲的内容。
但是由于时间仓促还有许多有待完善的地方,我会在以后的学习工作中继续努力。
总体来说,这次实习我受益匪浅。
在摸索该如何设计电路使之实现所需功
能的过程中,特别有趣,培养了我的设计思维,增加了实际操作能力。
在让我体
会到了设计电路的艰辛的同时,更让我体会到成功的喜悦和快乐。
在这里,我也非常感谢各位老师的耐心辅导以及同学们的热心帮助。
我忠心
的感谢各位老师,你们辛苦了!
希望在今后的学习过程中,老师能够多加引领我们走向更尖端的科技和更复
杂高深的领域,加强专业技术的培训和更多的开展科研创新研究。
通过实践引导
我们在理论指导下有所创新,为日后工程实践奠定基础。
8参考文献
【1】肖洪兵. 跟我学用单片机. 北京:北京航空航天大学出版社,2002.8
【2】何立民. 单片机高级教程.第1版.北京:北京航空航天大学出版社,2001 【3】赵晓安. MCS-51单片机原理及应用. 天津:天津大学出版社,2001.3
【4】李广第.单片机基础.第1版.北京:北京航空航天大学出版社,1999 【5】徐惠民、安德宁.单片微型计算机原理接口与应用.第1版.北京:北京邮电大学出版社,1996。