单片机及DSP课程设计报告 本文关键词:课程设计,机及,报告,DSP
单片机及DSP课程设计报告 本文简介:一、课设目的1、通过本设计,能综合运用《单片机技术原理与应用》、《DSP原理与应用》《C语言程序设计》以及《数字电路》、《模拟电路》等课程的内容,为以后从事电子产品设计、软件编程、系统控制等工作奠定一定的基础。2、学会使用KEILC和PROTEUS等软件,用C语言或汇编语言编写一个较完整的实用程序,
单片机及DSP课程设计报告 本文内容:
一、课设目的
1、通过本设计,能综合运用《单片机技术原理与应用》、《DSP原理与应用》《C语言程序设计》以及《数字电路》、《模拟电路》等课程的内容,为以后从事电子产品设计、软件编程、系统控制等工作奠定一定的基础。
2、学会使用KEIL
C和PROTEUS等软件,用C语言或汇编语言编写一个较完整的实用程序,并仿真运行,保证设计的正确性。
3、了解单片机接口应用开发的全过程:分析需求、设计原理图、选用元器件、布线、编程、调试、撰写报告等。
二、课设内容
设计一个基于单片机的音乐播放器,在播放音乐的同时并能显示播放的歌曲序号,同时可以实现上一曲、下一曲的转换;在播放的同时,还能实现暂停/开始的功能。
3、
问题分析、方案的提出、设计思路及原因
要想使播放器发出响声,就得设计一个能产生声响的程序,让单片机输出到扬声器。音调的高低用音阶表示,不同的音阶对应不同的频率。因此,不同频率的方波就可以产生音阶。由于频率的倒数是周期,因此可由单片机中的定时控制方波周期,当定时器计数溢出时产生中断。将与扬声器连接就可得到方波的周期,从而达到了控制频率,即音阶的目的。通过TXAL1
与TXAL2输入时钟信号,通过p1.0~p1.7输出控制现实控制信号显示,有p3.2、p3.3与p3.5分别作为上一曲、下一曲和开始暂停的控制输入。
显示电路是一个8位共阴极LED数码管。
单片机的P0.0-P0.7分别与数码管的A、B、C、D、E、F、G、DP相连接。
晶振电路由两个1nF的电容和一个6Mhz的晶体振荡器组成。节点1与单片机的XTAL2相连接,节点2与单片机的XTAL1相连接,从而为单片机提供时间信号,为音乐的播放节拍控制提供基本时间单位:当晶体振荡频率为6.MHz,定时器工作在方式1下时,若各音阶相对应的定时器计数初值为X,则可根据下式计算X:
控制电路,键一与p3.2相连、键二与p3.3相连、键3与p3.5相连。当电键按下时接口接低电平,从而实现对音乐播放器的控制。
键一联通实现上一曲更换,键发声电路由数字扬声器连接p2.0接口实现音乐的输出,由控制电路发出操作指令后,单片机调用相应程序,并将音乐信号由p2.0口输出,通过驱动扬声器发出美妙的音乐。二联通实现下一曲更换,键三联通实现开始暂停操作。
四、电路设计及功能说明,硬件原理框图及电路图
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS
8位微处理器,俗称单片机。
总原理图
51单片机
显示电路
电源电路
键控电路
复位电路
晶振电路
发声电路
时钟电路
与振荡器共同产生单片机所需的工作时钟信号
功能选择电路
实现播放器的功能操作
显示电路
实现单片机的信息显示功能
开始
4、
软件部分的程序流程图,算法和使用的编程技巧;
初始化
查询歌曲曲目
上一曲、下一曲
数码管显示
暂停、播放
等待播放
关闭显示
播放音乐
判断是否结束?
否
是
结束
1、总体思路
主程序实现对单片机进行初始化后,进入曲目识别子程序,进行歌曲曲目判断。确定歌曲曲目后,数码管再进行显示。然后,子程序对是否播放进行循环判断,得到播放中断的指令后再进行播放。
执行播放后,关闭数码管显示并调用查表子程序进行播放音乐。在播放音乐的过程中,查表子程序循环判断音乐是否结束。当音乐结束时,程序跳转回曲目识别子程序。
5、
源程序清单
OUT
BIT
P2.0
;定义音频输出端口,p2.0
N
EQU
3;歌曲总数
OUT_NUM
EQU
P1;数码管显视当前所放歌曲曲数
ORG
0000H
AJMP
MAIN
ORG
0003H
AJMP
LAST_SONG
;外部中断0用于接上一曲歌按键
ORG
000BH
AJMP
F_T0
;定时器0用于定时,作音符发生器用
ORG
0013H
q4:
AJMP
NEXT_SONG
;外部中断1接下一曲歌按键
ORG
001BH
AJMP
START_PAUSE
;定时器1用计数,这里用作中断,接开始/暂停键,初值为0ffH,方式2
ORG
0030H
MAIN:
MOV
SP,#60H
MOV
DPTR,#TABLE
;DPRT指向每首歌曲的入口地址的地址。
MOV
R0,#30H
;R0中存入数据30H,这里在以30H开始的单元存放每首歌曲的入口地址,其中30H,31H存放歌曲的节拍入口地址,32H,33H存放歌曲音符入口地址,每首歌占用四个存储存单元。
MOV
R5,#00H
;R5中存放表TABLE中正在执行操作的序号
MOV
R6,#1
;R6存放正在设置入口信息的歌曲数
SET_TAB:
MOV
A,R5
;设置每首歌曲的入口信息,存放在以30H开始的存储单元中。
MOVC
A,@A+DPTR
MOV
@R0,A
INC
R5
INC
R0
MOV
A,R5
MOVC
A,@A+DPTR
MOV
@R0,A
INC
R5
INC
R0
MOV
A,R5
MOVC
A,@A+DPTR
MOV
@R0,A
INC
R0
INC
R5
MOV
A,R5
MOVC
A,@A+DPTR
MOV
@R0,A
INC
R0
INC
R5
INC
R6
;设置完一首歌曲后,歌曲数加一
CJNE
R6,#N+1,SET_TAB
;是否设置完,没有便继续,否则进行下面的操作
;***********************************
对中断,计数器的相关参数进行设置
MOV
TMOD,#61H
;计数器0工作方式1,计数器1工作方式2
MOV
TH1,#0FFH
;给计数器1置初值0FFH,又由于是工作方式2,所以
MOV
TL1,#0FFH
;计数器计数为1,相当于一外部中断。
SETB
ET1
;允许计数器1中断
SETB
ET0
;允许计数器具0中断
CLR
PT0
;计数器0为低优先级
SETB
PT1
;计数器1为高优先级
SETB
IT0
;外部中断0为跳沿触发
SETB
PX0
;高优先级
SETB
IT1
;外部中断1为跳沿触发
SETB
PX1
;高优先级
SETB
EX1
;允许外部中断1中断
SETB
EX0
;允许外部中断定0中断
SETB
EA
;开中断总开关
SETB
TR1
;定时器1开始工作,作中断用
SETB
OUT
;音频输出端口初始化
;***********************************
;设置结束
CLR
F0
;设置F0=0,用来作暂停/播放的标置位用
MOV
22H,#01H
;22H单元中存放正在播放的歌曲编号
MOV
DPTR,#OUT_TAB
;将正在播放的歌曲编号送数码管显视
MOV
A,22H
MOVC
A,@A+DPTR
MOV
OUT_NUM,A
MOV
R7,#00H
;R7中存放歌曲总信息的入口地址
START0:MOV
R4,#00H
;R4存放当前正在播放歌曲的第几个节拍数
MOV
R0,#30H
;30H开始的单元中存放歌曲的入口信息
MOV
A,R7
;将歌曲的节拍表的入口地址送到DPTR
ADD
A,R0
MOV
R0,A
MOV
DPH,@R0
INC
R0
MOV
DPL,@R0
INC
R0
MOV
A,R4
INC
R4
MOVC
A,@A+DPTR
;取出第一节拍数,其实第一个节拍不是歌曲的第一个节拍,而是表示几分音符
;****************************************************
MOV
26H,A
;将取出的音符数+节拍数保存在职26H单元中
NEXT:
MOV
R0,#30H
;开始取出歌曲的第一个数据
MOV
A,R7
ADD
A,R0
MOV
R0,A
MOV
DPH,@R0
INC
R0
MOV
DPL,@R0
INC
R0
MOV
A,R4
INC
R4
MOVC
A,@A+DPTR
;放在A中
;****************************************************
JZ
END0
;若为0,则表示为休止符,不唱,本次音符不唱,
MOV
R1,A
;不为0,取出节拍数
ANL
A,#0FH
MOV
R2,A
MOV
A,R1
SWAP
A
ANL
A,#0FH
JNZ
SING
;音符不为0,唱
CLR
TR0
;为0,不唱,关频率发生器
SJMP
SING1
SING:
DEC
A
;开始唱,进行相应的数据处理
MOV
R3,A
RL
A
MOV
DPH,@R0
INC
R0
MOV
DPL,@R0
INC
R0
MOVC
A,@A+DPTR
MOV
21H,A
MOV
TH0,A
MOV
A,R3
RL
A
INC
A
MOVC
A,@A+DPTR
MOV
20H,A
MOV
TL0,A
SETB
TR0
;开唱
SING1:LCALL
DELAY
;每个音符唱多久
JB
F0,FOR
;是否暂停,
AJMP
NEXT
;没有暂停,继续
FOR:
CLR
TR0
;暂停,不唱
JB
F0,$
;等待播放
AJMP
NEXT
;开始播放
END0:
CLR
TR0
;不唱
MOV
A,22H
;唱完处理
CJNE
A,#N,WW
;是不是全部歌曲都唱完
MOV
22H,#01H
;全部唱完,则从第一首开始再唱
MOV
R7,#00H
MOV
OUT_NUM,#06H
;数码管显视第一首歌曲编号
AJMP
WWW
WW:
MOV
A,R7
;没有全部唱完,唱下一首,歌曲的入口信息调整
ADD
A,#4
MOV
R7,A
INC
22H
CLR
EA
PUSH
DPH
PUSH
DPL
MOV
A,22H
MOV
DPTR,#OUT_TAB
MOVC
A,@A+DPTR
MOV
OUT_NUM,A
;数码管显视相应的歌曲编号
POP
DPL
POP
DPH
WWW:
SETB
EA
AJMP
START0
;开始下一首的演唱
F_T0:
MOV
TH0,21H
;定时器0置初值
MOV
TL0,20H
CPL
OUT
;频率产生
RETI
NEXT_SONG:
PUSH
ACC
;下一曲中断程序处理,保护现场
PUSH
DPH
PUSH
DPL
CLR
EA
;关中断
MOV
A,22H
CJNE
A,#N,Q
;是最后一首吗?
MOV
R7,#00H
;是最后一首,则R7指向第一首,演唱第一首
MOV
22H,#01H
AJMP
BACK
Q:
INC
22H
;不是最后一首,唱下一首,R7内容加4,歌曲数加1
MOV
A,R7
ADD
A,#4
MOV
R7,A
BACK:
MOV
R4,#00H
;数码管显视相应的歌曲编号
MOV
A,22H
MOV
DPTR,#OUT_TAB
MOVC
A,@A+DPTR
MOV
OUT_NUM,A
;********************************************
MOV
B,R0
;对下首要演唱的歌曲的几分拍进行调整,同时对R0中的内容进行保护
MOV
R4,#00H
MOV
R0,#30H
MOV
A,R7
ADD
A,R0
MOV
R0,A
MOV
DPH,@R0
INC
R0
MOV
DPL,@R0
INC
R0
MOV
A,R4
INC
R4
MOVC
A,@A+DPTR
MOV
26H,A
;结果存入26H单元中
DEC
R4
MOV
R0,B
;恢复R0中的内容
;********************************************
POP
DPL
;恢复现场
POP
DPH
POP
ACC
SETB
EA
RETI
;中断返回
LAST_SONG:
PUSH
ACC
;上一曲中断程序处理开始,保护现场
PUSH
DPH
PUSH
DPL
CLR
EA
;关中断
MOV
A,22H
;曲目数送A
CJNE
A,#1,QQ
;是否是第一首
MOV
22H,#N
;是第一首歌曲
MOV
B,#4
;将R7指向最后一首歌曲
MOV
A,#N-1
MUL
AB
MOV
R7,A
AJMP
BACK2
;处理结束
QQ:
DEC
22H
MOV
A,R7
;R7减4
SUBB
A,#4
MOV
R7,A
BACK2:
MOV
R4,#00H
MOV
A,22H
MOV
DPTR,#OUT_TAB
MOVC
A,@A+DPTR
MOV
OUT_NUM,A
;数码管显视相应歌曲的编号
;********************************************
MOV
B,R0;对下首要演唱的歌曲的几分拍进行调整,同时对R0中的内容进行保护
MOV
R4,#00H
MOV
R0,#30H
MOV
A,R7
ADD
A,R0
MOV
R0,A
MOV
DPH,@R0
INC
R0
MOV
DPL,@R0
INC
R0
MOV
A,R4
INC
R4
MOVC
A,@A+DPTR
MOV
26H,A
;结果存入26H单元中
DEC
R4
MOV
R0,B;R0中的内容恢复
;********************************************
POP
DPL
;恢复现场
POP
DPH
POP
ACC
SETB
EA
RETI
;中断返回
START_PAUSE:CPL
F0
;开始/暂停中断处理程序,将标置位取反
JB
F0,RETURN
;为1返回
SETB
TR0
;为0则播放
RETURN:
RETI
;中断返回
DELAY:
MOV
27H,26H
;音符演奏时间控制
D2:
MOV
28H,#125
D3:
MOV
29H,#248
DJNZ
29H,$
DJNZ
28H,D3
DJNZ
27H,D2
DJNZ
R2,DELAY
RET
OUT_TAB:
DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,73H
;共阴数码管显视用
;OUT_TAB:
DB
0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
;共阳
TABLE:
DW
SONG1,TABLE1,SONG2,TABLE2,SONG3,TABLE3
TABLE1:DW
64580,64684,64777,64820,64898,64968,65030
DW
63628,63835,64021,64103,64260,64400,64524
SONG1:
DB
04H
;1=C
2/4
军港之夜
DB
32H,54H,52H,32H,54H,52H,32H,12H,12H,32H,32H,54H,52H,32H,52H,52H,32H,32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,14H,14H
DB
0C2H,32H,32H,12H,21H,31H,24H,32H,34H,0D2H,0C2H,14H,14H,32H,52H,52H,32H,52H,54H,32H,34H,31H,21H,12H,24H,24H
DB
34H,0E2H,0C2H,0D1H,0E1H,0D4H,12H,0E2H,32H,32H,0E2H,0D1H,0E1H,0D4H,0D2H,0E2H,32H,32H,0E2H,0E2H,0D1H,0E1H,0D4H
DB
22H,0D1H,11H,0E2H,0D2H,0C4H,0C4H,32H,52H,52H,32H,62H,5H,61H,54H,31H,52H,31H,12H,31H,31H,32H,54H,52H,32H,52H,52H,32H
DB
32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,34H,34H,32H,52H,52,32H,62H,51H,61H,54H,31H,52H,31H,12H,32H,12H,32H,32H,54H,52H
DB
32H,52H,52H,31H,31H,32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,14H,14H
DB
32H,52H,52H,32H,32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,14H,14H
DB
0C2H,32H,32H,12H,21H,31H,24H,32H,34H,0D2H,0C2H,14H,14H,32H,52H,52H,32H,52H,54H,32H,34H,31H,21H,12H,24H,24H
DB
34H,0E2H,0C2H,0D1H,0E1H,0D4H,12H,0E2H,32H,32H,0E2H,0D1H,0E1H,0D4H,0D2H,0E2H,32H,32H,0E2H,0E2H,0D1H,0E1H,0D4H
DB
22H,0D1H,11H,0E2H,0D2H,0C4H,0C4H,32H,52H,52H,32H,62H,5H,61H,54H,31H,52H,31H,12H,31H,31H,32H,54H,52H,32H,52H,52H,32H
DB
32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,34H,34H,32H,52H,52,32H,62H,51H,61H,54H,31H,52H,31H,12H,32H,12H,32H,32H,54H,52H
DB
32H,52H,52H,31H,31H,32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,14H,14H
DB
32H,52H,52H,32H,32H,21H,31H,24H,74H,0D2H,0C2H,14H,14H,14H,14H
DB
00H
TABLE2:DW
63835,64021,64103,64260,64400,64524,64580,64684,64777
DW
64820,64898,64968,65030,65058,65110,65157,65178
SONG2:
DB
02H;1=C
4/4
死了都要爱
DB
04H,94H
DB
0E8H,0E4H,0E4H,0E8H,0E4H,0F4H,0D4H,0C4H,0B4H,84H,84H,92H,92H,94H,92H,02H
DB
0A4H,0A2H,0B2H,0B4H,0C4H,84H,82H,92H,94H,0A4H
DB
04H,0C2H,0C2H,0D4H,0C2H,0D2H,0D8H,0D4H,0D2H,92H
DB
0E8H,0E4H,0E4H,0E8H,0E4H,0F4H,0D4H,0C4H,0B4H,84H,84H,92H,92H,94H,92H,02H
DB
0A4H,0A2H,0B2H,0B4H,0C4H,0E8H,0D8H
DB
0C8H,0C8H,08H,08H,78H,28H,38H,34H,24H
DB
24H,64H,64H,24H,64H,72H,72H,78H,58H,54H,44H,38H,34H,14H,34H,84H,74H,74H,62H,62H,0D8H,78H,28H,38H,34H,24H
DB
24H,64H,64H,24H,64H,72H,72H,72H,94H,92H,94H,0A4H,58H,58H,54H,44H
;#音不准
DB
58H,58H,58H,58H,0A8H,0A8H,0A4H,0B4H,0A4H,84H,0A4H,94H,98H,98H,08H
DB
84H,82H,82H,82H,82H,94H,0A2H,94H,92H,82H,74H,72H,74H,72H,72H,72H,72H,92H,91H,91H,94H,54H,74H,94H
;;*************************************************
DB
0A8H,0A4H,0A2H,0B2H,0C4H,0B4H,0A4H,0A4H,0A4H,92H,92H,98H,82H,72H,78H,04H,0A4H,0A2H,0B2H,0B4H,0C4H,84H,82H,92H,94H,0A4H
DB
04H,0C4H,0D4H,0C4H,0C8H,04H,94H
DB
0E8H,0E4H,0E4H,0E8H,0E4H,0F4H,0D4H,0C4H,0B4H,84H,84H,92H,92H,94H,92H,02
DB
0A4H,0A2H,0B2H,0B4H,0C4H,84H,82H,92H,94H,0A4H,04H,0C2H,0C2H,0D4H,0D8H,0D4H,0D2H,92H
DB
0E8H,0E4H,0E4H,0E8H,0E4H,0F4H,0D4H,0C4H,0B4H,84H,84H,92H,92H,94H,92H,02
DB
0A4H,0A2H,0B2H,0B4H,0C4H,84H,82H,92H,94H,0A4H,04H,0C2H,0C2H,0D4H,0D8H,0D4H,0D2H,92H
;*************
DB
0A4H,0A2H,0B2H,0B3H,0C4H,0E8H,0D8H
DB
0C8H,0C8H,0C8H,08H
DB
00H
TABLE3:
DW
64898,64968,65030,65086,65135,65158,65199,64260,64400,64524,64580,64684,64777,64862
SONG3:
DB
03H
;G=2/4
中华人民共和国国歌
DB
04H,04H,0C2H,14H,12H,12H,12H,11H,11H,0C2H,0D1H,0E1H,14H,14H,02H,32H,12H,21H,31H,52H,51H,51H,54H
DB
32H,31H,31H,12H,11H,31H,52H,51H,31H,24H,24H,24H,64H,54H,24H,34H,52H,34H,52H,32H,21H,31H,12H,11H,21H,34H,04H
DB
52H,51H,0D1H,12H,12H,32H,31H,31H,52H,51H,51H,22H,22H,22H,0D2H,0D1H,0D1H,24H,22H,0C2H,14H,12H,12H,34H,32H,32H,54H,54H,54H,54H
DB
12H,11H,31H,52H,51H,51H,64H,54H,32H,31H,11H,52H,52H,52H,32H,02H,12H,02H,0C4H,14H
DB
0A2H,0A1H,11H,52H,52H,52H,32H,02H,12H,02H,0C4H,14H,0C4H,14H,0C4H,14H,14H,04H
DB
04H,04H,04H,04H
DB
00H
END;
七、仿真过程综述
拿到任务书后的首先想到的是觉得这次课程设计还是比较难的,因为单片机课程的学习是在很早以前了,现在突然要用它需要在把相关知识捡起来,这需要一定的时间;而且,这次课设还需要编程,变成一直是我的弱项。但还是要认真对待,就仔细的看了所有的设计题目,根据自己的爱好和能力,我最终选择了播放器。
刚确定这个题目后觉得无从下手,不知道从什么开始做起。所以就在网上查阅了相关资料,大致浏览了一遍,看懂了几分,觉得应该从学习软件开始。因此就去图书馆借了一本相关的书,把仿真软件学了一遍并做了几个小例子练习了一下,就开始着手编程了。编程的过程是痛苦的,这需要很强的逻辑思维能力,这一部分只能耐心地慢慢来。经过查阅相关资料,和各种程序的拼凑,基本的程序是出来了,放到keil里调试时错误很多,在改错时又查阅大量的资料,曲曲折折的把程序改正好,最终形成一个.hex的文件。接下来画仿真图还是比较容易的,这一部分很轻松。当把程序加载进去开始仿真时又出现了问题,程序是对的,原理图是对的,可是一结合就是得不到想要的结果。在仔细研究,再加上和同学探讨,原来是所选择的元件有误,当把所有错误都改正以后,在仿真时就都成功了,该有的功能都有,该出现的显示也有了。
八、调试过程中的主要难点及解决思路和办法
编程调试中,用KILL将所编好的程序汇编,发现有好几处错误出现,经过仔细检查,发现一些是由于所输入的符号不是英文模式下,汇编机器无法识别,所以要将输入错误的符号在引文模式下重新输入一遍,就能改正了。
还出现了一类的错误提示是由于汇编语言语法的错误。比如:语句CPL
R1是不对的,因为它是无效的寄存器,只有修改成CPL
RI才是对的。、
仿真调试时,当把汇编好的.hex文件加入单片机中仿真时,结果又是并不是所期望的。在我第一次调试时,并没有播放出来歌曲,接下来试了好几次都不行,经过仔细分析和同学的交流,原来电容不是对应的,换了电容,又替换了原来的按键,结果再仿真时就成功了。所以在画原理图时选对元件很重要,只看到外观合适就用是不可以的。
九、课设结果及分析、收获、体会和建议
课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为电子信息工程专业的学生来说掌握单片机的开发技术是十分重要的。
我的题目是音乐播放器硬软件的设计,通过这次课程设计我学到很多很多的东西。我学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,能熟练地运用网络、图书馆等相关资料查阅需要的知识,学会了用proteus软件和keil软件来设计和调试基于单片机的功能实现的方法,了解并提高了自己对汇编语言的掌握程度,可以进行一些简单的编程。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从实践中证实结论,从而提高自己的实际动手能力和独立思考的能力。
同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不够好。这次课程设计通过自己的努力,同学的帮助,还有老师的辛勤指导下,最终顺利完成。
十、参考文献
[1]
郑郁正.单片机原理及应用.四川大学出版社,2003。
[2]
谭浩强.C程序设计(第二版).清华大学出版社,1999。
[3]
王晓君.安国臣等.
MCS—51及兼容单片机原理与选型.
北京-电子工业出版社,2003。
[4]
李启炎.
Protel
99SE应用教程.
上海-同济大学出版社
2005.2
单片机及DSP课程设计报告
专
业:
电子信息工程
班
级:
信息102
姓
名:
王文婕
学
号:
201027073
指导教师:
吴则举
时
间:2013-06-17~28
通信与电子工程学院
教师评语:
教师:
日期:
设计过程30﹪
课设报告40﹪
答辩30﹪
总成绩
篇2:单片机实验报告册填写
单片机实验报告册填写 本文关键词:单片机,填写,实验,报告
单片机实验报告册填写 本文简介:单片机实验报告册填写指导编写:HUBU2015级通信工程xmx2017年5月23日次数实验项目名称时间填写内容建议151单片机LED点阵屏字符显示器设计与实现:原理设计、硬件proteus仿真搭建第9周周二、周五2017年4月18日、21日单片机设计的原理用protues画出硬件图2系统软件设计第1
单片机实验报告册填写 本文内容:
单片机实验报告册
填写指导
编写:HUBU2015级通信工程
xmx
2017年5月23日
次数
实
验
项
目
名
称
时间
填
写
内
容
建
议
1
51单片机LED点阵屏字符显示器设计与实现:原理设计、硬件proteus仿真搭建
第9周周二、周五
2017年4月18日、21日
单片机设计的原理
用protues画出硬件图
2
系统软件设计
第10周周二、周五
2017年4月25日、28日
代码的设计
3
系统proteus仿真调试
第11周周二、周五
2017年5月2日、5日
用Keil生成.hex文件
计算机仿真结果
4
实物硬件搭建
第12周周二、周五
2017年5月9日、12日
所需元器件的选择
5
实物硬件搭建
第13周周二、周五
2017年5月16日、19日
元件引脚的判断
焊接
6
实物系统调试
第14周周二、周五
2017年5月23日、26日
单片机的烧录
7
实物系统调试
第15周周二、周五
2017年5月30日、6月2日
接电源测试
(最好情节波折)
8
实物系统验收
第16周周二、周五
2017年6月6日、9日
老师检测
9
心得与体会
实验室:计信大楼410或510(课表)
实验一
51单片机LED点阵屏字符显示器设计与实现:
原理设计、硬件proteus仿真搭建
系统硬件设计同设计报告
1、新建protues文件
2、功能模块:元件选择
端口模块
测量仪器
3、(1)点击P添加元器件(2)元器件清单
4、搭建电路
选中元器件然后放在电路图合适位置,连线。
本实验的Vcc和地在端口原件,分别是power和ground
5、完成硬件proteus仿真搭建
实验二
系统软件设计
系统软件设计同设计报告
实验三
系统proteus仿真调试
1、打开keil,先新建一个工程
2、单片机型号的选择
3、新建c程序
点击file/new后点左上角的保存按钮,输入文件名,记住扩展名.c,接着点击target
1,右键source
group
1,出现可以选择。
点击add
files
to
group
s
source
,选择刚才的c文件,点击add,后close。
4、创建hex
单击上面方框target
1的右边的第一个按钮。
选择output,勾选creat
hex
file,编程完后编译,连接等步骤。
5、成功生成.hex文件
6、打开protues双击单片机,然后将编译好的hex导入,点确定。
7、最后运行仿真即可。
8、仿真结果
实验四
实物硬件搭建(一)
硬件搭建的器材选择
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
管脚说明
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0
口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
管脚
备选功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
/INT0(外部中断0)
P3.3
/INT1(外部中断1)
P3.4
T0(记时器0外部输入)
P3.5
T1(记时器1外部输入)
P3.6
/WR(外部数据存储器写选通)
P3.7
/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,
ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出
88点阵相关原理参考设计报告
实验五
实物硬件搭建(二)
焊接过程中出现的问题及解决方案
1焊接方式
由于本实验中涉及的元器件管脚有些多,且排版较复杂,再加上焊锡有限,所以就放弃拖焊的焊接方式。采用利用导线连接管脚的方式进行焊接。
2元器件注意事项
对于管脚,要剪切的合适,焊接好后就不要再动该器件了,有时候修改不好,反而使焊接好的板子弄坏了,比如把电路板上镀的铜箔线刮断,元器件损坏等,再进行补救都不好补了。我曾经就这样弄坏了一个电路板。
3焊接注意事项
①焊接电路时如果用焊锡量普遍较大,以至于有些都堆成了一个锡球,这样不但难看而且还不牢固,合适的用锡量是焊出来的焊盘是一个往内凹的锥面。焊锡过少,不足以包裹焊点。
②冷焊。焊接时烙铁温度过低或加热时间不足,焊锡未完全熔化、浸润、焊锡表面不光亮(不光滑),有细小裂纹。
③夹松香焊接,焊锡与元器件或印刷板之间夹杂着一层松香,造成电连接不良。若夹杂加热不足的松香,则焊点下有一层黄褐色松香膜
点阵正面向上,ARK
SZ411288K在左边时,如上图所示,此时点阵为“行共阴”结构:
R表示行线
C表示列线,
当Rx低电平Cy高电平时,则相应(x,y)处的LED亮(参考原点为左上角)
LED测定引脚步骤如下
1.【定正负极】把万用表拨到电阻档×10,先用黑色探针(输出高电平)随意选择一个引脚,红色探针碰余下的引脚,看点阵有没发光,没发光就用黑色探针再选择一个引脚,红色探针碰余下的引脚,当点阵发光,则这时黑色探针接触的那个引脚为正极,红色探针碰到就发光的7个引脚为负极,剩下的6个引脚为正极。
2.【引脚编号】先把器件的引脚正负分布情况记下来,正极(行)用数字表示,负极(列)用字母表示,先定负极引脚编号,黑色探针选定一个正极引脚,红色点负极引脚,看是第几列的二极管发光,第一列就在引脚写A,第二列就在引脚写B,第三列以此类推。
这样就点阵的一半引脚都编号了。剩下的正极引脚用同样的方法,第一行的亮就在引脚标1,第二行就在引脚标2,第三行以此类推。
实验六
实物系统调试(一)
1烧录准备:
2
插芯片
芯片缺口方向对准插槽正方向
芯片缺口方向对准拉杆方向
3拉下插槽拉杆:
拉下之后如图所示
4插线
插线图
五
运行烧录软件
六
选择单片机型号和COM口:
七
打开程序文件
八
开始烧录
九
打开EP51电源开关
十
烧录完成
实验七
实物系统调试(二)
亮度有限
误差分析
1部分节点可能虚焊,导致接触不良,所以在LED上有些点显示的亮度没有预计的那么亮。
2在烧录程序的过程中,单片机被我反复拔下来几次,有些管脚已经不太牢固,甚至快脱落,所以插上去之后单片机管脚与底座可能接触不良。
实验八
实物系统验收
成功!
心得体会范本
第一篇
在这次课程设计的整个过程中,我们做了一次全面、较规范的设计练习,全面地温习了以前所学过的知识,用理论联系实际并结合单片机原理课程和解决实际问题,巩固、加深和扩展了有关单片机设计方面的知识。尤其重要的是让我们养成了科学的习惯,在设计过程中一定要注意掌握设计进度,按预定计划完成阶段性的目标,在底图设计阶段,注意设计计算与结构设计画图交替进行,采用正确的设计方法。在整个设计过程中注意对设计资料和计算数据的保存和积累,保持记录的完整性。在课程设计的实践中进行了设计基本技能的训练,掌握了查阅和使用标准、规范、手册、图册、及相关技术资料的基本技能以及计算、数据处理等方面的能力。
通过对通用51系列单片机机处理器、常用元器件的设计,掌握了一般单片机设计的程序和方法,让我们对整个单片机程序的设计,C51语言有了一个比较深的理解。
还有就是增强了自身的动手能力。在这次课程设计中,我主要负责的是程序设计和单片机部件焊接。通过参考相关的程序设计,自己写出了主要的程序代码。同时将元器件正确焊接到基板上。这些都是将以前书本上讲的或是没有讲的,通过一次课程设计具体的实施,使自己的动手能力和独立设计能力真正得到锻炼,对于以后我们的发展与学习来说,都可以看作一笔不小的财富,前面还有很多需要我们去尝试。
同时不能忽略的是,这一次课程设计是以小组为单位的。在这次课程设计中,我和自己的小组成员学会了密切分工配合。而这样的合作能力和团队精神在今后的学习工作中是很重要的。
第二篇
本文设计一个8×8点阵LED图文显示屏。经过测试,LED各点亮度均匀,可显示图形和文字,且稳定清晰无串扰。本系统具有硬件少、结构简单、容易实现,性能稳定可靠等特点。通过查阅资料,了解了LED发光原理和LED显示技术的原理和现状。在
LED点阵显示屏的设计过程中,学到了很多东西,复习了Protel、Proteus、Keil等软件的基础应用。基本了解了整个嵌入式开发的流程。这次设计开发,本人受益非浅,在以后的开发过程中一定总结经验,吸取教训,为以后的学习工作打好基础。
本论文是在鞠老师的悉心指导下完成的,从课题的选择到论文的最终完成的每一个环节,自始至终得到鞠老师的精心指导和帮助。老师渊博的学识、严谨的治学态度、求实创新的工作作风、对事业和科学的执着追求,以及对我们小组谆谆教诲给我留下了深刻的印象,使我受益终身。在课题的研究设计过程中,我不仅从鞠老师那里学到许多专业知识,更重要的是学会了学习新知识并将其巩固的方法,这无疑是一把开启未来生活的钥匙,特此向鞠老师表示衷心的感谢!
第三篇
本LED显示屏控制系统已能实现LED显示的基本功能,并且体现出了相对于传统的基于8位/16位普通单片机的显示系统的优越性,如上设计所述,但由于本组成员水平和设计时间有限,离一个完全实用的,能够完全符合市场需求的LED显示系统还有一定的差距.因此,在以后的研制过程中,还需要在以下几个方面做大量的工作:
(1)扮在系统抗干扰方面,不论是硬件部分还是软件部分,都还必须在工作现场根据实际情况进行大量的实验,调试工作,才能最终实现LED显示系统的可靠工作。
(2)在增强图文屏显示效果上,可使用双色屏或多色屏,双色(或多色)屏所使用的LED点阵单元,在同一点阵位置上安装了两个(或多个)不同颜色的LED发光灯,对不同颜色的显示控制方面进行进一步的设计,以满足显示更加丰富多彩的图形和文字。
(3)由于ARM微处理器的强大运算能力和丰富的片内外围,可将LED显示屏方便地接入以太网络,每一个
LED显示控制器可作为一个网络节点,方便的组成基于工业以太网的LED显示网络,在这方面还应该进行进一步的研究与实验,以满足更高,更复杂的使用要求。
在这次课程设计的整个过程中,我们做了一次全面、较规范的设计练习,全面地温习了以前所学过的知识,用理论联系实际并结合单片机原理课程和解决实际问题,巩固、加深和扩展了有关单片机设计方面的知识。尤其重要的是让我们养成了科学的习惯,在设计过程中一定要注意掌握设计进度,按预定计划完成阶段性的目标,在底图设计阶段,注意设计计算与结构设计画图交替进行,采用正确的设计方法。在整个设计过程中注意对设计资料和计算数据的保存和积累,保持记录的完整性。在课程设计的实践中进行了设计基本技能的训练,掌握了查阅和使用标准、规范、手册、图册、及相关技术资料的基本技能以及计算、数据处理等方面的能力。
通过对通用89C51单片机机处理器铁电存储器芯片、常用元器件的设计,掌握了一般单片机设计的程序和方法,让我们对整个单片机程序的设计,C51语言有了一个比较深的理解。
还有就是增强了自身的动手能力。在这次课程设计中,我主要负责的是程序设计和单片机部件焊接。通过参考相关的程序设计,自己写出了主要的程序代码。同时将元器件正确焊接到基板上。这些都是将以前书本上讲的或是没有讲的,通过一次课程设计具体的实施,使自己的动手能力和独立设计能力真正得到锻炼,对于以后我们的发展与学习来说,都可以看作一笔不小的财富,前面还有很多需要我们去尝试。
同时不能忽略的是,这一次课程设计是以小组为单位的。在这次课程设计中,我和自己的小组成员学会了密切分工配合。而这样的合作能力和团队精神在今后的学习工作中是很重要的。
19
篇3:《单片机实验报告》
《单片机实验报告》word版 本文关键词:单片机,实验,报告,word
《单片机实验报告》word版 本文简介:实验报告课程名称计算机测控技术实验项目单片机实验仪器keil4.0系别仪器科学与光电工程专业测控技术与仪器班级/学号学生姓名实验日期成绩指导教师实验一单片机程序设计基础一.实验设备硬件使用的是单片机SS-8051高级单片机实验仪,软件使用的是Keiluv2软件开发环境。二.实验目的熟悉单片机的调试环
《单片机实验报告》word版 本文内容:
实
验
报
告
课程名称
计算机测控技术
实验项目
单片机
实验仪器
keil4.0
系
别
仪器科学与光电工程
专
业
测控技术与仪器
班级/学号
学生姓名
实验日期
成
绩
指导教师
实验一
单片机程序设计基础
一.实验设备
硬件使用的是单片机SS-8051高级单片机实验仪,软件使用的是Keil
uv2软件开发环境。
二.
实验目的
熟悉单片机的调试环境与指令系统
三.实验内容
自编一个汇编小程序,使用Keil
uv2软件开发环境,进行编译、调试、运行程序。
Keil
uv2
操作流程的简单说明:
1.
NEW
PROJECT
↙,建一个新的项目,取项目名并存于F:盘下(最好在F盘下建一个自己的文件夹)。在出现的对
话框中选Atmel/AT89c51
芯片型号;或者可以从File/
devices
database
的对话框中选择芯片型号。
2.
FILE/
NEW
↙,建立一个新文件,在打开的窗口下输入程序,取文件名并存盘。
3.
选中Source
Group1点击鼠标右键,在出现的菜单中选中
Add
Files
to
Group
`
Source
Group1`,将文件加入到项目中。
4.
选中Target1点击鼠标右键,在出现的菜单中选中Options
for
Target
`
Target1`:
l
在出现的对话框中打开output项的对话框,选中`Great
HEX
File`,以保证编译时能生成.HEX文件,为后续下载程序做准备。
l
在出现的对话框中打开debug项的对话框,选中`Use
“keil
monitor
51-driver”,并将其下的选项均选中系统处于在线下载调试状态。。
5.
Project/Build
target或Rebuild
all
target
files,编译所输入的程序,检查语法错误,更改错误直至无错为止。
6.
Debug/
‘Start/Stop
Debug
Session’
↙,开始调试程序,单步或断点运行程序额,检查逻辑错误。
4.
实验程序
#include
unsigned
int
code
chOriginalSet[10]={30,30,550,30,8,30,550,30,8,1};
/*阀序时间间隔设置*/
unsigned
char
code
chFarXu[9]={0x00,0x51,0x55,0x45,0x80,0x62,0x6a,0x4a,0x80};
/*阀序*/
void
delay(unsigned
int
times);
main()
{
unsigned
char
i;
while(1)
{
for(i=1;i
#include
typedef
unsigned
char
Byte;
BytedataAA;
voidOUT(void)
{
SBUF=AA;/*发送字符子程序*/
wait:if(TI==1)
{
TI=0;
goto
end1;
}/*发送完毕返回*/
gotowait;/*否则等待TI=1*/
end1:_nop_();
}
void
IN(void)
{
in1:if(RI==1)
{
RI=0;
goto
end2;
}/*接收到字符(RI=1)时启动接收*/
goto
in1;/*否则查询是否接收到字符*/
end2:AA=SBUF;/*启动接收*/
}
voidmain(void)
{
TH1=0xF3;/*设置波特率为2400*/
TL1=0xF3;/*设置波特率为2400*/
TMOD=0x20;/*选择计时器1方式2产生波特率*/
IE=0;/*禁止所有的中断,采用查询方式*/
SCON=0x50;/*设置串口为方式1,接收允许*/
TR1=1;/*启动定时器1*/
AGAIN:IN();/*接收字符子程序*/
OUT();/*回送字符子程序*/
goto
AGAIN;/*循环*/
}
7.
实验截图
实验三
V/F转换电路实验
1、
实验内容
V/F转换电路的调试。
2、
实验要求
1、
在了解LM331工作原理(转换原理)的基础上,考虑以下几个问题:输入电压范围;输出频率范围;输入和输出间的对应关系。
2、
调试电路,直至V/F转换器可以正确输出波形。如果V/F转换器没有输出或输出波形不理想,请分析查找原因,并将波形调至等占空比。
3、
用示波器、频率计等工具观察V/F转换器的输出波形,观察定标调整环节W1,W2和W3对波形的影响。
4、
通过实测数据分析V/F转换器的线性,画出实际的V、F对应关系。
3、
实验电路图
四、实验数据处理
V(V)
4.973
4.029
3.500
3.005
2.499
1.999
1.504
1.001
0.502
F(Hz)
6.64
5.38
4.63
4.00
3.32
2.66
2.00
1.32
0.67
实验四
V/F转换的数据采集
一.
实验内容
连线并编制程序:使用定时器和计数器完成
LM331脉冲输出信号的采集功能,
对采集的数据进行处理,最终得到频率值。
二.
实验目的
1.
定时器中断的使用;
2.
学习定时器中断间隔时间的计算;
3.
掌握计数器的使用方法;
4.
学习中断处理程序的编程方法。
三.
原理简述
1.定时器/计数器的输入脉冲周期与机器周期一样,为振荡器频率的1/12。本实验中时钟频率为12M,现要采用中断方法来实现1秒延时,要在定时器1中设置一个时间常数,使其每隔0.05秒产生一次中断,CPU响应中断后R0中计数值减一,令(R0)=14H,即可实现1秒的延时,
时间常数可按下法确定:
机器周期=12/晶振频率=12/12=1uS
定时器需设初值为X,则(2^16—X)*1=50000uS
求出X=15536
化为十六进制:X=3CB0H,故初始值为:TH1=3CH,TL1=B0H。
2.
初始化程序
包括定时器初始化和中断系统初始化,主要对IP,IE,TCON,TMOD的相应位进行正确的设置,并将时间常数送入定时器中。由于只有定时器中断,IP不必设置。
注意一点:定时器1初始化时建议用如下的指令:
ANLTMOD,#0FH
ORLTMOD,#10H
3.
设计中断服务程序和主程序
中断服务程序除了要完成计数减1工作外,还要将时间常数重新送入定时器中,为下一次中断做准备。主程序则对计数器的数值进行处理,转换成频率值。
实验五
7279键盘显示控制实验
一.
实验题目
连线并编制程序,将HD7279A的全部编码送HD7279A显示,以一秒钟为间隔显示下一位,以前的显示内容左移。
二.
实验目的
1.
了解HD7279A键盘显示芯片的基本应用;
2.
掌握HD7279A键盘显示芯片的接口电路及编程方法。
三.
原理简述
HD7279A是一片具有串行接口的,可同时驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示、键盘接口的全部功能。
HD7279A内部含有译码器,可直接接受BCD码或16进制码,并同时具有2种译码方式,此外还有多种控制命令,如消隐、闪烁、左移、右移、段寻址等。命令的具体形式可查阅HD7279A相关的技术资料。
四.
实验电路
五.
连线方法
电路单元
2单元
6单元
8单元
9单元
连接一
P1.2-P1.5
DATA,/KEY,/CS,/CLK
(JP38.2-JP38.5)
连接二
左边的DG0-DG5
6G-1G
连接三
SA-DP
B7-B0
连接四
右边的DG0-DG3
C0-C3
连接五
SA-SC
C4-C6
连接六
JP16跳线接GND
另外,在实验之前,应将8单元的U7(7406)和U6(74LS245)芯片取下,因7279已经有直接驱动数码管的能力,如果另外放置驱动芯片,反而会影响数码管的显示效果。
六.
实验程序
程序清单(C51):
#include/*C51内部资源定义*/
#include
typedef
unsigned
char
Byte;/*下面的程序中用Byte代替unsigned
char*/
bdata
Byte
BIT_COUNT,TIMER,TIMER1,TEN,DATA_IN,DATA_OUT,AA,BB;
sbit
data_in0=DATA_IN^0;
sbit
data_out7=DATA_OUT^7;
sbit
DAT=P1^2;/*HD7279A的DATA连接于P1.2*/
sbit
KEY=P1^3;/*HD7279A的KEY(键盘中断信号)连接于P1.3*/
sbit
CS=P1^4;/*HD7279A的CS(片选信号)连接于P1.4*/
sbit
CLK=P1^5;/*HD7279A的CLK连接于P1.5*/
void
SEND(void);/*发送*/
void
LONG_DELAY(void);/*长延时*/
void
SHORT_DELAY(void);/*短延时*/
void
RECEIVE(void);/*接收*/
void
main(void)/*主程序*/
{
START:_nop_();/*启动,短延时几微秒*/
P1=0xDB;
/*给P1赋值0xDB*/
TIMER=50;/*定时50秒*/
START_DELAY:TIMER1=255;/*定时255秒*/
START_DELAY1:TIMER1--;/**/
if(TIMER1>0)
goto
START_DELAY1;/*如果TIMER1大于0跳转到START_DELAY1*/
TIMER--;/**/
if(TIMER>0)
goto
START_DELAY;/*如果TIMER大于0跳转到START_DELAY*/
DATA_OUT=0xA4;
/*给DATA_OUT赋值0xA4*/
SEND();
/*发送数据*/
CS=1;
/*片选置1*/
MAIN1:if(KEY==1)
goto
MAIN1;
/*如果键盘中断信号为1,跳转到MAIN1*/
DATA_OUT=0x15;
/*DATA_OUT赋值0x15*/
SEND();
/*发送*/
RECEIVE();
/*接收*/
CS=1;
/*片选为1*/
AA=DATA_IN;
/*给AA赋值DATA_IN*/
if(AA==6)BB=1;/*如果AA为6,BB为1*/
if(AA==5)BB=2;/*如果AA为5,BB为2*/
if(AA==4)BB=3;/*如果AA为4,BB为3*/
if(AA==14)BB=4;/*如果AA为14,BB为4*/
if(AA==13)BB=5;/*如果AA为13,BB为5*/
if(AA==12)BB=6;/*如果AA为12,BB为6*/
if(AA==22)BB=7;/*如果AA为22,BB为7*/
if(AA==21)BB=8;/*如果AA为21,BB为8*/
if(AA==20)BB=9;/*如果AA为20,BB为9*/
if(AA==30)BB=11;/*如果AA为30,BB为11*/
if(AA==29)BB=0;/*如果AA为29,BB为0*/
if(AA==28)BB=12;/*如果AA为28,BB为12*/
TEN=0;/*MOVTEN,A*/
DATA_OUT=0xA1;/*MOVDATA_OUT,#10100001B*/
SEND();/*CALLSEND*/
DATA_OUT=0xA1;/*MOVDATA_OUT,#10100001B*/
SEND();/*CALLSEND*/
DATA_OUT=0x81;/*MOVDATA_OUT,#10000001B*/
SEND();/*CALLSEND*/
DATA_OUT=TEN;/*MOVDATA_OUT,TEN*/
SEND();/*CALLSEND*/
DATA_OUT=0x80;/*MOVDATA_OUT,#10000000B*/
SEND();/*CALLSEND*/
DATA_OUT=BB;/*MOVDATA_OUT,B*/
SEND();/*CALLSEND*/
CS=1;
/*片选信号置1*/
WAIT:if(KEY==0)
goto
WAIT;
goto
MAIN1;
/*如果KEY为0,跳转到WAIT,否则跳转到MAIN1*/
}
void
SEND(void)
/*发送子程序*/
{
BIT_COUNT=8;
/*统计为8*/
CS=0;
/*片选置0*/
LONG_DELAY();
/*长延时*/
SEND_LOOP:CY=data_out7;
/*发送循环*/
DAT=CY;
/*引脚的状态*/
CLK=1;
/*时钟信号为1*/
AA=DATA_OUT;
/*给AA赋值DATA_OUT*/
AA=_crol_(AA,1);/*_crol_函数在这里是把左边的一个零移到右边*/
DATA_OUT=AA;/*给DATA_OUT赋值AA*/
SHORT_DELAY();
/*短延时*/
CLK=0;/*时钟信号为0*/
SHORT_DELAY;/*短延时*/
BIT_COUNT--;
if(BIT_COUNT>0)
goto
SEND_LOOP;/*DJNZBIT_COUNT,SEND_LOOP;
DAT=0;/*将DAT清0*/
}
void
LONG_DELAY(void)/*长延时子程序*/
{
TIMER=25;
/*定时25秒*/
DELAY_LOOP:TIMER--;/*延时循环*/
if(TIMER>0)
goto
DELAY_LOOP;/*如果TIMER大于0,跳转到DELAY_LOOP*/
}/*RET*/
void
SHORT_DELAY(void)/*短延时子程序*/
{
TIMER=4;/*MOVTIMER,#4;
/**/
DELAY_LOOP1:TIMER--;/*延时循环*/
if(TIMER>0)
goto
DELAY_LOOP1;/*如果TIMER大于0,跳转到DELAY_LOOP1*/
}
void
RECEIVE(void)/*接收子程序*/
{
BIT_COUNT=8;/*MOVBIT_COUNT,#8*/
DAT=1;/*SETBDAT*/
LONG_DELAY();/*CALLLONG_DELAY*/
RECEIVE_LOOP:CLK=1;/*SETBCLK*/
SHORT_DELAY();/*CALLSHORT_DELAY*/
AA=DATA_IN;/*MOVA,DATA_IN*/
AA=_crol_(AA,1);/*RLAA*/
DATA_IN=AA;/*MOVDATA_IN,A*/
CY=DAT;/*MOVC,DAT*/
data_in0=CY;/*MOVDATA_IN.0,C*/
CLK=0;/*CLRCLK*/
SHORT_DELAY();/*CALLSHORT_DELAY*/
BIT_COUNT--;/**/
if(BIT_COUNT>0)
goto
RECEIVE_LOOP;/*如果BIT_COUNT大于0,跳转到DELAY_LOOP*/
DAT=0;/*CLR
DAT*/
}
七.
实验截图
实验六
电机调速控制实验
一.
实验内容
连线并编制程序,产生脉冲信号,控制直流电动机的运行。
二.
实验目的
1.
掌握采用单片机控制直流电动机的硬件接口技术。
2.
掌握直流电动机驱动程序的设计与调试方法。
3.
熟悉直流电动机的工作特性。
三.
实验电路
4.
连线方法
电路单元
2单元
电机单元
电机单元
连接一
P10-P13
AD4-AD7
连接二
GND
CS1
连接三
GND
GND(有跳线)
连接四
VCC
VCC(有跳线)
5.
实验程序
#include
typedef
unsigned
char
Byte;
sbit
PAA=P1^0;
sbit
PBB=P1^2;
sbit
PCC=P1^1;
sbit
PDD=P1^3;//设置引脚
void
DelayXms()//延时程序
{
int
i,j;
for(i=0;i
#include
int
f,f0;
void
main()
{
TMOD=0X51;
TH0=0X9E;
TL0=0X58;
TH1=0X00;
TL1=0X00;
ET0=1;
EA=1;
TR0=1;
TR1=1;
while(1);
}
void
time1()
interrupt
1
using
2
{
EA=0;
TR0=0;
TR1=0;
f=TL1+TH1*256;
f0=f*2;
}
八.
实验截图
实验八
微型打印机接口控制实验
一.
实验内容:
将实验仪接上微型打印机,控制打印机打印出各种效果的汉字和字符。
二.
实验目的:
1.
了解微型打印机接口及其打印字符的方法;
2.
了解微型打印机打印汉字的方法;
3.
了解单片机与微型打印机的连线方法。
三.
有关说明:
l
并行接口连接
接口与引脚定义:本系列打印机并口与CENTRONICS
兼容,支持BUSY/ACK
握手协议,接口插座如下图:
并行接口各引脚信号的定义如下图表所示:
注:
1.“入”表示输入到打印机。
2.“出”表示从打印机输出。
3.信号的逻辑电平为TTL
电平。
l
并行接口引脚信号时序
并口时序如下图所示:
四.
实验电路:
五.
连线方法:
电路单元
第2单元
打印机
连接1
P0.0-P0.7
Data1-Data8(3,5,7,9,11,13,15,17)
连接2
P3.7
/STB(1)
连接3
P3.2(INT0)
BUSY(21)
连接4
Gnd
18
六.
实验程序
l
单片机控制打印机时汇编例程
BUSY
EQU
P3.2
;
定义BUSY
信号引脚
nSTB
EQU
P3.7
;
定义nSTB
信号引脚
JB
BUSY,$
;
等待打印机到空闲
MOV
P1,A
;
送数据到数据口
CLR
nSTB
;
置nSTB
为低电平
NOP
;
延长nSTB
信号脉冲宽度以满足时序要求
nop
nop
SETB
nSTB
;
置nSTB
为高电平(此时数据将被读入打印机)
RET
print_content:
DB
北京炜煌
DB
0dh
END
l
单片机C51
例程
//
北京炜煌科技打印机示例程序
//
Nocky
Tian
//
2007-07-17
#include
//
Hardware
configuration
#define
PRINTER_DATA
P1
//
定义打印机数据线端口
sbit
BUSY
=
P3^2;
//
定义打印机忙信号引脚
sbit
nSTB
=
P3^7;
//
定义打印机nSTB
信号引脚
sbit
PE
=
P3^3;
//
定义打印机纸状态检测信号引脚
sbit
nACK
=
P3^2;
//
定义打印机应答信号引脚
sbit
nERR
=
P3^1;
//
定义打印机错误检测信号引脚
sbit
nSEL
=
P3^0;
//
定义打印机在线检测信号引脚
#define
CR
0x0d
#define
LF
0x0a
void
PrintByte(unsigned
char
byte_data);
void
PrintString(char*
str);
void
PrintByteN(unsigned
char*
data_src,unsigned
char
N);
void
main(void)
{
char
str[]
=
“Printer
demo“;
PrintString(“北京炜煌WH“);
PrintByte(CR);
while(1);
}
/*
PrintByte()
Send
a
byte
to
printer
Nocky
Tian
@
2006-7-17/
#include
void
PrintByte(unsigned
char
byte_data)
{
while(
BUSY
==
1
){
}
PRINTER_DATA
=
byte_data;
nSTB
=
0;
_nop_();
//
调整nSTB
信号脉宽
nSTB
=
1;
}
/*
PrintString()
a
string
which
is
ending
with
a
/0
character
To
Excuted
the
command
a
addition
CR
character
is
needed
Nocky
Tian
@
2006-7-17/
void
PrintString(char*
str)
{
while(str
){
PrintByte((str++));
}
}
/*
PrintByteN()
N
bytes
through
printer
no
more
than
255
bytes
could
be
printed
by
the
function
If
more
than
255
bytes
need
printing,the
type
of
N
need
changing
to
unsigned
int,even
unsigned
long
if
necessary.
Nocky
Tian
@
2006-07-17/
void
PrintByteN(
unsigned
char*
data_src,//
pointer
to
data
source
unsigned
char
N)
//
number
of
data(byte)
{
while(
N--){
PrintByte(*(data_src++));
}
}
七.
实验截图