QQ网名大全

请问谁有 基于at89c51单片机控制的万年历

程序太长了 只能发一部分 你给邮箱号给我 我发给你
/*============================================================
使用1602液晶显示ds1302+c51时钟 这个程序是我以前写的多功能闹钟,也可以用来做万年历
=============================================================*/

//#include <at89x51.h>
#include<reg52.h>
#include <string.h>
#include < intrins.h >
#define delaynop() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;
////////////lcd1602定义引脚//////////////////
**it lcm_rw=p2^6;
**it lcm_rs=p2^5;
**it lcm_e=p2^7;
#define lcm_data p0
#define busy 0x80 //用于检测lcm状态字中的busy标识
**it led=p2^0; //背光灯输出
////////////////////////////////////////////////////////////////////

#define uchar unsigned char
**it acc0=acc^0;
**it acc7=acc^7;

/////ds1302引脚定义////////////////////////////
**it t_clk=p1^0;
**it t_io =p1^1;
**it t_rst=p1^2;
//////////////////////////////////////////////////

////////按键定义/////////////////////////////
**it system=p3^2; //**
**it timerup=p3^3; //时间加
**it timerdown=p3^4; //时间减
**it speaker=p3^2; //蜂鸣器
/////////////////////////////////////////////////

void set(uchar,uchar); //根据选择调整相应项目
void rtinputbyte(uchar); //输入 1byte */
uchar rtoutputbyte(void); //输出 1byte */
void w1302(uchar, uchar); //向ds1302写入一个字节
uchar r1302(uchar); //从ds1302读出一个字节
void set1302(uchar * ); //设置时间
void keysound(); //按键音
void clocksound(); //闹铃蜂鸣声

uchar id,msec,model,ledtime,d;
bit a,b; //闪烁标志位

uchar inittime[7]={0x00,0x10,0x19,0x29,0x03,0x04,0x06}; //初始化后设置为:06年3月//29日星期3 19点10分0秒
void out_lcm(void); //显示屏幕
void model0(void); //显示输出
void model1(void);
void model2(void);
void model3(void);
void model4(void);
void model5(void);
void model6(void);

void id_case1_key(); //项目调整
void modset(); //**键处理

void writedatalcm(uchar wdlcm); //lcd写数据函数
void writecommandlcm(uchar wclcm,buysc);//lcd写命令函数
uchar readstatuslcm(void);
void lcminit(void);//lcd初始化函数
void output**rmation(uchar x, uchar y, uchar ddata);
void d**playl**tchar(uchar x, uchar y, uchar code *ddata);

void delay5ms(void);
void delay400ms(void);
void systemsetup(void); //进入系统设置

uchar code systemp[]={"system.setup"}; //字符串输出(系统设定)
uchar code timer[]={"time"}; //字符串输出(时间)
uchar code date[]={"date"}; //字符串输出(日期)
uchar code alarmclock[]={"alarm"}; //字符串输出(闹铃)
uchar code lamp[]={"lamp"}; //字符串输出(背光灯)
uchar code reset[]={"reset"}; //字符串输出(时间归零)
uchar code exit[]={"exit"}; //字符串输出(退出)
uchar code set[]={"set"}; //字符串输出(设置)
uchar code sec[]={"sec"}; //字符串输出(秒)
uchar code clockset[]={"clockset"}; //字符串输出(闹铃设置)
uchar code clockon[]={"on"}; //字符串输出(on)
uchar code clockoff[]={"off"}; //字符串输出(off)

void timesetup(void); //时间设置
void datesetup(void); //日期设置
void alarmclockset(void); //闹铃设置
void lampsetup(void); //背光灯设置
void timereset(void); //时间清零

/*******************************************************************/
void delay1(int ms)
{
unsigned char y ;
while(ms--)
{
for(y = 0 ; y<250 ; y++)
{
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
}
}
}

void main(void)
{
speaker=1; //关闭蜂鸣器
led=0; //打开led ,低电平有效,外接9012驱动
delay400ms(); //启动等待,等lcm讲入工作状态
delay400ms();
lcminit(); //lcm初始化
tmod=0x01; //16位定时
th0=0x3c; //50ms
tl0=0xb0;
ea=1;
tr0=1;
et0=1;

while(1)
{
if(timerdown==0) //左移键按下后把背光灯打开
{
delay5ms();
if(timerdown==0)
{
keysound(); //蜂鸣声
led=0; //打开背光灯
ledtime=r1302(0xc1)/16*10+r1302(0xc1)%16;//取出背光灯时间并转换为十进制数
}
}
b=1; //**键是否动作标志。为1时不动作,为0时动作。
modset(); //调用**键处理程序判断按键是否按下。
if(b==0)
{
keysound(); //蜂鸣声
led=0; //打开背光灯
systemsetup(); //进入系统设置**
ledtime=r1302(0xc1)/16*10+r1302(0xc1)%16; //取出背光灯时间并转换为十进制数
}
if((led==0)&&ledtime==0) //延时间是否到
led=1; //关闭背光灯
if(r1302(0xc3)==1) //闹铃是否打开,0xc3为读闹铃寄存器地址。
{if((r1302(0x85)==r1302(0xc5))&&(r1302(0x83)==r1302(0xc7))) //判断闹铃时间是否到,
clocksound(); //发出闹铃蜂鸣声,无按键动作蜂鸣一分钟。
}
model0(); //输出显示屏幕
}
}

void keysound() //按键音
{
speaker=0; //开蜂鸣声
delay5ms();
speaker=1; //关蜂鸣声
}
void clocksound() //闹铃蜂鸣声
{
if(a==0)
{
speaker=0; //开蜂鸣声
delay5ms();
delay5ms();
delay5ms();
speaker=1; //关蜂鸣声
}
}

void modset() //**键处理
{
if(system==0)
{
delay5ms();
if(system==0)
{
while(system==0);
keysound(); //蜂鸣声
a=0;msec=0;b=0; //a、msec为闪烁标志,按键有动作时清零,不闪烁。
} //b为**键确认动作。其它程判断b是否为零时来确定**键是否动作。
}
}

void systemsetup(void) //系统设置
{
model=1;
while(model!=0)
{
out_lcm();
if (timerup==0) //设置项目左移
{delay5ms();
if(timerup==0)
{
a=0;msec=0;keysound();//蜂鸣声
if(model--==1) //6种系统设置项目
model=6;
}
while(timerup==0);
}
if (timerdown==0) //设置项目右移
{
delay5ms();
if(timerdown==0)
{a=0;msec=0;keysound();//蜂鸣声
if(model++==6)
model=1;
}
while(timerdown==0);
}
b=1; //**键是否动作标志。为1时不动作,为0时动作。
modset(); //调用**键处理程序判断按键是否按下。
if(b==0)
{
keysound(); //蜂鸣声
switch(model) //进入进个项目设置
{
case 1:
timesetup(); break; //时间设置
case 2:
datesetup();break; //日期设置
case 3:
alarmclockset();break;//闹铃设置
case 4:
lampsetup();break; //背光灯设置
case 5:
timereset();break; //时间清零
case 6:
model=0;break; //退出系统设置
}
}
}
}

void timesetup() //时间调整
{
id=6;
while(model==1) //model为1时进入时间调整
{
b=1;
modset();
if(b==0)
{keysound(); //蜂鸣声
if(id++==9) //6..9为时分秒调。 .
id=6;
}
id_case1_key(); //调用按键处理
out_lcm(); //显示输出
}
}
void datesetup() //对日期进行调整
{
id=1;
while(model==2) //model为2时进入日期调整
{b=1;
modset(); //**键是否动作
if(b==0)
{keysound(); //蜂鸣声
if(id++==5) //1..5为年月日星期 exit
id=1;
}
id_case1_key(); //日期调整
out_lcm(); //显示输出
}
}
void alarmclockset(void) //闹铃调整
{id=12;
while(model==3) //进入闹铃设置
{b=1;
modset(); //**键是否动作
if(b==0)
{keysound(); //蜂鸣声
if(r1302(0xc3)%16==0)
{id=0;model++;} //0xc2为闹铃开关寄存器。当为关时按下**键时将退出闹铃设置,当开时进入闹铃时间设置

else if(id++==15) //12..15为闹铃开关和时间设置 exit
id=12;
}
id_case1_key(); //调整
out_lcm(); //显示输出
}
}

void lampsetup(void) //背光灯时间设置
{id=10; //背光灯存储空间ds1302(0xc0)
while(model==4) //model为3时进入背光灯调整
{b=1;
modset(); //**键是否动作
if(b==0)
{keysound(); //蜂鸣声
if(id++==11) //10为背光灯 exit
id=10;
}
id_case1_key();
out_lcm(); //显示输出
}

}
void timereset() //时间清零
{
set1302(inittime); //清时间
w1302(0x90,0xa5); //打开充电二级管 一个二级管串联一个2k电阻
model++;
}
//对相应的项目进行加、减调整。
void id_case1_key() //按键处理
{
if (timerup==0) //增加
{
delay5ms();
if(timerup==0)
{a=0;msec=0;keysound(); //蜂鸣声
if((id==9)||(id==5)||(id==11)||(id==15)) //当id为9、5时按下加、减键将退出调整
{ model++; //退出时间、日期设置
id=0;
}
else
set(id,1);
}
while(timerup==0);
}
if (timerdown==0) //减少
{
delay5ms();
if(timerdown==0)
{a=0;msec=0;keysound(); //蜂鸣声
if((id==9)||(id==5)||(id==11)||(id==15)) //当id为9、5时按下加、减键将退出调整
{ model++; //退出时间、日期设置
id=0;
}
else
set(id,0); //调用ds1302写入函数
}
while(timerdown==0);
}
}

void timer_1(void) interrupt 1 //中断入口,闪烁
{
th0=0x3c; //50ms定时
tl0=0xb0;
if(msec++==10) //500ms
{
msec=0;
a=~a; //闪烁标志反转
if(a==0) //1秒后背光时间减一秒。
ledtime--;
}
}

//根据选择调整相应项目并写入ds1302
void set(uchar sel,uchar sel_1)
{
uchar address,item;
uchar max,min;
if(sel==1) {address=0x8c; max=99;min=0;} //年
if(sel==2) {address=0x88; max=12;min=1;} //月
if(sel==3) {address=0x86; max=31;min=1;} //日
if(sel==4) {address=0x8a; max=7; min=1;} //星期
if(sel==6) {address=0x84; max=23;min=0;} //小时
if(sel==7) {address=0x82; max=59;min=0;} //分钟
if(sel==8) {address=0x80; max=59;min=0;} //秒
if(sel==10) {address=0xc0; max=59;min=0;} //背光时间,最长1分钟
if(sel==12) {address=0xc2; max=1;min=0;} //闹铃开关寄存器
if(sel==13) {address=0xc4; max=23;min=0;} //闹铃时寄存器
if(sel==14) {address=0xc6; max=59;min=0;} //闹铃分寄存器

item=r1302(address+1)/16*10+r1302(address+1)%16;
if (sel_1==0) item++; else item--;
if(item>max) item=min;
if(item<min) item=max;

w1302(0x8e,0x00); //允许写操作
w1302(address,item/10*16+item%10); //写入ds1302 //转成bcd码
w1302(0x8e,0x80); //写保护,禁止写操作
}

//屏幕显示
void out_lcm(void)
{
switch(model)
{
case 0: model0(); break;
case 1: model1(); break;
case 2: model2(); break; //在不同的条件下显示不同的字符
case 3: model3(); break;
case 4: model4(); break;
case 5: model5(); break;
case 6: model6(); break;
}
}

/***********************model为零时第一行显示时间,不为零时显示system setup******/
void model0()
{
d**playl**tchar(0,0,timer); //显示固定字符串(time)
output**rmation(13,0,0x20); //不显示
output**rmation(4,0,0x20); //不显示
output**rmation(4,1,0x20); //不显示
output**rmation(15,1,0x20); //不显示
output**rmation(7,1,0x2f); //显示固定字符 "/"
output**rmation(10,1,0x2f); //显示固定字符 "/"
output**rmation(13,1,0x2f); //显示固定字符 "/"
d**playl**tchar(0,1,date); //显示固定字符串date(日期)
if(a==1) //冒号闪烁
{output**rmation(7,0,0x3a); output**rmation(10,0,0x3a);}
else
{output**rmation(7,0,0x20); output**rmation(10,0,0x20);}

/*******************model为零时第二行显示日期,不为零显示设置项目*******/

output**rmation(5,1,r1302(0x8d)/16+0x30); //显示年,十进制数字加上0x30便
//是ascii码对应的字符
output**rmation(6,1,r1302(0x8d)%16+0x30);

output**rmation(8,1,r1302(0x89)/16+0x30); //显示月
output**rmation(9,1,r1302(0x89)%16+0x30);

output**rmation(11,1,r1302(0x87)/16+0x30); //显示日
output**rmation(12,1,r1302(0x87)%16+0x30);

output**rmation(14,1,r1302(0x8b)%16+0x30); //显示星期

output**rmation(5,0,r1302(0x85)/16+0x30); //显示小时
output**rmation(6,0,r1302(0x85)%16+0x30);

output**rmation(8,0,r1302(0x83)/16+0x30); //显示分钟
output**rmation(9,0,r1302(0x83)%16+0x30);

output**rmation(11,0,r1302(0x81)/16+0x30); //显示秒
output**rmation(12,0,r1302(0x81)%16+0x30);
}

/*************************model不为零时显示系统设置***********************************/

//model为1时time闪烁,按下**键后进入时间调整
void model1()
/*************************************判断id的值来显示项目***********************/
{ output**rmation(0,0,0x20); //不显示
output**rmation(1,0,0x20);
d**playl**tchar(2,0,systemp); //第一行显示system setup
if(id==0) //为0时显示time date lalcak
{output**rmation(9,1,0x20); //不显示
output**rmation(4,1,0x20); //不显示
output**rmation(15,1,0x20); //不显示
d**playl**tchar(5,1,date); //显示date
d**playl**tchar(10,1,alarmclock);//显示clock

if(a==1)
{output**rmation(0,1,0x20); //不显示
output**rmation(1,1,0x20); //不显示
output**rmation(2,1,0x20); //不显示
output**rmation(3,1,0x20); //不显示
}
else
d**playl**tchar(0,1,timer); //显示time
}
else
{ //id不为零进入时间调整项目
output**rmation(3,1,0x3a); //显示固定字符 ":"
output**rmation(6,1,0x3a); //显示固定字符 ":"
output**rmation(9,1,0x20); //不显示
output**rmation(10,1,0x20); //不显示
output**rmation(0,1,0x20); //不显示
/****************************时显示闪烁控制********************/
if((id==6)&&(a==1)) //id为6时时闪烁
{
output**rmation(1,1,0x20); //不显示
output**rmation(2,1,0x20); //不显示
}
else
{output**rmation(1,1,r1302(0x85)/16+0x30); //显示时
output**rmation(2,1,r1302(0x85)%16+0x30);
}
/******************************分显示闪烁控制********************/
if((id==7)&&(a==1)) //id为7时分闪烁
{
output**rmation(4,1,0x20); //不显示
output**rmation(5,1,0x20); //不显示
}
else
{output**rmation(4,1,r1302(0x83)/16+0x30); //显示分
output**rmation(5,1,r1302(0x83)%16+0x30);
}
/******************************秒显示闪烁控制********************/
if((id==8)&&(a==1)) //id为8时秒闪烁
{
output**rmation(7,1,0x20); //不显示
output**rmation(8,1,0x20); //不显示
}
else
{output**rmation(7,1,r1302(0x81)/16+0x30); //显示秒
output**rmation(8,1,r1302(0x81)%16+0x30);
}
/*******************************exit显示闪烁控制********************/

if((id==9)&&(a==1)) //id为9时exit闪烁
{output**rmation(11,1,0x20); //不显示
output**rmation(12,1,0x20); //不显示
output**rmation(13,1,0x20); //不显示
output**rmation(14,1,0x20); //不显示
}
else
d**playl**tchar(11,1,exit); //显示exit
}
}
/***************************************modelo为2时date闪烁***********************************************/
void model2()
{
if(id==0)
{output**rmation(9,1,0x20); //不显示
output**rmation(4,1,0x20); //不显示
output**rmation(15,1,0x20); //不显示
d**playl**tchar(0,1,timer); //显示time
d**playl**tchar(10,1,alarmclock); //显示clock
if(a==1)
{output**rmation(5,1,0x20); //不显示
output**rmation(6,1,0x20); //不显示
output**rmation(7,1,0x20); //不显示
output**rmation(8,1,0x20); //不显示
}

else
d**playl**tchar(5,1,date); //显示date
}
/*****************************************************************************************************/
//id不为零时、进入日期调整
/*****************************************************************************************************/
else
{ output**rmation(0,1,0x20); //不显示
output**rmation(11,1,0x20); //不显示
output**rmation(3,1,0x2f); //显示固定字符 "/"
output**rmation(6,1,0x2f); //显示固定字符 "/"
output**rmation(9,1,0x2f); //显示固定字符 "/"
/****************************年显示闪烁控制********************/
if((id==1)&&(a==1)) //id为1时年闪烁
{
output**rmation(1,1,0x20); //不显示
output**rmation(2,1,0x20); //不显示
}
else
{output**rmation(1,1,r1302(0x8d)/16+0x30); //显示年
output**rmation(2,1,r1302(0x8d)%16+0x30);
}
/***************************月闪烁控制************************/
if((id==2)&&(a==1)) //id为2时月闪烁
{
output**rmation(4,1,0x20); //不显示
output**rmation(5,1,0x20); //不显示
}
else
{output**rmation(4,1,r1302(0x89)/16+0x30); //显示月
output**rmation(5,1,r1302(0x89)%16+0x30);
}
/***************************日闪烁控制************************/
if((id==3)&&(a==1)) //id为3日闪烁
{
output**rmation(7,1,0x20); //不显示
output**rmation(8,1,0x20); //不显示
}
else
{output**rmation(7,1,r1302(0x87)/16+0x30); //显示日
output**rmation(8,1,r1302(0x87)%16+0x30);
}
/***************************星期闪烁控制*********************************/
if((id==4)&&(a==1)) //id为4时星期闪烁
{
output**rmation(10,1,0x20); //不显示
}
else
{output**rmation(10,1,r1302(0x8b)%16+0x30); //显示星期
}
/**************************exit闪烁控制*********************************/
if((id==5)&&(a==1)) //id为5时exit闪烁
{ output**rmation(12,1,0x20); //不显示
output**rmation(13,1,0x20); //不显示
output**rmation(14,1,0x20); //不显示
output**rmation(15,1,0x20); //不显示
}
else
d**playl**tchar(12,1,exit); //显示exit
}
}
/*********************************************************************************/

/*model为3时进入闹铃项目

/**********************************************************************************/
void model3()
{
if(id==0)
{output**rmation(9,1,0x20); //不显示
output**rmation(4,1,0x20); //不显示
output**rmation(15,1,0x20); //不显示
d**playl**tchar(0,1,timer); //显示time
d**playl**tchar(5,1,date); //显示date
if(a==1)
{ output**rmation(10,1,0x20); //不显示
output**rmation(11,1,0x20); //不显示
output**rmation(12,1,0x20); //不显示
output**rmation(13,1,0x20); //不显示
output**rmation(14,1,0x20);
}
else
d**playl**tchar(10,1,alarmclock); //显示cloak
}

/**************************id不为零进入闹铃设置显示********************/
else
{if(id==12) //闹铃开关显示
{d**playl**tchar(0,1,clockset); //显示clockset
output**rmation(8,1,0x20);
output**rmation(13,1,0x20);
output**rmation(14,1,0x20);
佚名
2024-05-28 17:01:15
最佳回答
类似问题(10)