单片机实训77158.doc_第1页
单片机实训77158.doc_第2页
单片机实训77158.doc_第3页
单片机实训77158.doc_第4页
单片机实训77158.doc_第5页
免费预览已结束,剩余14页可下载查看

下载本文档

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

文档简介

南京工业大学单 片 机 应 用 实 习学生姓名:蒋骏学号:P1501100702专业:自动化班级:浦自10072013年7月一、 实习地点学科楼D301二、 实习时间2013年7月1日2013年7月12日三、 实习项目1. 绘制学习板的电路图,熟悉Altium Designer软件。2. 利用STC89C52RC的定时器1实现:可调时电子钟(七段码显示器)。3. 将第2项目的显示设备为液晶显示。4. 使用开发板上的DS18B20进行环境温度测量,并将测量到的温度值显示(七段码显示),小数点后一位有效数字,单位为C。5. 熟悉STC89C52RC的定时器2,并用定时器2实现可调时电子钟(七段码显示器)。6. 第4项目基础上实现:当温度大于等于28.0时,蜂鸣器鸣叫,同时,继电器闭合;当温度小于28.0时,蜂鸣器停止鸣叫,同时,继电器断开。7. 利用24C02芯片,对第4项目中开机1分钟内的环境温度测量值进行永久保存。8. 将第7项目中保存的温度值利用按键操作依次进行读取,利用数码管显示。9. 利用STC89C52RC自带的EEPROM代替24C02实现第7项目功能。10.在第6项目基础上,实现PC机可调时电子钟。其中:第16为所有学生必做项目;710为学有余力的学生选做项目。四、 实习项目完成情况1.电路图能够很好的完成,起初遇到的问题有:不知道如何对电路图进行放大和缩小及对电路图进行左右移动,经过自己的摸索,这些小问题还是被解决了。在画图的过程中,让一个从库文件中查找出的元器件进行镜像转换有点不知所措,后来通过查找资料,请教同学,原来双击那个元器件,在中部偏下有个反映单选框,打个勾就可以了。另外在元器件的排版上也要格外注意,保持好每个元件的距离,还要给网络标号留下足够的空间。在电路图全部画好以后,最后一步要检查错误并编译,在系统检查完毕并且没有错误,这就表示项目一成功了。2.定时器1实现可调电子钟:首先找出老师提供的原程序,在弄懂老师给的程序后,再运用自己所学到的知识对项目二进行修改。该项目使用定时器一,这是一个16位计数器,有4中工作方式。刚开始,我在学习板上下载了老师的程序,发现前四个数码管和后四个数码管应该对调,于是我将程序中LED_SELECT_MAP 的位选共阳极显示代码前四个和后四个换了下位置,这样数码管的显示就正确了。程序最重要的是要修改原程序中AT89S51配置这一段,原程序是定时器0,所以我把0x10赋值给了TMOD,使用了定时器一的工作方式一。TL0TH0也要更改为TL1TH1,TRO变成TR1,并赋值1,表示启动定时计数器1.并把0x88赋值给IE中断使能寄存器。最后在中断程序中,中断号不能忘记更改为3,其他的和原程序保持一致。3将项目二的显示设备为液晶显示:该项目使用了液晶显示屏,所以就要用到字模软件。首先在字模软件里依次将0,1,2,3,4,5,6,7,8,9的代码取出,格式设为纵向取模,倒序,宋体,12号,液晶屏上的时分秒之间采用冒号分隔,因此在字模软件中输入冒号,也取出冒号的代码,在调整时钟时,为了美观还需要添加横线,因此也要获得横线的代码。另外还需要一个清零的代码,这些字模代码都要放在lcd12232.c中,从0到横线依次排序为012。在老师所给程序12232-1液晶显示例题作为参考,在项目二的基础上再进行更改。在main.C中字模显示程序段再加入10,11,12.其中10对应的是清零,11对应的是冒号,12对应的是横线。因为是LCD液晶屏显示,还要添加一个LcdConfig() ,这是关于LCD液晶屏的配置函数。另外,在程序中的界面显示程序段,要添加一个if函数,判断在液晶显示屏正常显示时,是否应该显现时分秒之间的冒号。运用LEDBuffer数组函数,给相应的位选数码管赋值字模软件的编号,从而获取代码,实现功能。在学习板上按下s19按键,则进入界面调整状态。此时我设定界面在调整状态除了要调整的位置其余都是横线,所以要在界面显示程序段给LEDBufferi都赋12,表示调整界面时的横线。在时分秒三个调整界面都要加上这一句。在项目二的最后还要加上一段DrawWord,代表液晶显示。因为有八个数码管,因此要写八句。在DrawWord函数中要写明液晶屏上行,列,宽度,并利用LEDMAP,根据数码管的位选编号,进行首地址偏移,再利用其读取数字。这样,就可以在LCD液晶屏上展现可调整的电子时钟了。4使用开发板上的DS18B20进行环境温度测量:这个项目主要依靠DS18B20传感器来感应温度从而在数码管上实现温度的显示。因为要用到数码管,所以也要进行数码管的段选和为位选,都是共阳极显示代码,低电平点亮,这是为了显示数字。要显示温度还应当设置小数点和摄氏度,小数点用Point表示取0x7f,摄氏度用Celsius表示取0xc6。 然后再借助原程序进行一定的修改。在动态显示的一小段程序中,for循环语句中,i=7,因为有八个数码管,编号是从07,刚开始,我用的是i=8,程序不能执行,经过一次次调试,终于找到了错误。5. 用定时器2实现可调时电子钟:因为又是用数码管实现可调时的电子钟,所以只需要在项目二上做些改动。根据课本上的相关知识,自己又从网上收索了相关资料,得知定时器2是16位自动加载定时器,有三种工作方式,需要TF2软件清零。并且51里不包含T2CON,所以使用定时器2要选择REGX52.H作为头文件。在AT89S51配置程序段里,应将0x04赋值给T2CON,当TR2=1,启动定时器2,0x00赋值给T2MOD,当DCEN 置0后,定时器2可配置成向上计数。TL1TH1也要改TL2TH2,0xA0赋给IE。最后中断号不能忘记更改,定时中断2的中断号是5.并要在中断函数中添加软件清理,即TF2=0,TF2是溢出标志位。6.显示当前的温度并设置报警温度:该程序主要是几个小程序的组合,困难的地方在设置温度并让蜂鸣器叫。刚开始以为给蜂鸣器低电平就会叫,最后发现是给了一个脉冲。整个程序都是由以上几个项目中的极端代码整合而成,也参考了老师提供的原程序。最初整合以后会有些功能无法实现,错误在于几个小程序整合的位置不正确,纠正各部分的位置,将显示整合为一个,程序运行正常。 五、 典型项目实习报告1. 项目描述项目3:功能:利用STC89C52RC的定时器1实现:可调时电子钟(液晶屏显示)操作说明书: 上电后液晶正常显示,显示时间。 左起第三个按键(S19)作为调整时间切换按键。 左起第一个按键(S17),为递增,左起第二个按键(S18),为递减。附实物图:2. 学习板电路原理图2. 程序清单#include #include lcd12232.h#include delay.h #define KEY_PIN P3bit Timer1sFlg; /1s更新一次bit Timer05sFlg; /0.5s更新一次unsigned char LEDBuffer8; /显示缓冲区unsigned char Second;/秒 unsigned char Minute; /分unsigned char Hour; /时enum SHOW_STATE /展现状态 SHOW_NORMAL, SHOW_SEC_ADJ, SHOW_MIN_ADJ,SHOW_HOUR_ADJ,/标准状态 秒 分 时ShowState;typedef enum NULL, KEY_ENTER, KEY_UP, KEY_DOWN /空 s19调整 s17加 s18减TYPEDEF_KEY; enum LED_GOOUT = 10, CHAR_DEC, /灭 横;unsigned char code LEDMAP =/字模显示0, 1, 2, 3, 4,5, 6, 7, 8, 9,10,11,12 /10对应的0 11对应的冒号 12对应的横; void AT89S51Config(void); /函数void VariableInitial(void);void ShowNormal(void);void ShowSecondAdj(void);void ShowMinuteAdj(void);void ShowHourAdj(void); void Delay(unsigned int t); void Display(unsigned char * buf); /动态显示unsigned char GetKey(void);void main() LcdConfig();/lcd的配置 AT89S51Config(); /AT89S51配置VariableInitial();/变量初始化while(1)switch(ShowState)case SHOW_NORMAL:ShowNormal();break;case SHOW_SEC_ADJ:ShowSecondAdj();break;case SHOW_MIN_ADJ:ShowMinuteAdj();break;case SHOW_HOUR_ADJ:ShowHourAdj();break;default:break;Display(LEDBuffer); Timer1() interrupt 3 /* 定时中断1 所以中断号 是3 static unsigned char count_1s;static unsigned char count_05s;TL1 = (65536 - 50000)%256; /低位放余数TH1 = (65536 - 50000)/256; /高位放商count_1s+;count_05s+;if(count_1s = 20)Timer1sFlg = 1; /1秒钟到,显示值更新count_1s =0; if(count_05s = 10)Timer05sFlg = !Timer05sFlg;count_05s =0;void AT89S51Config(void) TMOD = 0x10; /* 定时器1TL1 = (65536 - 50000)%256; /* 个位TH1 = (65536 - 50000)/256; /* 十位TR1 = 1; /* 启动定时计数器 IE = 0x88; /定时器1/变量初始化/-void VariableInitial(void) ShowState = 0;Second = 0; Minute = 0;Hour = 0;Timer1sFlg = 0;Timer05sFlg = 1; void ShowNormal(void)TYPEDEF_KEY key;/1秒钟到,显示值更新if(Timer1sFlg)Timer1sFlg = 0;Second+;if(Second = 60)Second = 0;Minute +;if(Minute = 60)Minute = 0;Hour +;if(Hour = 24)Hour = 0;/界面显示LEDBuffer0 = Second % 10;/秒个位送显示缓冲区LEDBuffer1 = Second / 10;/秒十位送显示缓冲区LEDBuffer3 = Minute % 10;LEDBuffer4 = Minute / 10;LEDBuffer6 = Hour % 10;LEDBuffer7 = Hour / 10;if(Timer05sFlg) /0.5秒更新LEDBuffer2 = 11; /显示冒号LEDBuffer5 = 11;elseLEDBuffer2 = 10; /显示空白LEDBuffer5 = 10;/正常显示界面下响应按键key = GetKey();if(key = KEY_ENTER) /即按下s19ShowState = SHOW_SEC_ADJ; void ShowSecondAdj(void)/ShowSecondAdj为一个函数TYPEDEF_KEY key; /定义的变量unsigned char i; /定义一个无符号字符i/界面显示for(i = 0; i = 60)Second = 0;break;case KEY_DOWN:if(0 = Second)Second = 59;elseSecond-;break;void ShowMinuteAdj(void) / 函数TYPEDEF_KEY key; / 定义变量unsigned char i; / 定义无符号字符i/界面显示for(i = 0; i = 60)Minute = 0;break;case KEY_DOWN:if(0 = Minute)Minute = 59;elseMinute-;break;void ShowHourAdj(void)TYPEDEF_KEY key;unsigned char i;/界面显示for(i = 0; i = 24)Hour = 0;break;case KEY_DOWN:if(0 = Hour)Hour = 23;elseHour-;break;TYPEDEF_KEY GetKey(void)TYPEDEF_KEY key = NULL;if( KEY_PIN & 0x1c) /有键按下 11111100 判断17 18Delay(1000);/去抖动if(KEY_PIN & 0X04)/17key = KEY_UP;else if(KEY_PIN & 0X08) /18key = KEY_DOWN;else if(KEY_PIN & 0X10) /19key = KEY_ENTER;elsereturn(NULL);while( KEY_PIN & 0x1c)/等待键抬起Delay(2); return(key);return(NULL); void Display(unsigned char * buf) /buf 代表ledbuf 首地址 DrawWord(LEDMAP*(buf + 7),0,0,8); / DrawWord液晶显示 buf + 7首地址偏移,再利用其读取数字DrawWord(LEDMAP*(buf + 6),0,8,8);DrawWord(LEDMAP*(buf + 5),0,16,8);DrawWord(LEDMAP*(buf + 4),0,24,8);DrawWord(LEDMAP*(buf + 3),0,32,8);DrawWord(LEDMAP*(buf + 2),0,40,8);DrawWord(LEDMAP*(buf + 1),0,48,8);DrawWord(LEDMAP*(buf + 0),0,56,8);六、 实习感受和总结两周短暂而又充实的单片机实训,很快就结束了。单片机作为一种最简单的软件,与我们的日常生活息息相关,了解一些单片机程序的简单录入是非常必要的。在学习过程中,我发现学习单片机不仅仅需要软件知识,还需要硬件的知识,所以在实训的第一天老师就让我们试着画出学习板硬件电路图,这是在带领我们进入单片机的世界。有了对硬件的认识,我们在软件实现种种功能的时候思路才会更清晰。俗话说“好的开始是成功的一半”,在画电路图的那天猛然激起了我对单片机的兴趣,越来越觉得单片机是个很有趣的东西,值得我们好好专研。在两周的时间内,老师为我们安排了好几个项目,都让我们自己独立去完成,因为有许多的基础知识都是以前上课讲过的内容,还有一些扩展内容需要我们自己去查找资料,意在让我们遇到问题要学会独立思考,这样印象才会更加深刻。项目二项目三就在老师提供的原始程序上稍加变动,只要勤动脑再多加思考,问题不难解决。但是在项目五中所使用的定时器二是我们以前从未接

温馨提示

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

评论

0/150

提交评论