电子时钟设计单片机需求分析讲课稿.docx
- 文档编号:26487521
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:10
- 大小:61.95KB
电子时钟设计单片机需求分析讲课稿.docx
《电子时钟设计单片机需求分析讲课稿.docx》由会员分享,可在线阅读,更多相关《电子时钟设计单片机需求分析讲课稿.docx(10页珍藏版)》请在冰豆网上搜索。
电子时钟设计单片机需求分析讲课稿
电子钟
一、需求分析
1.功能描述
该电子钟能实现基本的时钟显示,还能调时。
调时可以对分时秒的每个位(即个位和十位)调整。
2.其他要求
当时钟的时间小于10-00-00时,时的十位为零,不显示。
(如显示时间:
9-45-00)
二、总体设计
1.设计思路
用89C51单片机实现控制和数据输出,8位7段LED数码管作为显示器件。
时间的调整通过外加独立按键来控制。
2.器件选型
89C51单片机、LED数码管、独立按键。
三、硬件设计
1.硬件框图
2.硬件模块
因该设计非常简单,硬件模块很少,只有显示模块和按键模块。
3.硬件电路图
硬件电路如下图所示:
四、软件设计
1.软件框图
2.软件流程图及其程序代码
2.1主程序
1.初始化:
将数字编码放在数组dis_7[11]中,位选数据放在scan_con[8]中,分、时、秒的个位和十位放在dis_[8]中,分时秒的初始数据放在timedata[3]中。
2.键盘扫描:
判断key0~key3中哪些键按下,
当key3未按下时:
1.key0按下,则key0每按下一次,秒加1。
2.key1按下,则key0每按下一次,分加1。
3.key2按下,则key0每按下一次,时加1。
当key3按下时:
1.key0按下,则key0每按下一次,秒的十位加1(即秒加10)。
2.key1按下,则key0每按下一次,分的十位加1。
3.key2按下,则key0每按下一次,时的十位加1。
3.显示:
通过P2口控制位选,使8个数码管依次被选中。
P0口作为数据的输出口,循环输出分、时、秒的各位数据,当P0口输出某位的数据后,P2口控制位选将给位数码管选中,从而使该位显示。
同时当时的十位为零时,使p2口输出为0,使该位不显示。
(即当hour<10时,时的十位不显示0)
4.定时中断:
采用方式1,定时50ms。
20次就构成1秒,每20次,秒就加1
主程序流程图
主程序代码:
main()
{TH0=0x3c;
TL0=0xb0;
TMOD=0x01;
ET0=1;
TR0=1;
EA=1;
for(;;)
{display();//显示子程序
keyscan();//键盘扫描子程序
}
}
2.2键盘扫描子程序
键盘扫描流程图
键盘扫描子程序代码
keyscan()
{if(key3==1)
{if(key0==0)
{delay1ms(10);
while(key0==0);
timedata[0]++;
if(timedata[0]==60)
{timedata[0]=0;
timedata[1]++;
if(timedata[1]==60)
{timedata[1]=0;
timedata[2]++;
if(timedata[2]==24)
timedata[2]=0;
}
}
}
if(key1==0)
{delay1ms(10);
while(key1==0);
timedata[1]++;
if(timedata[1]==60)
{timedata[1]=0;
timedata[2]++;
if(timedata[2]==24)
timedata[2]=0;
}
}
if(key2==0)
{delay1ms(10);
while(key2==0);
timedata[2]++;
if(timedata[2]==24)
timedata[2]=0;
}}
else
{if(key0==0)
{delay1ms(10);
while(key0==0);
timedata[0]+=10;
if(timedata[0]>=60)
{timedata[0]=0;
timedata[1]++;
if(timedata[1]=60)
{timedata[1]=0;
timedata[2]++;
if(timedata[2]==24)
timedata[2]=0;
}
}}
if(key1==0)
{delay1ms(10);
while(key1==0);
timedata[1]+=10;
if(timedata[1]>=60)
{timedata[1]=0;
timedata[2]++;
if(timedata[2]==24)
timedata[2]=0;
}
}
if(key2==0)
{delay1ms(10);
while(key2==0);
timedata[2]+=10;
if(timedata[2]>=24)
timedata[2]=0;
}
}
}
2.3显示子程序
显示子程序流程图
显示子程序代码
display()
{chark;
dis[7]=timedata[0]%10;
dis[6]=timedata[0]/10;
dis[4]=timedata[1]%10;
dis[3]=timedata[1]/10;
dis[1]=timedata[2]%10;
dis[0]=timedata[2]/10;
//通过模10计算,取出分时秒的个位和十位的值
if(dis[0]==0)
P2=0x00;//时个十位为零时,不显示
else
{P0=dis_7[dis[0]];
P2=scan_con[0];
delay1ms
(1);
P2=0x00;
}
for(k=1;k<8;k++)
//循环选中每个数码管,并输出其显示值,从而实现时钟显示
{P0=dis_7[dis[k]];
P2=scan_con[k];
delay1ms
(1);
P2=0x00;
}
}
五、测试效果
经过软件仿真,测试效果良好,上述功能都能实现。
效果如下图:
六、问题分析
1、实现过程中遇到的问题及解决方法分析。
因为我本科时学习单片机都是用汇编写程序,没有用过C语言写单片机程序,所以本实验开始时,我是用汇编写的程序,这个程序虽然能实现基本的时钟显示,但存在很多问题。
并且汇编使用起来很麻烦,可读性也很差。
最后,我决定试着用C语言写单片机程序。
经过好几天的摸索,最后总算是用C语言把程序写好了。
最后,经过仿真,该设计虽能达到预期的要求,但也存在不足之处。
仿真发现:
调时时,当有按键按下时,数码管显示会出现闪烁的情况。
经过分析得知,在电路中加入锁存器,该问题可以得到解决。
2收获与体会。
经过本次实验设计的学习,收获颇丰。
首先,对单片机有更进一步的了解,同时锻炼了我的动手能力。
其次,我学习了用C语言写单片机程序,基本学会了用C语言写单片机程序。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 时钟 设计 单片机 需求 分析 讲课