计算机控制技术课程设计文档格式.docx
《计算机控制技术课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《计算机控制技术课程设计文档格式.docx(40页珍藏版)》请在冰豆网上搜索。
四、设计仪器、设备和材料清单
主要仪器设备:
个人计算机和相关的软件
主要元器件:
独立按键18个
单片机芯片AT80C51一片
12MHz晶振一个
2N3906三极管一个
不同阻值电阻数个
开关一个
USB电源插口一个
喇叭一个
不同数值电容数个
电路板一块
五、主要原件功能
(1)AT89C51单片机及其引脚说明
AT89C51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89S51
主要特性:
·
8031CPU与MCS-51兼容
4K字节可编程FLASH存储器(寿命:
1000写/擦循环)
全静态工作:
0Hz-24KH·
三级程序存储器保密锁定
128*8位内部RAM
32条可编程I/O线
两个16位定时器/计数器
6个中断源
可编程串行通道
低功耗的闲置和掉电模式
片内振荡器和时钟电路
(2)、4X4行列式键盘识别及显示
组成键盘的按键有机械式、电容式、导电橡胶式、薄膜式多种,但不管什么形式,其作用都是一个使电路接通与断开的开关。
目前微机系统中使用的键盘按其功能不同,通常可分为编码键盘和非编码键盘两种基本类型。
编码键盘:
键盘本身带有实现接口主要功能所需的硬件电路。
不仅能自动检测被按下的键,并完成去抖动、防串键等功能,而且能提供与被按键功能对应的键码(如ASCII码)送往CPU。
所以,编码键盘接口简单、使用方便。
但由于硬件电路较复杂,因而价格较贵。
非编码键盘:
键盘只简单地提供按键开关的行列矩阵。
有关按键的识别、键码的确定与输入、去抖动等功能均由软件完成。
目前微机系统中,一般为了降低成本大多数采用非编码键盘。
键盘接口必须具有去抖动、防串键、按键识别和键码产生4个基本功能。
(1)去抖动:
每个按键在按下或松开时,都会产生短时间的抖动。
抖动的持续时间与键的质量相关,一般为5—20mm。
所谓抖动是指在识别被按键是必须避开抖动状态,只有处在稳定接通或稳定断开状态才能保证识别正确无误。
去抖问
1.题可通过软件延时或硬件电路解决。
(2)防串键:
防串键是为了解决多个键同时按下或者前一按键没有释放又有新的按键按下时产生的问题。
常用的方法有双键锁定和N键轮回两种方法。
双键锁定,是当有两个或两个以上的按键按下时,只把最后释放的键当作有效键并产生相应的键码。
N键轮回,是当检测到有多个键被按下时,能根据发现它们的顺序依次产生相应键的键码。
(3)被按键识别:
如何识别被按键是接口解决的主要问题,一般可通过软硬结合的方法完成。
常用的方法有行扫描法和线反转法两种。
行扫描法的基本思想是,由程序对键盘逐行扫描,通过检测到的列输出状态来确定闭合键,为此,需要设置入口、输出口一个,该方法在微机系统中被广泛使用。
线反转法的基本思想是通过行列颠倒两次扫描来识别闭合键,为此需要提供两个可编程的双向输入/输出端口。
(4)键码产生:
为了从键的行列坐标编码得到反映键功能的键码,一般在内存区中建立一个键盘编码表,通过查表获得被按键的键码。
2.用AT89S51的并行口P0接4×
4矩阵键盘,以P0.0-P0.3作输入线,以P0.4-P0.7作输出线;
在数码管上显示每个按键的“0-F”序号。
六、设计简单原理介绍
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。
利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。
就可在P1.0引脚上得到此频率的脉冲。
利用AT89C51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。
计数脉冲值与频率的关系式(如式3-1所示)是:
N=fi÷
2÷
fr3-1
式中,N是计数值;
fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);
fr是想要产生的频率。
其计数初值T的求法如下:
T=65536-N=65536-fi÷
fr
例如:
设K=65536,fi=1MHz,DO(523Hz)的计数值。
fr=65536-1000000÷
fr=65536-500000/f
DO的T=65536-500000/523=64580
单片机12MHZ晶振,高中低音符与计数T0相关的计数值如表4-2所示
表3-2音符频率表
低音音符
频率HZ
中音音符
高音音符
1
261.63
523.25
1045.5
2
293.67
587.33
1174.66
3
329.63
659.46
1318.51
4
349.23
698.46
1396.92
5
391.99
738.99
1567.98
6
440.00
880.00
1760.00
7
493.88
987.76
1975.52
我们要为这个音符建立一个表格,单片机通过查表的方式来获得相应的数据
低音0-19之间,中音在20-39之间,高音在40-59之间
TABLE:
DW0,63628,63835,64021,64103,64260,64400,64524,0,0
DW0,63731,63928,0,64185,64331,64463,0,0,0
DW0,64580,64684,64777,64820,64898,64968,65030,0,0
DW0,64633,64732,0,64860,64934,64994,0,0,0
DW0,65058,65110,65157,65178,65217,65252,65283,0,0
DW0,65085,65134,0,65198,65235,65268,0,0,0
DW0
在这个程序中,弹奏音乐的程序是用定时/计数器T0来完成的,播放音乐程序则是用定时/计数器T1来完成的。
七、设计的主要流程
(1)软件总体方案及设计流程
1)键盘扫描程序:
检测是否有键按下,有键按下则记录按下键的键值,并跳转至功能转移程序;
无键按下,则返回键盘扫描程序继续检测
2)功能转移程序:
对检测到得按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有两种,即音色调节功能和自动播放乐曲功能
3)琴键处理程序:
根据检测到得按键值,查询音律表,给计时器赋值,使发出相应频率的声音
4)自动播放歌曲程序:
检测到按键按下的是自动播放歌曲功能键后执行该程序,电子琴会自动播放事先已经存放好的歌曲,歌曲播放完毕之后自动返回至键盘扫描程序,继续等待是否有键按下
(2)程序简易流程图
1)主程序:
开始
键盘扫描程序
T0初始化并开中断允许T0中断
T1初始化并开中断允许T1中断
有键按下否
否
延时去抖动
识别按键功能
是
是否弹奏键
播放键
取相应的音符码装入T1
根据按键功能装入相应音符值到T0
启动T1
启动T0
按键释放成功否
停止T0工作
停止T1工作
2)弹奏程序流程图:
弹奏子程序
开中断并允许中断设定定时器工作方式
取键值
根据键值查音律表
给定时器T0赋值
开始计时
进入中断
CPLP3.0P3.0
退出中断
延时
返回键盘扫描程序
3)自动播放歌曲程序流程图:
自动播放音乐程序
A<
<
0,DPTR<
歌谱地址
开中断,设定定时器T1工作模式
取简谱码
取该音符的节拍码
STOP
A=0
Y
N
休止符
返回键盘扫描
A=0FFH
查音律表,给定时器赋值
INCDPTR
CPL3.0
(3)电路设计原理图如下:
(4)、PCB电路图如下:
(5)、设计源程序
PORT1EQUP1
PORT2EQUP2
SCKBITP3.0
SDABITP3.1
ORG0H
SJMPMAIN
ORG0BH
LJMPTIME0
ORG1BH
LJMPTIME1
ORG30H
MAIN:
CLRTR0
CLRTR1
MOVSP,#4FH
MOVR0,#100
CLRP3.4
LCALLDELAY5
MOV9H,#0
MOV0AH,#0
MOV0BH,#0
MOV0CH,#0
MOVTMOD,#11H
MOVIE,#8AH
MOV0DH,#88H
XIAN:
JBP3.2,QT1;
没按下放歌建跳qt1
SETBP3.4;
按下放歌建LED发光
LCALLDELAY1
JNBP3.2,$;
放歌建没释放原地等待
Q1:
LCALLSAO
CJNER0,#0,Q11
SJMPQ1
Q11:
LCALLTRANF
JZMAIN
MOV0DH,A;
0DH=按键值
LJMPSING0
QT1:
JBP3.3,QT4;
没按弹奏建跳QT3
SETBP3.4
JNBP3.3,$;
弹奏键没释放原地等待
QT2:
CJNER0,#0,QT3
SJMPQT2
QT3:
LCALLTRANF
CJNEA,#0BH,QT11;
若按键值=11转(B键)MAIN;
!
=11键转QT11
LJMPMAIN
QT11:
JCMAIN;
若按键值<
11转MAIN;
>
11继续
CJNEA,#0CH,M4;
若按键值!
=12转M1;
=12(C键)继续;
即C键没按下转M1
MOVPORT1,#11101111B
JNBP1.3,$;
若C键没释放原地等待
LJMPLOOP;
输入乐曲存储并演奏
M4:
LCALLRWX80;
擦写内存数据;
全部为1
LJMPMAIN
QT4:
LJMPXIAN;
返回重新扫描放歌和弹奏建
RWX80:
CJNEA,#0DH,MM2;
A!
=13(D键)转M2;
若为D键继续;
D键没按下转M2
MOV0EH,#0A2H;
0EH=162=10100010B;
0EH为24c16页地址
SJMPMM
MM2:
CJNEA,#0EH,MM3;
=14(E键)转M3;
E键没按下转M3
MOV0EH,#0A4H;
0EH=164=10100100B
SJMPMM
MM3:
MOV0EH,#0A6H;
F键按下;
0EH=166=10100110B
MM:
MOV0CH,#0H
RWX801:
LCALLRKX02
LCALLWKX02
INC0BH
MOVA,0BH
CJNEA,#0FFH,MM4
MM4:
INC0CH
CJNEA,#0H,RWX801
RET;
RKX02:
LCALLSTART
MOVA,#0A0H;
24C16寻址10100000写
LCALLWRBYT
LCALLTACK
MOVA,0BH;
发送24c16子地址
MOVA,#0A1H;
24C16寻址10100001读
;
LCALLWRBYT
LCALLTACK
MOV10H,R6
LCALLRDBYT
LCALLNOTACK
MOV11H,R6
MOV12H,R6
MOV13H,R6
LCALLSTOP
WKX02:
MOVR1,#10H
MOVA,#0A0H
MOVA,0CH
MOVR0,#4
WKX021:
MOVA,@R1
INCR1
DJNZR0,WKX021
LOOP:
AAA:
JBP3.3,LOOP4;
弹奏键按下向下执行存储乐曲并演奏否则转LOOP4继续输入乐曲
LCALLWBAY;
存00结束乐谱
MOV0DH,#12
LJMPSING0;
播放弹奏的乐曲
LOOP4:
CJNER0,#0,KEYIN
LJMPLOOP
KEYIN:
SWAPA
MOV09H,A
CJNEA,#0,ZZZ;
非0键转ZZZ
LJMPZZZZ;
0键转ZZZZ
ZZZ:
DECA;
A为按键值;
因从1键值音调序号对应TABLE频率表0位置;
故减1
MOV22H,A;
22H存修正后(A=A-1)的按键值
CLRC
RLCA;
A*2因TABLE一个单元为2字节(1字),指向该单元的第1个字节
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVTH1,A;
TH1赋初值
MOV21H,A;
TH1初值存21H
MOVA,22H
A*2因TABLE一个单元为2字节(1字)
INCA;
指向该单元的第2个字节
MOVTL1,A;
TL1赋初值
MOV20H,A;
TL1初值存20H
MOVTH0,#0C2H
MOVTL0,#0F6H
SETBTR0
SETBTR1
ZZZZ:
MOVA,PORT1
ORLA,#0F0H
CJNEA,#0FFH,ZZZZ
MOVA,0AH;
弹奏乐谱频率延迟值赋A
RRCA
RRCA;
弹奏乐谱频率延迟值/8
CJNEA,#0FH,NODE
SJMPDDD
NODE:
JCDDD
MOVA,#0FH;
弹奏乐谱频率延迟值/8后;
若>
15则=15
DDD:
ORL09H,A;
WWW:
MOVA,09H
MOV0CH,A
LCALLWBAY
LJMPLOOP;
频率延时
DELAY:
MOVR7,#125
DLY2:
MOVR4,#02
DLY3:
MOVR3,#248
DJNZR3,$
DJNZR4,DLY3
DJNZR7,DLY2
DJNZR5,DELAY
RET
DELAY1:
MOVR7,#30
MOVR6,#0
S1:
DJNZR6,$
DJNZR7,S1
DELAY5:
MOVR7,#10
S5:
DJNZR7,S5
SAO:
MOVR3,#11101111B
MOVR2,#11111111B
NLINE1:
MOVA,R3
MOVPORT1,A
CJNEA,#0FFH,KEYIN1
RLA
MOVR3,A
DJNZR0,NLINE1
KEYIN1:
LCALLNOPEN
RET
NOPEN:
MOVR2,A
CJNEA,#0FFH,NOPEN1
SJMPNOPEN
NOPEN1:
TRANF:
MOVB,#0
MOVA,R2
C1:
JNCC2;
C=0跳C2
INCB
INCB;
B=B+4
LJMPC1
C2:
RRA
C3:
JNCC4
LJMPC3
C4:
MOVA,B;
B为按键值
SING0:
MOV30H,#00H;
30H为TABLE1~11地址计数器
NEXT:
MOVA,0DH
CJNEA,#1,NN1
MOVDPTR,#TABLE1
LJMPWW
NN1:
CJNEA,#2,NN2
MOVDPTR,#TABLE2
NN2:
CJNEA,#3,NN3
MOVDPTR,#TABLE3
NN3:
CJNEA,#4,NN4
MOVDPTR,#TABLE4
NN4:
CJNEA,#5,NN5
MOVDPTR,#TABLE5
NN5:
CJNEA,#6,NN6
MOVDPTR,#TABLE6
NN6:
CJNEA,#7,NN7
MOVDPTR,#TABLE7
NN7:
CJNEA,#8,NN8
MOVDPTR,#TABLE8
NN8:
CJNEA,#9,NN9
MOVDPTR,#TABLE9