单片机实训报告
——数字时钟
成员:
金龙:2
王利伟:6
许林鹏: 9
春波:0
袁增莘:1
指导老师:翡
12电气自动化一班
2013.12.23—12.29
目录
一、设计目的 (2)
二、设计要求 (2)
2.1显示要求 (2)
2.2校准要求 (2)
2.3选型要求 (2)
三、硬件设计 (3)
3.1L E D电路图 (3)
3.2电路图分析 (4)
3.3键盘功能 (4)
四、程序设计 (5)
4.1程序流程图 (5)
4.2程序 (6)
课题:数字时钟
一、设计目的:
通过实训周学会制作数码管显示时、分、秒的数字可调时钟,近一步熟练掌握编程语言的应用。
二、设计要求:
2.1显示要求:
时钟要求用8位数码管显示,以数字形式显示时、分、秒的时间。
且从右端始八位数码管依次显示①秒个位②秒十位③横杠“—”④分个位⑤分十位⑥横杠“—”⑦时个位⑧时十位
2.2校准要求:
时钟要求计时准确,同时要求有校准时间的电路,且以按键校准。
2.3选型要求:
设计单片机选型以STC89C51RC-RD+系列为基础
三、硬件设计:
3.1、LED电路图
3.2电路图分析
本次课题是利用51单片机进行设计。
Led灯是由低电平点亮的,led位的选择是由单片机中的p2口控制的。
*键盘是采用独立式按键:
K1是p3.0;K2是p3.1;
K3是p3.2:K4是p3.3;
3.3键盘功能
K1, 是对时钟调整或调整后进行确定的选择键。
K2,是对选中位置后对其进行加。
K3,是对选中位置后对其进行减。
K4,是进行时分秒的选择位的操作。
四、程序设计
4.1程序流程图
#include <reg51.h>
unsigned char shig , shish , fensh ,feng ,miaosh ,miaog;
unsigned char shi, fen ,miao,k=0,n=0;
sbit k1=P3^0; sbit k2=P3^1; sbit k3=P3^2; sbit k4=P3^3;
unsigned char code
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x
77,0x7c,0x39,0x5e,0x79,0x71};
void tt0( ) interrupt 1 { TH0=15536/256;
TL0=15536%256;
n=n+1;
if(n==20)
{ n=0;
miao=miao+1;
if(miao==60)
{ miao=0;
fen=fen+1;
if(fen==60)
{ fen=0;
shi=shi+1;
if(shi==24)
{ shi=0;
}
}
}
}
}
void delay(int ms)
{ int i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
void display()
{ shish=shi/10; shig=shi%10;
fensh=fen/10; feng=fen%10;
miaosh=miao/10; miaog=miao%10;
P0=0; P2=0; P0=table[shish]; delay(1);
P0=0; P2=1; P0=table[shig]; delay(1);
P0=0; P2=2; P0=0x40; delay(1);
P0=0; P2=3; P0=table[fensh]; delay(1);
P0=0; P2=4; P0=table[feng]; delay(1);
P0=0; P2=5; P0=0x40; delay(1);
P0=0; P2=6; P0=table[miaosh]; delay(1);
P0=0; P2=7; P0=table[miaog]; delay(1); }
void displaysh(char w)
{ k=k+1; if(k==101)k=0;
shish=shi/10; shig=shi%10;
fensh=fen/10; feng=fen%10;
miaosh=miao/10; miaog=miao%10;
if(w!=2||k<=50)
{ P0=0; P2=0; P0=table[shish] ; delay(1);
P0=0; P2=1; P0=table[shig]; delay(1);
}
P0=0; P2=2; P0=0x40; delay(1);
if(w!=1||k<=50)
{ P0=0; P2=3; P0=table[fensh]; delay(1);
P0=0; P2=4; P0=table[feng]; delay(1);
}
P0=0; P2=5; P0=0x40; delay(1);
if(w!=0||k<=50)
{ P0=0; P2=6; P0=table[miaosh]; delay(1);
P0=0; P2=7; P0=table[miaog]; delay(1);
}
}
void main()
{ char shan=0,flage=0;
TMOD=0X01; TH0=15536/256; TL0=15536%256;
IP=0; IE=0X82; TR0=1;
while(1)
{ while(flage==0)
{ display();
k1=1;
if(k1==0)
{ delay(10);
k1=1;
if(k1==0)
{ TR0=0; flage=1;
}
}
while(k1==0)displaysh(shan); }
while(flage==1)
{ displaysh(shan);
k4=1;
if(k4==0)
{ delay(10);
k4=1;
if(k4==0)
{ shan=shan+1;
if(shan==3)shan=0;
}
}
while(k4==0)displaysh(shan);
k2=1;
if(k2==0 )
{ delay(10);
k2=1;
if(k2==0)
{ if(shan==0)
{ miao=miao+1;
if(miao==60)miao=0;
}
if(shan==1){fen=fen+1; if(fen==60)fen=0;
}
if(shan==2){shi=shi+1; if(shi==24)shi=0;}
}
}
while(k2==0)displaysh(shan);
k3=1;
if(k3==0)
{ delay(10);
k3=1;
if(k3==0)
{ if(shan==0){miao=miao-1; if(miao==255)miao=59; }
if(shan==1){fen=fen-1; if(fen==255)fen=59; }
if(shan==2){shi=shi-1; if(shi==255)shi=23; }
}
}
while(k3==0)displaysh(shan);
k1=1;
if(k1==0)
{ delay(10);
k1=1;
if(k1==0)
{ TR0=1;flage=0;
}
}
while(k1==0)display();
}
}
}。