基于单片机AT89C51的万年历,只需要显示时间就可以,不加其他的东西

作者&投稿:薛管 (若有异议请与网页底部的电邮联系)
求一个用51单片机设计的万年历,只要显示年月,日期,时间~

您是用来学习的,建议自己上网好好查查,此类资料多不胜数;如果您是用于商业目的,建议您购买整个项目的软硬件设计,通过工业设计出来的产品,功能全,BUG少。

请把你的邮箱告诉我吧!我的邮箱是1104293846@qq.com

#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
sbit SPK=P3^0;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
uchar Display_Buffer[16]=" ";
uchar Count,hour=12,min=12,sec=12;
bit flag,H_or_M;
uchar display[]="This is colck";
void _delay_ms(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
/**********************************************************************
*函数名称:LCD_Write_Command
*输 入:uchar cmd
*输 出:无
*功 能:向LCD1602写指令
**********************************************************************/
void LCD_Write_Command(uchar cmd)
{
LCD_RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令
LCD_RW=0;
LCD_EN=0;//EN置低电平
P0=cmd;//将数据送入P2口,即写入指令或地址
LCD_EN=1;//EN置高电平
_delay_ms(1);//稍延时,给硬件反应时间
LCD_EN=0;//当EN由高电平跳变成低电平时,液晶模块开始执行命令
}
/**********************************************************************
*函数名称:LCD_Write_Data
*输 入:uchar dat
*输 出:无
*功 能:向LCD1602写数据
**********************************************************************/
void LCD_Write_Data(uchar dat)
{
LCD_RS=1;//RS为高电平,RW为低电平时,可以写入数据
LCD_RW=0;
LCD_EN=0;//EN置低电平
P0=dat;//将数据送入P0口,即将数据写入液晶模块
LCD_EN=1;//EN置高电平
_delay_ms(1);//稍延时,给硬件反应时间
LCD_EN=0;//当EN由高电平跳变成低电平时,液晶模块开始执行命令
}
/**********************************************************************
*函数名称:Init_LCD
*输 入:无
*输 出:无
*功 能:初始化LCD1602
**********************************************************************/
void Init_LCD(void)
{
LCD_Write_Command(0x38);//显示模式设置:16×2显示,5×7点阵,8位数据接口
_delay_ms(1);
LCD_Write_Command(0x06);//显示模式设置:光标右移,字符不移
_delay_ms(1);
LCD_Write_Command(0x0c);//显示模式设置:显示开,无光标,光标不闪烁
_delay_ms(1);
LCD_Write_Command(0x01);//清屏幕指令,将以前的显示内容清除
_delay_ms(1);
}
/**********************************************************************
*函数名称:LCD_POS
*输 入:uchar pos
*输 出:无
*功 能:字符显示位置
**********************************************************************/
void LCD_POS(uchar pos)
{
LCD_Write_Command(0x80|pos);//显示位置的确定方法规定为"80H+地址码x"
}
/**********************************************************************
*函数名称:Show_String
*输 入:uchar *str
*输 出:无
*功 能:LCD1602显示字符串处理函数
**********************************************************************/
void Show_String(uchar *str)
{
while(*str!='\0')//只要没有写到结束标志,就继续写
LCD_Write_Data(*str++);//将字符常量写入LCD,并指向下一个字符
}
void song(void)
{
uchar i,j,k;
for(i=0;i<200;i++)
{
SPK=~SPK;
for(k=0;k<50;k++);
for(j=0;j<50;j++);
}
}
/////lcd1602液晶显示//////
void Display_Time(uchar Hour,uchar Min,uchar Sec)
{
Display_Buffer[0]=Hour/10+'0';//小时十位
Display_Buffer[1]=Hour%10+'0';//小时个位
Display_Buffer[2]=':';//显示:号
Display_Buffer[3]=Min/10+'0';//显示分钟十位
Display_Buffer[4]=Min%10+'0';//显示分钟个位
Display_Buffer[5]=':';//显示:号
Display_Buffer[6]=Sec/10+'0';//显示秒十位
Display_Buffer[7]=Sec%10+'0';//显示秒个位
LCD_POS(0x40);//显示在液晶第1行第0列
Show_String(Display_Buffer);
}
/////按键处理//////
void Set_time(void)
{
flag=0;
if(key1==0||key2==0||key3==0)//若key1,key2,key3其中有键按下,则为真
{
TR0=0;//定时器0停止
flag=1;//按键标志位为真
}
while(flag)//判断那一个按键按下
{
if(key1==0)//判断key1是否按下
{
while(!key1);//等待释放
H_or_M=!H_or_M;//选择是修改时还是分钟
}
else if(key2==0)//判断key2是否被按下
{
while(!key2);//等待释放
if(H_or_M)//若H_OR_M为真,则修改小时
{
if(++hour==24)//若小时=24,则小时=0
hour=0;//小时加1
}
else//否则修改分钟
{
if(++min==60)//若分钟等于60,则分钟等于0
min=0;//分钟加1
}
}
else if(key3==0)//判断key3是否被按下
{
while(!key3);//等待释放
if(H_or_M)//若H_OR_M为真,则修改小时
{
if(--hour==0xff) //小时减1,若小时等于-1,则小时等于23
hour=23;
}
else//否则修改分钟
{
if(--min==0xff)//分钟减1,若分钟等于-1,则分钟等于59
min=59;
}
}
else if(key4==0)//判断key4是否被按下
{
while(!key4);//等待释放
flag=0;//按键标志清零
TR0=1;//定时器0启动
}
Display_Time(hour,min,sec);//传H,M,S值显示到液晶
}
}
void timer0_init(void)//定时器0初始化
{
TMOD=0x01;//定时器0,方式1
ET0=1;//
EA=1;//总中断允许
TR0=1;//启动定时器0
TH0=(65535-50000)/256;//装高8位初值
TL0=(65535-50000)%256;//装低8位初值
}
void main(void)//主函数
{
//P0=0xff;
P1=0xff;//端口初始化
P3=0xff;
Init_LCD();//液晶初始化
timer0_init();//定时器0初始化
LCD_POS(0);//显示在液晶第1行第0列
Show_String(display);
while(1)//无限循环
{
Display_Time(hour,min,sec);//液晶显示时间
//_delay_ms(500);//延时
Set_time();//时间调整
}
}
void timer0() interrupt 1//定时器0中断
{
TH0=(65535-50000)/256;//重装定时器0高8位
TL0=(65535-50000)%256;//重装定时器0低8位
Count++;//计数加1
if(Count==20)//如果COUNT等于20
{
Count=0;//计数清零
sec++;//秒加1
if(sec==60)//判断秒是否等于60
{
sec=0;//秒清零
min++;//分钟加1
if(min==60)//判断分钟是否等于60
{
min=0;//若等于60,则清零分钟
hour++;//小时加1
if(hour==24)//判断小时是否等于24
{
hour=0;//若小时等于24,则清零小时,分钟,秒
min=0;
sec=0;
}
song();
}
}
}
}


试写出AT89C-51单片机片内外Rom和RAM的地址空间
内部ROM和外部ROM是靠EA来区分的,EA=0时访问外部ROM,此时内外ROM地址可以重叠,EA=1时访问内部ROM。RAM是靠WR和RD与ALE来区分的,读写信号有效时肯定访问外部RAM(扩展RAM),否则访问内部RAM(寄存器)。

stc12c5a60s2的单片机与at89c51单片机有什么区别论文上面要用
1、生产的公司不同 AT89C51是Atmel公司生产;stc12c5a60s2是宏晶公司生产。2、RAM和ROM不同 AT89C51是128byte RAM,4K ROM;stc12c5a60s2是256Byte,8K ROM。3、定时器数量不同 AT89C51有T0、T1两个16位定时器;STC89C52有T0、T1、T2三个16位定时器。

AT89C52与C51有什么区别啊?
首先.AT89C单片机已经停产了,现在是AT89S系列的支持ISP在线下载。然后再说C52和C51的区别:C51及C52单片机在内核结构上完全一样,兼容一样的指令系统,两者的主要差别在RAM和ROM上,C51是128byte RAM,4K ROM,C52是256Byte,8K ROM C51有T0、T1两个16位定时器、C52有T0、T1、T2三个16位定时...

AT89C205单片机的设计目的以及原理是什么
字面意思理解,这个问题你得问Atmel的设计工程师。分析你的目的给你如下资料:AT89C2051是一个低电压,高性能CMOS 8位单片机,片内含2k bytes的可反复擦写的只读Flash程序存储器和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用...

请教如何利用单片机(AT89C205)改变PWM的占空比?
首先要看你的PWM是怎么产生的,如果是定时器产生,就将计数器的装载值设置成可调的,那么在定时器的中断里的取反操作就会产生变化的高低方波脉冲;如果使用延时产生高低电平,那就更改延时参数

at89c51单片机
EA接低电平是执行外部程序存储器ROM中的程序,而AT89C51的程序存储器ROM是在内部的,因此,必须接高电平。RST接高电平是复位状态,是开机时加高电平使单片机复位,但要立即变成低电平,才能进入正常的工作状态。如果始终加高电平,将一直处于复位状态,却无法正常工作了。你对这个两脚的工作电平理解完全反...

AT89C2025和STC89C52有什么区别
这两款单片机差别不是很大,主要的区别如下:1、STC...是宏晶公司生产,AT...是Atmel公司生产 2、前者可以在线编程也就是有ISP功能,后者必须通过编程器烧录 3、前者具有6T模式,速度要快些,后者是12T模式 4、前者工作电压5.5V~3.3V,后者是5.25V~4.75V 5、前者用户程序空间从4K到64K不等,...

AT89C\/S51单片机的p0-p3口不稳定现象怎么解决\/?
没有程序的干预都是高电平啊!我们作过很多都没有问题,你先检查软件,然后检查你的电路连接,看看会不会有新的发现,或者晶振有没有起振啊!或者复位电路是否正常啊!

at89c51和at89c54单片机一样吗?
不一样。指令系统一样。引脚一样。主要是内部的ram和rom容量不同。还有定时器个个数不同。都兼容经典的51芯片。其他方面基本相同。

用at89c51单片机的定时\/计数器T0汇编语言设计
5. C语言源程序 include <AT89X52.H> unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};unsigned char dispbuf[8]={0,0,0,0,0,0,10,10};...

库车县13387592634: 基于单片机at89c51的数字万年历设计掌握哪些技能和方法 -
冶委复洛: 万年历的设计需要来掌握:1、单片机定时器的设置和使用放法.2、如果采用日历芯片(比如DS12887等)需要掌握采源用芯片的使用方法.3、数码管百或液晶的显示技术4、键盘的扫描检测度方法5、日历的计算方法6、其他单片机基础知识.

库车县13387592634: 基于AT89C51单片机的电子万年历设计,能够显示日期,时间,温度湿度,最好是闹钟.急急急,求大神指点 -
冶委复洛: 单片机读取时钟芯片和温湿度传感器的数据,然后在1602上面做显示.下载DS1302和LCD1602的数据手册,看看工作时序和寄存器就行了.

库车县13387592634: 急求单片机编程高手帮我编一个AT89C51的时钟+万年历的程序! -
冶委复洛: 基于单片机的数字钟(电子万年历) http://hi.baidu.com/dsu5566/blog/item/7cfe0fa480cd14fe9152eec8.html

库车县13387592634: 基于C51单片机的电子台历
冶委复洛: 基于"AT89C51单片机+DS1302+DS18B20+LCD12864显示" 1、显示年月日时分秒及星期信息. 2、具有可调整日期和时间功能 3、增加闰年计算功能 4、闹钟功能 ---- 这些,可不是三、五天就能做出来的. 要这个,恐怕是要拿出些银子来了.

库车县13387592634: 基于AT89C51单片机的万年历,求大神,求指导,RP1叫什么,U3叫什么? -
冶委复洛: 你好,BR1叫排阻,起上拉作用.而U3则是四路与门,用于按键触发,也就是说任意一个按键按下都会产生一个低电平信号,输入给MCU中断引脚.即P3^2.这样按键就会在中断函数中处理.

库车县13387592634: 电子万年历毕业设计(基于AT89C51单片机和DS1302时钟芯片)
冶委复洛: ; 时间,日期,星期显示 及调整 ; 带闹钟功能 ; 采用全菜单操作,简单明了.推荐:15 1602菜单万年历.rar( http://ishare.iask.sina.com.cn/f/11566548.html )

库车县13387592634: 基于AT89C51的万年历单片机编程 -
冶委复洛: 你好,这时我用51单片机编写出来的时钟程序,LCD1602显示,能显示时、分、秒、年、月、日、星期,其中时、分、秒可通过键盘调整,但是我没加入调整年、月、日、星期的功能.可以给你做个参考,硬件方面我没用时钟芯片,仅用了单片机内部定时器.希望我的回答能帮助到你.

库车县13387592634: 急急!!电子万年历毕业设计(基于AT89C51单片机和DS1302时钟芯片) 中 为什么要用存储电路 -
冶委复洛: 有两种可能:一这个设计被人修改了,原设计是基于8031的由于片内没有rom故要外接储存电路,但是设计电路却没有大的改动!这个可能性比较大!二:由于程序比较大,或者对储存的一些要求需要加储存电路(可能性较小).其实用AT89C51程序在2KB可以不加外部储存电路的!

库车县13387592634: 用ISIS7软件做万年历仿真怎么做,单片机是AT89C51,时钟芯片是DS1302,请好心人告诉我. -
冶委复洛: DS1302芯片资料很详细了,外围电路参照着画就行,首先需要设个初始值,就要用单片机来模拟1302的写时序了,之后读出就可以了

库车县13387592634: 基于单片机的数字日历时钟
冶委复洛: 多功能数字时钟的设计与制作 http://ww1.tabobo.cn/soft/20/233/2008/152201615128.html 摘 要 随着人类科技文明的发展,人们对于时钟的要求在不断地提高.时钟已不仅仅被看成一种用来显示时间的工具,在很多实际应用中它还需要能够实现...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网