电子秒表报告书.doc_第1页
电子秒表报告书.doc_第2页
电子秒表报告书.doc_第3页
电子秒表报告书.doc_第4页
电子秒表报告书.doc_第5页
免费预览已结束,剩余21页可下载查看

下载本文档

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

文档简介

目 录1设计概述31.1 设计目的及分析31.2 秒表功能描述31.3 部分硬件原理图32主程序设计32.1 硬件结构分析32.2程序设计流程图32.3 程序清单及注释33使用功能说明33.1 详细功能描述33.2 程序仿真实验34 总结3参考文献31设计概述1.1设计目的及分析1.1.1设计目的(1)加深对单片机的全面认识和掌握,对单片机课程的应用进一步的了解。(2)掌握定时器、外部中断的设置和编程原理。(3)能够将单片机软硬件结合起来,对程序进行编辑、校验。(4)利用单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义。1.1.2准备仪器集成电路芯片ADuC848,单片机开发板,七段数码管,MCS-51系列单片机微机仿真实验系统中的软件(Keil uvision3)。1.1.3设计难点利用单片机的定时器/计数器的功能,结合集成电路芯片ADuC848、LED数码管以及实验箱上的按键来设计计时器。将软、硬件有机地结合起来,使得系统能够正确地进行计时,数码管能够正确地显示时间。单片机电子秒表需要解决三个主要问题,一是如何利用多个中断实现计时和其他功能;二是如何实现LED的动态扫描显示;三是如何对键盘输入进行编程。1.2秒表功能描述1.2.1基本功能设计一电子秒表,基本功能,包括:1设计可以显示0.1100s的秒表,最小单位为毫秒;2通过按键控制秒表清零、暂停、继续、退出等功能;3增添键盘防死按功能,使操作更加灵活可靠;4具有倒计时功能; 5秒表可以分组存储,批量显示; 6可以对秒表分组储存的数据进行删除清零操作;7计时的时候,设置一个标志位,可以顺时针或逆时针旋转,增加美观性。1.2.2设计内容提要本系统采用ADuC848单片机为中心器件,利用其定时器/计时器定时和计数的原理,结合硬件电路:电源电路、晶振电路、复位电路、显示电路以及一些按键电路等来设计计时器,将软、硬件有机地结合起来。其中软件系统采用C语言编写程序,包括显示程序、快加程序、中断、延时程序等,并在Keil中调试运行;硬件系统利用Proteus强大的功能来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。秒表系统的电路原理图如下图所示:外围电路单片机电源电路显示电路键盘电路系统电路原理图1.3 部分硬件原理图Pin14:(P1.0P1.3)作为矩阵式键盘或独立按键的输入,P1口只能用于输入,默认用于模拟输入;作为数字输入使用时应先往P1口相应引脚写0,这里可以用P0&=0xf0。若P2、P3、P0口要作为输入,则应往相应引脚写1。Pin5、6:AVDD、AGND,模拟电源输入。Pin7、8:外部参考电压接入,Pin7接AGND。片内DAC有2.5V内部参考,ADC有1.25V内部参考。Pin9、10:(P1.4、P1.5)两路AD输入,可做差分输入,需要设置ADC的寄存器。ADuC848芯片引脚图Pin11、12:(P1.6、P1.7)各200uA激励电流源,可配合RTD等做应用。Pin13:两路AD输入做普通输入时的电压参考端,AD输入电压不能低于此引脚电压。Pin14:片内DAC输出。Pin15:复位引脚。Pin16、17:单片机RS232接口的RXD(P3.0) TXD(P3.1)。Pin18:(P3.2) 外部中断0,用于红外接收和PS/2接口。Pin19:(P3.3)LCD1602,LCD12864A的EN引脚,控制第一位数码管。Pin20、21:DVDD、DGND数字电源输入。 按键模块原理图由于P1口(用于行扫描)内部无上拉电阻,为使无键按下时行信号为高电平,故将行信号接上拉电阻,电阻大小10K即可。引脚复用:P2.0P2.3为4X4矩阵式键盘列扫描信号,又复用作步进电机控制信号,SPI信号、P2.1P2.3还复用为数码管第5、6、7位位码控制信号。参与复用的一项功能使用时,其他参与复用的功能则不能使用。插针配置: (1)插针10上面两脚接跳线帽,4X4矩阵式键盘输入,行扫描信号为P1.0P1.3,列扫描信号为P2.02.3。(2)插针10下面两脚接跳线帽,独立按键输入,该模式有4个独立按键可用,按键扫描所用端口为P1.0P1.3。这4个按键为4X4矩阵键盘的左边4个按键。本实验只用到4个独立按键,所以将跳线帽插到下面两个引脚。2主程序设计2.1硬件结构分析2.1.1总体结构单片机应用系统由硬件系统和软件系统两部分组成。硬件系统是指单片机以及扩展的存储器、IO接口、外围扩展的功能芯片以及接口电路;软件系统包括监控程序和各种应用程序。在单片机应用系统中,单片机是整个系统的核心,对整个系统的信息输入、处理、信息输出进行控制。与单片机配套的有相应的复位电路、时钟电路以及扩展的存储器和IO接口,使单片机应用系统能够运行。在一个单片机应用系统中,往往都会输入信息和显示信息,这就涉及键盘和显示器。在单片机应用系统中,一般都根据系统的要求配置相应的键盘和显示器。配置键盘和显示器一般都没有统一的规定,有的系统功能复杂,需输入的信息和显示的信息量大,配置的键盘和显示器功能相对强大,而有些系统输入/输出的信息少,这时可能用几个按键和几个LED指示灯就可以进行处理了。在单片机应用系统中配置的键盘可以是独立键盘,也可能是矩阵键盘。2.1.2显示电路显示电路既可以选用液晶显示器,也可以选用数码管显示。这里采用的是数码管显示电路:用2个共阴极LED显示,LED是七段式显示器,内部有7个条形发光二极管和1个小圆点发光二极管组成,根据各二极管的亮灭组合成字符。在用数码管显示时,这里有静态和动态两种选择:静态显示程序简单,显示温度,但是占用端口比较多;动态显示所使用的端口比较少,可以节省单片机的I/O口。在设计中,这里采用LED动态显示,用P0口驱动显示。由于P0口的输出极是开漏电路,用它驱动时需要外接上拉电阻才能输出高电平。2.1.3键盘电路在按键电路中,这里可以在I/O口上直接按键,或者通过I/O口设计一个键盘,然后通过键盘扫描程序判断是否有按键按下等。键盘扫描电路节省I/O口,但编程有些复杂,在这里,由于这里所用的按键较少,且系统是一个小系统,有足够的I/O口可以使用,为了使程序简化,这里采用按键电路,用部分P1口做开关,P1.0开始和暂停,P1.1清零,P1.2方向切换,P1.3历史数组,另外用软件法消除抖动。2.2程序设计流程图2.2.1主程序流程图本设计中,计时采用定时器T0和T1中断完成,其余状态循环调用显示子程序。当端口开关按键按下时,转入相应功能程序流程图如下图所示。2.2.2 定时器T1(T0)定时器T1和T0为十六位定时/计数器,采用的工作方式为常用方式1,其中T1的中断流程图如下图所示,T0中断与T1相似。 开始显示单元清零T1设为16位计时器模式允许T1中断调用显示子程序按键按下?进入功能程序NY T1中断保护现场秒表加1s处理恢复,中断返回加10ms处理 主程序流程图 定时器T1中断程序流程图2.3程序清单及注释#include ADUC848.h#define uchar unsigned char#define uint unsigned int/*变量定义*/uchar code Table=0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09;uchar code vary=0x7f,0xbf,0xdf,0xef,0xf7,0xfb; /正向循环显示字符uchar code vary2=0xfb,0xf7,0xef,0xdf,0xbf,0x7f; /反向循环显示字符uchar Cnt,sec_ms,sec,dir,n,nn,flag,wei,k,m,ss;uchar value_s9=0,value_ms9=0;/*键盘功能键*/sbit Key1=P10; /启动停止键sbit Key2=P11; /清零 记录数组 清楚历史数据sbit Key3=P12; /正反向计数切换sbit Key4=P13; /显示历史数据 /*数码管位选*/sbit led0=P33; sbit led1=P35;sbit led2=P36;sbit led3=P37;sbit led4=P24;sbit led5=P21;sbit led6=P22;sbit led7=P23;/*变量初始化*/void value_init()Cnt=0; sec_ms=0;sec=0;dir=0;n=0;nn=9;wei=0;/*定时器初始化*/void Timer_init() EA=1; /开总中断TMOD=0x11; /写中断方式TH0=(65536-1600)/256;/1ms 中断TL0=(65536-1600)%256;TH1=(65536-1600)/256;/1ms 中断TL1=(65536-1600)%256;ET0=1;ET1=1; TR0=0;/初始时关闭定时器0中断TR1=0; /初始时关闭定时器1中断/*1ms延时子函数*/void delay(uchar z)uchar i,j;for(i=0;iz;i+)for(j=0;j114;j+);/*毫秒显示子函数*/void display_ms(uchar ch)uchar ge,shi;shi=ch/10; /分离十位与个位ge=ch%10;led0=0; led2=0; led3=0; led4=0; led5=0; led6=0; led7=0; /关闭多余的数码管P0=Tableshi; led1=1; delay(2); /显示数据led1=0; led2=0; led3=0; led4=0; led5=0; led6=0; led7=0; /关闭多余的数码管P0=Tablege; led0=1; delay(2); /显示数据 /*秒显示子函数*/ void display_s(uchar ch)uchar ge,shi;shi=ch/10; /分离十位与个位ge=ch%10;led0=0; led1=0; led2=0; led4=0; led5=0; led6=0; led7=0; /关闭多余的数码管P0=Tableshi; led3=1; delay(2); /显示数据led0=0; led1=0; led3=0; led4=0; led5=0; led6=0; led7=0; /关闭多余的数码管P0=Tablege&0xfe; led2=1; delay(2); /显示数据并显示小数点 /*数字显示子函数*/void display_Num(uchar wei)led0=0; led1=0; led2=0; led3=0; led4=0; led5=0; led6=0; P0=Tablewei; led7=1; delay(2); /*中断服务程序*/void timer0() interrupt 1 /计时中断服务程序TH0=(65536-1600)/256;TL0=(65536-1600)%256;Cnt+;if(Cnt=10) /10ms 计时完毕Cnt=0;if(dir=0) /计数方向为正向sec_ms+; if(sec_ms=100) /1s 计时完毕sec_ms=0; sec+;if(sec=100)sec=0;if(dir=1) /计数方向为反向sec_ms-; if(sec_ms=255)sec_ms=99; sec-;if(sec=255)sec=99; void timer1() interrupt 3 /循环标记中断服务程序TH0=(65536-1600)/256;TL0=(65536-1600)%256;m+;if(m=6) m=0; if(dir=0) /计数方向为正向 led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;/顺时针循环显示P0=varym; led6=1; delay(2); ss+;if(ss=6) ss=0;if(dir=1)/计数方向为反向 led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;/逆时针循环显示P0=vary2ss; led6=1; delay(2); /*键盘扫描*/void keyscan()P1&=0xF0; /P1口设置 P1=P1&OxF0;if(Key1=0)/*一共延时约12ms*/display_s(sec); /延时 约4msdisplay_ms(sec_ms); /延时 约4msif(dir=0) led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;P0=0x7f; led6=1; delay(2); /延时 约2msif(dir=1) led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;P0=0xef; led6=1; delay(2); /延时 约2ms/*一共延时约12ms*/if(Key1=0) TR0=!TR0; nn=9; / 计数启动与停止按键TR1=!TR1; / 循环标记的启动与停止/*松手检测*/while(!Key1)display_s(sec); display_ms(sec_ms); if(dir=0) led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;P0=0x7f; led6=1; delay(2); if(dir=1) led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;P0=0xef; led6=1; delay(2); /*松手检测*/ if(TR0=0)/秒表为暂停状态 if(Key2=0)/清零键按下 display_s(sec); display_ms(sec_ms);if(dir=0) led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;P0=0x7f; led6=1; delay(2); if(dir=1) led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;P0=0xef; led6=1; delay(2); if(Key2=0) /清零键按下 sec=0; sec_ms=0; /计数清零for(k=0;k=9) nn=0; while(!Key4)display_s(value_snn); /数组显示display_ms(value_msnn);if(dir=0) /计数方向为正向led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;P0=0x7f; led6=1; delay(2); if(dir=1) /计数方向为反向led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;P0=0xef; led6=1; delay(2); switch(nn) /显示数据组别case 0: display_Num(1); break;case 1: display_Num(2); break;case 2: display_Num(3); break;case 3: display_Num(4); break;case 4: display_Num(5); break;case 5: display_Num(6); break;case 6: display_Num(7); break;case 7: display_Num(8); break;case 8: display_Num(9); break; if(TR0=1) /秒表为计时状态 if(Key2=0) /记录数据键按下 display_s(sec); display_ms(sec_ms);if(dir=0) led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;P0=0x7f; led6=1; delay(2); if(dir=1) led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;P0=0xef; led6=1; delay(2); if(Key2=0) /记录数据键按下 value_sn=sec; /保存数组value_msn=sec_ms; n+; if(n=9) n=0;while(!Key2)display_s(sec); display_ms(sec_ms);if(dir=0) /计数方向为正向led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;P0=0x7f; led6=1; delay(2); if(dir=1) /计数方向为反向led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;P0=0xef; led6=1; delay(2); /*主程序*/ void main()value_init(); /数值初始化Timer_init(); /定时器初始化while(1)keyscan(); /键盘扫描switch(nn)case 0: display_s(value_s0); display_ms(value_ms0); display_Num(1); break;case 1: display_s(value_s1); display_ms(value_ms1); display_Num(2); break;case 2: display_s(value_s2); display_ms(value_ms2); display_Num(3); break;case 3: display_s(value_s3); display_ms(value_ms3); display_Num(4); break;case 4: display_s(value_s4); display_ms(value_ms4); display_Num(5); break;case 5: display_s(value_s5); display_ms(value_ms5); display_Num(6); break;case 6: display_s(value_s6); display_ms(value_ms6); display_Num(7); break;case 7: display_s(value_s7); display_ms(value_ms7); display_Num(8); break;case 8: display_s(value_s8); display_ms(value_ms8); display_Num(9); break;case 9: display_s(sec); display_ms(sec_ms); break;if(dir=0) /计数方向为正向led0=0; led1=0; led2=0; led4=0; led5=0; led3=0; led7=0;P0=0x7f; led6=1; delay(2); if(dir=1) /计数方向为反向led0=0; led1=0; led2=0; led4=0; led5=0; led3

温馨提示

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

评论

0/150

提交评论