以AT89C51单片机为核心,制作一个LCD显示的智能电子钟

作者&投稿:旗临 (若有异议请与网页底部的电邮联系)
以AT89C51单片机为核心,制作一个LCD显示的智能电子钟~

#include #include#define uchar unsigned char#define uint unsigned int#define LCD1602_FLAG#define LCD1602_PORT P0
sbit lcd1602_rs=P2^0;sbit lcd1602_e=P2^2;sbit lcd1602_rw=P2^1;sbit lcd1602_busy=P0^7;sbit key_ch=P3^5;sbit key_add=P3^6;sbit key_minus=P3^7;
uchar i,sec,min,h,date,month,flag;uint year;uchar *chgstr[7]={" ","sec","min","hour","date","min","year"};uchar j,k,m,n,o,p;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar timestr[10],datestr[10];void init();void delay(uint);void time_display();void date_display();void control();void time();/************************************** 函数名称:lcd1602_CheckBusy()* 函数功能:状态查询*************************************/
void lcd1602_CheckBusy(){do{lcd1602_busy=1;lcd1602_rs=0;lcd1602_rw=1;lcd1602_e=0;lcd1602_e=1;}while(lcd1602_busy);}
/***************************************** 函数名称: lcd1602_WriteCmd()* 函数功能:写命令* 入口参数:命令字* 出口参数:无****************************************/
void lcd1602_WriteCmd(const uchar cmd){lcd1602_CheckBusy();lcd1602_rs=0;lcd1602_rw=0;lcd1602_e=1;LCD1602_PORT=cmd;lcd1602_e=0;}
/********************************************* 函数名称:lcd1602_WriteData()* 函数功能:写数据* 入口参数:c--待写数据* 出口参数:无**********************************************/
void lcd1602_WriteData(const uchar c){lcd1602_CheckBusy();lcd1602_rs=1;lcd1602_rw=0;lcd1602_e=1;LCD1602_PORT=c;lcd1602_e=0;}
/************************************************* 函数名称:lcd1602_Init()* 函数功能:初始化LCD* 入口参数:无* 出口参数:无************************************************/
void lcd1602_Init(){lcd1602_WriteCmd(0x38); //显示模式为8位2行5*7点阵lcd1602_WriteCmd(0x0c); //display enable,flag enable,flash enable,lcd1602_WriteCmd(0x06); //flag move to right,screen don't movelcd1602_WriteCmd(0x01); //clear screen}
/************************************************** 函数名称:lcd1602_Display()* 函数功能: 字符显示* 入口参数:ptr--字符或字符串指针* 出口参数:无* 说 明:用户可通过以下方式来调用:* 1)lcd1602_Display("Hello,world!");* 2) INT8U 存储类型 txt[]="要显示的字符串";* 或者 INT8U 存储类型 txt[]={'t','x','t',..,'\0'};* INT8U *ptr;* ptr=&txt;* lcd1602_Display(ptr);* 或 lcd1602_Display(txt);* 或 lcd1602_Display(&txt);*************************************************/
void lcd1602_Display(const uchar *ptr,uchar line,uchar xaddr){uchar data i=0;uchar *data q;
q=ptr;switch(line){case 0:lcd1602_WriteCmd(0x80+xaddr);while(q!=NULL && (*q!='\0') && i<16){lcd1602_WriteData(*q);q++;i++;}break;case 1:lcd1602_WriteCmd(0xc0+xaddr);while(q!=NULL && (*q!='\0') && i<16){lcd1602_WriteData(*q);q++;i++;}break;}}
void main(){lcd1602_Init();init();while(1){time_display();date_display();control();}}void init(){i=0;sec=0;min=0;h=12;date=26;month=6;year=2017;flag=0;EA=1;ET0=1;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void time_display(){timestr[7]=0x30+sec%10;timestr[6]=0x30+sec/10;timestr[5]=':';timestr[4]=0x30+min%10;timestr[3]=0x30+min/10;timestr[2]=':';timestr[1]=0x30+h%10;timestr[0]=0x30+h/10;timestr[8]=0;lcd1602_Display(timestr,1,3);}void date_display(){datestr[9]=0x30+date%10;datestr[8]=0x30+date/10;datestr[7]=':';datestr[6]=0x30+month%10;datestr[5]=0x30+month/10;datestr[4]=':';datestr[3]=0x30+year%10;datestr[2]=0x30+year/10%10;datestr[1]=0x30+year/100%10;datestr[0]=0x30+year/1000;lcd1602_Display(datestr,0,2);}void control(){if(!key_ch){delay(5);if(!key_ch){flag++;TR0=0;if(flag==7){flag=0;TR0=1;lcd1602_Init();}lcd1602_Display(chgstr[flag],1,12);}}while(!key_ch);if(flag==1&&key_add==0){while(!key_add);sec++;if(sec==60)sec=0;}if(flag==1&&key_minus==0){while(!key_minus);sec--;if(sec==-1)sec=59;}
if(flag==2&&key_add==0){while(!key_add);min++;if(min==60)min=0;}if(flag==2&&key_minus==0){while(!key_minus);min--;if(min==-1)min=59;}
if(flag==3&&key_add==0){while(!key_add);h++;if(h==24)h=0;}if(flag==3&&key_minus==0){while(!key_minus);h--;if(h==-1)h=23;}
if(flag==4&&key_add==0){while(!key_add);date++;if(date==29)if((year%4!=0)&&(month==2))date=1;if(date==30)if((year%4==0)&&(month==2))date=1;if(date==31)if((month==4)||(month==6)||(month==9)||(month==11))date=1;if(date==32)if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))date=1;}
if(flag==4&&key_minus==0){while(!key_minus);if(date>1)date--;}
if(flag==5&&key_add==0){while(!key_add);month++;if(month==13)month=1;}if(flag==5&&key_minus==0){while(!key_minus);month--;if(month==0)month=12;}
if(flag==6&&key_add==0){while(!key_add);year++;if(year==99)year=1;}if(flag==6&&key_minus==0){while(!key_minus);year--;if(year==0)year=99;} }
void T0_rpt() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;i++;time();}
void time(){if(i==20){i=0;sec++;if(sec==60){sec=0;min++;if(min==60){min=0;h++;if(h==24){h=0;min=0;sec=0;date++;if(date==29)if((year%4!=0)&&(month==2)){date=1;month++;if(month==13){month=1;year++;}}if(date==30)if((year%4==0)&&(month==2)){date=1;month++;if(month==13){month=1;year++;}}if(date==31)if((month==4)||(month==6)||(month==9)||(month==11)){date=1;month++;if(month==13){month=1;year++;}}if(date==32)if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)){date=1;month++;if(month==13){month=1;year++;}}}}}} }

[5]单片机多功能万年历电子表系统 节日提醒温湿度显示
功能描述:
1、 按键调时间, 设置闹钟
2、 带备用电池(断电继续走时)
3、 阳历、 农历节日提醒; 可显示上午、 中午、 晚上、 午夜、 深夜等时间段
4、 温湿度实时显示(可替换其他传感器数据显示)
5、 功能扩展: 语音播报万年历、 温湿度等。(此项功能为扩展功能)
☆已作出的实物优酷视频演示地址:
http://v.youku.com/v_show/id_XMTU0MjI4OTExNg==.html
[1]GPS 自动授时系统 语音报时/播报温湿度
实现功能:
1.可设置授时模式为自动授时和手动更新
2.可脱离 GPS 数据利用本地时钟芯片准确走时
3.可设置静音模式、 整点报时和自动语音播报温湿度及其混合模式等四种语音工作模式
4.可以切换显示本地时间和温湿度数据和 GPS 卫星时间数据和定位数据
5.经过分析 GPS 数据, 利用算法缩短了解析时间在秒级时间内就能获取到 GPS 时间数据(正常情况下, 完成定位需要几分钟以上)
6.(亮点) 利用算法自动计算星期参数和农历参数, 程序内部算法输入任何阳历日期数据即可得到准确的
星期数据和农历数据
7.利用 12864 串口工作模式, 节省了 8 个 IO
8.可进行功能定制
☆已作出的实物优酷视频演示地址:
http://v.youku.com/v_show/id_XMjY4OTkyNjk4NA==.html

给你一个例子供你参考下,我对STM8S稍微熟悉一点,我也是初学者。

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */
#include "lcd12864.h"
#include "stm8s207r.h"
#include "stm8s207rb.h"
#define sbi(io,bit)(io|=(1<<bit))//1
#define cbi(io,bit)(io&=~(1<<bit))//0
#define gbi(pin,bit)(pin&(1<<bit))//读
#define enableInterrupts() {_asm("rim
");} /* enable interrupts 使能中断*/
#define disableInterrupts() {_asm("sim
");} /* disable interrupts 不能中断*/
u8 year,month,day,hour,minute,seconds;//定义全局变量

void IO_Init(void)//定义IO口
{
sbi(PG_DDR,3);sbi(PG_CR1,3);cbi(PG_CR2,3);//RS
sbi(PG_DDR,4);sbi(PG_CR1,4);cbi(PG_CR2,4);//R/W
sbi(PI_DDR,0);sbi(PI_CR1,0);cbi(PI_CR2,0);//E
sbi(PG_DDR,5);sbi(PG_CR1,5);cbi(PG_CR2,5);//RST
}
void timer1_init(void)// 然后初始化定时器4 
{
TIM1_IER = 0x00; // 禁止中断
TIM1_EGR = 0x01; // 允许产生更新事件
TIM1_PSCRH = 0x13;  // 8M系统时钟经预分频f=fck/(PSCR+1)
TIM1_PSCRL = 0x88;  // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每个计数周期1ms
// 相当于计数器周期为100uS
// 设定重装载时的寄存器值
// 注意必须保证先写入高8位,再写入低8位
TIM1_ARRH = 0x09; // 设定重装载时的寄存器的高8位
TIM1_ARRL = 0xc4;
TIM1_CNTRH = 0; // 设定计数器的初值
TIM1_CNTRL = 0; 
TIM1_IER = 0x01;    // 允许更新中断
TIM1_CR1 = 0x01;  // 计数器使能,开始计数
}
void CLK_Init(void)//时钟
{
CLK_SWCR|=0x02;   //开启切换          
  CLK_ICKR|=0x01;   //开启内部HSI   
  while(!(CLK_ICKR&0x02));//等待HSI准备就绪   
  CLK_SWR=0xe1;        //设定HSI为主时钟源         
  while((CLK_SWCR & 0x01)==0x01);//等待切换完成         
  CLK_CKDIVR=0x00;     //设置分频,此处为HSI不分频        
  CLK_SWCR&=(~0x02); //关闭切换
//CLK_ECKR |=0x01;           //开启外部时钟    
  //while(!(CLK_ECKR&0x2)); //等待外部时钟   
//CLK_CKDIVR=0x00;
  //CLK_CKDIVR &= 0xF8; //CPU无分频 11.0592M  
//CLK_CKDIVR = 0x01;
  //CLK_SWR = 0xB4;            //选择外部时钟    
  //while(!(CLK_SWCR&0x08));   
  //CLK_SWCR |=0x02;           //使能外部时钟   ;
//CLK_PCKENR1=0x04;          //enble UART1 and ADC clock
//CLK_PCKENR2=0x08;
}
void deal_time(void)
{
if(seconds>59)
    {
seconds=0;minute++;
    }
if(minute>59)
    {
minute=0;hour++;
}
      if(hour>23)
    {
        hour=0;day++;
        }
if(day>29)
    {
day=0;month++;

          if(month>12)
    {
  month=0;year++;
  }

void LCD_display_time(void)
{
LCD12864_SetPos(2,0);
LCD12864_WriteDate(year/10+0x30);
LCD12864_WriteDate(year%10+0x30);
  LCD12864_DisplayString("年");
LCD12864_SetPos(2,2);
LCD12864_WriteDate(month/10+0x30);
LCD12864_WriteDate(month%10+0x30);
  LCD12864_DisplayString("月");
LCD12864_SetPos(2,4);
LCD12864_WriteDate(day/10+0x30);
LCD12864_WriteDate(day%10+0x30);
  LCD12864_DisplayString("日");
LCD12864_SetPos(3,0);
LCD12864_WriteDate(hour/10+0x30);
LCD12864_WriteDate(hour%10+0x30);
  LCD12864_DisplayString("时");
LCD12864_SetPos(3,2);
LCD12864_WriteDate(minute/10+0x30);
LCD12864_WriteDate(minute%10+0x30);
  LCD12864_DisplayString("分");
LCD12864_SetPos(3,4);
LCD12864_WriteDate(seconds/10+0x30);
LCD12864_WriteDate(seconds%10+0x30);
  LCD12864_DisplayString("秒");
}
main()

  CLK_Init();
IO_Init();
timer1_init();
LCD12864_Init();//初始化LCD
year=16;month=10;day=11;hour=12;minute=12;seconds=0;
_asm("rim
");
  while (1);
  { 
 deal_time();
 LCD_display_time();
}
}

希望例子能给你帮助。听说聪明的人能举一反三。



以前做过一个1602显示的。

你是要做实物吗?另外说的报时是哪一种的,比如语音报时,比如一段音乐。


单片机at89c51和AT89S51的区别有哪些
它们之间主要区别在于以下几点:1.引脚功能 引脚几乎相同,改变是,在AT89S51 P1.5中,P1.6,P1.7具有第二功能,即这三个引脚的第二功能构成一个串行ISP编程接口。2.编程功能 AT89C51仅支持并行编程,而AT89S51不仅支持并行编程,还支持ISP在线编程。在编程电压方面,AT89C51除5V外还需要12V Vpp才能...

AT89S52单片机片内硬件组成结构,与一般单片机和微机组成结构比较,显著...
以下内容讲诉了AT89S51\/52单片机与AT89C51单片机的区别,资源来自网络转帖于此,请核实后采用。它们之间主要区别在于以下几点:1.引脚功能:管脚几乎相同,变化的有,在AT89S51中P1.5,P1.6,P1.7具有第二功能,即这3个引脚的第二功能组成了串行ISP编程的接口。2.编程功能:AT89C51仅支持并行编程,而AT89S51...

80系列单片机和89系列单片机有什么区别?
AT89C2051取掉了P0口和P2口,内部的程序FLASH存储器也小到2K,封装形式也由51的P40脚改为20脚,相应的价格也低一些,特别适合在一些智能玩具,手持仪器等程序不大的电路环境下应用;AT89C1051在2051的基础上,再次精简掉了串口功能等,程序存储器再次减小到1k,当然价格也更低。单对AT89C51来说,在实际...

单片机的种类是AT89C51单片机?
AT89C51具有片内E2PROM,是真正的单片机,由于不需要外接EPROM,所以应用非常普遍。8031、8051片内没有EPROM,但它价格很低,软硬件系统开发成熟,所以应用也非常广泛。目前51系列的产品大多是8031、8051和AT89C51等。除了Intel公司,还有Atmel、Winbond、Philips、TEMIC、ISSI和LG等公司都生产兼容80C51的产品。...

AT89S51单片机的片内硬件结构有什么?
(9)特殊功能寄存器(SFR) 共有26个特殊功能寄存器,用于CPU对片内各功能部件进行管理、控制和监视。特殊功能寄存器实际上是片内各个功能部件的控制寄存器和状态寄存器,这些特殊功能寄存器映射在片内RAM区80H~FFH的地址区间内。AT89S51完全兼容AT89C51单片机。使用AT89C51单片机的系统在充分保留原来软、硬件...

简述at89c51的基本结构
时钟和振荡器:内置一个片内振荡器和时钟电路,为单片机产生时钟脉冲序列,以驱动CPU和其他部件的工作。其他功能:还包括总线(用于连接各个部件和单片机系统的扩展)、低功耗工作模式(如空闲模式和掉电模式)等。综上所述,AT89C51单片机以其丰富的内部资源和灵活的配置方式,在电子行业中得到了广泛应用。

at89c51和at89s52单片机编程有什么不同
区别:S系列的是能用下载线进行在线编程的 ISP,使用简单的HC244电路,就可以通过电脑上面的程序来进行对单片机的编程,是无须拆下来放到笨重的编程器上面写片子的 C系列则没有这个功能 89X52的P1.0 P1.1多了T\/C2的复用 89X51:4KROM、128RAM、4个中断源、2个定时器 89X52:8KROM、256RAM、5...

我的单片是stc90c516rd+,在keil中新建工程应该选哪个?
AT89C52就可以了,对程序并没有什么影响,但要记得把xram的地址和大小设置一下,否则就太浪费那些ram了。

怎样用at89c51的两个端口 同时控制一组led
两个端口可以同时作为输出用,但不能同时驱动过多大负载,AT89C51的输出电流较小最大输出15mA,通过计算可知一个(一段)LED大约为20mA左右,当11个或8个同时点亮一段时就是20*11=220mA或20*8=160mA,可想而知这么大的电流对于15mA来说都不是一个级别,对于接P0口8个显示正常而接P2口的3个很暗...

基于单片机AT89C51控制的篮球计分器课程设计报告
以MCU为核心,就是各种各样的单片机,是嵌入式硬件部分的实现方式之一,它主要是因为把处理器和存储器等部件集成在一块芯片上。在探索单片机的发展道路时,有过两种模式,即“Σ模式”与“创新模式”。“Σ模式”将通用计算机系统中的基本单元进行裁剪后,集成在一个芯片上,构成单片微型计算机“创新模...

白碱滩区18325456342: (=以AT89C51单片机为核心,制作一个LED显示的智能电子钟计时:秒、分、时 -
澄变肾舒: 六个数码管,晶振计时,到点移位,输出就好了么

白碱滩区18325456342: 写一个有关单片机AT89C51的程序
澄变肾舒: ORG 0000H ;单片机上电后从0000H地址执行 AJMP START ;跳转到主程序存放地址处 ORG 0030H ;设置主程序开始地址 START:MOV SP,#60H ;设置堆栈起始地址为60H MOV A,#0FEH ;ACC中先装入LED1亮的数据(二进制的...

白碱滩区18325456342: 用AT89C51单片机编写一个C语言程序实现2个数码管秒计数器,用4个按键分别控制暂停、加一秒、减一秒和继续 -
澄变肾舒: #include<reg51.h>#define uchar unsigned char; uchar LED1,LED2; uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar num=0;sec,key; void delay(unsigned int a) { unsigned int i,j; for(i=0;i<a;i++) for(j=0;j<120;j++); } void ...

白碱滩区18325456342: 用C语言编写AT89C51单片机程序,设计一个智能数字钟. -
澄变肾舒: 基本要求:1.C语言程序要求是模块化设计.2.该闹钟基于AT89C51单片机及相关外围电路进行设计.3.该闹钟有6个数码管(共阳极),可分别显示时间(时、分、秒)、及定时时间(分、秒).4.该闹钟有4个按钮,S1是切换显示按键,该键按下时可分别实现切换正常走时显示、设定走时显示、设置定时时间,启动定时,回到正常状态等功能.S2是设定键,即该键按下,将分别选中需要设定的选项.S3键是加键,即按下去表示相应选项加1.S4键是减键,即按下去表示相应的选项减1.5.该闹钟可以定时时间到,LED将发出提示闪光,且持续30s.发挥要求:1.定时时间可被打断,即打断后恢复时继续计时.2.设置闹钟报警功能;3.能切换显示年月日等信息.

白碱滩区18325456342: 基于AT89C51的电饭煲控制系统设计 -
澄变肾舒: 本设计主要由硬件电路设计和软件编程两大部分来实现, 以AT89C51单片机为核心,配备显示模块、定时信息等, 能通过数码管进行显示计时.备有按键,以便人工定时与修改当前时间.用户可以通过按键修改时间,以便达到用户所要实现的...

白碱滩区18325456342: 题目:电子时钟 1.任务 以AT89C51单片机为核心的时钟,在LED显示器上显示当前的时间. -
澄变肾舒: #include<reg52.h> //#include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit key1=P3^4;//按键1 sbit key2=P3^5;//按键2 sbit key3=P3^6;//按键3 sbit key4=P3^7;//按键4 sbit dula=P2^2; //取段 sbit wela=P2^3; //取位 ...

白碱滩区18325456342: 求懂电子的大大帮忙~
澄变肾舒: 你这个比较简单,用个红外模块就可以搞定,当红外模块感应到人后,会向单片机发送信号,此时单片机就控制个继电器打开烘干器就可以了,如果还不懂你可以到我网站查找相关资料 www.mvpdz.com

白碱滩区18325456342: 用AT89C51单片机做一个仿真,P0输入P1输出 要求有三个按键 分别控制三个灯的亮和灭. -
澄变肾舒: #include<reg51.h> sbit Key1=P0^0; sbit Key2=P0^1; sbit Key3=P0^2;//按键一脚接地,另一脚接IO且接10K电阻到电源. sbit Led1=P1^0; sbit Led2=P1^1; sbit Led3=P1^2;//LED阳极接电源,阴极接300欧姆到IO. //输入输出端口变化,需更改上面定义的端口号. main() { while(1) { Led1=Key1; Led2=Key2; Led3=Key3; } } 这样就好了.

白碱滩区18325456342: 毕业设计:用单片机AT89C51来做电热水器控制系统(跪求高人解决)! -
澄变肾舒: 用5个数码管,max7219驱动数码管 DS18B20测温度,可控硅控制加热棒,加上几个按键,浮球开关检测水位 先查查这几个芯片的手册 不懂再问

白碱滩区18325456342: 我下个星期要求做一个基于AT89C51系列的单片机的数字频率计设计,希望大家帮帮忙
澄变肾舒: 数字频率计单片机部分其实是好做得,无非就是用测频法(两个定时器配合,一个定时,一个计数)对付高频信号,用测周法对付低频信号(一个外部中断+一个定时器),程序量虽然有点,不过用C语言的话,也就是500行里面的事.最难的地...

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