北邮单片机实验报告Word文件下载.docx
《北邮单片机实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《北邮单片机实验报告Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
单片机芯片eeprom键盘检测
一.实验论证与比较
二.液晶屏显示模块
在整个程序中,液晶屏用于为用户显示说明及指令,实现交互可视性。
其中,PORTE作为普通数字I/O口。
由于所有的功能位数据和数据位数据送到液晶各引脚时液晶并不读入,而是通过将第六脚先置1再置0来触发,之后指令或数据才被读入,故设计ENABLE程序使其执行相应指令,相当于使能指令。
三.键盘输入模块
键盘作为输入模块的作用主要是为单片机输送用户指令,用户通过键盘输入操控音乐发生器的功能,同时在键盘演奏的功能下,按动不同键值发出不同音阶。
在4x4键盘中,循环检测行码和列码有无低电平,通过异或和与运算找到低电平所在位置,通过键盘查询表及FSR指针翻译出键值,执行相应指令。
四.音乐发生模块
音乐发生模块的作用主要是按照接收的指令使蜂鸣器发出不同音调和时长的声音。
其核心程序是方波产生器。
通过设置分频比和计数器TMR0来控制方波的频率。
对于不同音阶,用M1和M2控制时长和频率,并通过PORTC6端口输送至蜂鸣器,发出不同声音。
在按键电子琴功能部分,通过键码返回值FSR确定执行P1~P14,并且进行循环扫描,发出声音。
但是这种方法由于扫描程序存在延迟,致使声音粘连性不够好,需要加以改进。
五.录音模块
通过键盘输入,将输入的数据存储在ROM中,按播放键将其读取,播放音乐。
按照参考书上定义SPI的基本状态,将芯片的输出改为SPI串行通信协议,ISD4002语音芯片是16位命令,而16F877则是8位,所以需要给串行通信输出端口sspbuf无延迟的赋值两次8位指令。
二.系统总体设计
系统分为三个功能模块,播放存储音乐,按键电子琴和录音。
用户打开系统后,会进行相应的选择,选择播放音乐,则播放存储音乐;
选择按键电子琴,则会根据用户的按键,发出不同音调的声音;
选择录音,则用户按键,系统则会自动将其存储在ROM中,当用户选择播放后,则会将用户连续的按键对应的声音播放出来,完成录音且播放的功能。
1.系统总体框图
2.录音存储模块系统框图
三.硬件连接
1.液晶屏显示模块
由于控制指令与写入数据的PORTE值有所不同,故编写两个不同ENALE程序分别控制写入指令及数据的使能。
定义PORTD为输出端口。
对于指令,通过给PORTD赋值,可实现显示屏开关、光标闪烁、光标右移、清屏、写入位置等设置。
对于写入数据,通过给PORTD赋予字符的ASCII码值来显示相应的字母、数字及标点。
2.键盘输入模块
将PORTB设置为存储列码,PORTD存储行码。
在键盘扫描时,先将PORTB作为间接寻址读表直至键值表末尾,并存入W,与位置码比较,返回FSR的值(0~F)。
3.音乐发生模块
输入,屏蔽掉D口,将列码存入VALUE。
之后将PORTD作为出入,屏蔽掉B口,读取行码。
使行码列码组合送入VALUE中。
在翻译程序中,首先使FSR指针指向表头,
在方波产生器中,首先设置占空比OPTION_REG为8,产生方波,然后通过两个循环嵌套LPT1和LPT2作为延时。
在方波产生器程序中,声音的播放时长和频率是通过M1和M2这两个参数设置的,M1的值=发声频率*0.125*2,在这里0.125为按键按下发出声音的时长,M2的值=256-1/(发声频率/2),并将其赋值给TMR0。
4.录音模块
录音模块的原理在第一部分已经说明,SPI串行通信协议实现起来也比较容易。
先给16位指令赋值然后调用OUTPUT函数实现各种功能。
在系统流程走至录音模块时,按住1键开始录音,3键播放录音,2键控制暂停和继续,0键为返回键。
四.调试过程
1.实验箱调试
之前没有接触过单片机,刚开始对硬仿真也不是很熟悉,后来随着学习和熟悉,也熟练的掌握了实验箱调试的方法。
在进行任何插头的插拔之前需要先断电,包括查到电脑之前也需要先关机。
2.软件调试
软件调试类似我们之前的编程语言学习,诸如要严格按照编程语言语法规定,不要出现逻辑错误等,与单纯的编程语言相比较,更多的是要考虑变量的地址。
但在编程中,也遇到以下问题。
首先是没有转体。
定义端口输入输出方向的时候需要转至体1,在赋值时需转为体0。
在看书时对这一问题并没有意识到,但在自己编程液晶屏部分时最开始定义了TRISB和TRISD后没有转回体0,虽然编译并没有错误但就是运行不正确,再仔细检查才发现少了一句“BCFSTATUS,RP0”。
再有就是程序嵌套层次要尽量少,逻辑要尽量简单,不然会导致程序崩溃。
在下载到实验箱时有时会出现问题
3.硬件调试
在硬件调试时,我们开始没有分模块,分区域进行焊接,而是将整体焊接完成后,直接进行整体的调试。
结果,LCD显示屏什么也不显示。
在检查时,也因为整体布线过于凌乱,无法发现问题所在。
所以,第二次,我们痛定思痛,将电路拆掉,重新分模块,分区域进行焊接,调试,最后用万用表测出接电源部分输出异常,最后是因为将其中的电阻算错导致的。
在整体测试中,我们LCD显示屏显示异常,再次检查,检查电路图设计,电路焊接,仍是查不出问题所在。
最后我们怀疑是不是部分元器件损坏,最后查明,晶振坏了。
在硬件调试中,我们学习了不少书本上没有的知识。
首先,做实验时,一定要分模块,分区域进行,便于自己检查。
其次,也要大胆怀疑,质疑,有了问题不一定就是主观因素导致的,也有可能是客观因素导致的,要大胆质疑,全面考虑。
五.参考文献:
PIC单片机实用教程——基础篇(五号宋体)
李学海
北京航空航天大学出版社
使用说明:
的确是一本不可或缺的教材,本书列举了很多实用的具有实战意义的例子,单片机入门就是通过把这本书里的好例子一字一行敲进电脑去来实现的。
PIC单片机实用教程——提高篇
继承了前面基础篇的风格,例子也具有实战意义,主要讲RA、TMR2的使用和CCP模块的PWM脉宽调制功能。
六.实验心得体会
经过本次小学期的实验课,我学到了很多平时上课学不到的东西。
这次电路综合实验与以往的实验课有很大不同,之前我们接触到的实验课,更多的是由老师教会我们实验的基本知识和操作步骤,我们只需要按照老师的指导完成操作即可。
但这次实验之前,刚刚接触到单片机时,我可以说是一窍不通,甚至对于单片机究竟是什么也不能很精确地表达出来。
尽管实验之前老师讲了一些单片机的基本知识,但我对于如何使用单片机,如何用汇编语言编程还是一头雾水。
我们只能依靠两本参考书和自己查阅资料来逐渐熟悉理解汇编语言和单片机。
通过四天的学习,我对汇编语言和单片机有了一个初步的认识,这四天的学习很艰苦,也很枯燥乏味。
但同时收获也很大,我学会了如何快速的大概翻阅一本新书,以及如何从书本中筛选出对实验有用的知识,这对我是一个很大的锻炼和提高。
开始进行程序设计时,我们又遇到了一些困难,比如我们要实现那些功能,如何实现,能不能在规定时间内完成等等。
经过一段时间的困惑之后,我们小组成员通过讨论确定了题目,让我体会出团队的团结、相互的默契和彼此的信任在团队的协作中是多么重要。
在学习和实验过程中,我们收获了新知识,更重要的是学会了如何获取并运用知识。
我们遇到了很多困难,但通过对理论知识的一步步学习,并且查阅相关资料,逐渐有了自己的目标,也逐渐形成了实验步骤的规划,并付诸于实际程序设计和电路连接之中,在这个过程中,我们遇到了很多问题,也走了很多弯路,例如分工不明确,开始设计的功能过于简单等等。
但是我们都通过自己的努力和同学老师的帮助一一解决,我认为解决问题的过程远比一帆风顺的实验过程更有价值,吃一堑长一智,这次实验中的不足之处和没有解决的问题,我们下次一定能做得更好
七.硬件图
八.关键代码
1.屏幕显示
MOVWFPORTD
CALLDOWN
MOVLW0F4H;
音
MOVLW0C0H
MOVLW0D6H;
乐
MOVLW0B7H
MOVLW0A2H;
发
MOVLW0C9H
MOVLW0FAH;
生
MOVLW0C6H
MOVLW0F7H;
器
2.键盘检测
START
CLRFPORTC
MOVLWB'
01111111'
;
第三行
BTFSSPORTB,3
CALLZERO
BCFPORTA,0
BTFSSPORTB,2
CALLONE
BTFSSPORTB,1
CALLTWO
BTFSSPORTB,0
CALLTHREE
10111111'
第二行
BTFSSPORTB,3
CALLFOUR
CALLFIVE
CALLSIX
CALLSEVEN
11011111'
第一行
CALLEIGHT
BTFSSPORTB,2
CALLNINE
CALLRECORD
11101111'
第0行
BTFSSPORTB,3;
若第三位为1,则跳一步
CALLCC
GOTOSTART
3.录音功能
WRITE
BSFSTATUS,RP0
BSFSTATUS,RP1;
选定体3
BTFSCEECON1,WR;
上一次写操作是否完成
GOTO$-1;
否!
返回继续检测
BCFSTATUS,RP0;
选定体2
MOVFADDR,W;
取地址
MOVWFEEADR;
送地址寄存器
MOVFDATA1,W;
取数据
MOVWFEEDATA;
送数据寄存器
BSFSTATUS,RP0;
BCFEECON1,EEPGD;
选定EEPROM为访问对向
BSFEECON1,WREN;
开放写操作使能控制
MOVLW55H;
MOVWFEECON2;
送55H到寄存器EECON2(读写内部EEPROM,这句是固定的)
MOVLW0AAH;
送AAH到寄存器EECON2(读写内部EEPROM,这句是固定的)
BSFEECON1,WR;
启动写操作
BCFEECON1,WREN;
禁止写操作发生
INCFADDR,F;
地址递增
INCFDATA2,F;
数量递增
BCFSTATUS,RP0
BCFSTATUS,RP1
11111111'
MOVWFPORTC
CALLDELAY50MS
GOTORECORD;
继续写后面单元
READ1
DECFADDR,F;
地址递减
选体2为当前体
选体3为当前体
选定EEPROM为访问对象
BSFEECON1,RD;
启动读操作
体2为当前体
MOVFEEDATA,W;
BCFSTATUS,RP1;
体0为当前体
;
MOVWFPORTC;
送显LED
CALLDELAYDSP;
调用廷时子程序
MOVFADDR,F;
检测当前地址
BTFSSSTATUS,Z;
是否为0?
是!
跳一步
GOTOREAD1;
返回继续读出和显示
GOTOREAD2
READ2
CALLOUTPUT;
送数码管显示
READ3
MOVFADDR,W
XORLWDATA2
BTFSSSTATUS,Z
GOTOREAD1
4.歌曲
CALLDELAY1
CALLDELAY1
CALLDELAY2
CALLDELAY2
CALLDELAY3
CALLDELAYX
MOVLWB'
00000000'
MOVWFPORTC
CALLDELAYREAL
CALLSTART1
CALLDELAY3
CALLDELAY4
CALLDELAY4
CALLDELAY5
CALLDELAY5