历史上的今天
今天是: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;
史海拾趣
|
我在C#程序中想添加个计时器: System.Timers.Timer aTimer = new System.Timers.Timer(); aTimer.Elap ...… 查看全部问答> |
|
感谢您进来,祝您身体健康,财源滚滚! 我现在有一个硬件用的芯片是MAX323EPE,但是不支持VISTA和WIN7,有没有一种芯片能替换的,非常感谢。… 查看全部问答> |
|
在WINCE60里面把CELLCORE组件加进了NK,怎么测试这块是不是可以正常工作?有没简单的测试AP可用?怎么测试RIL组件绑定了物理通信的串口? 在WINCE60里面把CELLCORE组件加进了NK,怎么测试这块是不是可以正常工作?有没简单的测试AP可用?怎么测试RIL组件绑定了物理通信的串口?… 查看全部问答> |
|
最近在做一个在JZ上的PS2驱动,因为是第一次做驱动,所以不清楚具体是怎样掉用这个驱动的入口函数的?请各位大大帮帮忙,有帮忙的都有10分,不够我再加… 查看全部问答> |
|
ppc2003可以直接访问sql2000 server中的数据吗? ppc2003通过wifi跟局域网连接后,可以通过编程直接访问服务器上sql2000 server中的数据吗?有人说必须在ppc上安装sql CE,然后通过sql CE跟服务器上的sql2000交换数据?真的是这样?… 查看全部问答> |
|
因设计的模块较多,在有的模块中有任务发起。有的模块中仅有函数调用,在vxSIM调试时,不能顺利进行下去。有人能批点一下不? 另外,在一个文件中发起任务,在另一个文件中实现任务,可以不? 在任务中再发起子任务可以这样设计吗?… 查看全部问答> |
|
2010年度吉时利测试测量技术全国巡回研讨会将从9月初开始,在成都、重庆、合肥、南京、哈尔滨、武汉、兰州举办届时吉时利资深技术专家将与您深入交流: 绿色电子革命中的光电测试/新能源测试方案 新材料的测试方案 微弱信号测量难点与应对方 ...… 查看全部问答> |
|
使用uC2.86 ADC使用DMA中断的模式,在DMA1_CH1 初始化以及 中断 都没问题,都可以进中断, 但是改成 DMA1_CH4 就再也不进中断了,为什么?? 难道 DR_ADDRESS 地址不对?? RCC,等其他设置应该都没问题请大家看下我的初始化函 ...… 查看全部问答> |
|
最近在调STM8 的I2C(不想搞模拟的I2C),结果I2C没有调通,不知道问题所在,软件是参考I2C EEPROM固件那个程序写的。初始化如下: void IIC_Init(void) { UCHAR temp; CLK_PCKENR1 |= 0x01; I2C_CR1 = 0x00; &n ...… 查看全部问答> |




