1、 课课 程程 设设 计计 课程名称 单片机课程设计 题目名称 倒计时器 学生学院 物理与光电工程学院 专业班级 学 号 学生姓名 指导教师 2012 年 12 月 14 日 倒计时器设计倒计时器设计 1 1、功能要求:功能要求: 实现最长 99S 的倒计时功能; 利用数码管或液晶屏显示数字; 利用按键可以设置倒计时 时间;设置倒计时开始启动键;时间到,声(光)报警,示意倒计时时间到。 2 2、实现方法:、实现方法: 单片机采用 51 系列,分析功能要求,设计方案,编写程序(keil c51 软件) ,利用 Proteus 进行仿真。 流程图:流程图: 具体电路与软件设计具体电路与软件设计 1
2、1、按键倒计时时间设计与矩阵按键扫描按键倒计时时间设计与矩阵按键扫描函数函数 ankey()ankey() 上图就是 4 行 3 列矩阵按键与 AT89C51 的接法。 矩阵按键的原理和方法:矩阵按键的两端都与单片机的 I/O 口相连,在检测时,人为 时 钟 电 路 C51 单片机 按键倒计时时间设 计电路 显示电路 的通过单片机 I/O 口送出低电平。检测时,先送一列为低电平,其余几列全为高电平(这时 就确定了列数) ,然后立即轮流检测一次个行是否有低电平,若检测到某一行为低电平(这 时就确定了行数) ,则可以确定单前被按下的键是哪行哪列。同样,用这种方法轮流检测各 行各列,这样就可以检测所
3、有按键,当有键按下时,就可判断是哪个键被按下。当然,也可 以将行线置为低电平,扫描列是否有低电平。 当按下 09 数字键时,会产生相应数值赋给矩阵按键扫描函数中以定义的参数 key,当 按下#或*键时,会分别产生 11 或 10 赋给 key。这时调用对矩阵按键扫描进行相应处理函数 text(uchar )且 key 赋给它,text(uchar )函数对 key 值进行相应处理:如果只按下一次数字键, 那这数字就会是倒计时的个位, 如果按下两次数字键, 那第一次的数字就会是倒计时的十位, 第二次数字的数字就会是倒计时的个位,当按下#或*键时,开始倒计时。 2、动态数码管显示函数、动态数码管显
4、示函数 动态数码管显示就是轮流向各位数码管送出段选及相应的位选, 利用发光管的余辉和人 眼视觉暂留作用, 使人眼感觉各位数码管同时都在显示, 实际上多位数码管是一位一位轮流 显示的,只是轮流比较快,我们分辨不出来。本设计用的是两位动态共阴数码管显示,它和 单片机的连接如图所示: 其中那排阻是驱动电路。 3、时钟和复位电路时钟和复位电路 RST 为复位信号输入端,高电平有效。系统上电后,当已经进行过倒计时,这时想进 行不同时间的倒计时,只要按下复位按钮 K 后,就可以进行新的倒计时。 时钟电路接 XTAL1 和 XTAL2,再通过单片机中的定时器分频,得到秒的时间量级。 中断函数设计中断函数设计
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)%256; numt0+;/50ms 中断一次 完整电路图和程序:完整电路图和
6、程序: 完整电路图 程序:程序: #include #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(uchar numdis) /动态数码管显示子函数 uchar shi,ge; /分离两个分别要显示的数 shi=numdis/10; ge=numdis%10; sw=0; P2=tableshi; /送十位段选数据 delayms(5); /延时 sw=1; gw=0; P2