/*
51mcu液晶1602时钟温度显示(ZYB-MCU51-DS1302-18B20-LCD1602-A0)
本单片机具有完整的时间初始化和时间日期调校功能。
设计制作:Nathen.zhang@gmail.com
*/
#include<reg52.h>
#include <math.h>
#include <intrins.h> //使用 _nop_()将会用到此头文件
#define uchar unsigned char
#define uint unsigned int
//ds1302寄存器宏定义
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define WRITE_DATE 0x86
#define WRITE_MONTH 0x88
#define WRITE_DAY 0x8A
#define WRITE_YEAR 0x8C
#define READ_SECOND 0x81
#define READ_MINUTE 0x83
#define READ_HOUR 0x85
#define READ_DATE 0x87
#define READ_MONTH 0x89
#define READ_DAY 0x8B
#define READ_YEAR 0x8D
#define WRITE_PROTECT 0x8E
#define pos_year L1+0 //设置显示年的位置
#define pos_month L1+3
#define pos_date L1+6
#define pos_day L1+9
#define pos_hour L2+0
#define pos_minute L2+3
#define pos_sec L2+6
//1602连接定义
#define DATA P3
sbit RS1602=P1^5;
sbit RW1602=P1^6;
sbit E1602=P1^7;
#define L1 0x80 // 液晶显示第一行起始地址 然后再加上所有位序号(从0开始)
#define L2 0xc0 //液晶显示第二行起始地址 0x80+0x40
//1302管脚定义
sbit sclk=P2^3; // DS1302时钟信号 7脚
sbit clk_io=P2^4; // DS1302数据信号 6脚
sbit clk_rst=P2^5; // DS1302片选 5脚
//18b20定义
sbit DQ=P2^6; //定义DS18B20接口
uint t,tshi,tge,txs1,txs2; //温度显示用
unsigned int Readtemp(); //读取温度int temp;
void delay(uchar z);
void tmpDelay(int num); //延时函数
int get_temp(void); //获得温度
void tmpchange(void); //发送温度转换命令
void tmpwritebyte(uchar dat); //写一个字节到DS18B20里
uchar tmpread(void); //读一个字节
bit tmpreadbit(void); // 读一位
int temp;
void dsreset(void); //DS18B20初始化
void delayb(uint count); //delay
void temp_display(); //温度显示
//功能按键定义
sbit func_key=P2^2;
sbit inc_key=P2^1;
sbit dec_key=P2^0;
//地址、数据发送子程序
void delay(uchar);
void write1602_comd(uchar);
void write1602_data(uchar);
void init1602_lcd();
void keyscan();
void Init_DS1302();
void update_time();
uchar flag=0;
uchar code table1[]="09-10-30/5"; //初始化显示,主要用显示及保持格式符,不是初始值
uchar code table2[]="12:00:00"; //初始值在Init_DS1302()
void init1602_lcd()
{
int i;
write1602_comd(0x01);
write1602_comd(0x0c);
write1602_comd(0x06);
write1602_comd(0x3C); // 功能设置 :2行显示模式,数据为8位。还有字体的设置。
write1602_comd(0x80); //设置第一行地址指针
for(i=0;i<10;i++) //初始化显示,用于显示格式符
{
write1602_data(table1[i]);
delay(20);
}
write1602_comd(0xc0); // 设置第二行地址指针
for(i=0;i<8;i++)
{
write1602_data(table2[i]);
delay(20);
}
}
void delay(uchar z)
{
uchar i,j;
for(j=z;j>0;j--)
for(i=125;i>0;i--);
}
void write1602_comd(uchar com)
{
RS1602=0;
DATA=com;
RW1602=0;
delay(5);
E1602=1;
delay(5);
E1602=0;
}
void write1602_data(uchar datatowrite)
{
RS1602=1;
DATA=datatowrite;
RW1602=0;
delay(5);
E1602=1;
delay(5);
E1602=0;
}
void writeds1602_byte(uchar dat)
{
uchar i,dat_w;
dat_w=dat; //数据送给变量dat_w
for(i=0;i<8;i++)
{
clk_io=0; //数据线先拉低
if(dat_w&0x01) //如果是1
{clk_io=1;}
else //如果是0
{clk_io=0;}
dat_w=dat_w>>1; //右移一位
sclk=0; //先拉低时钟信号
sclk=1; //拉高时钟信号
}
sclk=0; //写一字节完毕,拉低时钟信号
}
//-------------------------------
//---- 从DS1302读一字节 (下降沿有效) --------
//---- 读出数据时从低位0位到高位7 -----------
//-------------------------------
uchar readds1602_byte()
{
uchar i,k;
k=0;
for(i=0;i<8;i++)
{
k=k>>1;
if(clk_io)
{k=k|0x80;}
sclk=1; //先拉低时钟信号
sclk=0;
}
sclk=0;
return (k);
}
//-------------------------------
//---- 指定地址写一数据 --------
//-------------------------------
void Write1602(uchar add,uchar dat) //dat为十进制数
{
clk_rst=0;
sclk=0;
clk_rst=1; //拉高RST
writeds1602_byte(add); // 写地址
writeds1602_byte((dat/10<<4)|(dat%10)); // DS1302中的时间数据是BCD码形式
sclk=0;
clk_rst=0;
}
//-------------------------------
//---- 指定地址读出一数据 ------
//-------------------------------
uchar Read1302(uchar add)
{
uchar temp,dat1,dat2;
clk_rst=0;
sclk=0;
clk_rst=1;
writeds1602_byte(add);
temp=readds1602_byte(); //读取的数据为16进制
sclk=0; //读取完毕,拉低SCLK
clk_rst=0; //拉低SCLK
dat1=temp/16; //16进制转成BCD
dat2=temp%16;
temp=dat1*10+dat2; //转换成10进制数字
return (temp);
}
//初始化DS1302
void Init_DS1302(void)
{ //设置初始化时间
Write1602 (WRITE_PROTECT,0X00); delay(1); //禁止写保护
Write1602 (WRITE_SECOND,0x00); delay(1); //秒位初始化
Write1602 (WRITE_MINUTE,0x00);delay(1); //分钟初始化
Write1602 (WRITE_HOUR,0x0C); delay(1); //小时初始化
Write1602 (WRITE_DAY,0x01); delay(1); //星期初始化
Write1602 (WRITE_DATE,0x12);delay(1); //日初始化
Write1602 (WRITE_MONTH,0x05); delay(1); //月初始化
Write1602 (WRITE_YEAR,0x09); delay(1); //年初始化
Write1602 (WRITE_PROTECT,0x80); delay(1);//允许写保护
}
/*************** 以下为:读写年、月、日、时、分、秒的子程序*******************/
/*不包括星期在内
功能:从DS1302中读出时间和日期,并在1602液晶上显示出来
三个参数分别为:1.读时间日期存储器地址 2.写入的十位光标地址 3.个位光标地址 */
void read_write_date_time(uchar _1302_addr, _1602_addr) //把1302的com_addr
{
uchar high,low,get_data;
Write1602 (WRITE_PROTECT,0x00);
delay(1); //禁止写保护
get_data=Read1302(_1302_addr); //秒
high=get_data/10;
low=get_data%10;
write1602_comd(_1602_addr);// 设置第二行地址指针
write1602_data(high+0X30);
write1602_data(low+0X30);
Write1602 (WRITE_PROTECT,0x80); delay(1); //允许写保护
}
void write_lcd(uchar cusr_addr,time_data )
{
uchar hour_wei,ge_wei;
hour_wei=time_data/10;
ge_wei=time_data%10;
write1602_comd(cusr_addr);// 设置第二行地址指针
write1602_data(hour_wei+0X30);
write1602_data(ge_wei+0X30);
}
void update_time()
{
uchar xq;
read_write_date_time(READ_HOUR,L2); //小时
read_write_date_time(READ_MINUTE,L2+3);
read_write_date_time(READ_SECOND,L2+6);
read_write_date_time(READ_YEAR,L1);
read_write_date_time(READ_MONTH,L1+3);
read_write_date_time(READ_DATE,L1+6); //日期
xq=Read1302(READ_DAY); //星期
write1602_comd(L1+9);
write1602_data(xq+0X30);
Write1602 (WRITE_PROTECT,0x80); //允许写保护
}
//键盘处理
uchar first=1,num,second,minute,hour,day,date,month,year;
void keyscan()
{
if(first==1) //读取当前值,用于调整的基准
{
second=Read1302(READ_SECOND);
minute=Read1302(READ_MINUTE);
hour=Read1302(READ_HOUR);
day=Read1302(READ_DAY);
date=Read1302(READ_DATE);
month=Read1302(READ_MONTH);
year=Read1302(READ_YEAR);
}
first=0;
if(func_key==0)
{
delay(5);
if(func_key==0)
{
num++;
flag=1;
while(!func_key);
if(num==1)
{
clk_rst=0; //停止时钟转换
write1602_comd(pos_sec); //调整秒 将光标移动到秒位置
write1602_comd(0x0f); //光标闪烁
}
}
if(num==2)
{
write1602_comd(pos_minute); //将光标移动到分钟
}
if(num==3)
{
write1602_comd(pos_hour); //将光标移动到小时
}
if(num==4)
{
write1602_comd(pos_day); //将光标移动到星期
}
if(num==5)
{
write1602_comd(pos_date); //将光标移动到日
}
if(num==6)
{
write1602_comd(pos_month); //将光标移动到月
}
if(num==7)
{
write1602_comd(pos_year); //将光标移动到年
}
if(num==8) /
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
ZYB-MCU51-DS1302-18B20-LCD1602-A0.rar (93个子文件)
ZYB-MCU51-DS1302-18B20-LCD1602-A0
History
电路图
1602
STARTUP.LST 10KB
1602 4KB
1602.Opt 1KB
1602.lnp 56B
1602.hex 625B
STARTUP.A51 6KB
1602.plg 351B
1602.OBJ 4KB
1602.__i 34B
1602.c~ 3KB
1602.c 3KB
1602.c_cbf 168B
STARTUP.OBJ 759B
1602.M51 8KB
1602.Uv2 2KB
1602.LST 6KB
1602_Uv2.Bak 0B
1602_Opt.Bak 1014B
proteus
ZYB-MCU51-LCD-A0.PWI 820B
ZYB-MCU51-LCD-A0.DSN 63KB
Last Loaded ZYB-MCU51-LCD-A0.DBK 63KB
12864+1602
lcd12864.Opt 1023B
STARTUP.LST 10KB
main.c 8KB
lcd12864_Uv2.Bak 0B
lcd12864.M51 15KB
ZYB-MCU51-LCD-A0_Opt.Bak 888B
lcd12864.lnp 60B
STARTUP.A51 6KB
ZYB-MCU51-LCD-A0_Uv2.Bak 2KB
main.__i 34B
lcd12864.hex 2KB
ZYB-MCU51-LCD-A0.Opt 887B
main.c_cbf 168B
STARTUP.OBJ 759B
main.LST 13KB
ZYB-MCU51-LCD-A0.Uv2 2KB
lcd12864_Opt.Bak 1024B
lcd12864.plg 1KB
main.OBJ 12KB
lcd12864 11KB
ZYB-MCU51-DS1302-18B20-LCD1602-A0.JPG 119KB
clock
STARTUP.LST 10KB
DS1302.OBJ 34KB
STARTUP.A51 6KB
clock.hex 8KB
clock.Opt 1KB
clock_Uv2.Bak 2KB
DS1302.C 14KB
DS1302.__i 36B
STARTUP.OBJ 759B
clock.Uv2 2KB
DS1302.LST 25KB
clock.M51 34KB
clock 30KB
clock.plg 12KB
clock.lnp 59B
clock_Opt.Bak 1KB
12864
lcd12864.Opt 1023B
STARTUP.LST 10KB
main.c 5KB
lcd12864_Uv2.Bak 0B
lcd12864.M51 11KB
ZYB-MCU51-LCD-A0_Opt.Bak 896B
lcd12864.lnp 60B
STARTUP.A51 6KB
main.__i 34B
lcd12864.hex 1KB
ZYB-MCU51-LCD-A0.Opt 899B
main.c_cbf 168B
STARTUP.OBJ 759B
main.LST 8KB
ZYB-MCU51-LCD-A0.Uv2 2KB
lcd12864_Opt.Bak 1024B
lcd12864.plg 1KB
main.OBJ 9KB
lcd12864 8KB
电路截图.JPG 112KB
电路图
Sheet1.SchDoc 64KB
Sheet1.SchDocPreview 48KB
History
Sheet1.~(4).SchDoc.Zip 6KB
Sheet1.~(8).SchDoc.Zip 9KB
Sheet1.~(13).SchDoc.Zip 10KB
Sheet1.~(3).SchDoc.Zip 6KB
Sheet1.~(2).SchDoc.Zip 6KB
Sheet1.~(7).SchDoc.Zip 9KB
Sheet1.~(9).SchDoc.Zip 9KB
Sheet1.~(6).SchDoc.Zip 8KB
Sheet1.~(15).SchDoc.Zip 9KB
Sheet1.~(14).SchDoc.Zip 9KB
Sheet1.~(1).SchDoc.Zip 5KB
Sheet1.~(5).SchDoc.Zip 7KB
ZYB-MCU51-LCD-A0.PrjPcb 30KB
共 93 条
- 1
资源评论
- xubenbo1232013-12-22还好,但不完善
- hongyang668812014-07-27谢谢楼主,资料不错,很有用,学习一下。
nathen_zhang1
- 粉丝: 3
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- #P0015. 全排列 超级简单
- pta题库答案c语言之排序4统计工龄.zip
- pta题库答案c语言之树结构7堆中的路径.zip
- pta题库答案c语言之树结构3TreeTraversalsAgain.zip
- pta题库答案c语言之树结构2ListLeaves.zip
- pta题库答案c语言之树结构1树的同构.zip
- 基于C++实现民航飞行与地图简易管理系统可执行程序+说明+详细注释.zip
- pta题库答案c语言之复杂度1最大子列和问题.zip
- 三维装箱问题(Three-Dimensional Bin Packing Problem,3D-BPP)是一个经典的组合优化问题
- 以下是一些关于Linux线程同步的基本概念和方法.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功