单片机课程设计 杨克须0721.docx
- 文档编号:29965309
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:60
- 大小:171.92KB
单片机课程设计 杨克须0721.docx
《单片机课程设计 杨克须0721.docx》由会员分享,可在线阅读,更多相关《单片机课程设计 杨克须0721.docx(60页珍藏版)》请在冰豆网上搜索。
单片机课程设计杨克须0721
单片机课程设计报告
任课老师:
付文秀
姓名:
杨克须
学号:
07212053
学院:
电子信息工程学院
班级:
自动化0702
一.实验目的------------------------------3
二.实验原理------------------------------3
三.实验内容------------------------------5
四.实验原理图----------------------------6
五.实验程序------------------------------6
六.具体程序分析--------------------------30
七.调试过程遇到的问题及方案--------------32
八.实验感想------------------------------33
九.元件清单------------------------------34
电子音调实验
一.实验目的
1.了解计算机发出不同音调的编程方法
2.熟悉定时器和键盘扫描电路的工作原理及编程方法。
3.熟悉液晶显示屏的工作原理及编程方法。
4.熟悉红外发射接收的工作原理和编码,实现红外接收控制。
5.完成实现具有红外遥控和键盘控制的电子音调发生器。
二.实验原理
1.音调的产生
音节由不同频率的方波产生,音节与频率的关系如表
(1)所示。
要产生音频方波,只要计算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。
利用计时器及时此半周期,每当计时到后就将输出方波的I/O(P3.7)反相,然后重复及时此半周期时间再对I/O反相,就可在P3.7脚得到此频率的方波。
将P3.7经过驱动电路与蜂鸣器相连,随着P3.7口输出不同频率的方波,蜂鸣器便会发出不同的声音。
每个音节相应的定时器初值计算公式见公式:
即:
表1C调各音符频率与计数值T的对照表
音符
频率(HZ)
简谱码(T值)
音符
频率(HZ)
简谱码(T值)
低1DO
262
63628
#4FA#
740
64860
#1DO#
277
63731
中5SO
784
64898
低2RE
294
63853
#5SO#
831
64934
#2RE#
311
63928
中6LA
880
64968
低3M
330
64021
#6
932
64994
低4FA
349
64103
中7SI
988
65030
#4FA#
370
64185
高1DO
1046
65058
低5SO
392
64260
#1DO#
1109
65085
#5SO#
415
64331
高2RE
1175
65110
低6LA
440
64400
#2RE#
1245
65134
#6
466
64463
高3M
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
#4FA#
1480
65198
#1DO#
554
64633
高5SO
1568
65217
中2RE
587
64684
#5SO#
1661
65235
#2RE#
622
64732
高6LA
1760
65252
中3M
659
64777
#6
1865
65268
中4FA
698
64820
高7SI
1967
65283
2.音长的设定
音乐的节拍是由延时实现的,如果1拍的时间为0.4秒,1/4拍是0.1秒。
只要设定延时时间,就可得到节拍的时间。
延时实现基本延时时间,节拍值只能是它的整数倍。
表2节拍与节拍码对照
节拍码
节拍数
节拍码
节拍数
1
1/4拍
1
1/8拍
2
2/4拍
2
1/4拍
3
3/4拍
3
3/8拍
4
1拍
4
1/2拍
5
1又1/4拍
5
5/8拍
6
1又1/2拍
6
3/4拍
8
2拍
8
1拍
A
2又1/2拍
A
1又1/4拍
C
3拍
C
1又1/2拍
F
3又3/4拍
3.曲谱存贮格式
unsignedcharcodeMusicName{音高,音长,音高,音长....,0,0};末尾:
0,0表示结束(Important)
音高由三位数字组成:
个位是表示1-7这七个音符
十位是表示音符所在的音区:
1-低音,2-中音,3-高音;
百位表示这个音符是否要升半音:
0-不升,1-升半音。
音长最多由三位数字组成:
个位表示音符的时值,其对应关系是:
|数值(n):
|0|1|2|3|4|5|6
|几分音符:
|1|2|4|8|16|32|64音符=2^n
十位表示音符的演奏效果(0-2):
0-普通,1-连音,2-顿音
百位是符点位:
0-无符点,1-有符点
调用演奏子程序的格式
Play(乐曲名,调号,升降八度,演奏速度);
|乐曲名:
要播放的乐曲指针,结尾以(0,0)结束;
|调号(0-11):
是指乐曲升多少个半音演奏;
|升降八度(1-3):
1:
降八度,2:
不升不降,3:
升八度;
|演奏速度(1-12000):
值越大速度越快;
在编写完曲谱后,使用0x00,0x00作为结束标志,当检测到此字符时表示一首歌结束,弹出“是否返回?
”.
4.键盘扫描
使用的是4*4的键盘
1
2
3
4
5
6
7
8
9
0
A
B
C(返回)
D(后退)
E(前进)
F(确认)
当按下相应位置的键时,其对应的行和列位置置高电平。
例如当按下1号键,高四位、低四位都置高电平,其代码为0x88。
依此类推下去,这样当选中其中的一个键需要的代码如下:
0x88
0x48
0x28
0x18
0x84
0x44
0x24
0x14
0x82
0x42
0x22
0x12
0x81
0x41
0x21
0x11
5.LCD显示原理及使用
LCD液晶显示器是LiquidCrystalDisplay的简称,LCD的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。
在编写的程序中,通过wrcomd()、wrdata()两个子函数实现对LCD命令写入和数据写入功能。
然后再通过不同的命令组合,实现汉字的显示,清屏等效果。
6.红外遥控部分
红外遥控部分使用遥控器为LC7461,红外接收头为1883D。
1、通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如下所示:
(一)遥控器发射部分键盘矩阵、编码调制、LED红外发送器
课程设计中使用的三洋彩电遥控器(LC7461)(实物图如下:
)
(二)接收部分
VS0038一体化红外接收头(设计中用1883D代替)(实物图如下:
)
红外接收头VS0038能够正常接收的角度
2、遥控发射器及其编码
(1)遥控发射器专用芯片很多
(2)根据编码格式可以分成:
脉冲宽度调制和脉冲相位调制两大类
现在我们研究以运用比较广泛,解码比较容易实现的脉冲宽度调制来加以说明,用LC7461组成发射电路为例说明编码原理。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:
(a)采用脉宽调制的串行码
(b)以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”
(c)以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”
遥控器发出由“0”和“1”组成的42位二进制码,经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。
然后再通过红外发射二极管产生红外线向空间发射,LC7461产生的遥控编码是连续的42位二进制码组,其中前26位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。
后16位为8位的操作码和8位的操作反码用于核对数据是否接收正确。
(其中的地址码为用户识别码,它又分为用户码与用户反码)
当遥控器上任意一个按键按下超过36ms时,LC7461芯片的振荡器使芯片激活,将发射一个特定的同步码头,对于接收端而言就是一个9ms的低电平,和一个4.5ms的高电平,这个同步码头可以使程序知道从这个同步码头以后可以开始接收数据。
解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。
如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右即可。
根据红外编码的格式,程序应该等待9ms的起始码和4.5ms的结果码完成后才能读码。
接收器及解码
VS0038是塑封一体化红外线接收器,它是一种集红外线接收、放大、整形于一体的集成电路,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,没有红外遥控信号时为高电平,收到红外信号时为低电平,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。
下图是按照红外遥控器按键的实际位置给出的32个按键的键值(16进制)
遥控器按键
三.实验内容
利用C语言编程实现四项功能,分别为音乐播放、数字谱曲、音乐弹奏、参数调整。
液晶显示选择相应的功能,进入子菜单。
按下“E”键,选择项下移一行,按下“D”,选择项上移一行。
(1)音乐播放实现播放三首歌曲,选择相应的数字,播放相应的歌曲。
当播放完歌曲后,会弹出“是否返回”,按下F键确认,可以返回菜单选项选择新的歌曲;若按下C键,将继续播放选中的歌曲
(2)数字谱曲实现记录按下的音高及节拍,先输入音符然后输入音符的节拍。
最后输入00F后按“确定键”结束录音,播放出刚谱的歌曲。
当播放完毕后会弹出“是否返回”,当选择F键,就返回上个菜单。
否则按下任意键,会循环重新播放。
(3)音乐弹奏实现利用按键1~7控制输出1234567的音,并且屏幕上会显示输入的音相应的列有液晶柱的变化,相应列上升两格,下一时刻上升两格,然后上升到最顶格后开始下降,恢复到初始状态。
(4)参数调整可以通过按键调整播放速度、调号及升降八度。
按下“E”键,相应的参数会增加,按下“D”键,相应的参数会减少。
四.实验仿真图
五.实验程序如下:
主函数为:
#include
#include
#include
#include
#include
#include
#include
voidmain()
{
intcho=0;
uchargetkey;
csh();
bmp(0,0,8,0,132);//刷屏
start_print();
while
(1)
{
menu_first(cho);
menu_state=1;
while(menu_state)
{
music_counter=0;
Sector_erase(start_add);
if(CheckState())
{
getkey=GetKeys();
delay(3000);//延时防颤
switch(getkey)
{
case0x41:
cho-=1;
cho=cho<0?
4:
cho;menu_first(cho);break;
case0x21:
cho+=1;
cho=cho>4?
0:
cho;menu_first(cho);break;
case0x11:
menu_second(cho);break;
default:
break;
}
}
}
}
}
各子函数为:
#ifndef_DRIVEFUTION_H_
#define_DRIVEFUTION_H_
/*********************EEPROM函数*******************/
/**************************************************/
/******************关闭ISP,IAP功能**************/
voidISP_IAP_disable(void)
{
ISP_CONTR=0X00;
ISP_CMD=0X00;
ISP_TRIG=0x00;
}
/*******************字节读***************************/
ucharByte_read(uintbyte_addr)
{
EA=0;//关中断
ISP_CONTR=En_Wait_TIME;//开启ISP/IAP;并送等待时间
ISP_CMD=Read_COM;//送字节读命令字
ISP_ADDRH=(uchar)(byte_addr>>8);//送地址高字节
ISP_ADDRL=(uchar)(byte_addr&0X00FF);//送地址低字节
ISP_TRIG=0X46;//送触发命令字0X46、0XB9
ISP_TRIG=0XB9;
_nop_();
ISP_IAP_disable();//关闭ISP/IAP功能
EA=1;//开中断
return(ISP_DATA);
}
/********************字节编程***********************/
voidByte_program(uintbyte_addr,ucharisp_iap_data)
{
EA=0;//关中断
ISP_CONTR=En_Wait_TIME;//开启ISP/IAP;并送等待时间
ISP_CMD=Prog_COM;//送字节编程命令字
ISP_ADDRH=(uchar)(byte_addr>>8);//送地址高字节
ISP_ADDRL=(uchar)(byte_addr&0X00FF);//送地址低字节
ISP_DATA=isp_iap_data;//送数据进ISP_DATA
ISP_TRIG=0X46;//送触发命令字0X46、0XB9
ISP_TRIG=0XB9;
_nop_();
ISP_IAP_disable();//关闭ISP/IAP功能
EA=1;//开中断
}
/*********************扇区擦除*********************/
voidSector_erase(uintsector_addr)
{
EA=0;//关中断
ISP_CONTR=En_Wait_TIME;//开启ISP/IAP;并送等待时间
ISP_CMD=Dele_COM;//送扇区擦除命令字
ISP_ADDRH=(uchar)(sector_addr>>8);//送地址高字节
ISP_ADDRL=(uchar)(sector_addr&0X00FF);//送地址低字节
ISP_TRIG=0X46;//送触发命令字0X46、0XB9
ISP_TRIG=0XB9;
_nop_();
ISP_IAP_disable();//关闭ISP/IAP功能
EA=1;
}
/*********************写入函数**********************/
voidEEPROM_write(uintaddr,ucharin_data)
{
Sector_erase(addr);
Byte_program(addr,in_data);
}
/*********************EEPROM函数*******************/
/**************************************************/
/***************音乐播放相关子函数*******************/
/****************************************************/
voidInitialSound(void)//初始化定时器
{
BeepIO=0;
Sound_Temp_TH1=(65535-(1/1200)*SYSTEM_OSC)/256;//计算TL1应装入的初值(10ms的初装值)
Sound_Temp_TL1=(65535-(1/1200)*SYSTEM_OSC)%256;//计算TH1应装入的初值
TH1=Sound_Temp_TH1;
TL1=Sound_Temp_TL1;
TMOD|=0x11;
ET0=1;
ET1=0;
TR0=0;
TR1=0;
EA=1;
}
voidBeepTimer0(void)interrupt1//音符发生中断函数
{
BeepIO=!
BeepIO;
TH0=Sound_Temp_TH0;
TL0=Sound_Temp_TL0;
}
/*********************END****************************/
/****************************************************/
/*****************LCD操作子函数**********************/
/****************************************************/
voidwrcomd(charcomd)//写入命令
{
cs=0;_nop_();
rs=0;_nop_();
e=1;_nop_();
rw=0;_nop_();
P0=comd;_nop_();
rw=0;_nop_();_nop_();
rw=1;_nop_();_nop_();_nop_();_nop_();
}
voidwrdata(chardata_wri)//往液晶中写入数据
{
cs=0;_nop_();
rs=1;_nop_();
e=1;_nop_();
rw=0;_nop_();
P0=data_wri;_nop_();
rw=0;_nop_();_nop_();
rw=1;_nop_();_nop_();_nop_();_nop_();
}
voidbmp(chardata_write,introw_start,introw_end,ucharcolumn_start,ucharcolumn_end)//刷屏子函数
//初始化设置,对屏幕清零,默认值,为0,0,8,2,132
{
unsignedchari,j;
intnum_3;
charnum_0=0xb0;
//ucharcolumn_h,column_l;
num_0+=row_start;
for(i=row_start;i { num_3=column_end; wrcomd(num_0);//写入命令设置页,从0页开始,0xb0=10110000;delay(time_def);//设置页 wrcomd(0x10|(0xf0&column_start)>>4);//设置列,先写入高4位再写入低四位 wrcomd(0x00|(0x0f&column_start)); for(j=column_start;j { wrdata(data_write); } num_0++; } } voiddelay(longinttime_delay)//延时子程序,执行time_delay个_nop_()延时 { longinti; for(i=0;i _nop_(); } voidwrite_word(char*p_word,intnum,intpos_x,intpos_y,intwidth,intheight)//写汉字/字符子函数 //对应参数数据数组名,数组中位置,行位置,列位置,宽,高 { charpage;//页号 unsignedinti,j,k,p; p=(unsignedint)num*2*width;//p确定汉字字模数据初始位置 i=height%8; k=(i)? (height/8+1): (height/8); page=0xb0+pos_y; for(i=0;i<2;i++) { wrcomd(page); wrcomd(0x10|(0xf0&pos_x)>>4); wrcomd(0x00|(0x0f&pos_x)); for(j=0;j { wrdata(p_word[j+p]); } p=p+width; page++; if(page-(unsignedchar)0xb0>7||page-(unsignedchar)0xb0<0) return; } } /*****************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机课程设计 杨克须0721 单片机 课程设计 杨克须 0721