电子时钟程序设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.设计目的

电子时钟是采用数字电路实现对日期、时、分、秒,数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表的报时功能。电子时钟已成为人们日常生活中的必需品,广泛应用于家庭、车站、码头、剧院、办公室等场所,给人们的生活、学习、工作带来极大的方便。不仅如此,在现代化的进程中,也离不开电子钟的相关功能和原理,比如机械手的控制、家务的自动化、定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。而且是控制的核心部分。因此,研究电子时钟及扩大其应用,有着非常现实的意义。

2.设计内容

2.1设计思想

针对要实现的功能,拟采用AT89C51单片机进行设计,AT89C51 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密

度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。这样,既能做到经济合理又能实现预期的功能。

在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。程序可分为闹钟的声音程序、显示程序、闹钟显示程序、调时显示、定时程序。运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。

2.2设计元件

元件

规格

数量

单片机 AT89C51 1 晶振 12MHz 1 晶振电容 30pF

2 按键

4

准备器件、搭接电

熟悉硬件 了解各引脚功

能 分块设计各部分电

将分块的电路组合

认真学习单片机汇编

语言 完成整体电路图 确定变成结构和思

综合各程序完成整体

程序

编辑各个程序模块

用Proteus 画出电路图

调试程序,进行修改

对仿真中出现的问题

进行改正 画出仿真图进行仿

仿真成功

软硬件结合,完成任务

书要求

验证硬件电路

成功

进行扩展

电阻10K,1K,220欧,各1,1,15电容10uF(+)1

七段数码管共阳极四位、两位各1,1 USB接口1

USB延长线1/2

底座40脚1

2.3设计图

2.4设计程序

#include

#include

#include

char data time[6];

void delay(unsigned char k);

sbit check=P0^0;

sbit inter0=P3^2;

sbit inter1=P3^3;

char data which=0;

char data count=0;

void smadd(unsigned char k);

void smsub(unsigned char n);

char code buf[]={ 0x00,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0xff,0x6f }; char code sel[]= {0x01,0x02,0x04,0x08};

void main()

{

char i;

for(i=0;i<500;i++);

time[0]=0;

time[1]=1;

time[2]=8;

time[3]=0;

time[4]=2;

time[5]=1;

TMOD=0X01;

TH0=(65535-5000)/256;

TL0=(65535-5000)%256;

IP=0x07;

IE=0X87;

TR0=1;

while(1)

{

for(i=0;i<6;i++)

{

P1=sel[i];

P2=buf[time[i]] ;

delay(10);

}

if(check==0)

{

delay(8);

TR0=0;

which=(which+1)%3;

while(check==0);

TR0=1;

}

}

}

void delay(unsigned char k)

{char i;

for (;k>0;k--)

for(i=0;i<80;i++)

{;}

}

void time_tr0() interrupt 1 using 2 {

TH0=(65535-5000)/256;

TL0=(65535-5000)%256;

count++;

if(count==100)

{

smadd(0);

}

}

void int0_i() interrupt 0 using 3

{

TR0=0;

smadd(which*2);

TR0=1;

while(inter0==0);

}

void int1_i() interrupt 2 using 1

{

TR0=0;

delay(20);

smsub(which*2);;

TR0=1;

while(inter1==0);

}

void smsub(unsigned char n)

{

delay(80);

if(time[n]>0)

{

time[n]=time[n]-1;

相关文档
最新文档