硬件课程设计实验报告.doc

上传人:来看看 文档编号:5026343 上传时间:2020-01-29 格式:DOC 页数:30 大小:324KB
返回 下载 相关 举报
硬件课程设计实验报告.doc_第1页
第1页 / 共30页
硬件课程设计实验报告.doc_第2页
第2页 / 共30页
硬件课程设计实验报告.doc_第3页
第3页 / 共30页
硬件课程设计实验报告.doc_第4页
第4页 / 共30页
硬件课程设计实验报告.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《硬件课程设计实验报告.doc》由会员分享,可在线阅读,更多相关《硬件课程设计实验报告.doc(30页珍藏版)》请在三一文库上搜索。

1、硬件课程设计报告班级: 信科09-3姓名: 学号: 指导老师:完成日期:2011年12月20日课程设计指导老师评阅书指导老师评语:指导老师签字:年 月 日目录目录3STC89C52单片机引脚图.4实验电路原理图5实验要求5概要6焊接工艺总结7编程思想.8程序框图9核心代码.12体会与建议.15附源代码.16STC89C52引脚图电路原理图实验要求1, 完成电路板的焊接。2, 完成对两个测试程序的代码恢复。概要大学里面大多数课程是理论课程,但对于我们对动手能力要求较强的信科专业,只学习理论知识远远不够。学校里以前安排的一些实验课程,一直没有引起自己的足够注意,大多数都是课上应付一下,然后草草交一

2、篇报告就了事了。以至于把写报告当成了实验的主要内容,这是本末倒置的。随着时间的积累,这种状态在使我发虚。虽然大多数人仍是这种状态。单片机是信科专业的核心课程,是和各种竞赛,以及以后工作联系最紧密的课程,是锻炼动手能力的绝佳机会。因此在最开始我就给予了它足够的重视,虽然进展并不是一帆风顺,但我感觉收获是丰富的,甚至可以说,这门课是我上大学以来让我收获最大的一门课程。看着三四百行自己写的源代码和运行流畅时钟,闹铃,以及别人羡慕的眼神,我感到一丝丝快意。整个课程设计分成两个部分,第一个部分是电路板的焊接与调通,这是纯硬件的,虽然技术含量比较低,但由于以前焊的少,还是碰到了好多问题,具体感受将在接下来

3、的说。第二个部分是程序设计,这是实验的主要部分,是软硬件结合的部分,也是最要技术的部分,要想写出可运行的程序,必须对每个电子器件和整个电路图的布局引脚足够熟悉。程序的设计是可以让人入迷的,我记得好几个晚上,我为了解决程序运行过程中存在的问题而无法入睡。当然,这次实验只是一个开端,电子设计还有很长的路要走,而留给我的时间已经不多了,我会利用本次课程给我的知识,在这条路上走下去,相对于一些同学,我可能晚了一步,但我相信,我会迅速追赶上来的。下面,我将写出实验的具体内容。焊接工艺总结这次焊接只是将直插的端口用焊锡封堵上,不涉及电路的连接,因此对知识的要求比较低。依我所见,如果焊接一帆风顺的话,反倒不

4、利于学习,因为如果没有排错的过程,人就不会关注电路板的内部结构,及元器件的布局。我以前焊电路板比较少,因此焊接过程中出了很多问题,这才迫使我关注电路板的布线,甚至动用了万用表去排错,这使得我在编程之前已经对电路很熟悉了,因此编程的时候比较顺利。结合自己和周围的同学焊接时遇到的问题,我得到了很多焊接电路板时的经验,具体总结如下:1. 焊接时心态一定要放平稳,不要着急,欲速则不达。2. 焊接时对有极性,有方向的器件一定要注意,比如发光二级管,数码管,排阻等,不要安反。3. 焊接前最好保证器件本身是好的,这样可以保证出现的问题是电路问题而不是器件本身的问题。虽然电子器件损坏得可能性比较小,但不是没有

5、可能的。一旦装上去再检测器件本身的好坏就不是那么容易了。4. 对引脚比较多的器件一定要注意,确保安装是正确的,因为这些器件一旦安装错误想拆下来是很麻烦的。5. 对于同种器件一定要注意型号,这次两个不同型号的排阻让人吃尽了苦头。6. 一定要注意安装的顺序,因为有些器件一旦先安装上另外一些器件就不好安装或不能安装了。编程思想这个程序是我到现在为止个人完成的最长的一个程序。程序一旦变长就会出现很多问题,比如说思维上容易混乱,查找错误困难,解决这些问题的核心编程思想就是使各个部分独立出来,也就是使用模块化的编程思想。这个程序,我主要分为六个模块:全局变量的定义模块,DS1302的初始化模块,蜂鸣器音乐

6、播放模块,时间显示模块,时间调节模块和主函数调用模块。当然这些模块并不是完全孤立的,他们存在相互调用,有一定耦合度。这是不可避免的。比如说要实现闹铃功能,即在显示时间的同时显示闹铃,就必须在显示时间的代码时延作为音符的延时。当然我尽力做到各模块的独立性尽可能高。这样做的好处有两个,一个是使程序看起来清晰易懂,另外一个就是当程序执行和自己想的不一样时容易判定哪一部分出了问题。当然解决这些问题的另一个问题是必须有良好的编程风格,恰当利用空格换行和注释。我想这一点我做到了。编程的基础是对CPU工作原理的深刻理解和对电路结构的明确把我。这要求把硬件和软件结合起来,是最有难度,最要水平的地方,经过这次训

7、练的洗礼,我感觉到我的能力有了质的飞跃。程序设计框图1,整体结构框图(主函数部分和时间调节部分)开始key6=1?读取时间读取时间是否显示时分秒显示年月日检测闹铃检测闹铃检测按键检测按键2,检测按键调时部分程序框图(以时分秒部分说明,年月日部分类似)开始Key1是否按下?s1=s1+1s1=s1 s1%3=?012哪个键被按下?哪个键被按下?哪个键被按下?将小时加1后写入DS1302将小时减1后写入DS1302将 分钟加1 后写入DS1302将分钟减1后写入DS1302将秒加1后写入DS1302将秒减1后写入DS1302与左边类似,这里略去没有键按下key2key3key2key3key2ke

8、y33,闹钟部分程序流程图:开始hour=12?(可调)否是播放音乐哪个键被按下?换音乐停止播放音乐key4key5核心代码音乐播放部分(闹铃部分)核心代码:void delay(unsigned char t) /延时程序,控制发音的时间长度 unsigned char t1; unsigned long t2; for(t1 = 0; t1 t; t1+) /双重循环, 共延时t个半拍 for(t2 = 0; t2 20; t2+) read_time(); display1(); ; /延时期间, 可进入T0中断去显示时间 TR0 = 0; /关闭T0, 停止发音这一部分是音符的延时,是

9、利用读取时间和显示时间完成延时的,保证了在响闹铃的同时还能显示时间。void sound(void) if(hour=0x12) /12点时响闹钟 unsigned char k, i; TMOD = 1; /置T0定时工作方式1 ET0 = 1; /开T0中断 EA = 1; /开CPU中断 while(flag%2=0&flag30000) i = 0; time1 = 1; while(time1) k = sszymmh1i + 7 * sszymmh1i + 1 - 1; /第i个是音符, 第i+1个是第几个八度 timer0h = FREQHk; /从数据表中读出频率数值 time

10、r0l = FREQLk; /实际上, 是定时的时间长度 time1 = sszymmh1i + 2; /读出时间长度数值 i += 3; song(); if(key4=0|key5=0) break; +flag;if(key5=0)flag=30000; while(flag%2=1&flag30000) i = 0; time1 = 1; while(time1) k = sszymmh2i + 7 * sszymmh2i + 1 - 1; /第i个是音符, 第i+1个是第几个八度 timer0h = FREQHk; /从数据表中读出频率数值 timer0l = FREQLk; /实际

11、上, 是定时的时间长度 time1 = sszymmh2i + 2; /读出时间长度数值 i += 3; song(); if(key4=0|key5=0) break; +flag;if(key5=0)flag=30000;break; 这一部分是音乐播放的主函数,有几个方面需要注意,第一,利用if语句完成了定时功能,要想修改闹铃时间只需修改if语句里的内容。第二,利用flag和按键共同完成了闹铃的控制,flag起初置0(上电后置0),按一下key4加1,当它除以2余0时且小于一个特别大地数时播放第一首乐曲,当它除以2余1且小于一个特别大的数时播放第二首乐曲,当检测到key5按下时,把fla

12、g置成那个非常大的数,此时播放结束,跳出循环。这就实现了用key4换音乐,用key5断闹铃的功能。时间显示部分:P2=0x80;P0=tabhour/16;delayms(3);P2=0x00;这里以小时的显示说明,有三个问题需要注意。第一,共阳极和共阴数码管的区别,对于每段数码管,共阳极给0时发光,共阴极给1时发光,所以它们的编码是不同的。对于每位而言,共阳极给1时导通,共阴极导通,所以编码也是不同的。第二,从DS1302读到的时间是用BCD码表示的,所以对16求整和求余才能得到相应的编码。第三,我们看起来8位同时显示利用的是视觉暂留。其实不是一直在显示的.时间调节部分核心地吗:if(key

13、2=0) delayms(100); if(key2=0)/key2按下表示加 write_ds1302(0x8e,0x00);/写保护寄存器的使用if(hour0x23) write_ds1302(0x84,( hour=(hour/16*10+hour%16)+1)/10*16+(hour/16*10+hour%16)+1)%10 );/16进制与十进制转换else write_ds1302(0x84,(0x00);/如果到了23点再加1应写入0点,如果还照常加1,将会出现乱码,以下类似write_ds1302(0x8e,0x80);/写保护寄存器的使用这里以修改小时的代码来说明问题,有三

14、个问题要注意。第一,利用按键控制加减,必须有足够的延时,这里用了100毫秒,如果时间过短,程序会好几次检测到按下。第二,调试时必须首先将从DS1302读到的BCD码转换成十进制再加1,再转换成BCD码,然后写入DS1302,要不然会出现乱码。第三,调时的过程必须注意边界,例如小时加到23应归零,小时减到0应归23,否则会出现乱码。调节哪一位用的是全局变量,和闹铃中换音乐的方法类似,就不再罗嗦了。主函数部分核心代码:while(1) changetime();/不断循环扫描显示,确定key6有没有被按下主函数最好简短,我做到了,但主函数非常重要。这里需要注意的是While(1)这个死循环是很重要

15、的,只有不断循环,才能检测到key6有没有被按下,依次确定是在年月日状态下工作还是时分秒状态下工作。至于,显示时间,检测闹铃都放时间调节函数changetime()中了。体会与建议通过这次试验,我感觉到了在动手能力上和知识综合运用上的巨大提升。这些体会已在概要部分有了说明,这里不再赘述。当然,直到验收的时刻,程序在设计上仍有一定不足,有待提升。事后,我比较了一下自己写的程序和别的同学写的程序。找出了自己的优点和缺点,优点是使用方便,操作便捷,缺点是还有些可以扩展的功能没写上。首先表现在,闹铃的时间只能在软件上修改,不能用键盘调节闹铃时间。当时把精力集中在利用扩展闹铃的功能上,最终使数字钟的闹铃

16、有了切换音乐的功能,结果是程序太长了,我删掉了一部分乐谱才把程序装下,当时想再扩展功能肯定装不下了,所以也就没再想怎么扩展。其实数字钟可以扩展的功能很多,比如可以设置倒计时功能,可以利用红外线遥控控制调节,可以安装温度传感器显示温度,等等,当然这就太多了,内存肯定不够用。现在我在准备参加电子设计竞赛,做的也是数字钟,不过这次用的AVR单片机,内存要大,这就可以尽全力扩展功能了。关于对本课程的建议,我觉得应该继续这样开硬件课程设计这门课给每个同学配一套零件,让同学们自己焊板子。同时,要加强监管,尤其是平时,我个人觉得不能等到最后验收,而应该将验收分几次完成,贯穿于整个课程设计,这样不至于使一些同

17、学,平时不努力,最后什么也做不出来,只能弄个程序草草交差了事。附:程序源代码/*包含头文件*/#include #include /*端口定义*/sbit DS1302_CLK = P10;sbit DS1302_IO = P11;sbit DS1302_RST = P12;/Ds1302端口sbit key6=P17;sbit key5=P16;sbit key1=P32;sbit key2=P33;sbit key3=P34;sbit key4=P35;/键盘端口sbit speaker=P14;/蜂鸣器端口int s1=0,s2=0; /控制调节哪一位的变量int flag=0; /控制

18、蜂鸣器int day1; /记忆时间,以便每天可以使用闹铃/*共阳LED段码表*/unsigned char code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/*定义全局变量*/unsigned char second,minute,hour,day,month,year;/秒,分,时,天,月,年变量定义/*延时程序*/void delayms(int xms)int i,j;for(i=xms;i0;i-)for(j=110;j0;j-);/*函数功能:数码管显示子程序*/*显示时分秒*/void display1(voi

19、d)P2=0x80;P0=tabhour/16;delayms(3);P2=0x00;P2=0x40;P0=tabhour%16;delayms(3);P2=0x00;P2=0x20;P0=0xbf;/显示-delayms(3);P2=0x00;P2=0x10;P0=tabminute/16;delayms(3);P2=0xff;P2=0x08;P0=tabminute%16;delayms(3);P2=0x00;P2=0x04;P0=0xbf;/显示-delayms(3);P2=0x00;P2=0x02;P0=tabsecond/16;delayms(3);P2=0x00;P2=0x01;P

20、0=tabsecond%16;delayms(3);P2=0x00;/*显示年月日*/void display2(void)P2=0x80;P0=tabyear/16;delayms(3);P2=0x00;P2=0x40;P0=tabyear%16;delayms(3);P2=0x00;P2=0x20;P0=0xbf;/显示-delayms(3);P2=0x00;P2=0x10;P0=tabmonth/16;delayms(3);P2=0xff;P2=0x08;P0=tabmonth%16;delayms(3);P2=0x00;P2=0x04;P0=0xbf;/显示-delayms(3);P2

21、=0x00;P2=0x02;P0=tabday/16;delayms(3);P2=0x00;P2=0x01;P0=tabday%16;delayms(3);P2=0x00;/*以下为DS1302基本操作程序*/*函数功能:向DS1302送一字节数据子程序入口参数:出口参数:*/void InputByte(unsigned char byte1)char i;for(i=8;i0;i-)DS1302_IO=(bit)(byte1&0x01);DS1302_CLK=1;_nop_();DS1302_CLK=0;byte1=1;return;/*函数功能:读DS1302一个字节子程序入口参数:出口

22、参数:*/unsigned char OutputByte() unsigned char i;unsigned ucdat=0;for(i=8;i0;i-)DS1302_IO=1;ucdat=1;if(DS1302_IO)ucdat|=0x80;DS1302_CLK=1;_nop_();DS1302_CLK=0; return(ucdat);/*函数功能:向DS1302某地址写一字节数据子程序入口参数:addr,TDat出口参数:*/void write_ds1302(unsigned char addr,unsigned char TDat)DS1302_RST=0;_nop_();DS1

23、302_CLK=0;_nop_();DS1302_RST=1; InputByte(addr);_nop_();InputByte(TDat);DS1302_CLK=1;_nop_();DS1302_RST=0;/*函数功能:读DS1302地址子程序入口参数:add出口参数:timedata*/unsigned char read_ds1302(unsigned char addr)unsigned char timedata;DS1302_RST=0;_nop_();DS1302_CLK=0;_nop_();DS1302_RST=1;InputByte(addr);timedata=Outp

24、utByte();DS1302_CLK=1;_nop_();DS1302_RST=0;return(timedata);/*函数功能:读DS1302时间子程序入口参数:出口参数:全局变量(second,minute,hour,week,day,month,year)*/void read_time()second=read_ds1302(0x81);/秒寄存器minute=read_ds1302(0x83);/分hour=read_ds1302(0x85);/时day=read_ds1302(0x87);/日month=read_ds1302(0x89);/月year=read_ds1302(

25、0x8d);/年 /*以下为蜂鸣器程序,作为闹钟*/unsigned char timer0h, timer0l, time1;/-/单片机晶振采用11.0592MHz/ 频率-半周期数据表 高八位 本软件共保存了四个八度的28个频率数据code unsigned char FREQH = 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, /低音1234567 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,/1,2,3,4,5,6,7,i 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, /

26、高音 234567 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF; /超高音 1234567/ 频率-半周期数据表 低八位code unsigned char FREQL = 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, /低音1234567 0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, /1,2,3,4,5,6,7,i 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, /高音 234567 0x47, 0x77, 0xA2, 0xB6, 0xDA,

27、 0xFA, 0x16; /超高音 1234567/-/乐谱1 世上只有妈妈好数据表 要想演奏不同的乐曲, 只需要修改这个数据表code unsigned char sszymmh1 = 6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1, /一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。/6, 2, 3 分别代表:, 中音, 个半拍;/5, 2, 1 分别代表:, 中音, 个半拍;/3, 2, 2 分别代表:, 中音, 个半拍;/5, 2, 2 分别代表:, 中音, 个半拍;/1, 3, 2

28、 分别代表:, 高音, 个半拍;/6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1,6, 1, 1, 5, 2, 1, 3, 2, 1,;/-/乐谱2祝你生日快乐code unsigned char sszymmh2= 5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4, 5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, ;/限于内存,乐谱没有写完void t0int() interrupt 1 /T0中断程序,控制发音的音调 TR0 = 0; /先关闭T0 speake

29、r = !speaker; /输出方波, 发音 TH0 = timer0h; /下次的中断时间, 这个时间, 控制音调高低 TL0 = timer0l; TR0 = 1; /启动T0/-void delay(unsigned char t) /延时程序,控制发音的时间长度 unsigned char t1; unsigned long t2; for(t1 = 0; t1 t; t1+) /双重循环, 共延时t个半拍 for(t2 = 0; t2 20; t2+) read_time(); display1(); ; /延时期间, 可进入T0中断去显示时间 TR0 = 0; /关闭T0, 停止

30、发音/-void song() /演奏一个音符 TH0 = timer0h; /控制音调 TL0 = timer0l; TR0 = 1; /启动T0, 由T0输出方波去发音delay(time1); /控制时间长度/-void sound(void) if(hour=0x12) /12点时响闹钟 unsigned char k, i; TMOD = 1; /置T0定时工作方式1 ET0 = 1; /开T0中断 EA = 1; /开CPU中断 while(flag%2=0&flag30000) i = 0; time1 = 1; while(time1) k = sszymmh1i + 7 *

31、sszymmh1i + 1 - 1; /第i个是音符, 第i+1个是第几个八度 timer0h = FREQHk; /从数据表中读出频率数值 timer0l = FREQLk; /实际上, 是定时的时间长度 time1 = sszymmh1i + 2; /读出时间长度数值 i += 3; song(); if(key4=0|key5=0) break; +flag;if(key5=0)flag=30000; while(flag%2=1&flag30000) i = 0; time1 = 1; while(time1) k = sszymmh2i + 7 * sszymmh2i + 1 - 1

32、; /第i个是音符, 第i+1个是第几个八度 timer0h = FREQHk; /从数据表中读出频率数值 timer0l = FREQLk; /实际上, 是定时的时间长度 time1 = sszymmh2i + 2; /读出时间长度数值 i += 3; song(); if(key4=0|key5=0) break; +flag;if(key5=0)flag=30000;break; /*以下为时间变换函数*/ void changetime() while(key6=1) /如果key6未被按下,则显示时分秒 day1=day;/读取时间 display1(); /显示使时间 sound(); /检测闹铃 if(key1=0) delayms(100); if(key1=0) /确认按下 s1+;switch(s1%3) /分情况通论,按一下调时,再按一下调分,再按一下调秒,如此循环往复 case 0: if(key2=0) delayms(100); if(key2=0)/key2按下表示加 write

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1