单片机高级实训项目教程I.docx
- 文档编号:4629226
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:27
- 大小:281.54KB
单片机高级实训项目教程I.docx
《单片机高级实训项目教程I.docx》由会员分享,可在线阅读,更多相关《单片机高级实训项目教程I.docx(27页珍藏版)》请在冰豆网上搜索。
单片机高级实训项目教程I
21.拉幕式数码显示技术
1.实验任务
用AT89S51单片机的P0.0/AD0-P0.7/AD7端口接数码管的a-h端,8位数码管
的S1-S8通过74LS138译码器的Y0-Y7来控制选通每个数码管的位选端。
AT89S51单片机的P1.0-P1.2控制74LS138的A,B,C端子。
在8位数码管上
从右向左循环显示“”。
能够比较平滑地看到拉幕的效果。
2.电路原理图
图4.21.1
3.系统板上硬件连线
(1.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7用8芯排线连接到“动
态数码显示”区域中的a-h端口上;
(2.把“三八译码模块”区域中的Y0-Y7用8芯排线连接到“动态数码显示”
区域中的S1-S8端口上;
(3.把“单片机系统”区域中的P1.0-P1.2端口用3根导线连接到“三八译
码模块”区域中的A、B、C“端口上;
4.程序设计方法
(1.动态数码显示技术;如何进行动态扫描,由于一次只能让一个数码管
显示,因此,要显示8位的数据,必须经过让数码管一个一个轮流显
示才可以,同时每个数码管显示的时间大约在1ms到4ms之间,所以
为了保证正确显示,我必须每隔1ms,就得刷新一个数码管。
而这刷
新时间我们采用单片机的定时/计数器T0来控制,每定时1ms对数码
管刷新一次,T0采用方式2。
(2.在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显
示缓冲区装有显示的不同数据即可。
5.程序框图
主程序框图
中断服务程序框图
图4.21.2
6.汇编源程序
DISPBUFEQU30H
DISPCNTEQU38H
DISPBITEQU39H
T1CNTAEQU3AH
T1CNTBEQU3BH
CNTEQU3CH
ORG00H
LJMPSTART
ORG0BH
LJMPINT_T0
START:
MOVDISPCNT,#8
MOVA,#10
MOVR1,#DISPBUF
LP:
MOV@R1,A
INCR1
DJNZDISPCNT,LP
MOVDISPBIT,#00H
MOVT1CNTA,#00H
MOVT1CNTB,#00H
MOVCNT,#00H
MOVTMOD,#01H
MOVTH0,#(65536-1000)/256
MOVTL0,#(65536-1000)MOD256
SETBTR0
SETBET0
SETBEA
SJMP$
INT_T0:
MOVTH0,#(65536-1000)/256
MOVTL0,#(65536-1000)MOD256
MOVA,DISPBIT
ADDA,#DISPBUF
MOVR0,A
MOVA,@R0
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
MOVA,P1
ANLA,#0F8H
ADDA,DISPBIT
MOVP1,A
INCDISPBIT
MOVA,DISPBIT
CJNEA,#08H,NEXT
MOVDISPBIT,#00H
NEXT:
INCT1CNTA
MOVA,T1CNTA
CJNEA,#50,LL1
MOVT1CNTA,#00H
INCT1CNTB
MOVA,T1CNTB
CJNEA,#8,LL1
MOVT1CNTB,#00H
INCCNT
MOVA,CNT
CJNEA,#9,LLX
MOVCNT,#00H
MOVA,CNT
LLX:
CJNEA,#01H,NEX1
MOV30H,#8
LL1:
LJMPDONE
NEX1:
CJNEA,#02H,NEX2
MOV31H,#8
MOV30H,#8
LJMPDONE
NEX2:
CJNEA,#03H,NEX3
MOV32H,#8
MOV31H,#8
MOV30H,#8
LJMPDONE
NEX3:
CJNEA,#04H,NEX4
MOV33H,#8
MOV32H,#8
MOV31H,#8
MOV30H,#8
LJMPDONE
NEX4:
CJNEA,#05H,NEX5
MOV34H,#8
MOV33H,#8
MOV32H,#8
MOV31H,#8
MOV30H,#8
LJMPDONE
NEX5:
CJNEA,#06H,NEX6
MOV35H,#8
MOV34H,#8
MOV33H,#8
MOV32H,#8
MOV31H,#8
MOV30H,#8
LJMPDONE
NEX6:
CJNEA,#07H,NEX7
MOV36H,#8
MOV35H,#8
MOV34H,#8
MOV33H,#8
MOV32H,#8
MOV31H,#8
MOV30H,#8
LJMPDONE
NEX7:
CJNEA,#08H,NEX8
MOV37H,#8
MOV36H,#8
MOV35H,#8
MOV34H,#8
MOV33H,#8
MOV32H,#8
MOV31H,#8
MOV30H,#8
LJMPDONE
NEX8:
CJNEA,#00H,DONE
MOV37H,#10
MOV36H,#10
MOV35H,#10
MOV34H,#10
MOV33H,#10
MOV32H,#10
MOV31H,#10
MOV30H,#10
LL:
LJMPDONE
DONE:
RETI
TABLE:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H
END
7.C语言源程序
#include
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsignedchardispbitcode[]={0xf8,0xf9,0xfa,0xfb,
0xfc,0xfd,0xfe,0xff};
unsignedchardispbuf[8]={16,16,16,16,16,16,16,16};
unsignedchardispbitcnt;
unsignedintt02scnt;
unsignedchart5mscnt;
unsignedcharu;
unsignedchari;
voidmain(void)
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
while
(1);
}
voidt0(void)interrupt1using0
{
t5mscnt++;
if(t5mscnt4)
{
t5mscnt=0;
P0=dispcode[dispbuf[dispbitcnt]];
P1=dispbitcode[dispbitcnt];
dispbitcnt++;
if(dispbitcnt8)
{
dispbitcnt=0;
}
}
t02scnt++;
if(t02scnt1600)
{
t02scnt=0;
u++;
if(u9)
{
u=0;
}
for(i=0;i<8;i++)
{
dispbuf[i]=16;
}
for(i=0;i
{
dispbuf[i]=8;
}
}
}22.电子琴
1.实验任务
(1.由4X4组成16个按钮矩阵,设计成16个音。
(2.可随意弹奏想要表达的音乐。
2.电路原理图
图4.22.1
3.系统板硬件连线
(1.把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区
域中的SPKIN端口上;
(2.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行
列式键盘”区域中的C1-C4R1-R4端口上;
4.相关程序内容
(1.4X4行列式键盘识别;
(2.音乐产生的方法;
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我
们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片
机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这
样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
现在以单片机12MHZ晶振为例,例出高中低音符与单片机计数T0相关的计数值
如下表所示
音符频率(HZ)简谱码(T值)音符频率(HZ)简谱码(T值)
低1DO26263628#4FA#74064860
#1DO#27763731中5SO78464898
低2RE29463835#5SO#83164934
#2RE#31163928中6LA88064968
低3M33064021#693264994
低4FA34964103中7SI98865030
#4FA#37064185高1DO104665058
低5SO39264260#1DO#110965085
#5SO#41564331高2RE117565110
低6LA44064400#2RE#124565134
#646664463高3M131865157
低7SI49464524高4FA139765178
中1DO52364580#4FA#148065198
#1DO#55464633高5SO156865217
中2RE58764684#5SO#166165235
#2RE#62264732高6LA176065252
中3M65964777#6186565268
中4FA69864820高7SI196765283
下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应
的数据
低音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
2、音乐的音拍,一个节拍为单位(C调)
曲调值DELAY曲调值DELAY
调4/4125ms调4/462ms
调3/4187ms调3/494ms
调2/4250ms调2/4125ms
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。
下面就用AT89S51单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。
在这个程序中用到了两个定时/计数器来完成的。
其中T0用来产生音符频率,T1
用来产生音拍。
5.程序框图
图4.22.2
6.汇编源程序
KEYBUFEQU30H
STH0EQU31H
STL0EQU32H
TEMPEQU33H
ORG00H
LJMPSTART
ORG0BH
LJMPINT_T0
START:
MOVTMOD,#01H
SETBET0
SETBEA
WAIT:
MOVP3,#0FFH
CLRP3.4
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY1
LCALLDELY10MS
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY1
MOVA,P3
ANLA,#0FH
CJNEA,#0EH,NK1
MOVKEYBUF,#0
LJMPDK1
NK1:
CJNEA,#0DH,NK2
MOVKEYBUF,#1
LJMPDK1
NK2:
CJNEA,#0BH,NK3
MOVKEYBUF,#2
LJMPDK1
NK3:
CJNEA,#07H,NK4
MOVKEYBUF,#3
LJMPDK1
NK4:
NOP
DK1:
MOVA,KEYBUF
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
MOVA,KEYBUF
MOVB,#2
MULAB
MOVTEMP,A
MOVDPTR,#TABLE1
MOVCA,@A+DPTR
MOVSTH0,A
MOVTH0,A
INCTEMP
MOVA,TEMP
MOVCA,@A+DPTR
MOVSTL0,A
MOVTL0,A
SETBTR0
DK1A:
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JNZDK1A
CLRTR0
NOKEY1:
MOVP3,#0FFH
CLRP3.5
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY2
LCALLDELY10MS
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY2
MOVA,P3
ANLA,#0FH
CJNEA,#0EH,NK5
MOVKEYBUF,#4
LJMPDK2
NK5:
CJNEA,#0DH,NK6
MOVKEYBUF,#5
LJMPDK2
NK6:
CJNEA,#0BH,NK7
MOVKEYBUF,#6
LJMPDK2
NK7:
CJNEA,#07H,NK8
MOVKEYBUF,#7
LJMPDK2
NK8:
NOP
DK2:
MOVA,KEYBUF
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
MOVA,KEYBUF
MOVB,#2
MULAB
MOVTEMP,A
MOVDPTR,#TABLE1
MOVCA,@A+DPTR
MOVSTH0,A
MOVTH0,A
INCTEMP
MOVA,TEMP
MOVCA,@A+DPTR
MOVSTL0,A
MOVTL0,A
SETBTR0
DK2A:
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JNZDK2A
CLRTR0
NOKEY2:
MOVP3,#0FFH
CLRP3.6
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY3
LCALLDELY10MS
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY3
MOVA,P3
ANLA,#0FH
CJNEA,#0EH,NK9
MOVKEYBUF,#8
LJMPDK3
NK9:
CJNEA,#0DH,NK10
MOVKEYBUF,#9
LJMPDK3
NK10:
CJNEA,#0BH,NK11
MOVKEYBUF,#10
LJMPDK3
NK11:
CJNEA,#07H,NK12
MOVKEYBUF,#11
LJMPDK3
NK12:
NOP
DK3:
MOVA,KEYBUF
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
MOVA,KEYBUF
MOVB,#2
MULAB
MOVTEMP,A
MOVDPTR,#TABLE1
MOVCA,@A+DPTR
MOVSTH0,A
MOVTH0,A
INCTEMP
MOVA,TEMP
MOVCA,@A+DPTR
MOVSTL0,A
MOVTL0,A
SETBTR0
DK3A:
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JNZDK3A
CLRTR0
NOKEY3:
MOVP3,#0FFH
CLRP3.7
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY4
LCALLDELY10MS
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY4
MOVA,P3
ANLA,#0FH
CJNEA,#0EH,NK13
MOVKEYBUF,#12
LJMPDK4
NK13:
CJNEA,#0DH,NK14
MOVKEYBUF,#13
LJMPDK4
NK14:
CJNEA,#0BH,NK15
MOVKEYBUF,#14
LJMPDK4
NK15:
CJNEA,#07H,NK16
MOVKEYBUF,#15
LJMPDK4
NK16:
NOP
DK4:
MOVA,KEYBUF
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
MOVA,KEYBUF
MOVB,#2
MULAB
MOVTEMP,A
MOVDPTR,#TABLE1
MOVCA,@A+DPTR
MOVSTH0,A
MOVTH0,A
INCTEMP
MOVA,TEMP
MOVCA,@A+DPTR
MOVSTL0,A
MOVTL0,A
SETBTR0
DK4A:
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JNZDK4A
CLRTR0
NOKEY4:
LJMPWAIT
DELY10MS:
MOVR6,#10
D1:
MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET
INT_T0:
MOVTH0,STH0
MOVTL0,STL0
CPLP1.0
RETI
TABLE:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB7FH,6FH,77H,7CH,39H,5EH,79H,71H
TABLE1:
DW64021,64103,64260,64400
DW64524,64580,64684,64777
DW64820,64898,64968,65030
DW65058,65110,65157,65178
END
7.C语言源程序
#include
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsignedchartemp;
unsignedcharkey;
unsignedchari,j;
unsignedcharSTH0;
unsignedcharSTL0;
unsignedintcodetab[]={64021,64103,64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178};
voidmain(void)
{
TMOD=0x01;
ET0=1;
EA=1;
while
(1)
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=0;
break;
case0x0d:
key=1;
break;
case0x0b:
key=2;
break;
case0x07:
key=3;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp&0x0f;
while(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_5=0;
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 高级 项目 教程