基于单片机精确正反计数工程文档.doc_第1页
基于单片机精确正反计数工程文档.doc_第2页
基于单片机精确正反计数工程文档.doc_第3页
基于单片机精确正反计数工程文档.doc_第4页
基于单片机精确正反计数工程文档.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

项 目 设 计 报 告课程名称 单片机基础 题 目 基于单片机的精确正反计数 计时系统的设计与实现 学 院 信息科学与技术学院 专 业 计算机科学与技术(物联网方向)学生姓名 王朋 学 号 201110411122 班级 1 任课教师 游 磊 2013 年 12 月 19 日 【摘要】单片机自1976年由Intel公司推出MCS-48开始,迄今已有三十多年了。由于单片机集成度高、功能强、可靠性高、体积小、功耗地、使用方便、价格低廉等一系列优点,目前已经渗入到人们工作和生活的方方面面,几乎“无处不在,无所不为”。单片机的应用领域已从面向工业控制、通讯、交通、智能仪表等迅速发展到家用消费产品、办公自动化、汽车电子、PC机外围以及网络通讯等广大领域。目前,各个行业,各个领域,在新产品的设计中,都尽可能的应用单片机技术,来提高产品的智能化程度,增强产品的竞争力,适应技术的进步。电子钟已成为人们日常生活中的必需品,广泛应用于家庭、车站、码头、剧院、办公室等场所。本系统采用本系统以AT89C52为主控芯片,设计并实现一个正计时和倒计时的秒表,并考虑节约系统的硬件,能用软件实现的功能尽量都用软件实现。这款秒表能按人们预定的时刻蜂鸣器发出音响信号来起到提醒的作用。这款秒表,不仅功能齐全,系统稳定度高,显示数据准确而且成本低,能够广泛应用于各种场合。 【关键词】单片机、秒表、AT89C52。 目录一、设计目的4二、实现环境41.上位机环境42. 下位机环境4三、 设计思路61.中断的概念 62.中断源63.中断寄存器74.寄存器功能与赋值说明75.中断结构图:96.C51单片机定时器简介97.定时器/计数器详细说明108. 实验步骤119. 实验流程图1210. 实验误差处理12四、 设计代码12五、 运行结果15六、 总结16七、参考文献17附录1.(元件清单)17附录2.(51_4原理图)19一、设计目的单片机的优点:u 体积小巧,携带方便。USB接口通讯及供电,通讯速度快,无须外接电源,活动自锁40Pin锁紧座有电源和烧写状态指示灯,可直观了解编程器当前状态,只需要USB供电,无需使用外部电源。周密的自保护方式,有效保证不损毁用户器件或编程器本身。u USB供电系统,直接插接到电脑。USB口即可提供电源,不需另接直流电源。u 8位数码管(可做数码管的静态扫描以及动态扫描显示实验如:0-999 计数器实验,温度检测实验,遥控解码实验等都可以用数码管显示)。u 8位LED发光二极管(做跑马灯实验,交通灯实验)。u 一路继电器控制(通过继电器可以控制其他电器设备的工作低压控制高压等实验,不过为了安全, 建议不要控制电压超过30V的设备)u 蜂鸣器(做单片机发声实验,播放音乐实验,报警实验等声响实验)u DS18B20 温度传感器,(初步掌握单片机操作后即可亲自编写程序获知当时的温度)u MAX232芯片RS232通讯接口(可以做为与计算机通迅的接口同时也可做为STC单片机下载程序的接口及仿真调试的接口)u 设计布局优势,4个按键位于左边,操作更方便。1所以选择单片机作为项目开发工具。 通过项目实践,进一步学习和掌握单片机应用系统的有关知识,加深了解单片机的工作原理。初步掌握单片机应用系统设计,制作和调试的方法。提高动手实践能力,提高科学的思维能力。二、实现环境 1.上位机环境 硬件环境: 电脑型号 华硕 K43SJ 笔记本电脑 操作系统 Windows 8 64位 ( DirectX 11 ) 处理器 英特尔 第二代酷睿 i5-2410M 2.30GHz 双核 主板 华硕 K43SJ (英特尔 HM65 芯片组) 内存 6 GB ( 金士顿 DDR3 1333MHz / 昱联 DDR3 1333MHz ) 主硬盘 日立 HTS723232A7A364 ( 320 GB / 7200 转/分 ) 显卡 Nvidia GeForce GT 520M ( 1 GB / 华硕 ) 显示器 LG LGD02F8 ( 14 英寸 ) 光驱 松下 DVD-RAM UJ8A0ASW DVD刻录机 声卡 瑞昱 ALC269 英特尔 6 Series Chipset 高保真音频 网卡 瑞昱 RTL8168E PCI-E Gigabit Ethernet NIC / 华硕 软件环境: 本设计采用VC6.0+来实现编程,VC6.0+是一种功能强大的面向对象的Windows编程开发平台。VC6.0的优点是界面简洁,占用资源少,操作方便。所以本设计采用VC作为串口编程工具。2. 下位机环境 硬件环境:cdu51-4单片机开发板,采用STC89C52单片机,(它具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构,全双工串行口。)8位数码管6个,8位LED发光二极管,它采用一种以MAX232为核心的通信接口电路。该接口电路适用于由一台PC机与多个8051单片机串行通信的设计,其原理和方法同样适用于PC机与其它单片机之间的串行数据通信。2-3 软件环境: 本实验采用Keil uVision3编程软件,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP,WIN7/WIN8等操作系统。掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选。4-5 Keil编程软件图2-1 图2-1 Keil编程软件页面STC_ISP_V480烧录软件图2-2 图2-2 STC_ISP_V480烧录软件页面3、 设计思路1.中断的概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 2.中断源 在51单片机中有5个中断源 中断号 优先级 中断源 中断入口地址 0 1(最高) 外部中断0 0003H 1 2 定时器0 000BH 2 3 外部中断1 0013H 3 4 定时器1 0018H 4 5 串口总段 0023H 3.中断寄存器 单片机有10个寄存器主要与中断程序的书写控制有关 1).中断允许控制寄存器IE 2).定时器控制寄存器TCON 3).串口控制寄存器SCON 4).中断优先控制寄存器IP 5).定时器工作方式控制寄存器TMOD 6).定时器初值赋予寄存器(TH0/TH1,TL0/TL1) 4.寄存器功能与赋值说明6-7 注:在用到中断时,必须要开总中断EA,即EA=1。 /开总中断 1).中断允许控制寄存器IE EX0(EX1):外部中断允许控制位 EX0=1 外部中断0开关闭合 /开外部0中断 EX0=0 外部中断0开关断开 ET0(ET1):定时中断允许控制位 ET0=1 定时器中断0开关闭合 /开内部中断0 ET0=0 定时器中断0开关断开 ES: 串口中断允许控制位 ES=1 串口中断开关闭合 /开串口中断 ES=0 串口中断开关断开 2).定时器控制寄存器 TCON /控制外部中断和定时器中断 外部中断: IE0(IE1):外部中断请求标志位 当INT0(INT1)引脚出现有效的请求信号,此位由单片机自动置1,cpu开始响应,处理终端,而当入 中断程序后由单片机自动置0. /外部中断,即外部中断相应的引脚接入低电平或下降沿信号时,中断开始响应。 IT0(IT1):外部中断触发方式控制位 /选择有效信号 IT0(IT1)=1:脉冲触发方式,下降沿有效。 IT0(IT1)=0:电平触发方式,低电平有效。 内部中断: TF0(TF1):内部定时器/计数器溢出中断标志位 当定时器、计数器计数溢出的时候,此位由单片机自动置1,cup开始响应,处理中断,而当进入中 断程序后由单片机自动置0. /内部中断实际上就是利用内部的计数器,只不过提供计数的脉冲来自单片机自身。 TRO(TR1):定时器/计数器启动位 /启动定时器 TRO(TR1)=1; 启动定时器/计数器0 TR0(TR1)=0; 关闭定时器/计数器0 3).串口控制寄存器SCON TI:串行口发送中断标志位 当单片机串口发送完一帧数据后,此位由单片机自动置1,而当进入中断服务程序后是不会自动清0的, 必须由用户在中断服务中用软件清0. RI:串行口接收中断标志位 当单片机串口接收完一帧数据后,此位由单片机自动置1,而当进入中断服务程序后是不会自动清0的, 必须由用户在中断服务软件中用软件清0. (IP以后补上,TMOD,TL0/TH0 在定时器/计数器中讲) 5.中断结构图: 6. C51单片机定时器简介本课程设计是利用MCS-51单片机内部的定时计数器、中断系统、以及行列键盘和LED显示器等部件,设计一个单片机秒表计时器。设计的计时器通过数码管显示,并能通过按键实现设置暂停、复位等。4-6正计时和倒计时分别使用两个定时器T0/T1,采用方式1,对12MHZ的系统时钟进行定时计数,初值设为XXYY(自己计算)。形成定时时间为50ms。用片内RAM的7BH单元对50ms计数,计920次产生秒计数器78H单元加1,正秒计数器加到999则复位,倒秒表计时减到000则复位。然后通过数码管显示出来。在处理过程中加上了按键判断程序,能对按键处理。7-87.定时器/计数器详细说明 1).计数的定义: 计数是指对外部事件进行计数,外部事件的发生以输入脉冲的形式表示,因此计数功能的实质就是对外来 的脉冲进行计数,在单片机中对应引脚T0和T1,两个脉冲输入端。 外部输入的脉冲在负跳变时有效(即外部脉冲由1变化到0),计数器加1. 2).定时器: 定时器是通过计数器的计数来实现的,不过此时的计数脉冲来自单片机的内部,因此定时器的实质是对内 部脉冲的计数,在单片机中,每个机器周期产生一次计数脉冲,计数器加1. 3).工作方式控制寄存器TMOD:9 TMOD的低半字节(D0,D1,D2,D3)用来控制定时器/计数器0 TMOD的高半字节(D4,D5,D6,D7)用来控制定时器/计数器1 对TMOD中的内容说明: GATE门控制。 GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。 当INT0引脚为高电平时TR0置位,启动定时器T0; 当INT1引脚为高电平时TR1置位,启动定时器T1。 GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。 C/T功能选择位 C/T=0时为定时功能,C/T=1时为计数功能。 M0、M1方式选择功能 由于有2位,因此有4种工作方式 4).根据单片机晶振,所选TMOD的的工作方式,所要定的时间,来确定THO和TLO所要赋予的初值10-11 (以12M晶振,工作方式1,16位计数器为例,设所定时间为Xus(16为计数器最大数65536,即65536us,若所 定时间大于65535,则要用if语句控制,现假设X65535) 1.时钟周期的时间t=1/12M=1/12 us 2.机器周期的时间T=12*1/12=1 us 3.因为每经过一个机器周期计数器+1,所以,计数器+1,经过的时间为 1 us。 若所定时间为X,则要求经过Xus,中断响应,又因为16为计数器要全部置1(即达到65535)+1后,中断才会 响应,所以,初值=(65536-X) 4.将初值转化为16进制码,分别付给THO和TLO eg:所定时间50ms 初值=(65536-50000)=15536=3CB0H TH0=0X3C; TL0=0XB0; (当工作方式不同时,TH0/TL0的赋值也不同,个人觉得有了16位计数器了,其余的没什么用,不介绍了)8. 实验步骤 1)启动Keil uVision3 2)新建项目“秒表”,并新建文件“正计时与倒计时7.c” 3)在“正计时与倒计时7.c”中写入代码,选择创建hex文件,编辑运行产生hex文件 4)使用STC_ISP_V480软件将产生的hex烧录到开发板中(注意com号的选择,在设备管理器中查看com号)。 9. 实验流程图 10. 实验误差处理 由于中断溢出,晶振和其他硬件原因造成单片机秒表时间可能不准确,那么我们可以使用软件来修正,使其计时更加精准。正常情况下:TC = M - T/T计数 = 65536 - 50ms/1us = 15536 = 3CB0H但是我们在16位计数机使用3CB0时存在误差,和标准时间比较5min慢1s,那么就应该修改TC:N = 20 * 50ms * 5 *60,T计数 = N/299;TC = M - T/T计数 = 3D574、 设计核心代码#includetypedef unsigned char uint8;typedef unsigned int uint16;code uint8 number= 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/ 0 1 2 3 4 5 6 7 8 9sbit D0 = P00;sbit D1 = P01;sbit D2 = P02;sbit Key1 = P30; sbit Key2 = P31; uint8 a6;uint8 b6;uint16 time;uint8 counter0=0; /容器uint8 counter1=0;void delay(uint8 z);void timer0_init();void timer1_init();void interrupt1_init();void interrupt0_init();void refresh0();void refresh1(uint8 data1,uint8 data2,uint8 data3);void delay(uint8 z)/延迟函数 uint8 i;while(z-) for(i=0;i120;i+); void timer0_init()TMOD|= 0x01;/M0位置1, /M1位置0TMOD&= 0xfd;TH0 = 0x3D; TL0 = 0x57; /修正成3D57/TL0 = 0xB0; /TR0 = 1;/TO开始计数 void timer1_init()TMOD |=0x10;TMOD &=0xdf; /TH1 = 0x3D; TL1 = 0x57; /修正成3D57/TL1 = 0xB0; /TR1 = 1; /T1开始计数 void interrupt0_init()/中断响应函数 ET0=1;/响应tiemer0的中断 就是打开TF0的中断功能EA =1;/中断请求被开放 void interrupt1_init() /中断响应函数 ET1=1;/响应tiemer1的中断 就是打开TF1的中断功能EA =1;/中断请求被开放 void main() time=999;timer0_init(); timer1_init(); interrupt0_init(); interrupt1_init(); while(1) uint16 ge,shi,bai;ge=time%10; /通过取余的方法把时间的个位取出来shi = (time/10)%10; /通过取整的方法把时间的十位取出来bai = (time/100)%10; /通过取整的方法把时间的百位取出来 refresh0(); /刷新低3位delay(2);/调用延迟函数refresh1(bai,shi,ge);/刷新高3位delay(2);/调用延迟函数 if(Key1 = 0) delay(2);if(Key1 = 0)while(!Key1);D0 = 0;D1 = 0;D2 = 0; if(Key2 = 0) delay(2);if(Key2 = 0)while(!Key1);D0 = 0;D1 = 0;D2 = 0; time =999;ge=time%10; /通过取余的方法把时间的个位取出来shi=(time/10)%10; /通过取整的方法把时间的十位取出来bai=(time/100)%10; /通过取整的方法把时间的百位取出来 refresh0(); /刷新低3位delay(2);/调用延迟函数refresh1(bai,shi,ge);/刷新高3位delay(2);/调用延迟函数 void refresh0() static uint8 j = 0;switch(j) case0:P0=0xff; P2&=0xDF;P2|=0x1F;j+;P0=numbera0; break; /?xcase1:P0=0xff; P2&=0xEF;P2|=0x2F; j+;P0=numbera1; break; /?x? case2:P0=0xff; P2&=0xF7;P2|=0x37; j=0;P0=numbera2; break; /x? default:break;void refresh1(uint8 data1,uint8 data2,uint8 data3) P0 = numberdata1;P2&=0xFE;P2|=0x3E; /最高位delay(1);P0 = 0xff;P0 = numberdata2;P2&=0xFD;P2|=0x3D;delay(1);P0 = 0xff;P0 = numberdata3;P2&=0xFB;P2|=0x3B;delay(1);P0 = 0xff; void interrupt_timer0() interrupt 1 /定时器0溢出中断 static uint16 sec=0; TH0 =0x3D; /重新对计数器进行赋值 TL0 = 0x57; /修正成3D57 / TL0 = 0xB0; / counter0+; if(20=counter0) /表示记满20次 ,即为1S sec+; counter0=0; a0=sec%10; /个位 a1=sec/10%10; /十位 a2=sec/100%10; /百位 void interrupt_timer1() interrupt 3 /定时器1溢出中断 高3位中断 TH1 =0x3D;/重新对计数器进行赋值 TL1 = 0x57; /修正成3D57/TL1 = 0xB0; / counter1+; if(20=counter1)/表示记满20次 ,即为1S time-; counter1=0; if(time=65536) time=999; 5、 运行结果计时器运行结果如图:6、 总结 单片机是我所学专业的主要课程之一,因此我认为单片机课程设计是十分必要而且十分重要的。尽管刚刚拿到课程设计题目时有点迷惘,不知道如何着手,但通过上网和图书馆查阅相关资料,自己认真钻研以及虚心询问同学,终于解决了一个又一个的困难和障碍,成功完成了任务。通过本次的单片机课程设计,不仅大大地丰富了我的理论知识,而且在实践过程中更令我学会了坚持、耐心和努力。此次单片机课程设计需要运用到许多之前所学过的知识,令我认识到自己以前学习的一些不足之处,例如对以前所学知识的理解不够深刻,掌握得不够牢固,运用不够灵活。这让我懂得了认真学习的重要性,以及要孜孜不倦地钻研所学过的知识,做得融会贯通,不能一览而过,不求甚解。在边学习边动手的过程中,我对电子时钟的构造以及原理有了进一步的了解,同时也加深和巩固了我对单片机C语言的认识。除此之外,由于是第一次做单片机,因此在此次课程设计的过程中,无论是电路绘制还是C语言编写都难免遇到了不少困难和障碍,例如C语言编写出错、电路元件无从入手等。在面对困难和障碍时,我庆幸自己没有退缩和逃避,而是通过各种方法,迎难而上,以坚持、耐心和努力勇敢无畏地面对困难,克服困难,解决困难。让我发现问题、分析问题、解决问题以及动手实践的能力都有了很大的提高,并了解到理论知识与实践相结合的重要意义。从这次的课程设计中,我们真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高。本次课程设计尽管时间不长,但从中所获,将令我受益终生。七、参考文献1 刘守义,单片机应用技术M 成都:西安电子科技大学出版,20022 VictorP.Nelson,DigitalLogicalCircuitsAnalysis&DesignJ,PrenticeHall.2003年6月出版,P40-943 万胜前.基于KeilC51软件的电子钟设计与制作J,鄂州大学学报,2007年第2期,P16-204 赵秀珍,单片微型计算机原理及其应用M中国水利水电出版社,20015 向继文等.基于AT89C51的电子钟系统设计J,应用科技,2007年第2期,P34-376 M.MorrisManoDigitalDesignM(ThirdEdition)HigherEducationPress,20027 何希才,杜煜.实用电子电路设计M. 北京:电子工业出版社,1998.28 马鸿文.基于AT89C51单片机的自动存取柜的设计与实现J.微计算机信息,2006,22(1-2):P101-1039 彭小军.用单片机实现电子时钟J.新余高专学报,2004年4月第9卷第2期,P27-3410 蒋敏.单片微机万年历设计J,职大学报,2000年第2期,P66-7311 StevenF.Barrett,DanielJ.Pack.EmbeddedSystemM.BeiJing:Electronic Industry Press,2004 附录1.(元件清单)易购元件商城

温馨提示

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

评论

0/150

提交评论