单片机课程设计 (1)_第1页
单片机课程设计 (1)_第2页
单片机课程设计 (1)_第3页
单片机课程设计 (1)_第4页
单片机课程设计 (1)_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、单片机课程设计一、本设计任务及完成的功能1、本设计任务:实现最长99S的倒计时功能;利用数码管或液晶屏显示数字;利用按键可以设置倒计时时间;设置倒计时开始启动键;时间到,声(光)报警,示意倒计时时间到。2、完成的功能:实现了099S之间任意整数秒的倒计时,通过矩阵按键中09数字键设置倒计时间,按下*或#键开始倒计时,当倒计时间结束时,LED灯亮,停止倒计时。二、倒计时器硬件设计1、元器件AT89C51单片机1个、两位动态共阴数码管1个、9个引脚的排阻、1k电阻3个、12MHz晶振1个、33pF电容2个、10uF极性电容1个、独立按键1个、4行3列矩阵按键1个、LED指示灯1个、电源和地若干2、

2、系统的硬件构成及功能最长99秒计时器的原理框图如图1所示。图1 99秒计时器系统原理框图系统硬件连线: (1)P1口接矩阵按键 (2)P2口接动态数码管的8个段选 (3)P06、P07分别接动态数码管的十位和个位 (4)P37接LED指示灯 (5)XTAL1和XTAL2接晶振 (6)RST接复位电路 三、系统的软件设计本系统的软件系统主要可分为主程序设计和定时中断程序。系统主程序设计主程序包括主函数、矩阵按键扫描函数、对矩阵按键扫描进行相应处理函数、动态数码管显示函数等。1、矩阵按键扫描函数ankey()矩阵按键的原理和方法:矩阵按键的两端都与单片机的I/O口相连,在检测时,人为的通过单片机I

3、/O口送出低电平。检测时,先送一列为低电平,其余几列全为高电平(这时就确定了列数),然后立即轮流检测一次个行是否有低电平,若检测到某一行为低电平(这时就确定了行数),则可以确定单前被按下的键是哪行哪列。同样,用这种方法轮流检测各行各列,这样就可以检测所有按键,当有键按下时,就可判断是哪个键被按下。当然,也可以将行线置为低电平,扫描列是否有低电平。本设计用的是4行3列矩阵按键,它接AT89C51单片机的P1口,接法如图所示:当按下09数字键时,会产生相应数值赋给矩阵按键扫描函数中以定义的参数key,当按下#或*键时,会分别产生11或10赋给key。这时调用对矩阵按键扫描进行相应处理函数text(

4、uchar )且key赋给它,text(uchar )函数对key值进行相应处理:如果只按下一次数字键,那这数字就会是倒计时的个位,如果按下两次数字键,那第一次的数字就会是倒计时的十位,第二次数字的数字就会是倒计时的个位,当按下#或*键时,开始倒计时。2、动态数码管显示函数动态数码管显示就是轮流向各位数码管送出段选及相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人眼感觉各位数码管同时都在显示,实际上多位数码管是一位一位轮流显示的,只是轮流比较快,我们分辨不出来。本设计用的是两位动态共阴数码管显示,它和单片机的连接如图所示:其中那排阻是驱动电路。3、复位电路如图:RST为复位信号输入端,高电

5、平有效。系统上电后,当已经进行过倒计时,这时想进行不同时间的倒计时,只要按下复位按钮后,就可以进行新的倒计时。中断函数设计先初始化中断函数:TMOD=0x01;设置定时器0为工作方式1(0000 0001)TH0=(65536-50000)/256;/装初值50ms一次中断TL0=(65536-50000)%256;EA=1; /开总中断ET0=1; /开定时器0中断TR0=0; /先别启动中断,留着用按键启动,以便开始倒计时中断函数如下:void T0_time() interrupt 1/定时器0中断函数TH0=(65536-50000)/256;/重装初值TL0=(65536-50000

6、)%256;numt0+;/50ms中断一次四、总体程序如下:#include <reg51.h> #define uchar unsigned char#define uint unsigned int sbit sw=P06;/十位位选sbit gw=P07;/个位位选sbit led=P37;/LED灯uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/编码定义uchar numt0,num;void delayms(uint);void text(uchar);void display(uc

7、har numdis) /动态数码管显示子函数uchar shi,ge; /分离两个分别要显示的数shi=numdis/10;ge=numdis%10;sw=0;P2=tableshi; /送十位段选数据delayms(5);/延时sw=1;gw=0;P2=tablege; /送个位段选数据delayms(5);gw=1;void delayms(uint x)/延时x msuint i,j;for(i=x;i>0;i-) /i=x即延时约x毫秒for(j=110;j>0;j-);void ankey() /键盘扫描uchar temp,key;P1=0xef;/第1行 temp=

8、P1; temp=temp&0x0f;/temp高4位清0; if(temp!=0x0f) /判断是否有键按下 delayms(10); /延时,消除抖动 if(temp!=0xf0)/判断是否有键按下 temp=P1; /重新读取P1口 switch(temp)/判断哪个键按下 case 0xeb: key=1; break; case 0xed: key=2; break; case 0xee: key=3; break; text(key); while(temp!=0x0f)/判断按键是否释放 temp=P1; temp=temp&0x0f; P1=0xdf;/第2行

9、temp=P1; temp=temp&0x0f; if(temp!=0x0f) delayms(10); if(temp!=0xf0) temp=P1; switch(temp) case 0xdb: key=4; break; case 0xdd: key=5; break; case 0xde: key=6; break; text(key); while(temp!=0x0f) temp=P1; temp=temp&0x0f; P1=0xbf;/第3行 temp=P1; temp=temp&0x0f; if(temp!=0x0f) delayms(10); if(

10、temp!=0xf0) temp=P1; switch(temp) case 0xbb: key=7; break; case 0xbd: key=8; break; case 0xbe: key=9; break; text(key); while(temp!=0x0f) temp=P1; temp=temp&0x0f; P1=0x7f;/第4行 temp=P1; temp=temp&0x0f; if(temp!=0x0f) delayms(10); if(temp!=0xf0) temp=P1; switch(temp) case 0x7b: key=10; break;c

11、ase 0x7d: key=0; break; case 0x7e: key=11; break; text(key); while(temp!=0x0f) temp=P1; temp=temp&0x0f; void text(uchar key)/判断键盘扫描结果,并倒计时static uchar n,bb,s;/静态局部变量s=1;if(key=0|key=1|key=2|key=3|key=4|key=5|key=6|key=7|key=8|key=9)n+;/有数字键被按下,n加1if(key=10|key=11)n=3;/*和#被按下,n置3switch(n)case 1:

12、bb=key;key=20;display(bb);break;/第1次按下数字键case 2: bb=bb*10+key;n=0;key=20;display(bb);break;/第2次按下数字键case 3: num=bb;/*和#被按下,开始倒计时while(s=1)TR0=1;/启动定时器0中断if(numt0=20)/如果到了20次,说明1秒时间到numt0=0;/然后把numt0清0重新再计20次num-;/num自减if(num=0)/如果num等0TR0=0;/关闭定时器0中断s=0; /推出循环led=0;/点亮LED灯display(num);/显示num break;v

13、oid init() /初始化函数 TMOD=0x01;/设置定时器0为工作方式1(0000 0001)TH0=(65536-50000)/256;/装初值50ms一次中断TL0=(65536-50000)%256;EA=1; /开总中断ET0=1; /开定时器0中断TR0=0; sw=1;/关数码管十位位选gw=1; /关数码管个位位选void main()/主函数init();/初始化函数num=0;while(1) /循环ankey(); /键盘扫描display(num);/动态数码管显示void T0_time() interrupt 1/定时器0中断函数TH0=(65536-500

14、00)/256;/重装初值TL0=(65536-50000)%256;numt0+;/50ms中断一次五、结束语当我第一眼看到这个倒计时的题目时,我感觉到并不难,没怎么在意,因为上学期学单片机的时候我们班大多数同学都自己买了单片机实验板(我也买了)回宿舍玩。那段时间我自己写了不少程序下载到单片机实验板上玩,其中就有写过倒计时程序和矩阵按键扫描程序,只是那时写的倒计时程序的倒计时间是不可调的,矩阵按键只是设置1位数的。我当时就想把这两个程序组合起来,用按键来设置倒计时间和控制倒计时的开始和结束不就行了吗?可是当我真正开始做的时候,问题出来了。第一次连好电路图后,先分别写了倒计时间不可调的倒计时程

15、序和矩阵按键扫描程序,分别仿真,都没问题。把两程序组合起来的时候,出来问题,我辛辛苦苦组合起来的程序竟然不听我话。先是不管我怎么按,数码管的显示一点都没反应,估计是矩阵按键扫描函数那里弄错了;修改后,按下的数字可以按我的意图显示了,但又不能倒计。唉!还不行!继续修改,终于可以倒计时了,可是高兴地太早了,运行了好几次,发现只能设置个位的倒计时,设置十位的时候它没反应。真正的问题出现了,我就被卡在这里了,而且卡了好几天,这期间我进行了很多次的修改,也多次请教别的同学帮忙,不知为什么,就是修改不好,不是改得更差了,就是改好了这个功能同时别的功能不行了。唉!我快要崩溃了,期末考试就来了,本来想早点弄好它,以便专心去复习,可看是简单就偏偏弄不出来。不管了,先复习、准备考试去了。几天后,我连

温馨提示

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

评论

0/150

提交评论