




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉理工大学单片机课程设计1.设计原理与方法1.1.设计原理本次课程设计的题目是:可编程倒计时装置,其中分和秒都是两位数字显示,键盘预先设置要倒计时的时间,按键启动倒计时装置,数码管动态显示倒计时的画面,当倒计时归零后,发出声音,提示倒计时结束。 该装置利用AT89S52单片机作为倒计时器的核心控制器,针对需要倒计时的场合进行可调时间的倒计时功能。首先通过键盘矩阵输入设置的要倒计时的时间,定好了相关的设置时或分或秒,进行倒计时的按键启动操作。在输入数字进行倒计时设置时,每一次切换选择设置时分秒都会将显示清零。当全部时间输入确定后,按下确认键后,可以计算总共倒计时时间,并将其显示在数码屏上。按键启动后,数码管会动态的进行显示时间,直到最后归零。倒计时完成后,通过蜂鸣器发出指示报警音,再次按下启动按钮可以清除报警音,回复待机状态。基本完成了题目要求实现的功能。其系统的原理框图如下所示: CPU响铃装置键盘输入时钟电路复位电路倒计时显示操作指示灯该图就是本设计的总的原理图,利用核心cpu的相关端口,可以进行相对应的功能实现,其具体的实现内容在后面的内容,进行具体的说明和介绍。1.2设计方案为了实现题目的要求,具体进行三个部分的设计。第一部分是输入部分,这个部分是用于倒计时的时间设置,采用矩阵键盘。特点是占用单片机I/O口少,但软件上需要编码。由于该系统涉及到了09数字的输入,只用单片机本身的I/O口难以实现实现,且还需要选择设置时分秒,引脚需求较多,所以用键盘矩阵来实现。第二部分是显示部分,本设计采用数码管显示倒计时时间。利用外接74LS47来点亮数码管。这样CPU8个引脚可输出2位BCD码,如果只用单纯引脚输出,需要24个引脚进行LED选通点亮。这样就很复杂。由于七段数码管需要选通6个,故采用轮询方式对每一个应该点亮的数码管进行操作,按键延时采用数码管显示模块填充,从根本上防止抖动。第三部分是控制部分,利用CPU的中断,在中断服务程序中执行启动与计时到的复位工作,采用负边沿的触发方式。同时,在倒计时完成后,采用蜂鸣器指示计时时间到与否。再用一个LED来指示当前工作状态。若该LED亮为开始计时,若该LED灭则为准备状态,可以重新输入计时时间重新计时。以上便是对倒计时装备的三大部分的设计思路,按照上面各个部分的设计,进行具体的设计来细化和实现相关功能。2.系统硬件设计2.1.硬件相关部分介绍芯片部分的介绍:AT89S52是低电压,高性能CMOS 8位单片机,有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash存储单元,可以按照常规方法对其进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。计时/计数器部分的介绍:TMOD为T0、T1的工作方式寄存器,其各位的格式如下:TMOD D7 D6 D5 D4 D3 D2 D1 D0 定时器T1| 定时器T0 其各位功能是:位7 GATE-T1的门控位,当GATA=0时,只要控制位TR1,即可启动定时器开始工作;当GATE=1时,除需要将TR1置1外,还要使INTI引脚为高电平,才能启动相应的定时器开始工作。位6 C/T-T1的功能选择位:当C/T=0时,T1为定时器方式;当C/T=1时,T1为计数器方式。位5和位4M1和M0-T1的方式选择位:由这2位的组合可以定义T1的3种工作方式。位3 GATE-T0的门控制:当GATE=0时,只要控制TR0置1,即可启动定时器T0开始工作;当GATE=1时,除需要将TR0置1外,还要使INTO引脚为高电平,才能启动相应的定时器开始工作。位2 C/T-T0的功能选择位:TMOD不能进行位寻址,只能用字节传送指令设置定时器工作方式,低半字节定义定时器1。复位时,TMOD所有位均为0,定时器处于停止工作状态。中断部分的介绍:CPU正在执行主程序时,单片机外部或内部发生的某一事件(如外部设备产生的一个电平的变化,一个脉冲沿的发生或内部计数器的计数溢出等)请求CPU迅速去处理,于是,CPU暂时中止当前的工作,转到中断服务处理程序处理所发生的事件。中断服务处理程序处理完该事件后,再回到原来被中止的地方,继续原来的工作(例如,继续执行被中断的主程序),这称为中断。 CPU处理事件的过程,称为CPU的中断响应过程。能够实现中断处理功能的部件称为中断系统;产生中断的请求源称为中断请求源。中断源向CPU提出的处理请求,称为中断请求(或中断申请)。中断的工作:保护现场、恢复现场、中断返回。中断方式的优点是大大地提高了CPU的工作效率。MCS-51的中断优先级结构。中断系统有两个不可寻址的“优先级激活触发器”。其中一个指示某高优先级的中断正在执行,所有后来的中断均被阻止。另一个触发器指示某低优先级的中断正在执行,所有同级的中断都被阻止,但不阻断高优先级的中断请求。在同时收到几个同一优先级的中断请求时,哪一个中断请求能优先得到响应,取决于内部的查询顺序。这相当于在同一个优先级内,还同时存在另一个辅助优先级结构,其查询顺序如下: 中断源 中断级别 外部中断0 最高 T0溢出中断 外部中断1 T1溢出中断 串行口中断 最低一个中断请求被响应,需满足以下必要条件:(1)CPU开中断,即IE寄存器中的中断总允许位EA=1。(2)该中断源发出中断请求,即该中断源对应的中断请求标志为“1”。(3)该中断源的中断允许位=1,即该中断没有被屏蔽。(4)无同级或更高级中断正在被服务。2.2.电路设计总体设计硬件电路图其中包括输入部分、显示部分和控制部分,这正好是设计思想的体现输入部分的电路图:该系统的输入由4X4的矩阵键盘提供。其中P1.4P1.7为扫描输出线,P1.0P1.3为扫描输入线。具体扫描时,先确定列号,再确定行号,人工给按键一个编码,然后根据其编码值进行相关操作。输入选择时:通过K13K15选择时,分,秒输入。软件上对这个操作进行状态开关改变。以备下一步输入数字选择存放单元。数字输入时:除了K4无功能键,其他10个位09的数字输入。在软件上定义为先输入一位存放在个位,再输入一位为先前输入值*10+本次输入值。针对输入过大,如秒,分超过60则改变为最大值59。显示部分的电路图:输出方面有3个部分,6个七端数码管构成了倒计时显示部分,蜂鸣器接受方波发出声音,是倒计时到的一个声音标志。LED为倒计时状态指示灯。数码管采用动态扫描方式,对输出数组中的数字进行依次输出,选通线为与输出数字相匹配的输出选通数组中。控制部分的电路图:AT89S52对输入和输出进行对应的控制,同时蜂鸣器可以根据方波的频率发出声音信号,由此根据它对计时到与否进行判断。该设计中蜂鸣器在计时时间到后会一直响。LED与启动/停止键按下相关,除了开机自检LED只受启动/停止键状态控制,若成功启动,LED亮,计时时间到停止时,LED灭。233.程序设计框图3.1.主程序3.2.数码管显示部分3.3键盘输入部分4.资源分配表本设计的资源分配表如下表所示:1.XTAL1,XTAL2构成内部自激振荡器,产生时钟脉冲信号2.RST单片机的复位3. P0.0P0.7控制7段数码管显示倒计时4. P1.0-P1.7由键盘输入预置倒计时分秒5. P2.0-P2.3 数码管管脚控制选通6. P3.0-P3.3控制音频输出7. P3.6 指示灯显示5.源程序代码#include #include #define TIME1H 0x40#define TIME1L 0x98 /定时器1溢出时间:49ms,用于计时模式的计数增加。#define LEDCHAR P0 /LED 字符I/O 口,P1.07对应ADP#define LEDSELECT P2 /LED 选择I/O口. P0.05对应LED的16#define SCANPORT P1 /键盘扫描端口/* *全局变量unsigned char code uca_LEDCode=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;/仿真用 / 0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60;/0,1,2,3,4,5,6,7,8,9unsigned char uca_LineScan4=0xEF,0xDF,0xBF,0x7F;/LINE 1 2 3 4 /键盘扫描线unsigned char code uca_LEDSelect=0xfe,0xfd,0xfb,0xf7,0xef,0xdf;/分别点亮第6,5,4,3,2,1号灯.unsigned char uca_LedNum6;/存放数字的各个位unsigned char uc_DisCount=1;/定时器0定时刷新LED计数。unsigned char uc_TimeCount=0;/定时器1定时计数。unsigned long ul_Number=0;/LED显示数字。unsigned char KeyValue;bit sethour=0;bit setminute=0;bit setsecond=0;bit settime=0;bit timesup=0;unsigned char hour;unsigned char minute;unsigned char second;unsigned long temp;sbit buzz=P30;sbit ledstate=P36;/* *显示函数unsigned char * pucLedNum(unsigned long ulNumber)if(ulNumber999999)ulNumber=999999;if(ulNumber0)ulNumber=0;uca_LedNum0 = ulNumber/100000; /最高位uca_LedNum1 = (ulNumber-100000*(long)uca_LedNum0)/10000;uca_LedNum2=(ulNumber-100000*(long)uca_LedNum0-10000*(long)uca_LedNum1)/1000;uca_LedNum3=(ulNumber-100000*(long)uca_LedNum0-10000*(long)uca_LedNum1-1000*(long)uca_LedNum2)/100;uca_LedNum4=(ulNumber-100000*(long)uca_LedNum0-10000*(long)uca_LedNum1-1000*(long)uca_LedNum2-100*(long)uca_LedNum3)/10;uca_LedNum5=(ulNumber-100000*(long)uca_LedNum0-10000*(long)uca_LedNum1-1000*(long)uca_LedNum2-100*(long)uca_LedNum3-10*(long)uca_LedNum4);return uca_LedNum;void vShowOneNum(unsigned char ucOneNum,unsigned char ucOrder)LEDSELECT=uca_LEDSelectucOrder; /ucOrder:05(代表从左到右16)LEDCHAR=uca_LEDCodeucOneNum;/* *键盘扫描函数unsigned char ucKeyScan()unsigned char ucTemp=0; /扫描状态暂存。unsigned char ucRow=0,ucLine=0; /行号,列号。 unsigned char l;for(ucLine=0;ucLine4;ucLine+) /列扫描SCANPORT=uca_LineScanucLine; /输出扫描电位。for(l=0;l50;l+); /延时20毫秒ucTemp=SCANPORT&0x0F; /输入扫描电位,并屏蔽高4位。if(ucTemp!=0x0F) /判断该列是否有按键按下,有则判断出行号。switch(ucTemp)case 0x0E: ucRow=10;break;case 0x0D: ucRow=20;break;case 0x0B: ucRow=30;break;case 0x07: ucRow=40;break;default: ucRow=50;break;break;for(l=0;l50;l+); /延时20毫秒SCANPORT=0x0F; /恢复P2口。return ucRow+ucLine+1;/返回按键编码。格式为2位数,高位为行号,低位为列号。void vKeyProcess(unsigned char ucKeyCode) if(sethour=1)switch(ucKeyCode)case 11: hour=hour*10+7;break; /7case 12: hour=hour*10+8;break; /8case 13: hour=hour*10+9;break; /9case 14: break; /时针case 21: hour=hour*10+4;break; /4case 22: hour=hour*10+5;break; /5case 23: hour=hour*10+6;break; /6case 24: break; /分针case 31: hour=hour*10+1;break; /1case 32: hour=hour*10+2;break; /2case 33: hour=hour*10+3;break; /3case 34: break; /秒针case 41: break; case 42: hour=hour*10+0;break; /0case 43: break; /确认case 44: break; /退出default:break;ul_Number=(long)hour*10000;if(setminute=1)switch(ucKeyCode)case 11: minute=minute*10+7;break; /7case 12: minute=minute*10+8;break; /8case 13: minute=minute*10+9;break; /9case 14: break; /时针case 21: minute=minute*10+4;break; /4case 22: minute=minute*10+5;break; /5case 23: minute=minute*10+6;break; /6case 24: break; /分针case 31: minute=minute*10+1;break; /1case 32: minute=minute*10+2;break; /2case 33: minute=minute*10+3;break; /3case 34: break; /秒针case 41: break; case 42: minute=minute*10+0;break; /0case 43: break; /确认case 44: break; /退出default:break;ul_Number=(long)minute*100;if(setsecond=1)switch(ucKeyCode)case 11: second=second*10+7;break; /7case 12: second=second*10+8;break; /8case 13: second=second*10+9;break; /9case 14: break; /时针case 21: second=second*10+4;break; /4case 22: second=second*10+5;break; /5case 23: second=second*10+6;break; /6case 24: break; /分针case 31: second=second*10+1;break; /1case 32: second=second*10+2;break; /2case 33: second=second*10+3;break; /3case 34: break; /秒针case 41: break; case 42: second=second*10+0;break; /0case 43: break; /确认case 44: break; /退出default:break;ul_Number=(long)second;void squarew(times) /产生方波 unsigned int t; for(t=0;ttimes;t+) buzz=0; for(t=0;ttimes;t+) buzz=1; void selftest(void) /实现自检 unsigned int i; P0=0xff; P2=0x00; for(i=0;i40000;i+); /延时2秒 P2=0xff; for(i=0;i700;i+) /发声检测 squarew(30); /* *显示子程序void display(void)vShowOneNum(*(pucLedNum(ul_Number)+uc_DisCount),uc_DisCount); /在LED上显示1位数字。if(uc_DisCount5)uc_DisCount+;/定时器0在每次被触发时,改变LED显示。else uc_DisCount=0;/从第一位到第六位循环显示。/* *主函数void main() selftest(); ledstate=0;TMOD=0x11; /定时器0:模式一;定时器0:模式一./TH1=TIME1H;TL1=TIME1L;ET1=1; /开定时器1中断PX1=1;IT1=1; /外部中断0,中断方式:低电平 EX1=1; /开启外部中断0EA=1; /开启总中断 SCANPORT=0x0F; /初始化键盘接口。 while(1) display(); KeyValue=ucKeyScan(); if(KeyValue!=5) if(KeyValue=14) display(); sethour=1; settime=1; setminute=0; setsecond=0; else if(KeyValue=24) display(); setminute=1; settime=1; sethour=0; setsecond=0; else if(KeyValue=34) display(); setsecond=1; settime=1; sethour=0; setminute=0; else if(KeyValue=43) display(); if(settime!=0) if(minute59) minute=59; if(second59) second=59; ul_Number=(long)hour*10000+(long)minute*100+(long)second; setsecond=0; settime=0; sethour=0; setminute=0; else if(KeyValue=44) display(); if(settime!=0) ul_Number=0;hour=0;minute=0;second=0;setsecond=0;settime=0;sethour=0;setminute=0; else display(); vKeyProcess(KeyValue); while(SCANPORT!=0x0f) display(); KeyValue=0; /*定时器1中断,用于计时功能void vTimer1(void) interrupt 3 unsigned int i; if(ul_Number=0) timesup=1; for(i=0;i30;i+) P2=0xff; squarew(48); for(i=0;i35;i+) P2=0x00; squarew(68); elseif(uc_TimeCount=19)uc_TimeCount=0;if(ul_Number%10000=0) ul_Number-=4041;else if(ul_Number%100=0) ul_Number-=41;else ul_Number-;else uc_TimeCount+;TH1=TIME1H;TL1=TIME1L;/*定时器0,定时刷新LED*void reset(void) interrupt 2 unsigned int k; for(k=0;k500;k+); /延时20ms if(timesup=0) TR1=1; ledstate=1; else TR1=0; timesup=0; ledstate=0; for(k=0;k500;k+);6.性能分析倒计时运行结果如下:按下运行键后,数码管面板显示000000按下时针键,输入要设置的小时数按下分针键,输入要设置的分钟数按下秒针键,输入要设置的秒钟数按下启动/停止 按键,开始倒计时工作在显示方面,由于使用了6个七段数码管,用C语言写的程序在点亮延迟方面控制不是很强,显示的时候有些闪烁出现。由于进行输入的时候,不是很智能,当我输入大于60的数字时候,上面开始倒计时后,会自动变成59开始。例如,我输入90分钟,开始倒计时,但是此时开始工作从59分59秒开始,不会智能的转换为1小时30分。试验箱上的LED为共阳极,也与仿真不一样,所以关于标志灯的选通熄灭也修改了很多。最后键盘的去抖时间有些过长了。导致按时间太短了也无法完成正确的输入。7.总结与心得通过本次课程设计,我对单片机和C语言的相关知识得到了进一步的,刚开始看到这个题目的时候,感觉倒计时不是很难,有对
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年上半年小学《综合素质》试题与参考答案解析
- 2025福建福州水务供应链管理有限公司副总经理(职业经理人)选聘1人考试模拟试题及答案解析
- 场地设备维护方案范本
- 抗渗沙浆防水施工方案
- 设备维修措施方案范本
- 石家庄古建园林施工方案
- 城口商用开水机施工方案
- 蒸压加气墙板施工方案
- 基于物联网的磨料磨具远程监控系统-洞察及研究
- 2025黑龙江绥化市庆安县招聘教师36人考前自测高频考点模拟试题及完整答案详解
- 食材采购协议书
- 项目驻地(营区)风险评估报告
- DL T 5745-2016 电力建设工程工程量清单计价规范
- 百白破疫苗效力评估的队列研究
- 田径比赛竞赛规则
- +Unit4+I+used+to+be+afraid+of+the+dark+SectionB+1a-1e课件2023-2024学年人教版九年级英语全册
- 2022新高考I卷II卷英语读后续写解读讲评及写作技巧指导课件
- 安徽省物业管理行业专题调研分析报告
- 2023国家电网作业安全风险管控典型生产作业风险定级库
- 媒介经营与管理(课程)课件
- 项目组织供应能力说明
评论
0/150
提交评论