/*****************************************************
4字LED点阵屏+DS1302万年历电子钟 C 程序【改模对换/反显】
******************************************************
声明:
本程序中DS1302读写部分是直接引用网上网友提供的共享程序,
本程序供大家学习之用,用勿用于商业用途。尊重作者版权。
编写:邓椿薪
时间:2006年6月9日 晚
邮箱:love2151@xinhuanet.com
网址:www.89s51diy.com
*******************************************************
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 <AT89x51.H>
#define uchar unsigned char
#define uint unsigned int
#define light 3 //定义亮度
uchar code hanzi[]; //汉字字模
uchar code timer[12][16]; //0~9数字
uchar code sw[]; //138驱动数据
void Show_word(); //待机显示按三秒间隔分别显示年、月日、星期、时分秒。
void Show_pass(); //不显示一个字
void Send_data(unsigned char *d); /*串口发送一行*/
/******************************************/
sbit resget=P1^4; //时钟复位
sbit key_moda=P1^5; //模式转换
sbit key_up=P1^6; //时钟加
sbit key_Down=P1^7; //时钟减
sbit T_CLK=P1^3; //DS1302引脚连接
sbit T_IO =P1^2;
sbit T_RST=P1^1;
sbit ACC0=ACC^0; //1bit数据存储位
sbit ACC7=ACC^7;
uchar starts_time[7]={0x00,0x10,0x22,0x11,0x06,0x07,0x06}; //初始化后设置
uchar Move,Speed,Flicker,line,Sec,Cent,Hour,Year,Month,Day,Week; //时间变量
uchar a,b,f,h,msec,id,x; //标志计数器 a为自动转换显示时间,b为手动与自动标志
uint zimuo; //字模计数器
uchar BUFF[10]; //缓存
void RTInputByte(uchar); /* 输入 1Byte */
uchar RTOutputByte(void); /* 输出 1Byte */
void W1302(uchar, uchar); // 向DS1302写入一个字节
uchar R1302(uchar); // 从DS1302读出一个字节
void Set1302(uchar *); // 写DS1302时间
void du1302(); // 读时间
void DelayMs(void); // 延时
void Set(uchar,uchar ); // 变量调整
void in_data(); // 调整移动数据
void rxd_data(); // 串口发送移动数据
/*主函数*/
void main()
{
Move=0;
zimuo=0;
TMOD=0x01; //16位定时
TH0=0x3c; //25ms晶振为24M
TL0=0xb0;
EA=1;
TR0=1;
ET0=1;
SCON=0; //初始化串口为工作方式0(同步通信方式,TxD输出同步脉冲)
while(zimuo<512)
{
while(Move<16) //数据移位。
{
for(Speed=0;Speed<10;Speed++) //移动速度
{
for(line=0;line<16;line++)
{
in_data(); //调整移动数据
rxd_data();
P2_7=1; //锁存为高,595锁存信号
P2=sw[line]; //输出行信号
DelayMs(); //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。*/
P2=0x7f; //关闭显示。
}
}
Move++; //移动一步
}
Move=0;
zimuo=zimuo+32;
}
zimuo=0;
while(1) //重复循环显示
{
if(resget==0)
{ DelayMs();
if(resget==0)
Set1302(starts_time); //初始化
W1302(0x8e,0x00); //控制命令,WP=0,写操作
W1302(0x90,0xa5); //打开充电二级管 一个二级管串联一个2K电阻
}
du1302(); //读取 秒 分 时 日 月 星期 年
if (key_moda==0) //设置和选择项目键
{ DelayMs();
if(key_moda==0)
{
if(id++==9) {id=0;}
h=0;msec=0; //清闪烁标志
while(key_moda==0){ Show_word();}
}
}
if(id!=0)
{
if (key_up==0) //增加
{
DelayMs();
if(key_up==0)
{
while(key_up==0)
{Show_word();} //调用显示
h=0;msec=0; //清闪烁标志
Set(id,0); //调用时间调调整
}
}
if (key_Down==0) //减少
{
DelayMs();
if(key_Down==0)
{
while(key_Down==0)
{Show_word();} //调用显示
h=0;msec=0; //清闪烁标志
Set(id,1); //调用时间调调整
}
}
}
else
{
if (key_up==0) //增加
{
DelayMs();
if(key_up==0)
{
while(key_up==0)
{Show_word();} //调用显示
h=0;msec=0; //清闪烁标志
if(b!=0) //手动调整显示的内容
{
if(f++==3) //f为显示转换标志
f=0;
}
}
}
}
Show_word(); //待机显示按三秒间隔分别显示年、月日、星期、时分秒。
}
}
/************************************************/
void Show_word() //串行输出显示
{ uchar h;
for(h=0;h<16;h++)
{
if((id==0)&(f==0)|(id==1)) //f为三秒转换显示
{
Send_data(&timer[0][0]); //不显示
if((Flicker==1)&(id==1)) //闪烁标志为1时不亮,为零时亮
{ Show_pass(); //不显示一个字
Show_pass();
}
else
{
Send_data(&timer[2][h]); //20年
Send_data(&timer[0][h]);
Send_data(&timer[Year/16][h]); //年值
Send_data(&timer[Year%16][h]);
}
Send_data(&hanzi[h*2+641]); //年字符
Send_data(&hanzi[h*2+640]);
Send_data(&timer[0]); //不显示
}
if((id==0)&(f==1)|(id==2)|(id==3))
{
if((Flicker==1)&(id==2)) //闪烁标志为1时不亮,为零时亮
{ Show_pass(); //不显示一个字
}
else
{
if(Month/16<1)
Send_data(&timer[0]); //月十位为零时不显示
else
Send_data(&timer[Month/16][h]); //月值
Send_data(&timer[Month%16][h]);
}
Send_data(&hanzi[h*2+673]); //月字符
Send_data(&hanzi[h*2+672]);
if((Flicker==1)&(id==3)) //闪烁标志为1时不亮,为零时亮
{ Show_pass(); //不显示一个字
}
else
{
Send_data(&timer[Day/16][h]); //日值
Send_data(&timer[Day%16][h]);
}
Send_data(&hanzi[h*2+961]); //日字符
Send_data(&hanzi[h*2+960]);
}
if((id==0)&(f==2)|(id==4)) //f为三秒转换显示
{
Send_data(&timer[0]); //不显示
Send_data(&hanzi[h*2+705]); //星字符
Send_data(&hanzi[h*2+704]);
Send_data(&hanzi[h*2+737]); //期字符
Send_data(&hanzi[h*2+736]);
if((Flicker==1)&(id==4)) //闪烁标志为1时不亮,为零时亮
{ Show_pass(); //不显示一个字
}
else
{
Send_data(&hanzi[Week%16*32+h*2+737]); //星期值
Send_data(&hanzi[Week%16*32+h*2+736]);
}
Send_data(&timer[0][0]); //不显示
}
if((id==0)&(f==3)|(id>4)) //f为三秒转换显示
{
if((Flicker
wnl.rar_万年历
版权申诉
184 浏览量
2022-09-22
17:17:45
上传
评论
收藏 9KB RAR 举报
weixin_42651887
- 粉丝: 79
- 资源: 1万+
最新资源
- 基于pytorch+Unet进行MRI肝脏图像分割源码+数据集+模型.zip
- 在Android Studio中开发一个Android App项目步骤
- 基于yolov8实现进行物体跟踪源码.zip
- Java多线程学习Java多线程学习Java多线程学习Java多线程学习.txt
- 算法数据结构-动态规划算法(Dynamic Programming)超详细总结加应用案例讲解.txt
- 2024最强秋招八股文(精简、纯手打)2024最强秋招八股文(精简、纯手打).txt
- 基于tensorflow多特征融合的微表情识别python源码.zip
- 基于yolov8实现人脸检测的python源码+运行说明.zip
- Micron Memory DDR3 SDRAM 全系列AD集成库(原理图库+PCB封装库).IntLib
- 基于tensorflow多特征融合的微表情识别python源码+详细使用说明.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈