单片机流水灯课程设计Word文档格式.docx
《单片机流水灯课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机流水灯课程设计Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
过完成本课题的软硬件设计,使同学们了解单片机实例的整个开发流程。
1.2.2基本要求
⑴简要说明
用单片机设计出一个数字钟。
此数字钟完成自动走时和时间调整的功能。
⑵任务和要求
设计简易的数字钟,该数字钟满足以下要求:
设计一个数字钟,该数字钟基本功能:
使用单片机的定时/计数器实现数字中的定时计数功能,秒计60次成分,分计60次成小时,小时计24次则计满一天。
本设计LED显示部分采用动态显示,其中2个LED显示器显示秒,2个LED显示器显示分钟,2个LED显示器显示小时。
同时为了使用方便,本题目还需要设计几个简单按键,可以通过按键实现时、分的调整,这样在主程序中需要加入键盘设置子程序。
2设计思路
基于单片机的简易数字钟设计主要可以分为以下几个模块来考虑:
㈠对于单片机AT89C51的T0,T1定时中断部分。
本次设计中的单片机晶振频率采用了精准的11.0592MHZ。
故对T1初值设定为:
DC00h,实现了10ms的定时,然后C程序中通过定义一个变量i,对i进行i++的100次循环,如此即可达到最小1S的实现。
而后在这个1S程序段的基础之上,我们可以分别编写出对时,分的程序段。
对于定时器T0,我们可以将其用来作为数码管动态扫描的定时中断,本次设计设为50ms左右,初值为FC17h。
这个取值通过最后的仿真及实际效果看出合理,不会出现闪烁等情况。
㈡校时电路。
本次设计要求了该简易数字钟必须具备时、分的调整功能。
故必须接入2个简单的按键(本设计设置问p1.4调时、p1.5调分,按键为实验箱单次脉冲按键模块),并且在软件部分必须引入这2个独立按键的子程序。
㈢显示电路。
考虑采用动态显示部分,用P0口作为数码管数据(段选),P2口作为数码管控制(位选)。
动态显示通常都是采用动态扫描的方法进行显示,即循环点亮每一个数码管,这样虽然在任意时刻都只有一位数码管被点亮,但由于人眼存在视觉暂留效应,只要每位数码管间隔时间足够短,就可以给人以通俗显示的感觉。
上面第一部分已提到,我们采用了50ms左右的时间间隔,并且是合理的。
6位数码管,实验室的硬件是共阴极的,故我们的数码表采用{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
㈣晶振电路。
在AT89C51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。
时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
㈤复位电路。
这部分设计用来完成对单片机的复位。
3设计方框图
3.1数字钟硬件部分示意图
该简易数字钟硬件部分主要由晶振、手动复位、单片机AT89C51、数码管显示、时间调整按键模块组成。
框图如下:
图3.1数字钟硬件系统示意图
3.2数字钟软件部分组成框图
3.2.1时间调整的程序流程
Y
N
INT1中断服务子程序
时钟分位调整
时钟分位+1
1小时到
时钟分位清零
返回
时钟小时位调整?
时钟小时+1
24小时到
时钟小时位清零
图3.2时间调整程序流程框图
3.2.2时钟显示程序流程
图3.324小时时钟
4简易数字钟源程序
4.1源程序
#include<
reg52.h>
#include"
common.h"
#defineFOSC12000000L
#defineT2MS(65536-(FOSC/12/1000)*2)//2mstimercalculationmethodin12Tmode
#defineS_1
#defineT_0
unsignedcharcodewetable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
unsignedcharcodedutable[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsignedchari=0;
unsignedintTcount=0;
unsignedintScount=0;
unsignedcharidataT[3]={9,0,0};
unsignedcharidataS[2]={0,0};
unsignedcharidatatemp[6];
bitmodeflag=0;
bitk1_flag=0;
bitk2_flag=0;
bitk3_flag=0;
bitk4_flag=0;
bitSbegin=0;
voiddelay_ms(unsignedcharx)
{
unsignedcharz,y;
for(z=x;
z>
0;
z--)
for(y=110;
y>
y--);
}
voidTimer0_Init()
TMOD|=0x01;
//settimer0asmode1(16-bit)
TL0=T2MS;
//initialtimer0lowbyte
TH0=T2MS>
>
8;
//initialtimer0highbyte
TR0=1;
//timer0startrunning
ET0=1;
//enabletimer0interrupt
EA=1;
//openglobalinterruptswitch
voidTimer1_Init()
{
TMOD|=0x20;
//settimer1asmode2(8-bit)
IP=0x08;
TL1=0x06;
TH1=0x06;
TR1=1;
//timer1startrunning
ET1=1;
//enabletimer1interrupt
voidmain(void)
beep=0;
delay_ms(200);
beep=1;
Timer0_Init();
Timer1_Init();
while
(1)
{
if(k1==0||k2==0||k3==0||k4==0)
{
delay_ms(10);
if(k1==0){while(!
k1);
k1_flag=1;
if(k2==0){while(!
k2);
k2_flag=1;
if(k3==0){while(!
k3);
k3_flag=1;
if(k4==0){while(!
k4);
k4_flag=1;
}
if(k1_flag)
if(modeflag==T_){k1_flag=0;
beep=0;
delay_ms(200);
beep=1;
modeflag=S_;
else{k1_flag=0;
modeflag=T_;
}
if(modeflag==T_)
if(k2_flag)
{
k2_flag=0;
beep=0;
T[0]++;
if(T[0]==24)
T[0]=0;
}
if(k3_flag)
k3_flag=0;
T[1]++;
if(T[1]==60)
T[1]=0;
if(k4_flag)
k4_flag=0;
T[2]++;
if(T[2]==60)
T[2]=0;
else
if(k2_flag){k2_flag=0;
Sbegin=~Sbegin;
if(k3_flag&
&
Sbegin==0){k3_flag=0;
S[0]=0;
S[1]=0;
}
}
voidtm0_isr()interrupt1using1
{
//reloadtimer0lowbyte
//reloadtimer0highbyte
if(modeflag==T_)
if(i%2==0)
temp[i]=T[i/2]/10;
temp[i]=T[(i-1)/2]%10;
else
temp[i]=S[i/2]/10;
temp[i]=S[(i-1)/2]%10;
LED7s_wei|=0x3f;
wela=1;
wela=0;
if(i==1||i==3)
LED7s_data=dutable[temp[i]]+0x80;
dula=1;
dula=0;
LED7s_d