/*********************************************************************************************
程序名: 带字库12864LCC电子钟程序
器 件: STC89C52,LCD12864(内置汉字字库),18B20温度芯片,1302时钟芯片 MCU晶振:12MHZ
功 能: 显示公历年月日
农历年月日
星期(星期不调用DS1302内的数据,二十根据公历年月日推算的)
温度
时分秒
公历重大节日
农历纪念日与节日(用于提醒农历生日非常实用)
注:1、当农历纪念日与公历纪念日碰到同一天,则按一秒的间隔轮流显示
2、20100226加入阳历大小月和平闰年判断,调日历时自动控制每个月份的天数
/*********************************************************************************************
/*********************************************************************************************/
//程序部分开始//
/****************************************************************************/
//头文件
#include <reg52.h>
#include <string.h>
/*****************************************************************************/
//定做PCB板的灯与扬声器定义
sbit led_back = P2^7;//背光控制(V2.1程序中加入了背光控制的硬件电路)
sbit beep = P3^1;//扬声器
/*****************************************************************************/
//定做PCB板温度传感器引脚定义
sbit DQ = P2 ^0 ;//ds18B20*/
/*****************************************************************************/
//键盘引脚定义
sbit KEY_1 = P1^7; //退出设置键,显示版本信息键
sbit KEY_2 = P1^6; //上调键
sbit KEY_3 = P1^5; //设置键
sbit KEY_4 = P1^4; //减,下调键
sbit KEY_5 = P1^3; //LED控制每次按动改变背光开关
/****************************************************************************/
//LCD接口定义
sbit RS = P1^0;//模式位,为0输入指令,为1输入数据
sbit RW = P1^1;//读写位,为0读,为1写
sbit E = P1^2;//使能位
#define Lcd_Bus P0 //数据总线
/*****************************************************************************/
//定义DS1302时钟接口
sbit clock_clk = P3 ^ 0;//ds1302_clk(时钟线)
sbit clock_dat = P3 ^ 6;//ds1302_dat(数据线)
sbit clock_Rst = P3 ^ 7;//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,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;//定义时间映射全局变量(专用寄存器)
bit w = 0; //调时标志位,=0时为走时状态,=1时为调时状态
static unsigned char menu = 0;//定义静态小时更新用数据变量
static unsigned char keys = 0;//定义静态小时更新用数据变量
static unsigned char timecount = 0;//定义静态软件计数器变量
signed char address,item,max,mini;
/****************************************************************************/
void DelayM(unsigned int a){//延时函数 1MS/次
unsigned char i;
while( --a != 0){
for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。
} //i 从0加到125,CPU大概就耗时1毫秒
}
/****************************************************************************/
/******************************************************************************/
//LCD驱动(DY12864CBL液晶显示屏并口驱动程序)
/******************************************************************************/
void chk_busy(){//检查忙位(底层)
RS=0;
RW=1;
E=1;
Lcd_Bus=0xff;
while((Lcd_Bus&0x80)==0x80);
E=0;
}
/******************************************************************************/
void write_com(unsigned char cmdcode){//写命令到LCD(底层)
chk_busy();
RS=0;
RW=0;
E=1;
Lcd_Bus=cmdcode;
E=0;
}
/******************************************************************************/
void write_data(unsigned char Dispdata){ //写数据到LCD(底层)
chk_busy();
RS=1;
RW=0;
E=1;
Lcd_Bus=Dispdata;
E=0;
}
/******************************************************************************/
void lcm_init(){//初始化LCD屏(被调用层)
write_com(0x30); //选择8bit数据流
write_com(0x0c); //开显示(无游标、不反白)
write_com(0x01); //清除显示,并且设定地址指针为00H
}
/*****************************************************************************/
void lcm_w_word(unsigned char *s){//向LCM发送一个字符串,长度64字符(一行)之内。(被调用层)
while(*s>0){ //应用:lcm_w_word("您好!"),直接显示:您好!
write_data(*s);
s++;
}
}
/******************************************************************************/
void lcm_w_test(bit i,unsigned char word){//写指令或数据(被调用层)
if(i == 0){
write_com(word);//写指令或数据(0,指令)
}else{
write_data(word);//写指令或数据(1,数据)
}
}
/******************************************************************************/
void lcm_clr(void){//清屏函数
lcm_w_test(0,0x01);
}
/******************************************************************************/
void lcm_clr2(void){//清屏上面3行(用空格填满要清显示的地方,因为液晶屏是静态显示的,所以这办法常用)
lcm_w_test(0,0x80);//第一行
lcm_w_word(" ");
//标尺("1234567812345678"应该能够显示满一行)
lcm_w_test(0,0x90);//第二行
lcm_w_word(" ");
//标尺("1234567812345678"应该能够显示满一行)
lcm_w_test(0,0x88);//第一行
lcm_w_word(" ");
//标尺("1234567812345678"应该能够显示满一行)
}
/******************************************************************************/
//DS18B20温度传感器驱动(显示0至60度,小数点后显示一位)
/******************************************************************************/
void Delay(int num){//延时函数
while(num--) ;
}
/******************************************************************************/
void Init_DS18B20(void){//初始化ds1820
unsigned char x=0;
DQ = 1; //DQ复位
Delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
Delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
Delay(20);
}
/******************************************************************************/
unsigned char ReadOneChar(void){//读一个字节
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--){
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
/******************************************************************************/
void WriteOneChar(unsigned char dat){//写一个字节
unsigned char i=0;
for (i=8; i>0; i--){
DQ = 0;
DQ = dat&0x01;
Delay(5);
DQ = 1;
dat>>=1;
}
}
/******************************************************************************/
unsigned int ReadTemperature(void){//读取温度,温度值返回到此函数中,供调用
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);//t内的温度值,返回到子函数中,要将温度传输到temp变量,应用temp=ReabTemperature()
}
/*****************************************************************************/
//后面会出现的函数声明(当各函数的排列适当时可不用声明,加入函数声明就不用管各个子函数出现的位置先后了?)
void lcm_w_ss(void);//向液晶LCM中写秒数据
void lcm_w_mm(void);//向液晶LCM中写分数据
void lcm_w_hh(void);//向液晶LCM中写小时数据
void lcm_w_dd(void);//写日数据
void lcm_w_mo(void);//写月数据
void lcm_w_yy(void);//写年数据
void lcm_w_xq(void);//星期处理并送入LCM的指定区域
unsigned char clock_in(void);//DS1302逐位写入字节(底层协议)
void clock_out(unsigned char dd);//1302驱动程序逐位读出字节(底层协议?
void Init_130
基于51单片机的电子万年历(LCD12864显示)
5星 · 超过95%的资源 需积分: 50 178 浏览量
2011-10-02
22:55:09
上传
评论
收藏 115KB RAR 举报
boyzone1122
- 粉丝: 0
- 资源: 1
最新资源
- Linux知识体系复习
- 东华深度学习课后习题全部
- 基于STM32+ESP8266+OneNET平台的环境监测报警系统设计.rar
- 基于Django+Django -Rest-Framework实现的在线考试系统
- mt7628 breed 固件
- 基于STM32F103+ESP8266+机智云的室内室外各种环境监测系统设计
- 基于STM32+MPU9250的小型四轴飞行器设计-毕设开题报告&PPT&部分回答问题.rar
- 基于STM32+NB-IOT的风机环境监控系统设计
- STM32单片机FPGA毕设电路原理论文报告一种基于单片机的节能断电保护电路设计
- 基于python+django+vue开发的外卖点餐系统
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈