資源簡介
基于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
- 上一篇:masm5含debug,li
nk - 下一篇:4人搶答器.rar
評論
共有 條評論