|
給大家分享一個(gè)基于51單片機(jī)的多功能萬年歷12864液晶顯示,溫度補(bǔ)償,同時(shí)更新時(shí)間溫度,與電腦同步�?梢栽O(shè)置鬧鐘
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源程序如下:
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#include "value.h"
#include "nongli.h"
uchar n_nian,n_yue,n_ri;
bit flag_200ms = 1;
uchar menu_1;
uchar flag_clock_en; //鬧鐘標(biāo)志位
uchar flag_clock_kai; //鬧鐘開標(biāo)志位
uchar flag_c_en;
bit flag_100ms;
sbit beep=P2^7; //蜂鳴器IO口
sbit dq=P3^2; //18b20 IO口的定義
uint temperature ; //溫度變量
/************ 延時(shí)函數(shù) *****************/
void delay_uint(uint z)
{
while(z--);
}
/********************************************************************
* 名稱 : delay_1ms()
* 功能 : 延時(shí)1ms函數(shù)
* 輸入 : q
* 輸出 : 無
***********************************************************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<115;j++);
}
uchar dis_lcd[10];
#include "lcd12864bu.h"
/******************顯示時(shí)間函數(shù)***************************/
void dis_shijian() //顯示時(shí)間
{
write_shu16(3*2,1*8,shi,0);
write_shuzi(1,3*2,3*8,fuhao[1],0);
write_shu16(3*2,4*8,fen,0);
write_shuzi(1,3*2,6*8,fuhao[1],0);
write_shu16(3*2,7*8,miao,0);
write_shu16(1*2,6*8,nian,0);
write_shu16(1*2,10*8,yue,0);
write_shu16(1*2,14*8,ri,0);
write_shu16(2*2,4*8,n_yue,0);
write_shuzi(1,2*2,6*8,fuhao[0],0);
write_shu16(2*2,7*8,n_ri,0);
if(week==0)
{
write_yhanzi(1,4,7*16,xingqi[0]);
}
if(week==1)
{
write_yhanzi(1,4,7*16,xingqi[1]);
}
if(week==2)
{
write_yhanzi(1,4,7*16,xingqi[2]);
}
if(week==3)
{
write_yhanzi(1,4,7*16,xingqi[3]);
}
if(week==4)
{
write_yhanzi(1,4,7*16,xingqi[4]);
}
if(week==5)
{
write_yhanzi(1,4,7*16,xingqi[5]);
}
if(week==6)
{
write_yhanzi(1,4,7*16,xingqi[6]);
}
if(week==7)
{
week=0;
write_yhanzi(1,4,7*16,xingqi[0]);
}
write_shu18b20(3*2,10*8,temperature,0);
write_shuzi(1,3*2,12*8,dian,0);
}
/************初始化顯示*****************/
void init_12864_dis() //初始化顯示
{
cs1=1; //左屏開顯示
cs2=0;
write_yhanzi(7,0,16,dzrl); //多功能電子日歷
write_yhanzi(2,2,0,yangli); //陽(0) 歷(1)
write_yhanzi(2,4,0,nongli); //農(nóng)(0) 歷(1)
// write_yhanzi(2,6,0,0x00); //時(shí)間
// write_yhanzi(2,6,0,shijian); //時(shí)間
write_shu16(1*2,4*8,0x20,0);
write_yhanzi(1,2,4*16,qita[0]); //年
write_yhanzi(1,2,6*16,qita[1]); //月
write_yhanzi(2,4,5*16,qita[6]); //星期
dis_shijian(); //顯示時(shí)間
write_yhanzi(1,6,7*16,wendu_fuhao); //℃
}
/***********************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 i,value;
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ù)
}
全部資料51hei下載地址:
單片機(jī)多功能萬年歷溫度(12864液晶顯示).zip
(275.64 KB, 下載次數(shù): 112)
2020-6-21 13:57 上傳
點(diǎn)擊文件名下載附件
多功能萬年歷
|
|