单片机实习报告_第1页
单片机实习报告_第2页
单片机实习报告_第3页
单片机实习报告_第4页
单片机实习报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、单片机实习报告学 院: 专 业: 姓 名: 学 号: 起讫时间: 指导教师: 二一年九月九日一、实习目的 1、熟悉单片机的原理、功能与应用 2、熟悉单片机开发的相关软硬件 3、培养单片机应用开发的兴趣 4、提高单片机应用系统的开发能力 二、实习要求 1、熟悉MCS-51单片机的原理; 2、熟悉单片机KEIL C51编程语言; 3、熟悉uVision2单片机C语言开发环境; 三、实习内容 1、熟悉单片机实习板的电路原理,焊接数字钟电路板,连接实习板上的电路,构成数字钟电路。 2、熟悉C51编程语言和开发环境,设计数字钟的软件程序,调试软硬件实习数字时钟功能。数字钟的具体设计要求 一、设计要求 1

2、、以MCS-51系列单片机为核心器件,组成一个电子时钟系统。 2、系统显示器由8位LED数码管组成,分别显示时间值的小时、分和秒,以24h(小时)计时方式。 3、 能够使用按键开关随时对当前时间进行调整。(推荐:键1为功能切换键,键2为移位键,键3为增加键,键4为减少键。也可自行定义。) 4、 有精力的学生可以实现秒表功能、闹钟定时功能、温度显示功能和通讯功能。 二、实习工具 计算机、万用表、稳压电源、编程器、电烙铁、单片机实习套件 三、方案论证 1、总体设计 为了实现LED显示器的数字显示,采用静态显示法和动态显示法。由于静态显示法需要数据锁存器等硬件,接口复杂一些。考虑时钟显示有8位,且系

3、统没有其他复杂的处理任务,所以决定采用动态扫描法实现LED的显示。单片机采用Atmel的AT89S52芯片,这样单片机可具有足够的空余硬件资源实现其它的扩充功能。2、系统硬件电路的设计 秒表/时钟计时器的硬件电路采用AT89S52单片机,最小化应用设计;采用共阴七段LED显示器,P0口输出段码数据,P2.0P2.5口作列扫描输出,P1.0,P1.1,P1.2,p1.3口接四个按钮开关,用以调时功能设置。P3.2口接温度传感器,P3.3口接闹铃,P3.4口接闹铃旁的LED。采用12MHz晶振,有利于精确定时。3、系统程序的设计(1)程序实现功能说明刚开始复位,数码管显示学号,随后从1秒开始计时。

4、短按按键1,可以实现调时功能,长按1可实现闹钟设置功能,当可以设置闹钟时LED灯亮,当设置时间与计时时间吻合时,闹铃响1分钟。短按按键2,实现移位功能,长按按键2,实现确定锁定功能。按键3实现“+”功能,按键4实现“-”功能。18B20为温度传感器,所以数码管后两位可以实现温度显示功能。(2)主程序本设计中,计时采用定时器T0中断完成,其余状态循环调用显示子程序,当端口开关按下时,转入相应功能程序。 (3)LED显示子程序 数码管显示的数据存放在内存单元dis 0-dis5中。其中dis0-dis1存放秒数据,dis2-dis3存放分数据,dis4-dis5存放时数据,每一地址单元内均为十进制

5、BCD码。由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应码段存放在ROM表(LEDMAP中)。显示时,先取出dis0-dis5中的某一数据,然后查得对应的显示用码段,并从P0口输出,P2口将对应的数码管选中供电,就能显示该地址单元的数据值。 (4)定时器T0中断服务程序 定时器T0用于时间计时。中断进入后,时钟计时累计中断达1秒时,对秒计数单元进行加1操作。在计数单元中采用十进制BCD码计数,满60进位,T0中断服务程序执行流程见图2.4。 (5)具体程序如下#include #include #define LEDLen 8#define jump_ROM 0xcc#d

6、efine start 0x44#define read_EEROM 0xbeunsigned char k=0;unsigned char status; /按键处理的状态bit seconds_flag=0; /秒标志位,表明时间已到一秒bit flag_key_delay; /键盘连续处理间隔时间周期信号bit key_first=1; /第一次扫描到按键按下#define KEY_PORT P1 /按键连接的端口bit key_operated=1; /按键已处理过标记unsigned char elaps; /按键长按的时间unsigned char timer_s; /按键随时时间

7、unsigned char temperature; /温度显示unsigned char hours, minutes, seconds; /时间显示的时、分、秒unsigned char timer_hours,timer_minutes; /闹钟定时的小时、分钟unsigned char hours_flag,minutes_flag,naozhong_flag;/小时,分钟,闹钟可设置标志位sbit P10 = P10;sbit P11 = P11;sbit P12 = P12;sbit P13 = P13;sbit DQ = P32;sbit P33 = P33;sbit P34 =

8、 P34;unsigned char disLEDLen; /发光二极管位选数组 code unsigned char LEDMAP = /发光二极管0F的段码 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71;延时程序void delay_ms(unsigned char N) /N*100us 软件延时 unsigned char i,j;i=N;j=50;dodowhile(-j);while(-i);-键盘相关程序unsigned char sca

9、nkey() /按键的监测unsigned char temp1,temp2; unsigned char start_time;temp1=KEY_PORT; /按键未按下为1,按下为0temp1&=0x0f; /取低四位if(temp1=0) /若没有键按下,temp1为0key_first=1;elaps=0;else /否则有键按下 delay_ms(10); /延时去抖动,通过比较temp1 和temp2=KEY_PORT; temp2是否相等,确切判断是否有键temp2&=0x0f; 按下if(temp1=temp2)if(key_first)start_time=timer_s;

10、key_first=0;key_operated=0;elaps= (timer_s+60-start_time)%60; /计算按键时间长短return temp1; /返回键值return 0; /没键按下时返回0void keydeal() /按键的处理unsigned char keyval; /键值keyval=scankey();if(keyval=1) /长按及短按key1(调时、定时闹钟)if(elaps6)hours_flag=1;naozhong_flag=1; /闹钟标志位,等于1时表示可以设置闹钟P34=0; /可设置闹钟时间时LED灯亮if(keyval=2) /短按

11、及长按key2(移位、锁定) if(elaps6) /长按为锁定功能 if(hours_flag=1)&(minutes_flag=0)&(naozhong_flag=0) hours_flag=0; if(hours_flag=1)&(minutes_flag=1)&(naozhong_flag=0) hours_flag=0; minutes_flag=0; if(hours_flag=1)&(minutes_flag=1)&(naozhong_flag=1) P34=1; hours_flag=0; minutes_flag=0; naozhong_flag=0; if(hours_fl

12、ag=1)&(minutes_flag=0)&(naozhong_flag=1) P34=1; hours_flag=0; minutes_flag=0; naozhong_flag=0; if(keyval=4)&(!key_operated) /短按key3(慢+)key_operated=1;if(hours_flag=1&(minutes_flag=0)&(naozhong_flag=0) hours+;hours=hours%24; if(hours_flag=1)&(minutes_flag=1)&(naozhong_flag=0) minutes+;minutes=minutes

13、%60;if(hours_flag=1)&(minutes_flag=0)&(naozhong_flag=1) timer_hours+;timer_hours=timer_hours%24; if(hours_flag=1)&(minutes_flag=1)&(naozhong_flag=1) timer_minutes+;timer_minutes=timer_minutes%60;if(keyval=8)&(!key_operated) /短按key4键(慢-)key_operated=1; if(hours_flag=1&(minutes_flag=0)&(naozhong_flag=

14、0) hours+=24;hours-;hours=hours%24; if(hours_flag=1)&(minutes_flag=1)&(naozhong_flag=0)minutes+=60; minutes-;minutes=minutes%60;if(hours_flag=1)&(minutes_flag=0)&(naozhong_flag=1) timer_hours+=24;timer_hours-;timer_hours=timer_hours%24; if(hours_flag=1)&(minutes_flag=1)&(naozhong_flag=1)timer_minute

15、s+=60; timer_minutes-;timer_minutes=timer_minutes%60; 温度相关函数void delay(unsigned char N) /N*4us 软件延时 unsigned char i;i=N;dowhile(-i); unsigned char reset(void) /18B20复位 unsigned char ready;DQ=1;delay(1);DQ=0;delay(120); /480us ,120DQ=1;delay(8); /大于60us小于75 ,注意值不能太大或太小(7)ready=DQ;delay(80); /响应周期300u

16、s ,75,不能太小return(ready);void write_byte(unsigned char dat)/18B20写字节 unsigned char i;for(i=0;i=1; /至少隔1us再输出下一位unsigned char read_byte(void) /18B20读字节 unsigned char i=0;unsigned char dat=0;for(i=0;i=1; /1usDQ=1;if(DQ=1)dat|=0x80;delay(15); /大于60us,15return(dat);void convert_temp(void)while(reset(); w

17、rite_byte(jump_ROM);write_byte(start);void read_temp(void) /温度测量子程序unsigned char TMPH,TMPL,temp=0; while(reset();write_byte(jump_ROM);write_byte(read_EEROM);TMPL=read_byte();TMPH=read_byte();TMPH=TMPH4;temp=(TMPH+TMPL);if(temp7) k=0; P0 = LED; P2= Pos; Pos = 60) seconds = 0; minutes+; if (minutes =

18、60) minutes = 0; hours+; if (hours = 24) hours = 0; 主程序-void main() static bit wendu_flag=1; unsigned int x=60000; TMOD = 0x01; /定时工作方式,采用工作方式1 TH0 = 0xfc; TL0 = 0x18; IE = 0x82; / EA=1(中断总允许), ET0 = 1(允许定时器中断) hours = 0; minutes = 0; timer_hours=0; timer_minutes=0; seconds = 0; hours_flag = 0; minu

19、tes_flag = 0; naozhong_flag=0; C100us = Tick; TR0 = 1; /启动定时器 do disp_buf0=0x3F; disp_buf1=0x07; disp_buf2=0x3F; disp_buf3=0x06; disp_buf4=0x3F; disp_buf5=0xCF; if(seconds_flag) seconds_flag=0; if(wendu_flag) read_temp(); wendu_flag=0; else convert_temp(); wendu_flag=1; while(x-); while (1) if(naozh

20、ong_flag=1) dis0=LEDMAPtimer_hours/10; dis1=LEDMAPtimer_hours%10|0x80; else dis0 = LEDMAPhours/10; dis1 = LEDMAPhours%10 | 0x80; if(naozhong_flag=1) dis2=LEDMAPtimer_minutes/10;dis3=LEDMAPtimer_minutes%10|0x80; else dis2 = LEDMAPminutes/10; dis3 = LEDMAPminutes%10 | 0x80; dis4 = LEDMAPseconds/10; dis5 = LEDMAPseconds%10| 0x80;scankey();keydeal();if(timer_hours=hours)&(timer_minutes=minutes)&(timer_hours!=0)&(timer_minutes!=0)&(naozhong_flag=0) P33=0; /定时时间到闹铃响 if(P33=0)&(abs(timer_min

温馨提示

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

评论

0/150

提交评论