• 大小: 13KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-05-19
  • 语言: 其他
  • 标签: 51单片机  

资源简介

基于52单片机的万年历电子时钟, 亲测好用 大家下载

资源截图

代码片段和文件信息

#include 	         //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义 变量范围0~255
#define uint  unsigned int  //无符号整型 宏定义 变量范围0~65535
#include “eeprom52.h“
#include “nongli.h“
#include “intrins.h“

bit flag_200ms ;
bit flag_100ms ;
sbit beep = P2^3;   //蜂鸣器定义
bit flag_beep_en;
uint clock_value;     //用作闹钟用的

sbit dq   = P2^2;   //18b20 IO口的定义


uint temperature ;    //温度变量
uchar flag_nl;        //农历 阳历显示标志位


uchar menu_1menu_2;



uchar key_timeflag_value;      //用做连加的中间变量
bit key_500ms  ;
uchar n_niann_yuen_ri; //农历显示的函数



#include “ds1302.h“
#include “lcd1602.h“



/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000 fen1);
byte_write(0x2001 shi1);
byte_write(0x2002 open1);
byte_write(0x2058 a_a);
}

/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
fen1  = byte_read(0x2000);
shi1  = byte_read(0x2001);
open1  = byte_read(0x2002);
a_a      = byte_read(0x2058);
}

/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先读
if(a_a != 1) //新的单片机初始单片机内问eeprom
{
fen1  = 3;
shi1  = 8;
open1  = 1;
a_a = 1;
write_eeprom();    //保存数据
}
}

/***********************18b20初始化函数*****************************/
void init_18b20()
{
bit q;
dq = 1; //把总线拿高
delay_uint(1);     //15us
dq = 0; //给复位脉冲
delay_uint(80); //750us
dq = 1; //把总线拿高 等待
delay_uint(10); //110us
q = dq; //读取18b20初始化信号
delay_uint(20); //200us
dq = 1; //把总线拿高 释放总线
}

/*************写18b20内的数据***************/
void write_18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{  //写数据是低位开始
dq = 0;  //把总线拿低写时间隙开始 
dq = dat & 0x01; //向18b20总线写数据了
delay_uint(5);  // 60us
dq = 1;  //释放总线
dat >>= 1;
}
}

/*************读取18b20内的数据***************/
uchar read_18b20()
{
uchar ivalue;
for(i=0;i<8;i++)
{
dq = 0;  //把总线拿低读时间隙开始 
value >>= 1;  //读数据是低位开始
dq = 1;  //释放总线
if(dq == 1)  //开始读写数据 
value |= 0x80;
delay_uint(5);  //60us 读一个时间隙最少要保持60us的时间
}
return value;  //返回数据
}

/*************读取温度的值 读出来的是小数***************/
uint read_temp()
{
uint value;
uchar low;    //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序
init_18b20();    //初始化18b20
write_18b20(0xcc);    //跳过64位ROM
write_18b20(0x44);    //启动一次温度转换命令
delay_uint(50);    //500us

init_18b20();    //初始化18b20

write_18b20(0xcc);    //跳过64位ROM
write_18b20(0xbe);    //发出读取暂存器命令

EA = 0;
low = read_18b20();    //读温度低字节
value = read_18b20();  //读温度高字节
EA = 1;
value <<= 8;    //把温度的高位左移8位
value |= low;    //把读出的温度低位放到value的低八位中
value *= 0.625;        //转换到温度值 小数
return value;    //返回读出的温度 带小数
}



/******************1ms 延时函数*******************/
void delay_1ms(uint q)
{
uint ij;
for(i=0;i for(j=0;j<120;j++);
}

/******************写星期函数*******************/
void w

评论

共有 条评论