单片机实例2026Word格式文档下载.docx
- 文档编号:22942745
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:47
- 大小:226.67KB
单片机实例2026Word格式文档下载.docx
《单片机实例2026Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机实例2026Word格式文档下载.docx(47页珍藏版)》请在冰豆网上搜索。
unsignedchari,j;
voidmain(void)
{TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
while
(1)
{if(P0_0==0)
{for(i=5;
i>
0;
i--)
for(j=248;
j>
j--);
if(P0_0==0)
{second++;
if(second==60)
{second=0;
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
while(P0_0==0);
}}
if(P0_1==0)
{minite++;
if(minite==60)
{minite=0;
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
while(P0_1==0);
if(P0_2==0)
{
for(i=5;
hour++;
if(hour==24)
hour=0;
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
while(P0_2==0);
}}}}
voidt0(void)interrupt1using0
mstcnt++;
if(mstcnt==8)
mstcnt=0;
P1=dispcode[dispbuf[dispbitcnt]];
P3=dispbitcode[dispbitcnt];
dispbitcnt++;
if(dispbitcnt==8)
{dispbitcnt=0;
tcnt++;
if(tcnt==4000)
{tcnt=0;
second++;
minite++;
minite=0;
{hour=0;
}}}
21.拉幕式数码显示技术
用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位数码管上从右向左循环显示“12345678”。
能够比较平滑地看到拉幕的效果。
图4.21.1
(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个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。
主程序框图
中断服务程序框图
图4.21.2
unsignedchardispbitcode[]={0xf8,0xf9,0xfa,0xfb,
0xfc,0xfd,0xfe,0xff};
unsignedchardispbuf[8]={16,16,16,16,16,16,16,16};
unsignedintt02scnt;
unsignedchart5mscnt;
unsignedcharu;
unsignedchari;
TMOD=0x02;
while
(1);
t5mscnt++;
if(t5mscnt==4)
t5mscnt=0;
P0=dispcode[dispbuf[dispbitcnt]];
P1=dispbitcode[dispbitcnt];
dispbitcnt=0;
t02scnt++;
if(t02scnt==1600)
t02scnt=0;
u++;
if(u==9)
u=0;
for(i=0;
i<
8;
i++)
dispbuf[i]=16;
u;
dispbuf[i]=8;
}
22.电子琴
(1.由4X4组成16个按钮矩阵,设计成16个音。
(2.可随意弹奏想要表达的音乐。
图4.22.1
3.系统板硬件连线
(1.把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPKIN端口上;
(2.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;
4.相关程序内容
(1.4X4行列式键盘识别;
(2.音乐产生的方法;
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
现在以单片机12MHZ晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表所示
音符
频率(HZ)
简谱码(T值)
低1 DO
262
63628
#4FA#
740
64860
#1 DO#
277
63731
中5SO
784
64898
低2 RE
294
63835
#5SO#
831
64934
#2RE#
311
63928
中6LA
880
64968
低3M
330
64021
#6
932
64994
低4FA
349
64103
中7SI
988
65030
370
64185
高1DO
1046
65058
低5SO
392
64260
#1DO#
1109
65085
415
64331
高2RE
1175
65110
低6LA
440
64400
#2RE#
1245
65134
466
64463
高3M
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
1480
65198
554
64633
高5SO
1568
65217
中2RE
587
64684
1661
65235
622
64732
高6LA
1760
65252
中3M
659
64777
1865
65268
中4FA
698
64820
高7SI
1967
65283
下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据
低音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
调4/4
125ms
62ms
调3/4
187ms
94ms
调2/4
250ms
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。
下面就用AT89S51单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。
在这个程序中用到了两个定时/计数器来完成的。
其中T0用来产生音符频率,T1用来产生音拍。
图4.22.2
unsignedchartemp;
unsignedcharkey;
unsignedcharSTH0;
unsignedcharSTL0;
unsignedintcodetab[]={64021,64103,64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178};
TMOD=0x01;
P3=0xff;
//将P3口取出
P3_4=0;
//使P3_4为低电平,这样可以判断第一竖排有没有键按下
temp=P3;
temp=temp&
0x0f;
if(temp!
=0x0f)//有键按下
for(i=50;
for(j=200;
//延时
=0x0f)//再判断是否有键按下
switch(temp)//判断是哪个键按下
case0x0e:
key=0;
break;
case0x0d:
key=1;
case0x0b:
key=2;
case0x07:
key=3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
//找出键对应的频率的时间,作为定时器中断初始值
STL0=tab[key]%256;
while(temp!
=0x0f)
TR0=0;
P3_5=0;
//跟上面差不多,现在是判断第二排的按键
switch(temp)
key=4;
key=5;
key=6;
key=7;
P3_6=0;
key=8;
key=9;
key=10;
key=11;
P3_7=0;
key=12;
key=13;
key=14;
key=15;
TH0=STH0;
TL0=STL0;
23.模拟计算器数字输入及显示
(1.开机时,显示“0”
(2.第一次按下时,显示“D1”;
第二次按下时,显示“D1D2”;
第三按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音。
图4.23.1
(3.把“单片机系统”区域中的P0.0-P0.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;
(4.把“单片机系统:
区域中的P2.0-P2.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;
4.相关程序设计内容
(1.行列式键盘输入及按键功能设定;
(2.动态数码显示;
(3.数码显示方式处理;
5.汇编源程序
(略)
6.C语言源程序
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsignedcharcodedispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsignedchardispbuf[8]={0,16,16,16,16,16,16,16};
unsignedchardispbitcount;
unsignedcharkeypos;
bitalarmflag;
voidchange(unsignedchar*p,unsignedcharcount)
while(count>
0)
*(p+count)=*(p+count-1);
count--;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
if((key>
=0)&
&
(key<
10))
keypos++;
if(keypos<
8)
change(dispbuf,keypos);
dispbuf[0]=key;
else
keypos=8;
alarmflag=1;
alarmflag=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实例 2026
![提示](https://static.bdocx.com/images/bang_tan.gif)