基于单片机的数字时钟设计开题报告

急急急急!
1设计内容:
(1)显示时间:使用四位数码管显示时间(小时、分钟),熟悉并使用ATC2051单片机进行时间控制,设置RESET复位键驱动单片机。
(2)定时:使用12M的晶振焊接到单片机上
(3)附加功能:
①.时间误差调节:便成使单片机能正确读取按钮信息,设计调节按钮连接电路使数字时钟的时间与实际时间出现误差的时候能用按钮进行选择调整。
②.LED灯报时:将LED灯能按单片机设定的程序定时闪烁,做报时提醒,到了定点时间便闪烁报时。

2主要内容(包括课题来源及选题依据、课题工作计划、技术路线、实验(实践)方案、预期结果等)
有的话马上发我邮箱[email protected]

//我这里有一个定时的闹钟,你把蜂鸣器的中断改为LED就行了,可以通过P2^0--P2^3实现秒表的显示和以及调时调分和调节闹钟以及闹钟的开关,有问题可以给我留言QQ834589429

#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

code unsigned char tab[]=

                  {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 

             //共阴数码管 0-9

sbit  A1=P2^0;

sbit  A2=P2^1;

sbit  A3=P2^2;

sbit  A4=P2^3;

sbit beep=P1^4;

    

unsigned char Shiwan;

unsigned char Wanwei;

unsigned char Qianwei;

unsigned char Baiwei;

unsigned char Shiwei;//定义十位

unsigned char Gewei,Naoling1,Naoling2,Naoling3,Naoling4; //定义个位

static unsigned char hour=12,minute=30,second=0,count=0;

static unsigned char alarmhour=12,alarmminute=29,i=0,j=0,k;

/******************************************************************/ 

/*                    延时函数                                    */

/******************************************************************/

void delay(unsigned int cnt)

 while(--cnt);

}

 void xianshi(void)

    Gewei=tab[second%10]; //个位显示处理  

    Shiwei=tab[second/10];//十位显示值处理 

    if(second%2==0) 

 {

 Baiwei=tab[minute%10];

 Qianwei=tab[minute/10];// 千位

    }

  else 

   {

 Baiwei=(tab[minute%10]|0x80);//百位显示处理:加点的字码  

 

    Qianwei=(tab[minute/10]|0x80);

  }

 

 

      

 if(second%2!=0)

    {

    Wanwei=tab[hour%10];

 Shiwan=tab[hour/10];

 }

   else 

    {     

    Wanwei=(tab[hour%10]|0x80);

 Shiwan=(tab[hour/10]|0x80);

  }

 Naoling1=~tab[alarmhour%10];

 Naoling2=~tab[alarmhour/10];

 Naoling3=~tab[alarmminute%10];

 Naoling4=~tab[alarmminute/10];

 } 

void timer0() interrupt 3 using 1

{

TH1=0x3c; //中断设置初始化 

TL1=0xb0;

if(alarmhour==hour&&alarmminute==minute&&j==1)

{

beep=0;

}

}

 /******************************************************************/ 

/*                    定时器中断函数                              */ 

/******************************************************************/ 

void timer1() interrupt 1 using 0 

{           

TH0=0xd8;             //重新赋值 

TL0=0xf0;      

count++;

xianshi();

if (count==99)      //100x10ms=1S,大致延时时间 

 {     

    count=0;

    second++;       //秒加1 

 if(second==60) 

 minute++;   

 {      

 if(second==60) 

 second=0;  

 {   

  if(minute==60) 

  hour++;   

  {     

  if(minute==60) 

    minute=0;  

 {   

 if(hour==24) 

 hour=0; 

  }     

  }

  }

  }

  } 

 }

 /******************************************************************/

/*                    主函数                                      */

/******************************************************************/

void  main()

{   

TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式1,16位定时 

TH0=0xd8;

TL0=0xf0;

IE= 0x82;  //打开中断

TR0=1;     //打开定时开关

xianshi();

 EA=1;ET0=1;TMOD |=0x21;TR0=1; //开中断总开关,计数器0允许中断,设置中断模式,启动计数器0

ET1=1;TR1=1;

 while(1)

 {

  {

  if(!A3)

  { 

  delay(10000);

  if(!A3)

  {   

   i++;if(i==7)i=0; 

   xianshi();

  } 

  }

  }

  {

  if(!A4) 

  {

  delay(10000);

  if(!A4)

  {

   i--;if(i==255)i=6;

   xianshi();

  }  

  } 

  }

 switch(i)

 {

case 0:     //正常显示控制

  {        

  P1=0x1e;      //片选个位 

  P0=~Baiwei; //显示个位

  delay(300);   //短暂延时 

  P1=0x1d;       //片选十位

  P0=~Qianwei;//显示十位

  delay(300);   //短暂延时

  P1=0x1b;      //片选百位

  P0=~Wanwei;   //显示百位

  delay(300);   //短暂延时

  P1=0x17;     //片选千位

  P0=~Shiwan;  //显示千位

  delay(300);   //短暂延时

  P1=0x1f;

  P0=0xff;

  delay(300);

 } ;break; 

case 1:    //调分控制

 {

 if(second%2!=0)

 { 

  P1=0x1e;      //片选个位 

  P0=~Baiwei; //显示个位

  delay(300);   //短暂延时 

  P1=0x1d;       //片选十位

  P0=~Qianwei;//显示十位

  delay(300);   //短暂延时

  P1=0x1f;

  P0=0xff;

  delay(300);

}

else

delay(300);

delay(300);

{

if(!A1)

{

delay(10000);//消抖

if(!A1)

{  

minute++;if(minute==61)minute=0;

xianshi();

}  

}//按键处理 

{

if(!A2)

{   

delay(10000);//消抖 

if(!A2)

{     

minute--;if(minute==255)minute=59;

xianshi();

}  

}  

}

};break;

case 2:      //调时控制

  {

  if(second%2==0)

  {

  P1=0x1b;      //片选百位

  P0=~Wanwei;   //显示百位

  delay(300);   //短暂延时

  P1=0x17;     //片选千位

  P0=~Shiwan;  //显示千位

  delay(300);   //短暂延时

  P1=0x1f;

  P0=0xff;

  delay(300);

 }

 else

delay(300);

delay(300);

  {

if(!A1)

{

delay(10000);//消抖

if(!A1)

{

hour++;if(hour==24)hour=0;

xianshi();

}

}//按键处理 

}

{

if(!A2)

delay(10000);//消抖

if(!A2)

hour--;if(hour==255)hour=23;

xianshi();

}

}

}

  };break;

  case 3: //秒显示控制

  {

  P1=0x1e;      //片选个位 

  P0=~Gewei; //显示个位

  delay(300);   //短暂延时 

  P1=0x1d;       //片选十位

  P0=~Shiwei;//显示十位

  delay(300);   //短暂延时

  P1=0x1f;

  P0=0xff;

  delay(300);

delay(300);

delay(300);

  };break;

 

case 4://闹钟控制

if((!A1)||(!A2))

{

delay(10000);

if((!A1)||(!A2))j++;

if(j==2)

j=0;

}

switch (j)

{

case 0:{

  P1=0x1e;      //片选个位 

  P0=~0x71; //显示个位

  delay(300);   //短暂延时 

  P1=0x1d;       //片选十位

  P0=~0x71;//显示十位

  delay(300);   //短暂延时

  P1=0x1b;      //片选百位

  P0=~0x3f;   //显示百位

  delay(300);   //短暂延时

  P1=0x17;     //片选千位

  P0=~0x40;  //显示千位

  delay(300);   //短暂延时

  delay(300);

  

         };break;

case 1:{

  P1=0x1e;      //片选个位 

  P0=~0x37; //显示个位

  delay(300);   //短暂延时 

  P1=0x1d;       //片选十位

  P0=~0x3f;//显示十位

  delay(300);   //短暂延时

  P1=0x1b;      //片选百位

  P0=0xff;   //显示百位

  delay(300);   //短暂延时

  P1=0x17;     //片选千位

  P0=~0x40;  //显示千位

  delay(300);   //短暂延时

  delay(300);

        }

 }

};break; 

 

case 5://闹铃分钟调整

{

{

P1=0x1e;

P0=Naoling3;

delay(300);

P1=0x1d;

P0=Naoling4;

delay(300);

P1=0x1f;

P0=0xff;

delay(300);

delay(300);

delay(300);

}

{

if(!A1)

{

delay(10000);//消抖

if(!A1)

{  

alarmminute++;if(alarmminute==61)alarmminute=0;

}  

}//按键处理 

{

if(!A2)

{   

delay(10000);//消抖 

if(!A2)

{     

alarmminute--;if(alarmminute==255)alarmminute=59;

}  

}  

}

};break;

case 6://闹铃小时调整

{   

{

P1=0x1b;

P0=Naoling1;

delay(300);

P1=0x17;

P0=Naoling2;

delay(300);

P1=0x1f;

P0=0xff;

delay(300);

delay(300);

delay(300);

}

{

if(!A1)

{

delay(10000);//消抖

if(!A1)

{  

alarmhour++;if(alarmhour==24)alarmhour=0;

}  

}//按键处理 

}

 

{

if(!A2)

{   

delay(10000);//消抖 

if(!A2)

{     

alarmhour--;if(alarmhour==255)alarmhour=23;

}  

}

};break;

default :break;

}

}

}

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-01-19
相关资料:

多功能数字钟设计

一 简介

时钟, 自从它发明的那天起,就成为人类的朋友,但随着时间的推移,人们对它的功能又提出了新的要求,怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时钟。本方案设计的多功能电子钟除了传统的显示时间功能之外还可以测试温度、电网频率、电压、并提供了过压报警、非接触止闹等功能。其中温度采用AD590温度传感器电路测得,非接触止闹则采用红外控制技术实现。

二 方案论证

时钟模块方案
方案一 基本门电路搭建 用基本门电路来实现数字钟,电路结构复杂,故障系数大,不易调试。
方案二 单片机编程 用单片机设计电路,由于使用软硬件结合的方式,所以电路结构简单、调试也相对方便。与第一种方案比较优点是非常明显的。我们选择了第二种方案

测温模块方案
方案一 热电阻测温 热电阻测量温度,精度和灵敏度都可以,但是它的电阻值与温度的线性关系不好.不便用数字的方法处理。
方案二 热电偶测温 热电偶是温度测量中应用最广泛的一种传感器 .在一般的测量和控制中,常用于中高温的温度检测.在 测量中需要温度的冷端补偿,在数字电子中实现不方便
方案三 AD590加运算放大器 二端式半导体温度传感器 AD590的工作电压要求不高,测温的范围比较宽最重要的是它的输出电流是紧随温度变化的电流源,所以它的线性非常好.我们选择了这种方案。
测电压模块方案
方案一 取样测试。用高速的取样电压取样,可得电压的峰值与主频率,并根据其电压大小进行相应的报警操作。此方案功能实现复杂,造价相对较高,不适合一般的家用。
方案二 测得电压有效值 测电压的有效值的方法比较简单,可以把一段时间内的电压的整体情况反映出来 ,但不能测出电压的瞬时变化的情况,对电网的突然冲击不能测出.
方案三 测得峰值推得有效值。交流电经过整流滤波后得到直流电压大小就是交流电的峰值,分压测出此电压大小,后根据交流电有效值和峰值的关系可推得有效值。这种方案采用的电路简单,实现方便,易于调试,精度较高, 为我们的设计采用。

非接触止闹模块方案
方案一 声音止闹
声音代替肢体给人带来了很大便利,但是要采用声控装置不得不考虑外界噪声对正常声音信号带来的干扰,而这一点又很难控制,因此虽然声控方便,但在这里不太适用所以割舍。
方案二 红外止闹
红外控制技术现在已被广泛地应用到各个领域,此技术有其独特的特点,首先操作方便抗干扰性好、探测灵敏度高、工作湿度范围宽设计电路有不太复杂,造价也不高,由于这些特点我们选用了红外遥控来止闹。

显示模块方案
方案一 段码显示。段码显示需要专门的驱动,增大了硬件电路,调试不易。而且用段码表示不够直观,因此不采用这种方案
方案二 单片机控制液晶显示。控制部分集成在单片机内软件调试,硬件集成度大,为本方案所采用。

综上所述得到以下方块图:

三 各模块功能

单片机控制显示部分:液晶显示片上显示时间、电压、温度,键盘控制,键盘如下图所示:

调节 ↑
闹铃 ↓

闹铃键用来设置闹铃,闹铃响时按下闹铃键可用来止闹,平时闹铃键可用来设置闹铃的开关,闹铃关时按下此键闹铃功能将被打开,反之闹铃功能将被关闭。需要调节时间时,按动调节按钮,显示片上需要设置的时间值以闪烁的方式出现,以示区别,表示当前调节内容,再次按动,跳至下个需要设置的时间值,我们可以通过切换选择我们需要调整的时间部分,然后按“上”“下”按钮进行设定。其中时钟部分以二十四或十二小时(AM/PM)制显示。
此外单片机还控制温度和电压的测量,通过测温端和测电压端输出的电压,由相应的函数关系求得被测端的被测参数,然后显示在液晶显示屏上.

测温部分
原理方块图:
温度检测电路的设计,电路图如下:
测温元件使用温度传感器AD590。A/D590在0℃时输出的电流I=273 uA,温度T每增加1℃,I增加1u A。输出的电压变化为:
Δv=1uA×R2
系统要求电压变化范围在0—5伏,可解得R2<62.5K,设计中R2采用了52K的电阻。
当温度为-10摄氏度时,要求输出电压尽量接近于0 V,
U0=(It-Vcc/R1) ×R2=0
由上述公式,得R1约为56k,本设计中取R1=56.3
3.A/D转换及显示电路的设计。本设计中所采用的单片机内置十位A/D转换器,显示电路也是通过编程单片机控制,控制程序见附录。

电压测量及欠压过压报警
电压测试电路如下:
交流电经变压器后,经半波整流后分压测得电压。电路图如下:

在变压器的中线上引出15v的交流电压,经过二极管以后相当滤掉了 负向电压。当电压从峰值下降到一定程度时,电容C1开始放电。取R3*C1>60ns,电阻上得到约等于交流电峰值的直流电压,分压后测得输出电压,有电路连接和交流电峰值、有效值的关系,
把三极管的基极接到单片机的一个控制口上,控制电容放电,保证每次的采样结果的正确性,也可以防止放电电流对电源的影响。由于我们已经知道现在用的是标准的电源,所以我们可以用电源的有效值计算出电压的最大值用于电压的上下限的报警。
我们用计数器接在J2 J3两端,通过每分钟计的的高电平或低电平个数就可以得出电网的频率。

非接触止闹:我们用红外控制技术控制闹钟的关闭。发射电路如下图

其中38khz方波发生电路由555接成,经74ls08后由三极管驱动两个发光二极管,当按钮按下时,发出控制光线。
接收电路如下图所示:

当接收到红外信号时,OUT端产生低电平信号,传到控制端,实现止闹功能。
单片机控制系统原理图如下:

控制系统主要由单片机应用电路、存储器接口电路、LCD显示接口电路、键盘电路、模拟量输入输出接口电路、供电电路及程序下载和调试接口电路组成。其中单片机应用电路是系统工作的核心,它主要负责控制各个部分协调工作.由于系统构成接口较多,为了更好的组织各个功能部件正常工作,我们选用功能强大的AVR单片机作为主控CPU.它集各种存储器(FLASH,RAM,EEPROM)、模拟器件(A/D转换器,模拟比较器)于一体,同时还集成了各种总线控制器等数字通信器件,是真正的片上系统(SOC).由于本系统涉及各种数字和模拟电子器件的应用,因此使用此单片机作为本系统的主控CPU,使开发速度大大提高。

四 系统调试过程与测试结果

本实验需要调试的主要有两部分:温度测试部分的调试和电压测试部分的调试

温度测试部分
实验数据如下

温度T(℃) 理论AD590输出电流(uA) 理论电压值Ut (V) 实际电压值Uo (V)
0 273 0.416 0.640
10 283 0.930 0.790
20 293 1.444 1.568
26.4 299.4 1.795 2.07
27.5 3090.5 1.852 2.10
30 303 1.985 2.35
40 313 2.471 3.130
50 323 2.985 3.312
60 333 3.499 3.845
70 343 4.013 4.378
100 373 5.62 5.98

表中AD590输出理论电流值由AD590本身的性质决定,理论电压输出则由仿真软件仿真计算得到。可以看出,理论电压和实际电压有明显的差别,实际输出电压高于理论算得的电压值,经不断分析测试可作如下总结:由于系统本身工作产生热量,使得AD590所测温度高于环境温度,但可以看出,实际电压值与温度依然呈线性关系变化,于是对测得数据进行一元线性回归处理,用最小二乘法求得此线性关系的斜率和初象,得到输出电压与温度变化之间的函数变化关系如下:
T=(100Uo-64)/5.34
在所得式中代入测得数据计算,其误差都不超过1摄氏度,可验证所得式的正确性。将此公式写入单片机控制程序中,就可以根据输入的电压变化得到相应的温度值。

电压调试部分:
测输入交流电压和输出交流电压的值,调10K电位器,市的交流输入为15是电压在2.5V到3V之间。保持电位器不变化,测得输入输出电压关系,得出相应函数关系。输入电压为十五伏时一边调电位器,一边观察输出电压。接入输出电压的电阻为2.17时输出电压在要求范围。这时测输入电压输出电压值如下表:

输入经变压器后的交流电压Ui’ (v) 输出直流电压Uo (v)
19.7 3.64
16.3 3
15 2.71
11.7 2.12
7.1 1.25
由表中数据可得以下结论:输入和输出约成正比变化,而经变压器后的电流是原电流的3/22,在由上述关系可得
Vi=Vo*80.2
测试过程中,经变压器后的交流电压和输出的直流电压线性关系符合得很好,上式作为最后的结果被写在程序中.

五 结束语
这款多功能计数器采用了现在广泛使用用的单片机技术为核心,软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用大屏幕液晶显示、红外遥控装置和电压报警装置使人机交互简便易行,较为有效地完成了题目的要求。

其他相关:

http://www.bysj120.cn/lunwen/jsj/3151.html

仅供参考,请自借鉴

希望对您有帮助
第2个回答  2010-01-16
我有个,不过你需要改一下。就只有时间调整的,没有报时提醒,调时是用LED指示,有小时调整和分钟
ASD EQU 22H ;分显示
BSD EQU 23H ;十分显示
CSD EQU 24H ;小时显示
DSD EQU 25H ;十小时显示
ID EQU 28H ;标志位
ORG 0
AJMP START
ORG 0BH
AJMP TIME0 ;定时器0标志位
ORG 30H
START: CLR P1.0 ;秒闪烁
SETB P3.6
SETB P3.7
MOV ID,#0
MOV 26H,#0
MOV 27H,#0
SETB EA ;开总中断
SETB ET0 ;开TR0中断
MOV TMOD,#01H ;T0工作模式1
MOV SP,#50H ;移开堆栈
MOV 20H,#0 ;百毫秒清0
MOV 21H,#0 ;毫秒清0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
DISP: JNB P3.7,DIS1
ACALL STLP
JMP DISP
DIS1: ACALL DELAY10
JNB P3.7,$
CLR TR0
CLR EA
DDS: ACALL STLP
JB P3.7,REL
ACALL DELAY10
JB P3.7,REL
INC ID
MOV A,ID
CJNE A,#3,REL
MOV ID,#0
REL: JNB P3.7,$
MOV A,ID
CJNE A,#0,IS0
CLR P1.1
JB P3.6,IUT0
ACALL DELAY10
JNB P3.6,$
INC 27H
MOV A,27H
CJNE A,#24,IUT0
MOV 27H,#0
IUT0: AJMP DDS
IS0: CJNE A,#1,IS1
SETB P1.1
CLR P1.2
JB P3.6,IUT1
ACALL DELAY10
JNB P3.6,$
INC 26H
MOV A,26H
CJNE A,#60,IUT1
MOV 26H,#0
IUT1: AJMP DDS
IS1: CJNE A,#2,IS2
SETB P1.2
CLR P1.0
SETB EA
SETB TR0
AJMP DISP
IS2: AJMP DDS
STLP: MOV A,26H
MOV B,#10
DIV AB
MOV BSD,A
MOV ASD,B
MOV A,27H
MOV B,#10
DIV AB
MOV DSD,A
MOV CSD,B
MOV DPTR,#ABCD
MOV A,ASD
MOVC A,@A+DPTR
MOV P0,A
CLR P2.4
ACALL DELAY1
SETB P2.4
MOV A,BSD
MOVC A,@A+DPTR
MOV P0,A
CLR P2.5
ACALL DELAY1
SETB P2.5
MOV A,CSD
MOVC A,@A+DPTR
MOV P0,A
CLR P2.6
ACALL DELAY1
SETB P2.6
MOV A,DSD
MOVC A,@A+DPTR
MOV P0,A
CLR P2.7
ACALL DELAY1
SETB P2.7
RET
TIME0: PUSH PSW
PUSH ACC
INC 21H
MOV A,21H
CJNE A,#20,AGAIN
CPL P1.0
INC 20H
MOV A,20H
CJNE A,#60,NEXT
INC 26H
MOV A,26H
CJNE A,#60,NEX1
INC 27H
MOV A,27H
CJNE A,#23,NEX2
MOV 27H,#0
NEX2: MOV 26H,#0
NEX1: MOV 20H,#0
NEXT: MOV 21H,#0
AGAIN: MOV TH0,#3CH
MOV TL0,#0B0H
POP ACC
POP PSW
RETI
DELAY1: MOV R7,#10
D1: MOV R6,#200
DJNZ R6,$
DJNZ R7,D1
RET
DELAY10: MOV R7,#20
D2: MOV R6,#250
DJNZ R6,$
DJNZ R7,D2
RET
ABCD: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
END
第3个回答  2010-01-15
我有不过是51的,功能是这些。
【功能】
计时:⑴可实现年、月、日、时、分、秒的计时。
⑵自动根据月份来调整日期的进制,如到2月28号24时0分0秒时自动进入下一个月的计时、到3月31号24时0分0秒时自动进入下一个月的计时。
⑶计时可计到2099年。
调时:⑴具有普通电子时钟的A、B键功能,A键为调时状态切换键。B键为调时自加键,第二功能为显示日期功能。
⑵接一下A键、切换一下调时位置、在调时位置非调时状态时,相应的位置进行跳动闪烁。每接一下B键调时位置自动加1,一直接下B键停止跳动闪烁,自动自加,松开后立刻停止。
⑶在正常计时,接一下B键可看日期。接一下A键,无法中断日期显示。延时5S自动返回计时状态。
⑷在调时状态时,30S自动返回计时状态。
⑸在调分钟时,秒自动归零,调到正常计时状态时,接一下B键、从零秒自动计时。若停止计时,不进行任何的操作。1分钟后自动返回计时状态。并计时
注意:本时钟必须用32.768KHz晶振,晶振精度是小于10ppM,一周不差7秒,必须用CD4060,不能用HCF4060 。
第4个回答  2010-01-16
.

发一份给你看看,让你参考

.本回答被提问者采纳
相似回答