硬件课程设计实验报告.doc_第1页
硬件课程设计实验报告.doc_第2页
硬件课程设计实验报告.doc_第3页
硬件课程设计实验报告.doc_第4页
硬件课程设计实验报告.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

硬件课程设计实验报告班级: #姓名: Lenbo学号: 123456指导老师: xxp概要: 此次硬件课程设计整个过程涉及的知识面较广:首先,从焊接电路板开始。实验器件材料比较齐全(拿到的是已经设计好的CS SS-I实验板,各种电子元件都是事先准备好的),按照所给电路图将各电子元件焊接在对应位置即可;我觉得焊接电路板这个环节比较考查细心程度,我大概花了6个多小时,自认为比较细心美观程度也还可以,当然最重要的是电路板可用。然后结合常用单片机有关知识设计功能(题目要求的是数字钟和电子音乐)。此后再根据要实现的功能编写代码(整体架构以C语言来构建,通过调用汇编代码实现)。当然后续的代码调试过程是很麻烦的。下面列举的是CS SS-I实验电路板的详细配置参数:1 STC89C52RC单片机,支持串口ISP在线下载。2 8位数码管(可做静态显示,动态扫描实验,数字钟时间显示)。3 16位LED发光二极管(可做流水灯实验)。4 6个按键按键查询按键中断5 MAX232芯片构成标准的RS232串行通信接口,本板可同PC机,单片机开发板进行串行通信,也可直接由计算机串口下载程序至单片机FLASH ROM(8k)进行程序的烧录。6 蜂鸣器(可做单片机发声,播放音乐实验)。7 DS1302时钟芯片(SPI串口实时时钟)。(DS1302时钟芯片网上有丰富的相关资料和参考程序。)8 DS18B20温度传感器接口(初步掌握单片机操作后即可亲自编写程序获知当时的温度)。9 单片机的34个IO口全部由DIP40插座引出,方便用户进行自由扩展进行各种实验。10 USB供电系统,通过直接插接到电脑USB口即可得到+5V电源,不需另接直流电源,方便用户节省费用。(USB座4芯只用到1和4,其中4正1负)注意:理论上USB2.0接口电压3.3-5V,最大电流500MA。为避免初学者使用USB口烧坏主板,(尤其是笔记本电脑)可另配DC9V电源。本开发板已预留了稳压与滤波电路,并具有防止反接保护功能。11 STC89C52RC系列单片机下载编程次数可达数十万次(AST89S52 1000次),下载用时比较短,比专业编程器快。一. 焊接工艺总结最开始拿到实验板的时候十分激动,在经过老师讲解了一些电路板焊接的要点、焊接注意事项、焊接工具的使用以及电子元器件的基本特性之后我便一鼓作气花了差不多4个半小时的功夫将实验板大部分都勾勒出来了。在焊接的过程中,我发现对于在这方面没有什么经验的同学选择适合的焊接工具很关键,比如焊接用的电笔有几种不同类型的(包括马蹄形、针尖形)。那些管脚比较长的电子元件适合用针尖形电笔,若用马蹄形的则焊锡非常不容易接在焊接口处;而那些管脚较短的用马蹄形将更快而且“美容”效果不错,不用担心锡多了或少了。另外焊接过程中特别要注意那些极性电子元件有正负极之分,一旦焊反了返工很麻烦,同时焊接顺序也特别重要。我在焊接芯片底座(共6个)的时候一时疏忽直接将其中一个芯片焊接在了电路板上(好在这种情况并不影响本次实验所要实现的功能,所以我就当个教训,若是拆了重新焊那将难以想象!)。此外焊接时不要接触得太久以防将电路板或其他器件烧坏。焊接电子元件是最好对照电路原理图一步一步地,也顺便理清电路图大致原理,了解各主要电子元件的连接情况方便后面烧写程序; 应该在保证焊接正确且功能基本实现的基础上考虑实验板的美观,不要盲目追求美观而导致焊接失误; 还有一点就是要特别注意安全,在焊接过程中被烫伤的同学特别多,我在焊接时好几次将手汤伤,甚至差一点让电笔将电线烧坏。最后,又几经加工我基本完成了电路板的焊接工作,接通电源后二极管都可以亮,蜂鸣器也都正常,将老师给的几个试验程序也都能顺利运行。二. 编程思想数字钟需要实现五个功能。正常显示当前时间、显示当天日期、对当前时间进行调整、对当前日期进行调整、设置闹钟时间。为了使单片机在断电的情况下仍然可以实现正常计时,在此采用DS1302计时芯片,通过3.2V锂电池供电实现连续计时。下面是数字钟的设计思想:首先编写DS1302芯片的读写驱动程序。按键功能设计。K1控制模式选择,K1是单片机外部中断0,采用下降沿触发方式,接收外来中断,K2是数字调整键,对选定的显示位进行加一操作,K2键也是外部中断采用下降沿中断。K6键用来选择调整位,在调整显示数字时不是按位调整,而是按照时、分、秒、日、月、年十进制数字进行调整。K5键实现数字钟闹钟打开功能,K4键实现数字钟闹钟关闭功能。七段数码管显示部分,显示时间时采用24进制,时分秒之间用短连接符隔开。显示日期时,年份只显示后两位,年月日之间也用短连接符隔开,在调整时间和日期时为了加以区别调时时数码管显示全零,而调日期时由于日期没有0月0日,所以数码管显示为00-01-01,通过数码管显示数字不同来确定调整模式,在调整时为了区分调整位,我通过小数点来标识,要调哪一位则这位的个位小数点点亮。 在设置闹钟时,只进行时分的设置,因此秒位不显示(黑屏),由于闹钟分为打开和关闭,为了便于识别,当闹钟打开时,在显示时间模式时最高位的小数点点亮,关闭时不点亮。本程序为了能够让闹钟音乐和数码管扫描同时进行,采用定时器扫描,通过定时器扫描对应数码管应该显示数字,再通过位控制来循环扫描,从而显示时间或日期。外部中断0用于模式选择,外部中断1用来对当前数码管显示位的待调位进行加1操作。在主程序中应该对外部中断和定时器进行初始化,同时对调整过后的数据写入DS1302,并从DS1302中读取当前模式所需数据。通过软件查询判断K6,K5,K4是否按下,并实现相应功能。主程序中还应该实现当前时间与闹钟时间的对比,如果相等的话则调用音乐程序,否则不操作。电子音乐的实现。构成声音的三要素分别是振幅、频率和音色。其中振幅关系到声音的大小,由电流决定,频率牵涉到声音的高低音,音色则是声音中谐波的成分。在实验中只考虑声音的高低音变化,即通过让52定时器产生不同的方波用以实现不同频率。除此之外,还要考虑到拍子的长短。在拍子的延时时通过调用汇编所写的软件精确延时达到所需延时。三. 程序框图四.核心代码日期和闹钟程序代码:-#include#define uint unsigned int#define uchar unsigned charuchar code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /dep点的编码0x7fuchar day,mon,year,sec,min,hour,or,h_clock,m_clock,clock_b,sn;#define w_s 0x80#define w_m 0x82#define w_h 0x84#define w_d 0x86#define w_mon 0x88#define w_year 0x8c#define r_s 0x81#define r_m 0x83#define r_h 0x85#define r_day 0x87#define r_mon 0x89#define r_year 0x8d#define w_wp 0x8esbit sclk = P10;sbit io = P11;sbit rst = P12;sbit k1 = P32;sbit k2 = P33;sbit k3 = P34;sbit k4 = P35;sbit k5 = P16;sbit k6 = P17;sbit beep = P14;void write_c(uchar dat) /DS1302写入 uchar i; for(i=0;i1; sclk=1; void write_ds(uchar add,uchar dat) /写数据 rst =0; sclk=0; rst=1; write_c(add); write_c(dat); rst=0; io=1; sclk=1;uchar read_ds(uchar add) /读数据 uchar i,value; rst=0; sclk=0; rst=1; write_c(add); for(i=0;i=1; sclk=0; if(io) value=value|0x80; sclk=1; sclk=1; value=(value/16)*10+value%16; /十六进制转换为十进制 return value;void init_ds1302() write_ds(w_wp,0x00); write_ds(0x90,0xab); /设置电源切断后,自动切换到备用电源 write_ds(w_h,0x00); /设置24制 write_ds(w_year,0x10); write_ds(w_mon,0x10); write_ds(w_d,0x15); write_ds(w_h,0x12); write_ds(w_m,0x12); write_ds(w_s,0x16); write_ds(w_wp,0x80); /关闭寄存器输入 void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=40;y0;y-);void feng(uint a) /蜂鸣器函数 uint x; for(x=a; x0; x-) beep=1; delay(4); beep=0; void s_beep(uint a,uint b) /闹钟时间显示 uchar i; P2=0; P0=tablea%10; /时 P2=0x08; for(i=0;i=160;i+); P2=0; P0=tablea/10; P2=0x10; for(i=0;i=160;i+);P2=0;P0=0xbf;P2=0x04;for(i=0;i160;i+); P2=0; P0=tableb%10; P2=0x01; for(i=0;i=160;i+); P2=0; P0=tableb/10; P2=0x02; for(i=0;i=160;i+);void v_time() /数码管时间函数 uchar i; P2=0; P0=tablesec%10; P2=0x01; for(i=0;i=150;i+); P2=0; P0=tablesec/10; P2=0x02; for(i=0;i=150;i+);P2=0;P0=0xbf;P2=0x04;for(i=0;i=150;i+); P2=0; P0=tablemin%10; P2=0x08; for(i=0;i=150;i+); P2=0; P0=tablemin/10; P2=0x10; for(i=0;i=150;i+);P2=0;P0=0xbf;P2=0x20;for(i=0;i=150;i+); P2=0; P0=tablehour%10; P2=0x40; for(i=0;i=150;i+); P2=0; P0=tablehour/10; P2=0x80; for(i=0;i=150;i+); void view_d() /数码管日期函数 uchar i; P2=0; P0=tableday%10; P2=0x01; for(i=0;i=160;i+); P2=0; P0=tableday/10; P2=0x02; for(i=0;i=160;i+); P2=0; P0=tablemon%10-0x80; P2=0x04; for(i=0;i=160;i+); P2=0; P0=tablemon/10; P2=0x08; for(i=0;i=160;i+); P2=0; P0=tableyear%10-0x80; P2=0x10; for(i=0;i=160;i+); P2=0; P0=tableyear/10; P2=0x20; for(i=0;i=160;i+); P2=0; P0=table0; P2=0x40; for(i=0;i=160;i+); P2=0; P0=table2; P2=0x80; for(i=0;i=96) temp=0; write_ds(w_wp,0x00); /禁止写保护 write_ds(w_s,temp); /秒初始化 write_ds(w_wp,0x80); /允许写保护 if(k3=0) delay(10); if(k3=0) while(k3=0); kk=read_ds(r_s); temp=(kk-1)/10*16+(kk-1)%10; if(temp=0) temp=89; write_ds(w_wp,0x00); /禁止写保护 write_ds(w_s,temp); /秒初始化 write_ds(w_wp,0x80); /允许写保护 break; case 2: if(k2=0) delay(10); if(k2=0) while(k2=0); kk=read_ds(r_m); temp=(kk+1)/10*16+(kk+1)%10; if(temp=96) temp=0; write_ds(w_wp,0x00); /禁止写保护 write_ds(w_m,temp); /分初始化 write_ds(w_wp,0x80); /允许写保护 if(k3=0) delay(10); if(k3=0) while(k3=0); kk=read_ds(r_m); temp=(kk-1)/10*16+(kk-1)%10; if(temp=0) temp=89; write_ds(w_wp,0x00); /禁止写保护 write_ds(w_m,temp); /分初始化 write_ds(w_wp,0x80); /允许写保护 break; case 3 : if(k2=0) delay(10); if(k2=0) while(k2=0); kk=read_ds(r_h); temp=(kk+1)/10*16+(kk+1)%10; if(temp=36) temp=0; write_ds(w_wp,0x00); /禁止写保护 write_ds(w_h,temp); /时初始化 write_ds(w_wp,0x80); /允许写保护 if(k3=0) delay(10); if(k3=0) while(k3=0); kk=read_ds(r_h); temp=(kk-1)/10*16+(kk-1)%10; if(temp=0) temp=35; write_ds(w_wp,0x00); /禁止写保护 write_ds(w_h,temp); /时初始化 write_ds(w_wp,0x80); /允许写保护 break; default:sn=0; void key_day() /日期按键程序 uchar temp,kk,m,y; if(k1=0) delay(10); if(k1=0) while(k1=0); sn+; m=read_ds(r_mon); y=read_ds(r_year)+2000; switch(sn) case 1: if(k2=0) delay(10); if(k2=0) while(k2=0); kk=read_ds(r_day); temp=(kk+1)/10*16+(kk+1)%10; if(temp40) if(m=1|m=3|m=5|m=7|m=8|m=10|m=12) if(temp49) temp=1; if(m=4|m=6|m=9|m=11) if(temp48) temp=1; if(m=2) if(y%100!=0&y%4=0|y%400=0) if(temp41) temp=1;if(!(y%100!=0&y%4=0|y%400=0)temp=1; write_ds(w_wp,0x00); /禁止写保护 write_ds(w_d,temp); /日初始化 write_ds(w_wp,0x80); /允许写保护 if(k3=0) delay(10); if(k3=0) while(k3=0); kk=read_ds(r_day); temp=(kk-1)/10*16+(kk-1)%10; if(temp=0) if(m=1|m=3|m=5|m=7|m=8|m=10|m=12) temp=49; if(m=4|m=6|m=9|m=11) temp=48; if(m=2) if(y%100!=0&y%4=0|y%400=0) temp=41; else temp=40; write_ds(w_wp,0x00); /禁止写保护 write_ds(w_d,temp); /日初始化 write_ds(w_wp,0x80); /允许写保护 break; case 2: if(k2=0) delay(10); if(k2=0) while(k2=0); kk=read_ds(r_mon); temp=(kk+1)/10*16+(kk+1)%10; if(temp18) temp=1; write_ds(w_wp,0x00); /禁止写保护 write_ds(w_mon,temp); /月初始化 write_ds(w_wp,0x80); /允许写保护 if(k3=0) delay(10); if(k3=0) while(k3=0); kk=read_ds(r_mon); temp=(kk-1)/10*16+(kk-1)%10; if(temp=0) temp=18; write_ds(w_wp,0x00); /禁止写保护 write_ds(w_mon,temp); /月初始化 write_ds(w_wp,0x80); /允许写保护 break; case 3: if(k2=0) delay(10); if(k2=0) while(k2=0); kk=read_ds(r_year); temp=(kk+1)/10*16+(kk+1)%10; if(temp153) temp=0; write_ds(w_wp,0x00); /禁止写保护 write_ds(w_year,temp); /年初始化 write_ds(w_wp,0x80); /允许写保护 if(k3=0) delay(10); if(k3=0) while(k3=0); kk=read_ds(r_year); temp=(kk-1)/10*16+(kk-1)%10; if(temp=-1) temp=153; write_ds(w_wp,0x00); /禁止写保护 write_ds(w_year,temp); /年初始化 write_ds(w_wp,0x80); /允许写保护 break; default:sn=0; void b_set() /闹钟按键 uchar b; if(k1=0) delay(10); if(k1=0) while(k1=0); b+; switch(b) case 1: if(k2=0) delay(10); if(k2=0) while(k2=0); m_clock=m_clock+1; if(m_clock=60) m_clock=0;s_beep(h_clock,m_clock); if(k3=0) delay(10); if(k3=0) while(k3=0); m_clock=m_clock-1; if(m_clock=0) m_clock=59;s_beep(h_clock,m_clock); break; case 2: if(k2=0) delay(10); if(k2=0) while(k2=0); h_clock=h_clock+1; if(h_clock=24) h_clock=0; s_beep(h_clock,m_clock); if(k3=0) delay(10); if(k3=0) while(k3=0); h_clock=h_clock-1; if(h_clock=0) h_clock=23;s_beep(h_clock,m_clock); break;default:b=0; break; void show() /显示函数 uchar b; if(k4=0) delay(10); if(k4=0) while(k4=0); b+; switch(b) case 0: key_time(); /时间部分 dis_t(); break; case 1: key_day(); dis_d(); /日期部分 break; case 2: b_set(); s_beep(h_clock,m_clock); break; default: b=0; break; void main() or=1; h_clock=0; m_clock=0; clock_b=1; init_ds1302();beep=0;while(1) show();-蜂鸣器程序代码:-#include#define uchar unsigned char#define uint unsigned intsbit SPK = P14;unsigned char T0_Times = 0;unsigned char code Music = 0x18, 0x30, 0x1C, 0x10, 0x20, 0x40, 0x1C, 0x10, 0x18, 0x10, 0x20, 0x10, 0x1C, 0x10, 0x18, 0x40, 0x1C, 0x20, 0x20, 0x20, 0x1C, 0x20, 0x18, 0x20, 0x20, 0x80, 0xFF, 0x20, 0x30, 0x1C, 0x10, 0x18, 0x20, 0x15, 0x20, 0x1C, 0x20, 0x20, 0x20, 0x26, 0x40, 0x20, 0x20, 0x2B, 0x20, 0x26, 0x20, 0x20, 0x20, 0x30, 0x80, 0xFF, 0x20, 0x20, 0x1C, 0x10, 0x18, 0x10, 0x20, 0x20, 0x26, 0x20, 0x2B, 0x20, 0x30, 0x20, 0x2B, 0x40, 0x20, 0x20, 0x1C, 0x10, 0x18, 0x10, 0x20, 0x20, 0x26, 0x20, 0x2B, 0x20, 0x30, 0x20, 0x2B, 0x40, 0x20, 0x30, 0x1C, 0x10, 0x18, 0x20, 0x15, 0x20, 0x1C, 0x20, 0x20, 0x20, 0x26, 0x40, 0x20, 0x20, 0x2B, 0x20, 0x26, 0x20, 0x20, 0x20, 0x30, 0x80, 0x20, 0x30, 0x1C, 0x10, 0x20, 0x10, 0x1C, 0x10, 0x20, 0x20, 0x26, 0x20, 0x2B, 0x20, 0x30, 0x20, 0x2B, 0x40, 0x20, 0x15, 0x1F, 0x05, 0x20, 0x10, 0x1C, 0x10, 0x20, 0x20, 0x26, 0x20, 0x2B, 0x20, 0x30, 0x20, 0x2B, 0x40, 0x20, 0x30, 0x1C, 0x10, 0x18, 0x20, 0x15, 0x20, 0x1C, 0x20, 0x20, 0x20, 0x26, 0x40, 0x20, 0x2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论