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

智能电子钟LCD显示设计要求:1.年月日时分秒 2.定时报时需要用到音乐模块。急需程序代码。以下是可能用到的图

给你一个例子供你参考下,我对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\n");} /* enable interrupts 使能中断*/
#define disableInterrupts() {_asm("sim\n");} /* 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\n");
  while (1);
  { 
 deal_time();
 LCD_display_time();
}
}

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

追问

谢谢你的好意。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-06-27
以前做过一个1602显示的。追问

就是1602显示的

第2个回答  2017-06-27
你是要做实物吗?另外说的报时是哪一种的,比如语音报时,比如一段音乐。追问

能用蜂鸣器发出点声音就行了,比如说到几点了就响下,实物都有,就缺程序编码

追答

你已经搭好电路或者有开发板的话就要根据你的原理图写程序的,你上面的图不知道是不是你所用的电路图。

类似的

追问

是的啊,那是单片机开发板的使用说明书上的图

追答

那就是按你的要求量身打造了,功能比较简单,什么时候需要呢?有问题私聊吧

追问

功能都能实现吗,太感激你了,程序代码能发下吗,要是可以用的话就采纳你

追答

电路图看不清,重新发我一份。

相似回答