历史上的今天

今天是:2024年09月29日(星期日)

正在发生

2019年09月29日 | 课程设计题三十三:基于单片机的电子钟

发布者:科技飞翔 来源: eefocus关键字:单片机  电子钟  STC89C51 手机看文章 扫描二维码
随时随地手机看文章

1)设计任务:设计一个能 显示当前的年、月、日、时、分、秒,具有闹钟功能的的电子时钟。


2)指标要求


(1)可实现12小时制和24小时制转换。


(2)年、月、日、时、分均可以单独设置,设置时该项目闪烁。 


(3)计时精度误差:≤1秒/日。


(4)液晶显示。 


(5)能实现闹钟功能。


(6)电源:1节5号干电池(1.5V)。


一、Protues仿真图(添加温度显示功能):


二、Protues仿真图(12-24进制转换):

三、程序源码(添加温度显示功能):

因为注释非常的全,这里就不再进行讲解了。

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

================================================================================

【平    台】STC89C51平台

【编    写】Sumjess

【E-mail  】1371129880@qq.com

【软件版本】V2.0

【最后更新】2018年09月06日

【相关信息参考下列地址】

【网    站】

  Sumejss博客  https://blog.csdn.net/qq_38351824

  电子发烧友  http://bbs.elecfans.com/zhuti_mcu_1.html

  中国电子网  http://bbs.21ic.com/icfilter-typeid-11-214.html

---------------------------------------------------------------------------------

【dev.env.】MDK4.14及以上版本

【Target  】STC89C51

第一次修订:2019/05/23

第二次修订:2018/05/24

第三次修订:2018/05/26

================================================================================

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

#include          //调用单片机头文件

#define uchar unsigned char  //无符号字符型 宏定义 变量范围0~255

#define uint  unsigned int //无符号整型 宏定义 变量范围0~65535

#include "E2PROM52_Sumjess.h"

#include "Dateconversion_Sumjess.h"

#include "intrins.h"

 

 

bit flag_200ms ;

bit flag_100ms ;

sbit beep = P1^4;   //蜂鸣器定义

bit flag_beep_en;

uint clock_value;     //用作闹钟用的

 

sbit dq   = P2^0;   //18b20 IO口的定义

 

 

uint temperature ;    //温度变量

uchar flag_nl;        //农历 阳历显示标志位

 

 

uchar menu_1,menu_2;

 

 

 

uchar key_time,flag_value;      //用做连加的中间变量

bit key_500ms  ;

uchar n_nian,n_yue,n_ri; //农历显示的函数

 

 

#include "DS1302_Sumjess.h"

#include "LCD1602_Sumjess.h"

 

 

 

 

/******************把数据保存到单片机内部eeprom中******************/

void write_eeprom()

{

SectorErase(0x2000);

byte_write(0x2000, fen1);

byte_write(0x2001, shi1);

byte_write(0x2002, open1);

byte_write(0x2058, a_a);

}

 

/******************把数据从单片机内部eeprom中读出来*****************/

void read_eeprom()

{

fen1  = byte_read(0x2000);

shi1  = byte_read(0x2001);

open1  = byte_read(0x2002);

a_a      = byte_read(0x2058);

}

 

/**************开机自检eeprom初始化*****************/

void init_eeprom()

{

read_eeprom(); //先读

if(a_a != 1) //新的单片机初始单片机内问eeprom

{

fen1  = 3;

shi1  = 8;

open1  = 1;

a_a = 1;

write_eeprom();    //保存数据

}

}

 

/***********************18b20初始化函数*****************************/

void init_18b20()

{

bit q;

dq = 1; //把总线拿高

delay_uint(1);     //15us

dq = 0; //给复位脉冲

delay_uint(80); //750us

dq = 1; //把总线拿高 等待

delay_uint(10); //110us

q = dq; //读取18b20初始化信号

delay_uint(20); //200us

dq = 1; //把总线拿高 释放总线

}

 

/*************写18b20内的数据***************/

void write_18b20(uchar dat)

{

uchar i;

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

{ //写数据是低位开始

dq = 0; //把总线拿低写时间隙开始 

dq = dat & 0x01; //向18b20总线写数据了

delay_uint(5); // 60us

dq = 1; //释放总线

dat >>= 1;

}

}

 

/*************读取18b20内的数据***************/

uchar read_18b20()

{

uchar i,value;

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

{

dq = 0; //把总线拿低读时间隙开始 

value >>= 1; //读数据是低位开始

dq = 1; //释放总线

if(dq == 1) //开始读写数据 

value |= 0x80;

delay_uint(5); //60us 读一个时间隙最少要保持60us的时间

}

return value; //返回数据

}

 

/*************读取温度的值 读出来的是小数***************/

uint read_temp()

{

uint value;

uchar low;    //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序

init_18b20();    //初始化18b20

write_18b20(0xcc);    //跳过64位ROM

write_18b20(0x44);    //启动一次温度转换命令

delay_uint(50);    //500us

 

init_18b20();    //初始化18b20

write_18b20(0xcc);    //跳过64位ROM

write_18b20(0xbe);    //发出读取暂存器命令

EA = 0;

low = read_18b20();    //读温度低字节

value = read_18b20();  //读温度高字节

EA = 1;

value <<= 8;    //把温度的高位左移8位

value |= low;    //把读出的温度低位放到value的低八位中

value *= 0.625;        //转换到温度值 小数

return value;    //返回读出的温度 带小数

}

 

 

----由于篇幅的问题,只显示一部分,请下载后自行观看,程序非常的全-----

-----关注公众号免费下载-----

四、程序源码(12-24进制转换):

因为注释非常的全,这里就不再进行讲解了。

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

================================================================================

【平    台】STC89C51平台

【编    写】Sumjess

【E-mail  】1371129880@qq.com

【软件版本】V2.0

【最后更新】2018年09月06日

【相关信息参考下列地址】

【网    站】

  Sumejss博客  https://blog.csdn.net/qq_38351824

  电子发烧友  http://bbs.elecfans.com/zhuti_mcu_1.html

  中国电子网  http://bbs.21ic.com/icfilter-typeid-11-214.html

---------------------------------------------------------------------------------

【dev.env.】MDK4.14及以上版本

【Target  】STC89C51

第一次修订:2019/05/23

第二次修订:2018/05/24

第三次修订:2018/05/26

================================================================================

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

#include          //调用单片机头文件

#define uchar unsigned char  //无符号字符型 宏定义 变量范围0~255

#define uint  unsigned int //无符号整型 宏定义 变量范围0~65535

#include "E2PROM52_Sumjess.h"

#include "Dateconversion_Sumjess.h"

#include "intrins.h"

 

bit flag_200ms ;

bit flag_100ms ;

sbit beep = P1^4;   //蜂鸣器定义

bit flag_beep_en;

uint clock_value;     //用作闹钟用的

 

uchar flag_nl,flag_n2;        //农历 阳历显示标志位

 

 

uchar menu_1,menu_2;

 

 

 

uchar key_time,flag_value;      //用做连加的中间变量

bit key_500ms  ;

uchar n_nian,n_yue,n_ri; //农历显示的函数

 

 

 

#include "DS1302_Sumjess.h"

#include "LCD1602_Sumjess.h"

 

 

 

/******************把数据保存到单片机内部eeprom中******************/

void write_eeprom()

{

SectorErase(0x2000);

byte_write(0x2000, fen1);

byte_write(0x2001, shi1);

byte_write(0x2002, open1);

byte_write(0x2058, a_a);

}

 

/******************把数据从单片机内部eeprom中读出来*****************/

void read_eeprom()

{

fen1  = byte_read(0x2000);

shi1  = byte_read(0x2001);

open1  = byte_read(0x2002);

a_a      = byte_read(0x2058);

}

 

/**************开机自检eeprom初始化*****************/

void init_eeprom()

{

read_eeprom(); //先读

if(a_a != 1) //新的单片机初始单片机内问eeprom

{

fen1  = 3;

shi1  = 8;

open1  = 1;

a_a = 1;

write_eeprom();    //保存数据

}

}

 

 

 

/******************1ms 延时函数*******************/

void delay_1ms(uint q)

{

uint i,j;

for(i=0;i for(j=0;j<120;j++);

}

 

/******************写星期函数*******************/

void write_week(uchar hang,uchar add,uchar week)//写星期函数

{

if(hang==1)   

write_com(0x80+add);

else

write_com(0x80+0x40+add);   

switch(week)

{

case 1:write_data('M');//星期数为1时,显示

   write_data('O');

   write_data('N');

   break;

   

case 2:write_data('T');//星期数据为2时显示

   write_data('U');

   write_data('E');

   break;

case 3:write_data('W');//星期数据为3时显示

   write_data('E');

   write_data('D');

   break;

case 4:write_data('T');//星期数据为4是显示

   write_data('H');

   write_data('U');

   break;

case 5:write_data('F');//星期数据为5时显示

   write_data('R');

   write_data('I');

   break;

case 6:write_data('S');//星期数据为6时显示

   write_data('T');

   write_data('A');

   break;

case 7:write_data('S');//星期数据为7时显示

   write_data('U');

   write_data('N');

   break;

}

}

 

/*************时钟显示***************/

void init_1602_ds1302()

{

if(flag_n2 == 0)  //显示24

{

write_sfm2_ds1302(1,1,shi);    //显示时

write_sfm2_ds1302(1,4,fen);    //显示分

write_sfm2_ds1302(1,7,miao);    //显示秒

write_week(2,12,week);

}

else

{

if(shi==0x20) shi=0x08;

else if(shi==0x13) shi=0x01;

else if(shi==0x14) shi=0x02;

else if(shi==0x15) shi=0x03;

else if(shi==0x16) shi=0x04;

else if(shi==0x17) shi=0x05;

else if(shi==0x18) shi=0x06;

else if(shi==0x19) shi=0x07;

else if(shi==0x21) shi=0x09;

else if(shi==0x22) shi=0x10;

else if(shi==0x23) shi=0x11;

 

write_sfm2_ds1302(1,1,shi);    //显示时

write_sfm2_ds1302(1,4,fen);    //显示分

write_sfm2_ds1302(1,7,miao);    //显示秒

write_week(2,12,week);

}

if(flag_nl == 0)  //显示阳历

{

write_sfm2_ds1302(2,2,nian);   //显示年

write_sfm2_ds1302(2,5,yue);    //显示月

write_sfm2_ds1302(2,8,ri);    //显示日

}

else //显示农历

{

write_sfm2_ds1302(2,2,n_nian); //显示年

write_sfm2_ds1302(2,5,n_yue); //显示月

write_sfm2_ds1302(2,8,n_ri); //显示日 

}

 

}    

 

/*************定时器0初始化程序***************/

void init_time0()   

{

EA   = 1;   //开总中断

TMOD = 0X01;   //定时器0、工作方式1

ET0  = 1;   //开定时器0中断 

TR0  = 1;   //允许定时器0定时

}

 

/*************闹钟报警函数***************/

void menu_dis()

{

static uchar mm,value;

if(flag_100ms == 1)   //100ms执行一次

{

flag_100ms = 0;

if(open1 == 1) //如果闹钟打开

{

if((miao == 0) && (fen == fen1) && (shi == shi1)) 

{

flag_beep_en = 1; //有报警 打开蜂鸣器响的标志位

}

if(flag_beep_en == 1) //闹钟以被打开

{

clock_value++;

if(clock_value <= 30)  

beep = ~beep;    //蜂鸣器叫3秒

else if(clock_value > 30)

{

beep = 1;     //蜂鸣器停1秒

if(clock_value > 40)

{

clock_value = 0;

 

}

}

//  1 分钟后自动关闭闹钟

value ++;

if(value >= 10)

{

value = 0;

mm++;

if(mm >= 60)

{

mm = 0;

[1] [2]
关键字:单片机  电子钟  STC89C51 引用地址:课程设计题三十三:基于单片机的电子钟

上一篇:课程设计题二:7人多数表决器
下一篇:课程设计题一:八人抢答器

推荐阅读

   自推出以来,Galaxy Note9已经收到两个系统更新,第一个改进了对超级慢动作视频模式的控制,第二个解决了Bixby按钮的问题。现在第三个系统更新已经推送,这也是最重要的一个,因为它有望大幅改善相机体验。  德国用户发现OTA已经更新,版本号为N960FXXU2ARI9,大小为302MB。更新日志是关于相机的改进:解决了图像的某些部分曝光不足的HDR问题,也...
学习本章时,配合《STM32F4xx 中文参考手册》 “通用 I/O(GPIO)” 章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。 关于建立工程时使用 KEIL5 的基本操作,请参考前面的章节。本讲建议看火哥视频,很重要。链接:https://pan.baidu.com/s/1Dusgd-K1pPJpILpcp7xawg 提取码:w6nx 5.1 GPIO 简介: GPIO 是通用输入...
  1、机器人操作机构   通过有限元分析、模态分析及仿真设计等现代设计方法的运用,实现机器人操作机构的优化设计。探索新的高强度轻质材料,进一步提高负载/自重比。此外采用先进的及交流伺服,使机器人操作机几乎成为免维护系统。   机构向着、可重构方向发展。例如,关节模块中的伺服电机、、检测系统三位一体化;由关节模块、连杆模块用重组...
9月26日,苹果公司的印刷电路板制造商欣兴电子发布公告称,因苏州地区将于9月26日中午12时至9月30日24时停供工业生产用电,公司在苏州及昆山的子公司将暂时停工至9月30日。  欣兴电子表示,停工期间将协调集团内其他厂区生产,以满足客户出货需求,预计停工4.5个工作日暂时尚未产生重大影响。  作为苹果和特斯拉的主要机械零部件供应商,乙盛精密也在9...

史海拾趣

问答坊 | AI 解惑

基于Windows CENET的嵌入式PC视频监控系统.pdf

基于Windows CENET的嵌入式PC视频监控系统.pdf…

查看全部问答∨

zlib内存解压缩问题!

我将程序代码进行压缩,然后烧进flash里,用zlib进行解压缩时,总是出Z_DATA_ERROR!为什么? 我是用winrar进行压缩的!难道不行吗?…

查看全部问答∨

驱动/单片机/嵌入式群 18483749 欢迎高手加入!

名称:驱动/单片机/嵌入式群 群号:18483749 简介:c/c++,单片机,驱动开发,工业控制.技术交流…

查看全部问答∨

PPC6.1中的phonesetting中把属性页中某个原来的应用替换为我的应用,com接口是什么?

PPC6.1中的phonesetting中把属性页中某个原来的应用替换为我的应用,com接口是什么? 在线等,谢谢!…

查看全部问答∨

第四代大功率UPS的技术——无变压器设计

                                      &n ...…

查看全部问答∨

QT版 finder -- 类似库文件的finder 能够查找 硬件IP

上次问过 如何查找 硬件设备的IP地址 非常感谢academic大侠的回复 今天晚上终于有时间可以来玩玩看了 硬件平台非8962板 但是 一样 的 跑lwip 于是 就将locator.c 移植到工程中区 并参考finder下的文件 用QT写了个简单小DEMO 可以辅助我的调 ...…

查看全部问答∨

msp430基础程序集合

msp430基础程序集合…

查看全部问答∨

Launchpad串行驱动44键盘

哪位高手有收藏到有基于Launchpad串行驱动44键盘的程序,麻烦分享一下!感激不尽…

查看全部问答∨

LM4F231在IAR下的float变量

芯片是LM4F231, ARM M4的内核,开发环境是IAR 6.3。     遇到的问题,当定义局部变量时比如 float f=1.1; 时在IAR下察看local 局部变量值时发现f变量值为<error> 也没有分配变量地址。        对于这一问题 ...…

查看全部问答∨

cadence 16.5 ESpice Device Model的创建

cadence 16.5 要创建一个排阻 ESpice Device Model,各位大神   请问怎么创建啊?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved