資源簡(jiǎn)介
基于52單片機(jī)的萬年歷電子時(shí)鐘, 親測(cè)好用 大家下載
代碼片段和文件信息
#include? ?????????//調(diào)用單片機(jī)頭文件
#define?uchar?unsigned?char??//無符號(hào)字符型?宏定義 變量范圍0~255
#define?uint??unsigned?int ?//無符號(hào)整型?宏定義 變量范圍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;????????//農(nóng)歷?陽歷顯示標(biāo)志位
uchar?menu_1menu_2;
uchar?key_timeflag_value;??????//用做連加的中間變量
bit?key_500ms??;
uchar?n_niann_yuen_ri; //農(nóng)歷顯示的函數(shù)
#include?“ds1302.h“
#include?“l(fā)cd1602.h“
/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
void?write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000?fen1);
byte_write(0x2001?shi1);
byte_write(0x2002?open1);
byte_write(0x2058?a_a);
}
/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來*****************/
void?read_eeprom()
{
fen1??=?byte_read(0x2000);
shi1??=?byte_read(0x2001);
open1??=?byte_read(0x2002);
a_a??????=?byte_read(0x2058);
}
/**************開機(jī)自檢eeprom初始化*****************/
void?init_eeprom()
{
read_eeprom(); //先讀
if(a_a?!=?1) //新的單片機(jī)初始單片機(jī)內(nèi)問eeprom
{
fen1??=?3;
shi1??=?8;
open1??=?1;
a_a?=?1;
write_eeprom(); ???//保存數(shù)據(jù)
}
}
/***********************18b20初始化函數(shù)*****************************/
void?init_18b20()
{
bit?q;
dq?=?1; //把總線拿高
delay_uint(1); ????//15us
dq?=?0; //給復(fù)位脈沖
delay_uint(80); //750us
dq?=?1; //把總線拿高?等待
delay_uint(10); //110us
q?=?dq; //讀取18b20初始化信號(hào)
delay_uint(20); //200us
dq?=?1; //把總線拿高?釋放總線
}
/*************寫18b20內(nèi)的數(shù)據(jù)***************/
void?write_18b20(uchar?dat)
{
uchar?i;
for(i=0;i<8;i++)
{ ?//寫數(shù)據(jù)是低位開始
dq?=?0; ?//把總線拿低寫時(shí)間隙開始?
dq?=?dat?&?0x01;?//向18b20總線寫數(shù)據(jù)了
delay_uint(5); ?//?60us
dq?=?1; ?//釋放總線
dat?>>=?1;
}
}
/*************讀取18b20內(nèi)的數(shù)據(jù)***************/
uchar?read_18b20()
{
uchar?ivalue;
for(i=0;i<8;i++)
{
dq?=?0; ?//把總線拿低讀時(shí)間隙開始?
value?>>=?1; ?//讀數(shù)據(jù)是低位開始
dq?=?1; ?//釋放總線
if(dq?==?1) ?//開始讀寫數(shù)據(jù)?
value?|=?0x80;
delay_uint(5); ?//60us 讀一個(gè)時(shí)間隙最少要保持60us的時(shí)間
}
return?value; ?//返回?cái)?shù)據(jù)
}
/*************讀取溫度的值?讀出來的是小數(shù)***************/
uint?read_temp()
{
uint?value;
uchar?low; ???//在讀取溫度的時(shí)候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會(huì)影響到18b20的時(shí)序
init_18b20(); ???//初始化18b20
write_18b20(0xcc); ???//跳過64位ROM
write_18b20(0x44); ???//啟動(dòng)一次溫度轉(zhuǎn)換命令
delay_uint(50); ???//500us
init_18b20(); ???//初始化18b20
write_18b20(0xcc); ???//跳過64位ROM
write_18b20(0xbe); ???//發(fā)出讀取暫存器命令
EA?=?0;
low?=?read_18b20(); ???//讀溫度低字節(jié)
value?=?read_18b20();??//讀溫度高字節(jié)
EA?=?1;
value?<<=?8; ???//把溫度的高位左移8位
value?|=?low; ???//把讀出的溫度低位放到value的低八位中
value?*=?0.625; ???????//轉(zhuǎn)換到溫度值?小數(shù)
return?value; ???//返回讀出的溫度?帶小數(shù)
}
/******************1ms?延時(shí)函數(shù)*******************/
void?delay_1ms(uint?q)
{
uint?ij;
for(i=0;i for(j=0;j<120;j++);
}
/******************寫星期函數(shù)*******************/
void?w
- 上一篇:masm5含debug,li
nk - 下一篇:4人搶答器.rar
評(píng)論
共有 條評(píng)論