标题:
单片机ds1302日历数字钟数码管显示程序
[打印本页]
作者:
eyyye
时间:
2018-12-25 15:45
标题:
单片机ds1302日历数字钟数码管显示程序
在此附程序源码,希望帮助到由需要的小伙伴!
单片机源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sclk = P1^2; //ds1302时钟脉冲引脚
sbit dio = P1^1; //ds1302输入引脚
sbit ce = P1^0; //ds1302片选引脚
sbit beep = P1^7; //蜂鸣器引脚
// 显示部分引脚定义
sbit din = P2^6; // 串行数据输出,接CH451的数据输入
sbit load=P3^3; //串行命令加载,上升延激活
sbit dout=P2^7; //INT1,键盘中断和键值数据输入,接CH451的数据输出
sbit dclk = P2^5; //串行数据时钟上升延激活
//ch452命令定义
#define CH452_RESET 0x0201 // 复位
#define CH452_SYSOFF 0x0400 // 关闭显示、关闭键盘
#define CH452_SYSON1 0x0401 // 开启显示
#define CH452_SYSON2 0x0403 // 开启显示、键盘
#define CH452_DIG4 0x0c00 // 数码管位4显示,需另加8位数据
#define CH452_DIG5 0x0d00 // 数码管位5显示,需另加8位数据
#define CH452_DIG6 0x0e00 // 数码管位6显示,需另加8位数据
#define CH452_DIG7 0x0f00 // 数码管位7显示,需另加8位数据
#define h 12
#define m 0
#define s 0
unsigned char code number[]={0xbd,0x18,0xd5,0xd9,0x78,0xe9,0xed,0x98,0xfd,0xf9};
//键盘部分
uchar keycode,b,d,z,zz;
//按键延时部分
void Delay200ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 7;
j = 78;
k = 167;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
void CH452_Read(void)
{ uchar cmd1;
uint i,j;
cmd1=0x07; //读按键的命令字
load=0;
for(i=0;i!=4;i++) // 只需要发出高4位,多发也可以,但应该确保最后留下的4位是该命令码
{
din=cmd1&1;
dclk=0;
cmd1>>=1; //往右移一位
dclk=1; //产生时钟上升沿锁通知CH451输入位数据
}
load=1; //产生加载上升沿通知CH451处理命令数据
for(j=0;j<100;j++){ }
keycode=0; //清除keycode
for(i=0;i!=7;i++)
{
keycode<<=1; //数据移入keycode,高位在前,低位在后
if (dout)
{ keycode++;} //从高到低读入451的数据
// keycode|=CH452_DOUT;
dclk=0; //产生时钟下升沿通知CH451输出下一位
dclk=1;
}
}
// ch452写程序
void ch451_write(uint command)
{
char i;
load=0;
for(i=0;i<12;i++){ //送入12位数据,低位在前
din = command&1;
dclk =0;
command>>=1;
dclk=1; //上升沿有效
}
load=1;
}
//显示程序
void display1(uchar minute10,minute,second10,second)
{
ch451_write(CH452_DIG4 | number[minute10]);
ch451_write(CH452_DIG5 | number[minute]|0x02);
ch451_write(CH452_DIG6 | number[second10]);
ch451_write(CH452_DIG7 | number[second]);
}
//显示程序
void display2(uchar z,zz,nian10,nian)
{
ch451_write(CH452_DIG4 | 0);
ch451_write(CH452_DIG5 | 0);
ch451_write(CH452_DIG6 | number[nian10]);
ch451_write(CH452_DIG7 | number[nian]);
}
//显示程序
void display3(uchar yue10,yue,ri10,ri)
{
ch451_write(CH452_DIG4 | number[yue10]);
ch451_write(CH452_DIG5 | number[yue]);
ch451_write(CH452_DIG6 | number[ri10]);
ch451_write(CH452_DIG7 | number[ri]);
}
//ds1302时序部分程序
void write_1302(uchar add,dat)//写数据 add 是addres 地址 dat 是数据
{
uchar i,temp;
temp=add; // 把add地址给 temp
ce=0;
_nop_();
sclk=0;
_nop_();
ce=1;
_nop_();
for(i=0;i<8;i++)
{
sclk=0;
_nop_();
if((temp&0x01)==0x01)// 刚才把地址给了temp 现在和1与然后一位一位的给dio 前面定义了dio是引脚
dio=1;
else
dio=0;
temp>>=1;
sclk=1;
_nop_();
}
temp=dat;
for(i=0;i<8;i++)
{
sclk=0;
_nop_();
if((temp&0x01)==0x01)
dio=1;
else
dio=0;
temp>>=1;
sclk=1;
_nop_();
}
ce=0;
sclk=0;
}
uchar read_1302(uchar add)// 读数据
{
uchar dat,dat1,i,temp;
temp=add;
ce=0;
_nop_();
sclk=0;
_nop_();
ce=1;
for(i=0;i<8;i++)
{
sclk=0;
_nop_();
if((temp&0x01)==0x01)
dio=1;
else
dio=0;
temp>>=1;
sclk=1;
_nop_();
}
for(i=0;i<8;i++)
{
sclk=0;
_nop_();
if(dio)
dat|=0x80;
if(i<7)
dat>>=1;
sclk=1;
}
dat1=dat/16;
dat=dat%16;
dat=dat1*10+dat;
ce=0;
sclk=0;
return dat;
}
//数字调整
uint tiaozheng ( uint Q){
uint a;
a = Q;
if(Q>15) {
a=a+6;
}
if(Q>25) {
a=a+6;
}
if(Q>35) {
a=a+6;
}
if(Q>45) {
a=a+6;
}
if(Q>55) {
a=a+6;
}
return a;
}
//主函数部分
void main()
{
unsigned int minute;
unsigned int second;
unsigned int shi;
unsigned int ri;
unsigned int yue;
unsigned int nian;
b=0;
d=0;
ch451_write(CH452_RESET); // 开启显示
ch451_write(CH452_SYSON2); // 开启显示
write_1302(0x8e,0x00); //开写保护
write_1302(0xc0,0xfe);
write_1302(0xc2,0xff);
write_1302(0x80,0x30); //秒写入 (地址+数据)
write_1302(0x82,0x59); //分写入
write_1302(0x84,0x11); //时写入
write_1302(0x86,0x11); //日写入
write_1302(0x88,0x01); //月写入
write_1302(0x8c,0x18); //年写入
write_1302(0x8e,0x80); //关写保护
display3(1,5,0,3);
while(1){
write_1302(0x8e,0x00); //开写保护
second=read_1302(0x81); //读秒
minute=read_1302(0x83); //读分钟
shi=read_1302(0x85); //读小时
ri=read_1302(0x87); //读日
yue=read_1302(0x89); //读月
nian=read_1302(0x8d); //读年
write_1302(0x8e,0x80); //关写保护
CH452_Read();
//功能键作用
if(keycode==0x4c){
Delay200ms();
CH452_Read();
if(keycode==0x4c){
b++;
if (b==7){
b=0;
}
}
}
if(keycode==0x4f){
Delay200ms();
CH452_Read();
if(keycode==0x4f){
d++;
if (d==7){
d=0;
}
}
}
if (keycode==0x44){
Delay200ms();
CH452_Read();
if (keycode==0x44){
display2(0,0,nian/10,nian%10);
b=0;
}
}
if (keycode==0x45){
Delay200ms();
CH452_Read();
if (keycode==0x45){
display1(yue/10,yue%10,ri/10,ri%10);
b=0;
}
}
if (keycode==0x46){
Delay200ms();
CH452_Read();
if (keycode==0x46){
display1(shi/10,shi%10,minute/10,minute%10);
b=0;
}
}
if (keycode==0x47){
Delay200ms();
CH452_Read();
if (keycode==0x47){
display1(0,0,second/10,second%10);
b=6;
}
}
if(b==1){
display2(0,0,nian/10,nian%10);
}
if(b==2){
display2(0,0,yue/10,yue%10);
}
if(b==3){
display2(0,0,ri/10,ri%10);
}
if(b==4){
display2(0,0,shi/10,shi%10);
}
if(b==5){
display2(0,0,minute/10,minute%10);
}
if(b==6){
display2(0,0,second/10,second%10);
}
//选择加减键
//加减年
if(d==1){
CH452_Read();
if (keycode==0x4d){
Delay200ms();
CH452_Read();
if (keycode==0x4d){
nian++;
nian = tiaozheng(nian);
write_1302(0x8e,0x00);//开写保护
write_1302(0x8c,nian); //年写入
write_1302(0x8e,0x80);//关写保护
write_1302(0x8e,0x00);//开写保护
nian=read_1302(0x8d); //读年
write_1302(0x8e,0x80);//关写保护
display2(0,0,nian/10,nian%10);
b=1;
}
}
if(d==1){
CH452_Read();
if (keycode==0x4e){
Delay200ms();
CH452_Read();
if (keycode==0x4e){
nian--;
nian = tiaozheng(nian);
write_1302(0x8e,0x00);//开写保护
write_1302(0x8c,nian); //年写入
write_1302(0x8e,0x80);//关写保护
write_1302(0x8e,0x00);//开写保护
nian=read_1302(0x8d); //读年
write_1302(0x8e,0x80);//关写保护
display2(0,0,nian/10,nian%10);
b=1;
}
}
}
}
//加减月
if(d==2){
CH452_Read();
if (keycode==0x4d){
Delay200ms();
CH452_Read();
if (keycode==0x4d){
yue++;
write_1302(0x8e,0x00);//开写保护
write_1302(0x88,yue); //月写入
write_1302(0x8e,0x80);//关写保护
write_1302(0x8e,0x00);//开写保护
yue=read_1302(0x89); //读月
write_1302(0x8e,0x80);//关写保护
display2(0,0,yue/10,yue%10);
b=2;
}
}
if(d==2){
CH452_Read();
if (keycode==0x4e){
Delay200ms();
CH452_Read();
if (keycode==0x4e){
yue--;
yue = tiaozheng(yue);
write_1302(0x8e,0x00);//开写保护
write_1302(0x88,yue); //月写入
write_1302(0x8e,0x80);//关写保护
write_1302(0x8e,0x00);//开写保护
yue=read_1302(0x89); //读月
write_1302(0x8e,0x80);//关写保护
display2(0,0,yue/10,yue%10);
b=2;
}
}
}
}
//加减日
if(d==3){
CH452_Read();
if (keycode==0x4d){
Delay200ms();
CH452_Read();
if (keycode==0x4d){
ri++;
ri = tiaozheng(ri);
write_1302(0x8e,0x00);//开写保护
write_1302(0x86,ri); //日写入
write_1302(0x8e,0x80);//关写保护
write_1302(0x8e,0x00);//开写保护
ri=read_1302(0x87); //读日
write_1302(0x8e,0x80);//关写保护
display2(0,0,ri/10,ri%10);
b=3;
}
}
if(d==3){
CH452_Read();
if (keycode==0x4e){
Delay200ms();
CH452_Read();
if (keycode==0x4e){
ri--;
ri = tiaozheng(ri);
write_1302(0x8e,0x00);//开写保护
write_1302(0x86,ri); //日写入
write_1302(0x8e,0x80);//关写保护
write_1302(0x8e,0x00);//开写保护
ri=read_1302(0x87); //读日
write_1302(0x8e,0x80);//关写保护
display2(0,0,ri/10,ri%10);
b=3;
}
}
}
}
//加减小时
if(d==4){
CH452_Read();
if (keycode==0x4d){
Delay200ms();
CH452_Read();
if (keycode==0x4d){
shi++;
shi = tiaozheng(shi);
write_1302(0x8e,0x00);//开写保护
write_1302(0x84,shi); //小时写入
write_1302(0x8e,0x80);//关写保护
write_1302(0x8e,0x00);//开写保护
shi=read_1302(0x85); //读小时
write_1302(0x8e,0x80);//关写保护
display2(0,0,shi/10,shi%10);
b=4;
}
}
if(d==4){
CH452_Read();
if (keycode==0x4e){
Delay200ms();
CH452_Read();
if (keycode==0x4e){
shi--;
shi = tiaozheng(shi);
write_1302(0x8e,0x00);//开写保护
write_1302(0x84,shi); //小时写入
write_1302(0x8e,0x80);//关写保护
write_1302(0x8e,0x00);//开写保护
shi=read_1302(0x85); //读小时
write_1302(0x8e,0x80);//关写保护
display2(0,0,shi/10,shi%10);
b=4;
}
}
}
}
//加减分钟
if(d==5){
CH452_Read();
if (keycode==0x4d){
Delay200ms();
CH452_Read();
if (keycode==0x4d){
minute++;
minute = tiaozheng(minute);
write_1302(0x8e,0x00);//开写保护
write_1302(0x82,minute); //分写入
write_1302(0x8e,0x80);//关写保护
write_1302(0x8e,0x00);//开写保护
minute=read_1302(0x83); //读分
write_1302(0x8e,0x80);//关写保护
display2(0,0,minute/10,minute%10);
b=5;
}
}
if(d==5){
CH452_Read();
if (keycode==0x4e){
Delay200ms();
CH452_Read();
if (keycode==0x4e){
minute--;
minute = tiaozheng(minute);
write_1302(0x8e,0x00);//开写保护
write_1302(0x82,minute); //分写入
write_1302(0x8e,0x80);//关写保护
write_1302(0x8e,0x00);//开写保护
minute=read_1302(0x83); //读分
write_1302(0x8e,0x80);//关写保护
display2(0,0,minute/10,minute%10);
b=5;
}
}
}
}
//加减秒
if(d==5){
CH452_Read();
if (keycode==0x4d){
Delay200ms();
CH452_Read();
if (keycode==0x4d){
second++;
second = tiaozheng(second);
write_1302(0x8e,0x00);//开写保护
write_1302(0x80,second); //秒写入
write_1302(0x8e,0x80);//关写保护
write_1302(0x8e,0x00);//开写保护
second=read_1302(0x81); //读秒
write_1302(0x8e,0x80);//关写保护
display2(0,0,second/10,second%10);
b=6;
}
}
if(d==5){
CH452_Read();
if (keycode==0x4e){
Delay200ms();
CH452_Read();
if (keycode==0x4e){
second--;
second = tiaozheng(second);
write_1302(0x8e,0x00);//开写保护
write_1302(0x80,second); //秒写入
write_1302(0x8e,0x80);//关写保护
write_1302(0x8e,0x00);//开写保护
second=read_1302(0x81); //读秒
write_1302(0x8e,0x80);//关写保护
display2(0,0,second/10,second%10);
b=6;
}
}
}
}
//蜂鸣器部分
if(h==shi){
if (m==minute){
if (second==s){
beep = 0;
Delay200ms();
beep = 1;
}
}
}
}//while结束
}//main结束
复制代码
所有资料51hei提供下载:
A最终程序.rar
(41.94 KB, 下载次数: 23)
2018-12-25 15:44 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2018-12-25 18:20
补全原理图或者详细说明一下电路连接即可获得100+黑币
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1