利用89c51单片机编写可调万年历

发布者:学思者最新更新时间:2020-06-23 来源: eefocus关键字:89c51  单片机  可调万年历 手机看文章 扫描二维码
随时随地手机看文章

最近需要编写我学单片机一个星期以来最大的一个项目,目前感觉相当有挑战性,题目如下:


1)项目一(远程时钟控制系统)


项目背景:时间对于每个人都很重要,特别是对于高速发展的今天。每个城市都有中央LED显示,上面一般包含有时间,天气相应的信息。说近一点,比如我们学校体育馆的LED屏。对于这些显示系统,我不可能每次调整信息都爬到那么高的位置去调节。为此,我们需要设计一个远程时钟控制系统。


项目要求:


1,能够在开发板上的液晶1602上设计出电子钟万年历。


2,设计串口通信协议。


3,通过串口协议,能够通过串口将时钟信息发送到PC机上。


4,通过串口协议,设置的时钟的年,月,日,时,分,秒。


5,通过串口协议,可以向液晶实时动态的发布广告信息,并且在广告与时钟自动切换。


6,通过串口协议,可以控制液晶上显示的效果,例如,左移右移以及移动的速度。


7,通过串口协议,设置实时闹钟。


项目说明:


这里对于串口通信协议进行一些说明。串口通信协议就是通过串口实现人机交互的一种功能。这里给大家介绍一种简单实用的协议。大家也可以自己重新设计协议。例如:


我们可以通过在串口输入命令:menu,激活一个控制菜单。菜单内容如下:


【a】change time //修改系统时间


【b】ads       //发布广告


【c】Good look    //修改特效


……..


【q】 quit        //退出


然后输入:a,就可以进入你设计修改系统时间的菜单中,然后你在修改系统时钟菜单中进行系统时钟修改。


为了体现系统的健壮性,大家需要设计防错机制,例如当你输入menu的时候,你输入了menn,那么你的系统应该提示:input error!


除了修改系统时间,时钟可以停止,其他的时候,时钟都必须是运行的


现在只完成成型的万年历部分,如下


#include

#define uint unsigned int

#define uchar unsigned char

char shi, fen, miao,yue,ri;

uchar num;

uint count,s1num,nian;

sbit rs=P2^0;

sbit rw=P2^1;

sbit en=P2^2;

sbit s1=P3^2;

sbit s2=P3^3;

sbit s3=P3^4;

uchar code table[]="  2012-11-30";

uchar code table1[]="  23:59:55";

void delay(uint z) //延时函数

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void write_com(aa) //写命令

{

rs=0;

rw=0;

P0=aa;

delay(5);

en=1;

delay(5);

en=0;

}

//////////////////////////////////////////////

void write_data( bb)  //写数据

{

rs=1;

rw=0;

P0=bb;

delay(5);

en=1;

delay(5);

en=0;

}

void write_sfm(uchar add,uchar bb) //写时间

{

uchar shi,ge;

shi=bb/10;

ge=bb%10;

write_com(0x80+0x40+add);

write_data(0x30+shi);

write_data(0x30+ge);

}

void write_yr(uchar add1,uchar bb) //写日期

{

uchar s,g;

s=bb/10;

g=bb%10;

write_com(0x80+add1);

write_data(0x30+s);

write_data(0x30+g);

}

void write_n(uchar add2,uchar bb) //写年

{

uchar qi,ba,sh,gg;

qi=bb/1000;

ba=bb%1000/100;

sh=bb%100/10;

gg=bb%10;

write_com(0x80+add2);

write_data(0x30+qi);

write_data(0x30+ba);

write_data(0x30+sh);

write_data(0x30+gg);

}

//////////////////////////////////////////////////////////

void init() //初始化

{

miao=55;

fen=59;

shi=23;

nian=2012;

yue=11;

ri=30;

en=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80);

for(num=0;num<12;num++)

{

write_data(table[num]);

delay(5);

}

write_com(0x80+0x40);

for(num=0;num<10;num++)

{

write_data(table1[num]);

delay(5);

}

    TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

 

}

/////////////////////////////////////////////////////

 

///////////////////////////////////////

void keyscan() //调节日期时间

{

if(s1==0)

{

delay(5);

if(s1==0)

{ s1num++;

while(!s1);

if(s1num==1)

{

TR0=0;

write_com(0x80+0x40+8);

write_com(0x0f);

}

}

if(s1num==2)

{

write_com(0x80+0x40+5);

}

if(s1num==3)

{

write_com(0x80+0x40+2);

}

if(s1num==4)

{

write_com(0x80+10);

}

if(s1num==5)

{

write_com(0x80+7);

}

if(s1num==6)

{

write_com(0x80+2);

}

if(s1num==7)

{

s1num=0;

write_com(0x0c);

TR0=1;

}

 

}

if(s1num!=0)

{

if(s2==0)

{

delay(5);

if(s2==0)

{

while(!s2);

if(s1num==1)

{

miao++;

if(miao==60)

miao=0;

write_sfm(8,miao);

write_com(0x80+0x40+8);

}

if(s1num==2)

{

fen++;

if(fen==60)

fen=0;

write_sfm(5,fen);

write_com(0x80+0x40+5);

}

if(s1num==3)

{

shi++;

if(shi==24)

shi=0;

write_sfm(2,shi);

write_com(0x80+0x40+2);

}

if(s1num==4)

{

ri++;

if(ri==31)

ri=1;

write_yr(10,ri);

write_com(0x80+10);

}

if(s1num==5)

{

yue++;

if(yue==13)

yue=1;

write_yr(7,yue);

write_com(0x80+7);

}

if(s1num==6)

{

nian++;

if(nian==9999)

nian=1;

write_n(2,ri);

write_com(0x80+2);

}

}

}

if(s3==0)

{

delay(5);

if(s3==0)

{

while(!s3);

if(s1num==1)

{

miao--;

if(miao==-1)

miao=59;

write_sfm(8,miao);

write_com(0x80+0x40+8);

}

if(s1num==2)

{

fen--;

if(fen==-1)

fen=59;

write_sfm(5,fen);

write_com(0x80+0x40+5);

}

if(s1num==3)

{

shi--;

if(shi==-1)

shi=23;

write_sfm(2,shi);

write_com(0x80+0x40+2);

}

if(s1num==4)

{

ri--;

if(ri==0)

ri=30;

write_yr(10,ri);

write_com(0x80+10);

}

    if(s1num==5)

{

yue--;

if(yue==0)

shi=12;

write_yr(7,yue);

write_com(0x80+7);

}

if(s1num==6)

{

nian--;

if(nian==0)

nian=1;

write_n(2,nian);

write_com(0x80+2);

}

}

}

}

}

 /////////////////////////////////////////

void main() //主函数

{

init();

while(1) 

{

keyscan();

if(count==18)

{

count=0;

miao++;

if(miao==60)

{

miao=0;

fen++;

if(fen==60)

{

fen=0;

shi++;

if(shi==24)

{

shi=0;

ri++;

if(ri==31)

{

ri=1;

yue++;

if(yue==13)

{

yue=1;

nian++;

if(nian==9999)

{

nian=0;

    }

write_n(2,nian);

    }

write_yr(7,yue);

}

write_yr(10,ri);

}

write_sfm(2,shi);

}

write_sfm(5,fen);

}

write_sfm(8,miao);  

}

}

}

//////////////////////////////////////////////////////

void timer0() interrupt 1 //定时器中断0

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

count++;

}

关键字:89c51  单片机  可调万年历 引用地址:利用89c51单片机编写可调万年历

上一篇:51单片机概述以及设计最小系统
下一篇:51单片机(九).51单片机简单项目—万年历和温度采集

推荐阅读最新更新时间:2024-11-14 09:31

8051单片机教程第二十二课:串行口应用编程实例
1.串口方式0应用编程8051单片机串行口方式0为移位寄存器方式,外接一个串入并出的移位寄存器,就可以扩展一个并行口。 例:用8051串行口外接CD4094扩展8位并行输出口,如图所示,8位并行口的各位都接一个发光二极管,要求发光管呈流水灯状态。串行口方式0的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于TI或RI标志。串行发送时,可以靠TI置位(发完一帧数据后)引起中断申请,在中断服务程序中发送下一帧数据,或者通过查询TI的状态,只要TI为0就继续查询,TI为1就结束查询,发送下一帧数据。在串行接收时,则由RI引起中断或对RI查询来确定何时接收下一帧数据。无论采用什么方式,在开始通讯之前,都要先对控制寄存
[单片机]
8051<font color='red'>单片机</font>教程第二十二课:串行口应用编程实例
51单片机控制DHT11在1602上显示温湿度的程序
单片机源程序如下: #include reg52.h #define uint unsigned int #define uchar unsigned char typedef bit BOOL; sbit io = P2^0; sbit rs = P2^6; sbit rw = P2^5; sbit ep = P2^7; uchar data_byte; uchar RH,RL,TH,TL; /********延时模块***********/ void delay(uchar ms) { // 延时子程序 uchar i; while(ms--) { for(i = 0;i 250;i++);
[单片机]
单片机成长之路(51基础篇) - 010 51单片机的中断系统
一. 有关中断的概念 1. 仔细研什么叫中断?   举例:同学正在教室写作业,忽然被人叫出去,回来后,继续写作业这就是生活中的“中断”的现象,就是正常的工作过程被外部的事件打断了。 二. 引入计算机中断的概念。   中断的作用:     处理断电保存,解决快速CPU与慢速外设之间的矛盾等。对MCS-51单片机的中断系统用一句话讲叫:“五源中断,两级管理”中断请求源(五源中断)   五个中断源: 外部中断0(/INT0)   0003H T0溢出中断   000BH 外部中断1(/INT1)   0013H T1溢出中断   001BH 串口中断 入口地址     0023H   有了中断请
[单片机]
<font color='red'>单片机</font>成长之路(51基础篇) - 010 51<font color='red'>单片机</font>的中断系统
51单片机定时器/计数器的结构和原理
  定时器/计数器简称定时器,其作用主要包括产生各种时标间隔、记录外部事件的数量等,是微机中最常用、最基本的部件之一。803l单片机有2个16位的定时器/计数器:定时器0(T0)和定时器1(T1)。   T0由2个定时寄存器TH0和TL0构成,T1则由TH1和TL1构成,它们都分别映射在特殊功能寄存器中,从而可以通过对特殊功能寄存器中这些寄存器的读写来实现对这两个定时器的操作。作定时器时,每一个机器周期定时寄存器自动加l,所以定时器也可看作是计量机器周期的计数器。由于每个机器周期为12个时钟振荡周期,所以定时的分辨率是时钟振荡频率的1/12。作计数器时,只要在单片机外部引脚T0(或T1)有从1到0电平的负跳变,计数器就自动加1。计
[单片机]
51<font color='red'>单片机</font>定时器/计数器的结构和原理
采用单片机和传感器实现温湿度检测系统的设计
引言 随着社会经济的发展和科学技术的不断进步,许多情况下都需要对环境的温湿度进行限定,因此,必须在某些特定环境安装温湿度报警器以进行监控。为此,本文利用集成温湿度传感器HM1500的测温快速、使用简便等特点,同时结合MSP430单片机强大的功能,设计了一个监控系统来对温湿度进行实时监控以进行超限报警。本系统测量准确、调试方便、可实时记录报警信息、方便工作人员排故,并可广泛应用于条件恶劣、人员不便进入的场合。 1 系统结构和总体设计方案 本系统的总体设计方案如图1所示。本方案采用分别设计温度和湿度采样电路的方法,将集成温度传感器AD590采集得到的电流信号和湿度传感器HM1500采集到的电压信号转换为给定范围内的电压信号。然后由
[单片机]
采用<font color='red'>单片机</font>和传感器实现温湿度检测系统的设计
单片机程序烧录的3种方式(ISP、ICP、IAP)是什么?
说起给单片机烧录程序,大家应该都不陌生吧,我最早接触单片机是从51单片机开始的,型号是STC89C52RC,当时烧录程序就是用的下面这种烧录软件——STC-ISP。 这种方式,通过串口连接单片机,选择一个合适的波特率就可以烧录了。 后来学习STM32,编程时使用KEIL软件自带的下载按钮就能下载程序,方便了不少,但需要额外使用J-Link等下载器。 再后来,接触到产品研发,给已经发布出的产品升级,都是要靠远程无线升级的(想想看,产品已经到客户那里了,当软件需要升级时,要是还使用有线的方式烧录程序,得有多麻烦) 既然给单片机烧录程序的方式有多种,那烧录方式具体怎么分类呢? 可以分为3种: ISP(In-System
[单片机]
<font color='red'>单片机</font>程序烧录的3种方式(ISP、ICP、IAP)是什么?
30-基于51单片机出租车计价器(霍尔测速)
具体实现功能 系统由AT89C52单片机+霍尔传感器模块+LCD1602液晶屏+DS1302时钟模块+AT24C02掉电存储模块+直流电机+按键模块+电源构成。 具体功能: 1、无乘客模式:显示当前时间; 2、切换到乘客模式:可以显示起步价(三公里内)、单价(三公里后)、总价(元)、里程和乘车时间,可以按照里程或计时两种模式收费; 3、里程模式收费:在高速情况下,按照起步价和里程单价收费 4、计时收费模式:在低速情况下,按照计时时间和时间单价收费 5、按清零键,计价器可清除计价。 6、可以设置白天和夜晚的起步价、单价,可以设置计时模式的单价; 7、根据当前时间,白天和夜晚的收费不同。 液晶显示的
[单片机]
30-基于51<font color='red'>单片机</font>出租车计价器(霍尔测速)
你了解GD32 MCU的命名规则吗
下面为大家介绍GD32 MCU的通用命名规则,以GD32F303ZGT6为例,其中,GD32代表GD32 MCU,F代表通用系列产品类型,303代表303产品子系列,Z代表144引脚数,G代表1MB Flash容量,T代表LQFP封装,6代表-40-85°温度等级。 命名规则详细说明如下表所示。 字符 说明 列举 GD32 代表GigaDevice 32位MCU 无 F 代表产品类型 F:SIP通用系列;E:eFlash嵌入式增强系列;L:超低功耗系列;VF:RISC-V系列;W:Wi-Fi无线系列;H:H7高性能系列;A:车规系列。 303 代表产品子系列 GD32F10X、GD32F1X0、GD32F20X、GD
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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