/***************************************************************************
32*64多功能点阵时钟程序
程序编写:
07电气工程 傅春平
07数控技术 梁绍威
如有问题加QQ群讨论;120069344
****************************************************************************/
/**************************32*64双色点阵程序*************************************
程序经过10多次的修改,除了时钟的显示功能,增加了温湿度的显示,
农历显示;
24节气显示;
农历节日和家人生日显示;
1302时钟校准功能;
红外遥控调时功能兼按键调时;
流水边框功能;
******************************************************/
/*使用材料有:STC89C58一片,40M晶振或则20M晶振双倍速下载
DS1302及其晶振和后背电池,按键若干,红外遥控器一个,
32*64双色点阵单元板一块*/
/*****************************************************
占用单片机资源有:
定时器3个,
外部中断一个,
RAM 112,
ROM 30K
*******************************************************
最后祝大家制作成功!!!!!!!!!!!!!!!!!!
程序没有有效简化!!!!1
DS1302 接线图
Vcc2 CLK I/O /RST
| | | |
-------------------
| 8 7 6 5 |
| DS1302 |
| |
| 1 2 3 4 |
-------------------
| | | |
VCC1 GND
1 脚接+5V 2,3脚32768HZ晶振 4脚接地 5脚接S51的P02 6脚接S51的P01 7接S51的P00
8脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容
电压在2.5V以上即可维持
595连级输出数据,138行驱动。*/
#include "stc89c51rc.h"
#include <intrins.h>
#include "common.h"
#include "ds1302.h"
#include "zimo.h"
#include "DHT11.h"
#include "24jieqi.h"
#include "yinli.h"
#include "hongwai.h"
#include "show.h"
#define uchar unsigned char
#define uint unsigned int
//初始化单片机内部配置
void init()
{
E=0 ;
//595使能
IP=0x04 ;
//设置优先级 外部中断1为优先级
TMOD=0x12 ;
//定时器0 1
TH1=0x3C ;
//15ms晶振为40M 定时器1方式1 16位模式初始化
TL1=0xB0 ;
EA=1 ;
TR1=1 ;
ET1=1 ;
TH0=0x00 ;
//定时器0初始化方式2 8位自动重装方式
TL0=0x00 ;
TR0=1 ;
ET0=1 ;
//外部中断
IT1=1 ;
//下降沿触发中断
RCAP2H=0x7D ; //定时器2
RCAP2L=0x0CB ;
ET2=1 ;
TR2=1 ;
EX1=1 ;
//开外中断1
ri=1 ;
r=1 ;
zz=0 ;
rr=1 ;
}
/******************************************/
/*主函数*/
void main()
{
init();
//重复(无限)循环显示
while(1)
{
if(irokk==1) //红外数据接收完成标志位
{
Ircordpro(); //处理红外数据
irokk=0 ; //标志位清0
}
if((resget==0)||(IRcord[0]==0x16))
{
DelayMs();//消斗
if((resget==0)||(IRcord[0]==0x16))
Set1302(starts_time);
//初始化
W1302(0x8e,0x00);
//控制命令,WP=0,写操作
W1302(0x90,0xa5);
//打开充电二级管 一个二级管串联一个2K电阻
}
du1302();
//读取 秒 分 时 日 月 星期 年
CK();
//时间校准
/* if((Cent>0x02)&&(Cent<0x07))
{
MCU_POWER_DOWN;
} */
if(Sec!=ping) //点阵屏中间的两个点变化
{
ping=Sec ;
w=~w ;
}
c_sun=0 ;
//y=R1302(0x8c+1)/16*10+R1302(0x8c+1)%16 ;
nian_sun=Year ;
// y=R1302(0x88+1)/16*10+R1302(0x88+1)%16 ;
yue_sun=Month ;
// y=R1302(0x86+1)/16*10+R1302(0x86+1)%16 ;
ri_sun=Day ;
Conver_xingqi(c_sun,nian_sun,yue_sun,ri_sun);
//农历星期转换
Conversion(c_sun,nian_sun,yue_sun,ri_sun);
//农历转换
jj=jieqi(Year,Month,Day);
//设置和选择项目键
if((key_moda==0)||(IRcord[0]==0x0a))
{
DelayMs();
if((key_moda==0)||(IRcord[0]==0x0a))
{
if(id++==12)
{
id=0 ;
}
ha=0 ;
msec=0 ;
//清闪烁标志
while((key_moda==0)||(IRcord[0]==0x0a))
{
Show_word();
IRcord[0]=0x00 ;
}
}
}
if(id!=0)
{
//增加
if((key_up==0)||(IRcord[0]==0x06))
{
DelayMs();
if((key_up==0)||(IRcord[0]==0x06))
{
while((key_up==0)||(IRcord[0]==0x06))
{
Show_word();
IRcord[0]=0x00 ;
}
//调用显示
ha=0 ;
msec=0 ;
//清闪烁标志
Set(id,0);
//调用时间调调整
}
}
//减少
if((key_Down==0)||(IRcord[0]==0x05))
{
DelayMs();
if((key_Down==0)||(IRcord[0]==0x05))
{
while((key_Down==0)||(IRcord[0]==0x05))
{
Show_word();
IRcord[0]=0x00 ;
}
//调用显示
ha=0 ;
msec=0 ;
//清闪烁标志
Set(id,1);
//调用时间调调整
}
}
}
else
{
//增加
if((key_up==0)||(IRcord[0]==0x06))
{
DelayMs();
if((key_up==0)||(IRcord[0]==0x06))
{
while((key_up==0)||(IRcord[0]==0x06))
{
Show_word();
IRcord[0]=0x00 ;
}
//调用显示
ha=0 ;
msec=0 ;
//清闪烁标志
//手动调整显示的内容
if(b!=0)
{
//f为显示转换标志
if(f++==6)f=0 ;
}
}
}
}
//------------------------
//调用温湿度读取子程序
if(nn==1)
{
RH();
}
//串口显示程序
//--------------------------
Show_word();
//待机显示按三秒间隔分别显示年、月日、星期、时分秒。
IRcord[0]=0x00 ;
}
}
/************************************************/
//中断入口,闪烁
void timer_1(void)interrupt 3
{
TH1=0x44 ;
//15ms晶振为24M
TL1=0x80 ;
//1000ms
if(msec++==40)
{
msec=0 ;
if(mm++==10)
{
nn=1 ;
}
x++;
if(x>=a)
{
x=0 ;
//自动模式
if(b==0)
{
if(f++==6)
f=0 ;
//f显示转换计数器 ,d为用户设置的自动转换时间的值。
}
}
//5秒后进入正常走时。
if(ha++==5)
{
id=0 ;
ha=0 ;
}
}
if(msec<20)
Flicker=0 ;
//闪烁标志反转
else
Flicker=1 ;
}
/******************************************************************/
//定时器2中断入口,用于DTH11的数据转换标志
void timer_2(void)interrupt 5
{
TF2=0 ;
// TH2 = 0x7D;
// TL2 = 0x0CB;
if(yy