(2)时间以24小时为一个周期,显示时、分、秒;
(3)计时过程具有报时功能,当时间到达整点前5秒进行蜂鸣报时;
(4)为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号。
c51单片机 晶振为11.0592MHz
#include<reg52.h>
#define HOUR1 1
#define HOUR0 0
#define MIN1 2
#define MIN0 8
#define SEC1 2
#define SEC0 0
#define uint unsigned int
#define ulint unsigned long int
#define uchar unsigned char
sbit dula=P2^6
sbit wela=P2^7
sbit beep=P2^3
int i
ulint
sharp,second,count=0,sec0=SEC0,sec1=SEC1,min0=MIN0,min1=MIN1,hour0=HOUR0,hour1=HOUR1//秒计数全局变量
uchar code segment[]=
uchar code time[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f}
void delay(uint)//程序毫秒延时
void beeper(uchar)//开蜂鸣器毫秒
void init()//初始化函数
void display()//从数码管上显示
void counter()//计算进行过程中的时、分、秒值
void scan()//扫描键盘
void main()
{
init()
while(1)
{
scan()//扫描键盘看是否有键按下
for(i=6i>0i--)//动态扫描6位数码管
{
display()//显示时、分、秒
}
}
}
void init()
{
second=hour1*36000+hour0*3600+min1*600+min0*60+sec1*10+sec0
TMOD=0x01
TH0=(65536-46080)/256
TL0=(65536-46080)%256
EA=1
ET0=1
TR0=1
}
void delay(uint z)//程序毫秒延时
{
uint x=0,y=0
for(x=zx>0x--)
for(y=110y>0y--)
}
void timer0() interrupt 1
{
TH0=(65536-46080)/256
TL0=(65536-46080)%256
count++
if(count==20)//判断是否到1秒
{
counter()//计算进行过程中的时、分、秒值
if(sharp!=hour0) beeper(1000)//判断小时的值是否改变,变则启动蜂鸣器
}
}
void beeper(uchar tt)
{
uchar t=tt
count=0
beep=0//开蜂鸣器
delay(t)
beep=1//关蜂鸣器
}
void display()
{
P0=0xff//位消影(低电平选择位)
//送位选信号
wela=1
P0=segment[i-1]
wela=0
P0=0x00//段消影(高电平选择段)
//送段选信号
dula=1
switch(i)
{
case 6 : P0=time[sec0]break
case 5 : P0=time[sec1]break
case 4 : P0=time[min0]break
case 3 : P0=time[min1]break
case 2 : P0=time[hour0]break
case 1 : P0=time[hour1]break
}
delay(1)
P0=0x00//配合上面用于消隐
dula=0
}
void counter()
{
second++
if(second==86400) second=0
count=0
sharp=hour0//设置报时检测KEY
sec0=second%10
sec1=(second%60-sec0)/10
min0=((second%3600-sec1*10-sec0)/60)%10
min1=((second%3600-sec1*10-sec0)/60-min0)/10
hour0=(second%36000-min1*600-min0*60-sec1*10-sec0)/3600
hour1=second/36000
}
void scan()
{
}
另外,团IDC网上有许多产品团购,便宜有口碑
具体代码如下:#include<graphics.h>
#include<math.h>
#include<dos.h>
#define PI 3.1415926
//屏幕中心的坐标(640X480模式下)
#define mid_x 320
#define mid_y 240
int main()
{ int graphdriver=DETECT,graphmode
int end_x,end_y
struct time curtime
float th_hour,th_min,th_sec
initgraph(&graphdriver,&graphmode,"C:\\TC2")//初始化VGA屏幕模式
setbkcolor(BLACK)//使用黑色的背景色
while(!kbhit(0)) //若有键盘输入,则跳出,即是结束程序
{ setcolor(GREEN)//把画笔设为绿色
circle(mid_x,mid_y,180)//钟的外圆
circle(mid_x,mid_y,150)//钟的内圆
circle(mid_x,mid_y,1)//画出钟的圆心
gettime(&curtime)//取得系统当前时间
th_sec=(float)curtime.ti_sec*0.1047197551//把秒针的角度化为弧度,为以后绘制时方便,下同
th_min=(float)curtime.ti_min*0.1047197551+th_sec/60.0//分针的弧度
th_hour=(float)curtime.ti_hour*0.5235987755+th_min/12.0//时度的弧度,注意整时是12等分的,所时乘的是3.14/180*5
//计算出时针的尾的坐标(时针长70)
end_x=mid_x+70*sin(th_hour)
end_y=mid_y-70*cos(th_hour)
setcolor(RED)
line(mid_x,mid_y,end_x,end_y)//用红色线画出时针
//计算出分针坐标(分针长110)
end_x=mid_x+110*sin(th_min)
end_y=mid_y-110*cos(th_min)
setcolor(RED)
line(mid_x,mid_y,end_x,end_y)//用红色画出分针
end_x=mid_x+140*sin(th_sec)
end_y=mid_y-140*cos(th_sec)
setcolor(RED)
line(mid_x,mid_y,end_x,end_y)//同上,画出秒针,长为140
//画出钟盘上的刻度,刻度长20
line(140,240,160,240)//9点对应的大刻度
line(320,60,320,80)//12点对应的大刻度
line(500,240,480,240)//3点的刻度
line(320,420,320,400)//6点的刻度
line(410,395.7,400,378.4)//5点
line(475.7,330,458.4,320)//4点
line(475.7,150,458.4,160)//2点
line(410,84.3,400,101.6)//1点
line(230,84.3,240,101.6)//11点
line(164.3,150,181.6,160)//10点
line(164.3,330,181.6,320)//8点
line(230,395.7,240,378.4)//7点
sleep(BLUE)//这里应该是打错,停止一秒,应为sleep(1000)
cleardevice()//清除屏幕上的显示
}
closegraph()//关闭VGA屏幕,即返回文本方式
return 0
}