历史上的今天
返回首页

历史上的今天

今天是:2025年02月11日(星期二)

正在发生

2020年02月11日 | 51单片机音乐万年历制作

2020-02-11 来源:51hei

一、电源电压4.8V—5.2V,可以直接用电脑USB供电。
二、程序修改说明
1、如果你编译通不过,就是你用的KEIL库文件不全,请换个完整版本的KEIL,或到我店铺购买,本程序是完全编译通过,且没有1个警告;
2、本程序由于农历,节气等数据很占空间,编译后有19K多,请使用程序存储器20K以上的51单片机,比如STC89C55、STC89C58,STC89C516,AT89C55,AT89S54,SST89C58等;
3、如果你的汉字显示不全或乱码,比如“三“显示不了,那是你的KEIL没有打补丁,并不是程序问题,至于什么补丁你可以网上搜或向我索要;
4、在修改位定义的时候需要将Soundplay.h文件下的sbit    BeepIO  = P3^7;  sbit KEY_1 = P2^7;一起修改;
5、蜂鸣器请最好使用无源蜂鸣器或小喇叭,这样音质会很好。
三、生日、节气和节日提示说明
1、本万年历的各种提示会在主界面第四行交替显示,其中生日和节气优先显示。

Altium Designer画的音乐万年历原理图和PCB图如下:(51hei附件中可下载工程文件)

单片机万年历元件清单:
名称    数量    说明
STC89C54(STC89C516)单片机    1    内存≥20K的51单片机都可以
DS1302    1    
DS18B20    1    
40DIP座    1    
8DIP座    1    
3DIP座    1    
20芯座    1    
20芯插针    1    
10K排阻    1    可以不安装
无源蜂鸣器    1    
CR2032电池    1    
电池座    1    
电源座    1    
按键    4    
开关    1    
32768HZ晶振    1    
11.0592MHZ晶振    1    
S8050三极管    1    
30P电容    2    
103电容    1    可以不安装
10uF电解    1    
4.7K电阻    1    
10K电阻    2    
220uF电解    1    可以不安装
PCB    1    
12864液晶    1    ST7920驱动字库液晶

单片机音乐万年历源程序如下:

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

//12864液晶万年历 时钟2010年最新 V5.2版

//设计: 杨黎民

//程序部分开始

//更新日期:2010年9月3

//主要特点:多功能菜单、多风格主界面,生日、节日、节气、农历时段多功能提示,闹钟、音乐、温度、屏幕自检

//5.1增加了调整时间反白和闹钟设置反白显示

//5.2调整了生日和节气优先显示

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

//头文件

#include

#include

#include

#include "SoundPlay.h"//音乐文件

#define uchar unsigned char 

#define uint unsigned int

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

//扬声器定义

sbit        beep   = P3^7;//扬声器

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

//温度传感器定义

sbit DQ = P2 ^ 0;//ds18B20

uint tvalue;//温度值

uchar tflag,flagdat,t,hh1;//温度正负标志

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

//键盘引脚定义

//sbit KEY_1 = P2^7;  //左上,在音乐文件SoundPlay.h中已定义

sbit KEY_2 = P2^6;         //左下

sbit KEY_3 = P2^5;         //右上

sbit KEY_4 = P2^4;         //右下

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

//定义DS1302时钟接口

sbit clock_clk = P2 ^ 1;//ds1302_clk(时钟线)

sbit clock_dat = P2 ^ 2;//ds1302_dat(数据线)

sbit clock_Rst = P2 ^ 3;//ds1302_Rst(复位线)

//定义累加器A中的各位

sbit a0   = ACC ^ 0;

sbit a1   = ACC ^ 1;

sbit a2   = ACC ^ 2;

sbit a3   = ACC ^ 3;

sbit a4   = ACC ^ 4;

sbit a5   = ACC ^ 5;

sbit a6   = ACC ^ 6;

sbit a7   = ACC ^ 7;

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

//定义全局变量

unsigned char yy,mo,dd,xq,hh,year,year1;//定义时间映射全局变量(专用寄存器)

unsigned char shi,ge,sec_temp,min_temp,hour_temp,secl,selx,e=0,hh1,mm1,k,mm,ss,n;

char n1,n2;

bit w = 0; //调时标志位

static unsigned char menu = 0;//定义静态小时更新用数据变量

static unsigned char keys = 0;//定义静态小时更新用数据变量

static unsigned char timecount = 0;//定义静态软件计数器变量

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

//-----------------------------------------------

//TS12864并口相关设定//

#define        BUSY_FLAG        P0_7                                                //液晶模块忙标志

#define        MPU_RS_CH        P1_5                                                //寄存器选择输入

#define        MPU_RW_CH        P1_6                                                //读写控制

#define        MPU_ENABLE        P1_7                                                //使能控制

#define        LCD_DATA        P0                                                        //液晶数据口

//-----------------------------------------------

#define LOW                        0                                                        //低电平

#define        HIGH                1                                                        //高电平

#define        OFF                        0                                                        //逻辑关

#define        ON                        1                                                        //逻辑开

//-----------------------------------------------

//液晶模块指令集定义

#define        cClearDisplay        0x01                                        //清显示指令

#define        cEntryModeSet        0x06                                        //设置输入模式

#define        cDisplayOnCtrl        0x0c                                        //设置开显控制

#define        cFunctionSetB        0x30                                        //功能设定(基本指令)

#define        cFunctionSetE        0x34                                        //功能设定(扩充指令)

#define        cFuncDrawOn                0x36                                        //设置绘图功能

//-----------------------------------------------

uchar xdata lcdPosX, lcdPosY;                                                        //X,Y坐标

uchar xdata halfScr, halfLineCnt, basicBlock;                        //半屏,半屏行数,N*8块

//-----------------------------------------------

//子程序声明和用法

bit scanKey1 (void);

//按键1检测

void procKey (void);

//按键处理子程序

void lcdInit (void);

//初始化LCD子程序

void lcdClear (void);

//清除LCD文本屏幕子程序

void lcdWriteCommand (uchar Command); 

//写入控制命令到LCD子程序

//输入参数:LCD控制指令

void lcdWriteData (uchar Data); 

//写入显示数据到LCD子程序

//输入参数:显示数据

void checkLcdBusy (void); 

//检测LCD忙碌子程序

void displayPhoto (uchar *bmp, uchar bmpCls); 

//全屏显示图形子程序

//输入参数:*bmp=图形数据 

//bmpCls=清除图形屏幕选项(OFF为不清屏,即显示图形,ON为清屏)

void convertChar (uchar CX, CY, width); 

//字符反白显示

//输入参数:CX=要反白字符的行(0-3)

//CY=要反白字符的列(0-7)

//width=要反白字符的长度(1-16)

void wrPosition (void); 

//坐标写入子程序

void dispString (uchar X, Y, speed, uchar *msg); 

//显示字符串子程序

//输入参数:X=行(0-3), Y=列(0-7), speed=显示速度(毫秒), msg=字符数据

void beepBl (void);

//蜂鸣器响一声子程序

void delayMs (uchar ms); 

//延时(毫秒)子程序

//输入参数:毫秒数

void delaySec (uchar sec); 

//延时(秒)子程序

//输入参数:秒数

void init_dz();

void clear_img();

//===============================================

//12864液晶驱动

//===============================================

void lcdInit (void)

{

        lcdWriteCommand(cFunctionSetE);

        lcdWriteCommand(cFunctionSetB);

        lcdClear();

        lcdWriteCommand(cEntryModeSet);

        lcdWriteCommand(cDisplayOnCtrl);

        if(k==1){clear_img();lcdClear();

        }

        if(k==0){lcdClear(); clear_img();init_dz();

        }

}

//===============================================

void lcdClear (void) 

{

        lcdWriteCommand(cClearDisplay);

}

//===============================================

void lcdWriteCommand (uchar Command) 

{

        checkLcdBusy();

        MPU_RS_CH = LOW;

推荐阅读

史海拾趣

CDE [ CORNELL DUBILIER ELECTRONICS ]公司的发展小趣事

随着电子行业的快速发展,客户对电容器的需求日益多样化。CDE公司积极应对市场变化,致力于定制化电容器的研发与应用。公司利用数学建模和定制化的仿真App对电容器的设计进行微调,以满足不同客户的特定需求。这一举措不仅提升了CDE的市场竞争力,也为公司在定制化电容器领域树立了领先地位。

Axiohm公司的发展小趣事

Axiohm公司最初是一家小型电子元件制造商,面对激烈的市场竞争,公司创始人李先生意识到唯有技术创新才能脱颖而出。他带领团队投入大量研发资源,成功开发出一种具有高性价比的新型半导体材料。这一创新不仅降低了生产成本,还提高了产品的性能稳定性,迅速赢得了市场的青睐。随着销量的不断增长,Axiohm逐渐在电子行业中崭露头角。

博流(Bouffalo Lab)公司的发展小趣事

随着公司的发展壮大,博流积极寻求与全球知名企业的合作机会。其中,与谷歌的合作尤为引人注目。作为Google Matter EAP合作伙伴,博流与谷歌共同推动Matter协议在智能家居生态系统中的应用,为用户提供更加便捷、智能的家居体验。此外,博流还与多家产业链上下游企业建立了紧密的合作关系,共同推动物联网产业的发展。

Gamewell-FCI ( Honeywell )公司的发展小趣事

自成立以来,博流公司一直致力于物联网、车联网和智能穿戴领域集成电路芯片的研发。经过不断的技术创新和突破,公司成功推出了多款具有竞争力的芯片产品,广泛应用于智能家居、智慧城市、智能制造等领域。同时,博流还注重与物联网生态合作伙伴的紧密合作,共同提供端到端、边缘计算到云的整体解决方案,为客户创造价值。

Elpakco Inc公司的发展小趣事

面对全球化的市场竞争,Elpakco Inc公司积极实施全球化战略。公司先后在欧美、亚洲等地设立了分支机构,与当地企业开展合作,共同开拓市场。同时,公司还积极参加国际电子展会,展示公司的最新技术和产品,提升了公司的国际知名度和影响力。

Fillfactory Nv公司的发展小趣事

2015年,FIDELIX迎来了一个重要的转折点。在这一年,东芯半导体有限公司(以下简称“东芯半导体”)正式收购了FIDELIX 25.3%的股权,成为其第一大股东及实际控制人。这一收购标志着FIDELIX开始进入一个新的发展阶段。

通过与东芯半导体的合作,FIDELIX获得了更多的资金支持和市场资源。东芯半导体是一家专注于中小容量存储芯片研发、设计和销售的中国企业,在半导体领域拥有丰富的经验和资源。双方的合作不仅为FIDELIX带来了更多的发展机会,同时也加速了FIDELIX在国际市场上的扩张步伐。

在上述两个故事的基础上,可以根据FIDELIX公司的具体发展历程、重要事件、技术创新、市场策略等方面进行进一步的拓展和补充,以形成完整、详细的故事内容。

问答坊 | AI 解惑

WINCE的项目中,能引用System.timers吗?

我在C#程序中想添加个计时器:                 System.Timers.Timer aTimer = new System.Timers.Timer();                 aTimer.Elap ...…

查看全部问答>

请高手支招,寻找MAX323EPE的替换芯片

感谢您进来,祝您身体健康,财源滚滚! 我现在有一个硬件用的芯片是MAX323EPE,但是不支持VISTA和WIN7,有没有一种芯片能替换的,非常感谢。…

查看全部问答>

wince界面设计问题

请问要设计出这样的界面需要使用什么软件? 这种界面设计使用的什么方法。都是贴的图吗? 那具体设计过程是怎么样的? 好像是先设计整个界面,然后在截图。 …

查看全部问答>

在WINCE60里面把CELLCORE组件加进了NK,怎么测试这块是不是可以正常工作?有没简单的测试AP可用?怎么测试RIL组件绑定了物理通信的串口?

在WINCE60里面把CELLCORE组件加进了NK,怎么测试这块是不是可以正常工作?有没简单的测试AP可用?怎么测试RIL组件绑定了物理通信的串口?…

查看全部问答>

系统是怎么调用PS2驱动的入口函数的?

最近在做一个在JZ上的PS2驱动,因为是第一次做驱动,所以不清楚具体是怎样掉用这个驱动的入口函数的?请各位大大帮帮忙,有帮忙的都有10分,不够我再加…

查看全部问答>

ppc2003可以直接访问sql2000 server中的数据吗?

ppc2003通过wifi跟局域网连接后,可以通过编程直接访问服务器上sql2000 server中的数据吗?有人说必须在ppc上安装sql CE,然后通过sql CE跟服务器上的sql2000交换数据?真的是这样?…

查看全部问答>

vworks中多任务的实现能否以多个文件中发起

因设计的模块较多,在有的模块中有任务发起。有的模块中仅有函数调用,在vxSIM调试时,不能顺利进行下去。有人能批点一下不? 另外,在一个文件中发起任务,在另一个文件中实现任务,可以不? 在任务中再发起子任务可以这样设计吗?…

查看全部问答>

立即报名预约2010吉时利新能源与新材料测试技术研讨会

2010年度吉时利测试测量技术全国巡回研讨会将从9月初开始,在成都、重庆、合肥、南京、哈尔滨、武汉、兰州举办届时吉时利资深技术专家将与您深入交流: 绿色电子革命中的光电测试/新能源测试方案 新材料的测试方案 微弱信号测量难点与应对方 ...…

查看全部问答>

uCADCDMA通道4中断问题!

使用uC2.86   ADC使用DMA中断的模式,在DMA1_CH1 初始化以及 中断 都没问题,都可以进中断, 但是改成 DMA1_CH4 就再也不进中断了,为什么?? 难道 DR_ADDRESS 地址不对?? RCC,等其他设置应该都没问题请大家看下我的初始化函 ...…

查看全部问答>

问高手一个关于STM8 I2C的问题

最近在调STM8 的I2C(不想搞模拟的I2C),结果I2C没有调通,不知道问题所在,软件是参考I2C EEPROM固件那个程序写的。初始化如下: void IIC_Init(void) { UCHAR temp; CLK_PCKENR1 |= 0x01; I2C_CR1    = 0x00;  &n ...…

查看全部问答>