单片机课程设计报告模板Word格式.docx
《单片机课程设计报告模板Word格式.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告模板Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
![单片机课程设计报告模板Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/10/ea09e9c7-73d6-4a63-82eb-23d7b5ce6c56/ea09e9c7-73d6-4a63-82eb-23d7b5ce6c561.gif)
执行部件电路:
包括喇叭、状态指示灯。
二、方案论证及选择
1、电子琴部分
由于市场上有许多的电子琴,从而想用单片机来实现电子琴的功能和音乐盒,通过7个按键代替市场上电子琴的按键,最后一个按键用来播放音乐。
音乐是由不同的频率所产生的声音,通过控制时间来给喇叭送电平,从而使喇叭发出不同的响声,在通过查找歌曲的音符,做成一个音符表。
通过按按键在由程序控制表的取的次序从而让喇叭发播放音乐。
通过滑动变阻器控制喇叭声音大小。
2、测温部分
测温部分是基于DS18B20温度传感器的探测,然后实时传输给数码显示器。
并且设有温度报警系统。
当外界温度高于50°
或者低于-20°
时状态指示灯亮,蜂鸣器发出警报。
3、计数部分
RR0加一,RR1减一,RR2加十,RR减十.
第三部分电路设计与参数选择
一、单片机最小系统电路设计和元件的选择
第四部分软件设计部分
一、<
主程序>
#include<
reg51.h>
hardware.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharTempTH0,TempTL0,bian;
//临时的Th0和Tl0,修改定时器中断时间用的变量
ucharYinFu,JiePai,shu,shu1,TimeSec=10;
staticuchartemp;
ucharcodeTabMusic[7][340];
bitFlag,ZF;
//0:
电子琴,1:
音乐盒
ucharcodeseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x01};
voiddelay5(uchar);
bitinit_ds18b20(void);
ucharreadbyte(void);
voidwritebyte(uchar);
ucharretemp(void);
voidwenxx(void);
voidDelay05ms(ucharDelay05msData);
voidDelay10ms(ucharDelay10msData);
voidFunKeyScan(void);
//电子琴程序
voidFunPlay(void);
//音乐盒播放程序
voidDisplay(uchartemp);
voidxianshi(void);
voidmain(void)
{
uchari;
TempTH0=0x00;
TempTL0=0x00;
TH0=TempTH0;
TL0=TempTL0;
TMOD=0x01;
TR0=0;
ET0=1;
EX0=1;
//0
EX1=1;
//1
IT0=1;
PX1=1;
EA=1;
ABC=0x00;
temp=retemp();
Delay05ms
(1);
while
(1)
{
while(shu==2)
xianshi();
while(shu==1)
{TR0=0;
if(i==0)temp=retemp();
if(++i==200)i=0;
Display(temp);
wenxx();
}
while(shu==0)
{
if(Flag==0)//电子琴
if(PKey!
=0xff)//发现按键按下
{
FunKeyScan();
//检测键盘并修改定时时间
TR0=1;
//发出声音
else//如果发现按键弹起,则关闭声音
{
TR0=0;
shu1=bian+1;
Display(shu1);
}
else//音乐盒功能
i=0;
while((TabMusic[bian][i]!
=255)&
&
(shu==0))//检查是否到了歌曲结束
{
YinFu=TabMusic[bian][i++];
//取得音符,
JiePai=TabMusic[bian][i++];
//取得节拍
FunPlay();
//根据音符控制定时器的频率
Delay10ms(JiePai*30);
//根据节拍控制频率的持续时间
if(Flag==0)
break;
//如果发现不是音乐盒状态,退出
}
Flag=0;
//自动播放结束,则自动转为电子琴状态
}
}
voidDisplay(uchartemp)
if(temp>
9)
wen=seg[temp/10];
//输出十位
dian1=1;
Delay05ms
(2);
//延时5ms
dian1=0;
wen=0xff;
}
dian2=1;
wen=seg[temp%10];
//输出个位
dian2=0;
/*--------------精确延时5us子程序---------*/
voiddelay5(ucharn)
do
_nop_();
n--;
while(n);
/*--------------初始化函数--------------------*/
bitinit_ds18b20(void)//检测到DS18B20返回0没检测到DS18B20则返回1
DQ=1;
DQ=0;
delay5(100);
//延时500US
delay5(12);
//延时60US
if(DQ==0)//检测到DS18B20则为0
while(DQ==0);
//等待DS18B20释放总线
return0;
//检测到DS18B20则为0
else
return1;
//没检测到DS18B20则返回1
/*--------------读取一字节函数----------------*/
ucharreadbyte(void)
uchari=0;
uchardate=0;
for(i=8;
i>
0;
i--)
DQ=0;
delay5
(1);
DQ=1;
//15微秒内拉释放总线
date>
>
=1;
if(DQ)
date|=0x80;
delay5(11);
return(date);
/*--------------写一字节函数------------------*/
voidwritebyte(uchardat)
for(i=8;
DQ=0;
DQ=dat&
0x01;
//写"
1"
在15微秒内拉低
delay5(12);
//写"
0"
拉低60微秒
DQ=1;
dat>
delay5(5);
/*--------------读取温度函数------------------*/
ucharretemp(void)
uchara,b;
uchart;
while(init_ds18b20());
writebyte(0xCC);
writebyte(0x44);
Delay05ms(16);
writebyte(0xBE);
a=readbyte();
b=readbyte();
a>
=4;
b<
<
t=b|a;
if((b&
0x80))
ZF=0;
//表示负温度
t=~t+1;
//温度在寄存器中为12位,分辨率为0.0625
elseZF=1;
return(t);
voidwenxx(void)
if(!
ZF)
wendu=1;
=20)
wendu1=1;
elsewendu1=0;
if(ZF)
wendu=0;
=50)
voidFunKeyScan(void)
switch(PKey)
case0xfe:
TempTH0=0xfc;
TempTL0=0x8f;
bian=0;
break;
case0xfd:
TempTL0=0xef;
bian=1;
case0xfb:
TempTH0=0xfd;
TempTL0=0x45;
bian=2;
case0xf7:
TempTL0=0x6c;
bian=3;
case0xef:
TempTL0=0xb4;
bian=4;
case0xdf:
TempTL0=0xf4;
bian=5;
case0xbf:
TempTH0=0xfe;
TempTL0=0x2d;
bian=6;
default:
voidFunPlay(void)
switch(YinFu)
case11:
TempTH0=0xf9;
TempTL0=0x1e;
TR0=1;
case12:
TempTL0=0xde;
case13:
TempTH0=0xfa;
TempTL0=0x8a;
case14:
TempTL0=0xd8;
//11---17表示低音音符
case15:
TempTH0=0xfb;
TempTL0=0x68;
case16:
TempTL0=0xe8;
case17:
TempTL0=0x5a;
case21:
case22:
case23:
case24:
//21---27中音符
case25:
case26:
case27:
case31:
TempTL0=0x47;
case32:
TempTL0=0x77;
case33:
TempTL0=0xa2;
case34:
TempTL0=0xb6;
case35:
TempTL0=0xda;
//31---37表示高音音符
case36:
TempTL0=0xfa;
case37:
TempTH0=0xff;
TempTL0=0x16;
voidFunTimer0()interrupt1
POut=!
POut;
voidDelay05ms(ucharDelay05msData)
uchari,j;
for(i=0;
i<
Delay05msData;
i++)
for(j=0;
j<
167;
j++);
voidDelay10ms(ucharDelay10msData)
Delay10msData;
Delay05ms(20);
voidFunEx0(void)interrupt0
Delay05ms(60);
if(PEX0==0)
Flag=!
Flag;
voidFunEx1(void)interrupt2
Delay05ms(46);
if(PEX1==0)
{shu++;
if(shu==3)shu=0;
//TabMusic[]偶数位为音符
//0:
休止符,200:
表示歌曲结束。
//奇数0-10表示音符的持续时间,比如,5表示500ms。
ucharcodeTabMusic[7][340]={
16,1,17,1,21,1,23,1,22,1,21,2,22,1,0,2,
16,1,17,2,21,2,17,2,15,1,0,2,
16,1,17,2,21,1,0,1,22,1,23,2,17,1,0,2,
16,1,17,1,21,1,25,1,23,1,21,1,22,1,0,2,
16,1,17,1,21,1,0,1,22,1,23,1,17,1,0,1,
16,1,26,1,26,1,26,1,26,1,31,1,27,1,27,1,
26,1,26,1,25,1,23,1,25,1,26,1,21,1,21,1,0,2,
16,1,26,1,26,1,26,1,26,1,31,1,27,1,26,1,
26,1,25,1,25,1,26,1,27,1,23,1,23,1,23,1,0,2,
16,1,26,1,25,1,26,1,26,1,31,1,27,1,27,1,
26,1,26,1,25,1,23,1,25,1,25,1,27,1,26,1,0,2,
26,1,27,1,31,1,31,1,31,1,31,1,31,1,
27,1,26,1,26,1,26,1,25,1,23,1,25,1,25,1,27,1,
26,1,0,4,255},//1
{16,1,16,1,15,2,16,1,23,1,23,2,22,1,23,1,
22,1,22,1,22,1,21,1,16,2,0,2,
16,1,0,2,16,1,16,1,15,1,16,1,21,2,22,1,
23,1,25,1,26,2,23,1,0,1,23,1,25,1,23,1,
26,1,27,1,26,1,26,1,25,1,23,2,23,1,21,1,
22,1,0,1,23,1,23,1,25,1,26,2,
22,1,22,1,23,1,22,1,23,2,22,1,15,1,22,1,
21,2,16,1,0,1,16,1,0,1,16,1,16,1,15,2,
16,1,23,1,23,2,22,1,23,1,22,1,22,1,22,1,
16,2,16,1,0,1,16,1,16,1,15,1,16,1,21,2,22,1,
23,1,25,1,26,2,23,1,0,1,23,1,0,1,23,1,
25,1,23,2,26,1,27,1,26,1,25,1,23,1,23,1,21,1,
22,1,22,1,23,1,23,1,0,1,23,1,22,1,23,1,
25,1,25,2,22,1,22,1,23,1,22,1,23,2,22,1,15,1,
22,1,21,1,16,1,0,1,16,1,0,1,26,2,
23,1,25,1,31,1,32,1,31,1,26,2,25,1,26,1,31,1,
26,1,25,1,26,1,25,1,23,1,0,4,255},//2
{26,1,25,1,25,1,23,1,25,1,0,2,26,1,25,1,
23,1,22,1,21,1,21,1,0,2,16,1,
21,1,22,1,23,1,25,1,0,1,23,1,22,1,21,1,
23,1,22,1,22,1,0,2,26,1,25,1,25,1,23,1,
25,1,0,2,26,1,25,1,23,1,22,1,21,1,0,2,
16,1,21,1,22,1,23,1,25,1,0,2,23,1,22,1,21,1,
16,1,21,1,22,1,21,1,21,1,
26,1,25,1,25,1,23,1,25,1,0,2,26,1,25,1,
0,4,255},//3
{23,1,25,1,23,1,22,1,23,1,22,1,23,1,23,1,
22,1,16,1,21,1,23,1,22,1,22,1,21,1,16,1,
21,1,22,1,23,1,25,1,22,1,23,1,26,1,25,1,
15,1,22,1,21,1,22,1,21,1,16,1,21,1,22,1,
23,1,25,1,22,1,23,1,26,1,25,1,25,1,23,1,
0,1,22,1,23,1,22,1,21,1,25,1,26,1,23,1,
16,1,25,1,23,1,22,1,23,1,23,1,25,1,31,1,
25,1,26,1,0,1,26,1,25,1,23,1,23,1,25,1,
25,1,23,1,25,1,26,1,31,1,32,1,31,1,25,1,
23,1,22,1,25,1,23,1,23,1,0,1,23,1,25,1,
31,1,25,1,26,1,31,1,32,1,31,1,25,1,23,1,
25,1,31,1,26,1,23,1,22,1,23,1,25,1,33,1,
32,1,32,1,31,1,0,1,31,1,0,1,23,1,25,1,
32,1,32,1,0,1,32,1,0,1,32,1,31,1,0,1,31,1,
0,1,31,1,0,1,31,1,0,1,31,1,0,1,31,1,0,1,
0,4,255},//4
{15,1,21,2,23,1,25,2,21,1,17,2,23,1,25,1,
0,1,25,1,26,1,27,1,31,2,26,1,26,1,25,1,
25,1,0,1,0,1,23,1,22,1,21,2,21,1,21,1,23,1,
22,1,21,2,21,1,21,1,23,1,22,1,21,2,21,1,21,1,
22,1,23,1,22,1,21,1,16,1,22,1,23,1,22,1,0,1,
0,1,15,1,22,2,16,1,17,1,21,1,22,1,21,1,0,1,
0,1,23,1,25,1,23,2,22,1,21,1,25,1,17,1,0,1,
0,1,16,1,17,1,16,2,17,1,16,2,15,1,23,1,0,1,
0,1,25,1,23,2,22,1,21,1,25,1,17,1,0,1,0,1,
16,1,17,1,21,2,21,1,21,1,22,1,23,1,22,1,0,1,
0,1,15,1,21,2,23,1,25,2,21,1,17,2,23,1,25,2,
25,1,26,2,27,1,31,2,26,1,26,1,25,1,25,1,0,1,
23,1,22,1,21,2,21,1,21,1,23,1,22,1,21,2,21,1,
21,1,22,1,23,1,22,2,16,1,17,1,21,1,22,1,21,1,
0,1,0,1,0,4,255},//5
{21,1,21,1,16,1,15,1,16,1,21,1,21,1,22,1,
23,1,0,1