亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
單片機(jī)萬年歷時(shí)鐘制作參考代碼仿真(LCD12864+ds1302)
[打印本頁]
作者:
kkllkkxx
時(shí)間:
2021-9-24 16:51
標(biāo)題:
單片機(jī)萬年歷時(shí)鐘制作參考代碼仿真(LCD12864+ds1302)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png
(42.84 KB, 下載次數(shù): 41)
下載附件
2021-9-25 05:05 上傳
51hei.png
(23.37 KB, 下載次數(shù): 24)
下載附件
2021-9-25 05:05 上傳
單片機(jī)源程序如下:
/*
* 萬年歷
*/
#include "main.h" //包含頭文件main.h
#include "LCD.h" //包含頭文件LCD.h
#include "DS1302.h" //包含頭文件DS1302.h
#include "word.h" //包含頭文件word.h
#include "lunar_calendar.h" //包含頭文件lunar_calendar.h
#include "buzz.h" //包含頭文件buzz.h
#include "eeprom52.h"
TIME time, tmp_time; //時(shí)間變量
ALARM alarm; //時(shí)間變量
char a_a;
bit Alarm_flag=0; //時(shí)間變量
bit Clock_flag=0; //時(shí)間變量
bit flag=0; //時(shí)間變量
sbit DQ=P3^7; //DS18B20 pin 溫度傳感器引腳
/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2c00); //清空
SectorErase(0x2e00);
byte_write(0x2c01,Alarm_flag);
byte_write(0x2c02,Clock_flag);
byte_write(0x2c03,alarm.hour);
byte_write(0x2c04,alarm.min);
byte_write(0x2060,a_a);
}
/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來*****************/
void read_eeprom()
{
Alarm_flag= byte_read(0x2c01);
Clock_flag=byte_read(0x2c02);
alarm.hour=byte_read(0x2c03);
alarm.min=byte_read(0x2c04);
a_a = byte_read(0x2060);
}
/**************開機(jī)自檢eeprom初始化*****************/
void init_eeprom()
{
a_a = byte_read(0x2060);
if(a_a != 1) //新的單片機(jī)初始單片機(jī)內(nèi)問eeprom
{
a_a = 1;
write_eeprom(); //保存數(shù)據(jù)
}
}
//-----------------18B20-----------------------
unsigned char L_18B20,H_18B20,zhengshu,shangwen,xiawen; //溫度用變量
unsigned int fg=0,xiaoshu_a; //溫度用變量
//-----------------18B20----------------------
void delay(uint16 n)//延時(shí)us級(jí)
{
while (n--);
}
//************************************************************************/
// 函數(shù): LCD_Delay()
// 描述: 延時(shí)t ms函數(shù)
// 參數(shù): t
// 返回: 無
// 備注: 11.0592MHZ t=1延時(shí)時(shí)間約1ms
// 版本: 2015/01/01 First version
//************************************************************************/
void Delay_nms(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++) //循環(huán)t次
for(j=0;j<113;j++) //循環(huán)113次 每次約3us
;
}
/////////////////////////////////////////////////
//-----------播放音樂----------------------------
/////////////////////////////////////////////////
/*------DS18B20------*/
void delay_18B20(unsigned int i)
{
while(i--);
}
/*DS18B20的復(fù)位脈沖 主機(jī)通過拉低單總線至少480us以產(chǎn)生復(fù)位脈沖
然后主機(jī)釋放單總線并進(jìn)入接收模式 此時(shí)單總線電平被拉高
DS18B20檢測(cè)到上升沿后 延時(shí)15~60us,拉低總線60~240us產(chǎn)生應(yīng)答脈沖 */
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復(fù)位
delay_18B20(8); //稍做延時(shí)
DQ = 0; //單片機(jī)將DQ拉低
delay_18B20(80); //精確延時(shí) 大于 480us
DQ = 1; //拉高總線
delay_18B20(14); //延時(shí)
x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
delay_18B20(20); //延時(shí)
}
/*寫時(shí)隙 主機(jī)在寫1時(shí)隙向DS18B20寫入1,在寫0時(shí)隙向DS18B20寫入0
所有寫時(shí)隙至少需要60us,且在兩次寫時(shí)隙之間至少需要1us的恢復(fù)時(shí)間
兩種寫時(shí)隙均以主機(jī)拉低總線開始
產(chǎn)生寫1時(shí)隙:主機(jī)拉低總線后,必須在15us內(nèi)釋放總線,由上拉電阻拉回至高電平
產(chǎn)生寫0時(shí)隙:主機(jī)拉低總線后,必須整個(gè)時(shí)隙保持低電平 */
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)//循環(huán)8次
{
DQ = 0; //DQ輸出0
DQ = dat&0x01;
delay_18B20(5); //延時(shí)
DQ = 1; //DQ輸出1
dat>>=1; //右移位
}
}
/*所有讀時(shí)隙至少60us 且兩次獨(dú)立的讀時(shí)隙之間至少需要1us的恢復(fù)時(shí)間
每次讀時(shí)隙由主機(jī)發(fā)起,拉低總線至少1us。
若傳1,則保持總線高電平;若發(fā)送0,則拉低總線
傳0時(shí)DS18B20在該時(shí)隙結(jié)束時(shí)釋放總線,再拉回高電平狀態(tài),主機(jī)必須在讀時(shí)隙開始后的15us內(nèi)釋放總線,并保持采樣總線狀態(tài) */
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號(hào)
dat>>=1; //移位
DQ = 1; // 給脈沖信號(hào)
if(DQ) //如果DQ=1,執(zhí)行下面的語句
dat|=0x80;
delay_18B20(4);//延時(shí)
}
return(dat); //返回?cái)?shù)據(jù)
}
void read_18B20(void)
{
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號(hào)列號(hào)的操作
WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
delay_18B20(100); // this message is wery important
Init_DS18B20(); //初始化DS18B20
WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
delay_18B20(100); //延時(shí)
L_18B20=ReadOneChar(); //讀取低八位數(shù)據(jù)
H_18B20=ReadOneChar(); //讀取高八位數(shù)據(jù)
zhengshu=L_18B20/16+H_18B20*16; //整數(shù)部分
xiaoshu_a=(L_18B20&0x0f)*10/16; //小數(shù)第一位
}
//------------------DS18B20---------------------
/////////////////////////////////////////////////
/*
* 按鍵掃描
*/
int8 scan_key(void)
{
int8 val=-1; //初始化鍵值為-1
if (KeyIn1 == 0) //判斷=0?有無按鍵按鍵
{
val = 1; //鍵值=1
while (KeyIn1 == 0); //等待按鍵釋放
}
else if (KeyIn2 == 0) //判斷=0?有無按鍵按鍵
{
val = 2; //鍵值=2
while (KeyIn2 == 0);//等待按鍵釋放
}
else if (KeyIn3 == 0) //判斷=0?有無按鍵按鍵
{
val = 3; //鍵值=3
while (KeyIn3 == 0);//等待按鍵釋放
}
//if (val > 0)
//buzzer_sound();
return val; //返回鍵值
}
/*
* 主界面框架
*/
void main_frame(void)
{
play32(80, 2, 10); //顯示數(shù)
play32(32, 2, 10); //顯示數(shù)
play8(16, 0, S_xie);//顯示斜線
play8(40, 0, S_xie);//顯示斜線
// play8(96, 0, RH);
// play8(120, 0, S_percent);
play8(120, 6, S_du);//顯示度
}
/*
* 主界面
*/
void main_show(bit refresh)
{
uint8 lunar[2];
if (refresh)
read_time((uint8 *)&time);// 讀時(shí)間函數(shù)// 時(shí)間
if (refresh || (time.sec != tmp_time.sec)) // 秒更新
{
tmp_time.sec = time.sec; //讀取秒數(shù)據(jù)
play8_num(104, 6,zhengshu); //溫度顯示
play32_num(96, 2, time.sec); //顯示秒
}
if (refresh)
main_frame();//刷新界面
if (refresh || (time.min != tmp_time.min)) // 分更新
{
if (!refresh)
flag = 0;
tmp_time.min = time.min;//讀取分
play32_num(48, 2, time.min); //顯示分
}
if (refresh || (time.hour != tmp_time.hour)) // 時(shí)更新
{
if ((!refresh)&&(Clock_flag))
alarm_sound();
tmp_time.hour = time.hour; //讀取時(shí)
play32_num(0, 2, time.hour); //顯示時(shí)
}
if (refresh || (time.day != tmp_time.day)) //日更新
{
tmp_time.day = time.day; //讀取日
play8_num(48, 0, time.day); //顯示日
// 農(nóng)歷
turn_lunar_calendar(&time, lunar);
play_lunar_calendar(0, 6, lunar[0], lunar[1]);
}
if (refresh || (time.week != tmp_time.week)) // 周更新
{
tmp_time.week = time.week; //讀取周
play_week(68, 0, time.week); //顯示周
}
if (refresh || (time.mon != tmp_time.mon)) // 月更新
{
tmp_time.mon = time.mon; //讀取月
play8_num(24, 0, time.mon); //顯示月
// 農(nóng)歷
turn_lunar_calendar(&time, lunar); //轉(zhuǎn)換農(nóng)歷月
play_lunar_calendar(0, 6, lunar[0], lunar[1]); //顯示農(nóng)歷月
}
if (refresh || (time.year != tmp_time.year)) // 年更新
{
tmp_time.year = time.year; //讀取年數(shù)據(jù)
play8_num(0, 0, time.year); //顯示年
// 農(nóng)歷
turn_lunar_calendar(&time, lunar); //轉(zhuǎn)換農(nóng)歷年
play_lunar_calendar(0, 6, lunar[0], lunar[1]); //顯示農(nóng)歷年
}
}
/*
* 主機(jī)界面設(shè)置
*/
void main_set(void)
{
int8 key_val, state=1; //變量
play32_num(96, 2|0x80, time.sec); //顯示秒
while (1)
{ key_val = scan_key();//鍵盤掃描
if (key_val == 1) // 設(shè)置
{
if (state >= 7)
state = 0;
else
state++; //位置狀態(tài)加1
set_time((uint8 *)&time); //設(shè)置時(shí)間
main_show(1); //顯示主界面
switch (state)
{ case 0: set_time((uint8 *)&time); break;//設(shè)置時(shí)間
case 1: play32_num(96, 2|0x80, time.sec); break;//顯示秒
case 2: play32_num(48, 2|0x80, time.min); break;//顯示分
case 3: play32_num(0, 2|0x80, time.hour); break;//顯示時(shí)
case 4: play_week(68, 0|0x80, time.week); break;//顯示周
case 5: play8_num(48, 0|0x80, time.day); break; //顯示日
case 6: play8_num(24, 0|0x80, time.mon); break; //顯示月
case 7: play8_num(0, 0|0x80, time.year); break; //顯示年
default: break; //退出循環(huán)
}
}
else if (key_val > 1)//按鍵值大于1
{
if (state == 1)//位置1設(shè)置秒
{
if (key_val == 3)//加按下?
time.sec++;//秒加1
else
time.sec--; //秒減1
if (time.sec >= 60)
time.sec = 0;
else if (time.sec < 0)
time.sec = 59;
play32_num(96, 2|0x80, time.sec);//顯示秒
}
else if (state == 2) //位置2設(shè)置分
{
if (key_val == 3) //加按下?
time.min++; //加1
else
time.min--; //減1
if (time.min >= 60)
time.min = 0;
else if (time.min < 0)
time.min = 59;
play32_num(48, 2|0x80, time.min);//顯示分
}
else if (state == 3) //位置3設(shè)置時(shí)
{ if (key_val == 3) //加按下?
time.hour++; //加1
else
time.hour--; //減1
if (time.hour >= 24)
time.hour = 0;
else if (time.hour < 0)
time.hour = 23;
play32_num(0, 2|0x80, time.hour);//顯示時(shí)
}
else if (state == 4) //位置4設(shè)置周
{ if (key_val == 3) //加按下?
time.week++; //加1
else
time.week--; //減1
if (time.week >= 8)
time.week = 1;
else if (time.week < 1)
time.week = 7;
play_week(68, 0|0x80, time.week);//顯示周
}
else if (state == 5)//位置5設(shè)置日
{
if (key_val == 3) //加按下?
time.day++; //加1
else
time.day--; //減1
if (time.day >= 32)
time.day = 1;
else if (time.day < 1)
time.day = 31;
play8_num(48, 0|0x80, time.day);//顯示日
}
else if (state == 6) //位置6設(shè)置月
{
if (key_val == 3) //加按下?
time.mon++; //加1
else
time.mon--; //減1
if (time.mon >= 13)
time.mon = 1;
else if (time.mon < 1)
time.mon = 12;
play8_num(24, 0|0x80, time.mon);//顯示月
}
else if (state == 7) //位置7設(shè)置年
{
if (key_val == 3) //加按下?
time.year++; //加1
else
time.year--; //減1
if (time.year >= 100)
time.year = 0; //0年
else if (time.year < 0)
time.year = 99; //99年
play8_num(0, 0|0x80, time.year);//顯示年
}
else
{
break; //退出循環(huán)
}
}
if (state == 0)
break; //退出循環(huán)
}
}
/*
* 鬧鐘界面顯示
*/
void alarm_show(void)
{
int8 key_val, state=1;
uint32 t=0;
play16(0, 0, nao); //顯示 鬧
play16(16, 0, zhong); //鐘
play16(32, 0, maohao); //冒號(hào):
if (Alarm_flag)
play16(48, 0, kai); //開
else
play16(48, 0, guan);//關(guān)
play32_num(32, 2, alarm.hour); //時(shí)
play32(64, 2, 10); //冒號(hào)
play32_num(80, 2, alarm.min); //分
play16(0, 6, zheng); //顯示 整
play16(16, 6, dian); //顯示 點(diǎn)
play16(32, 6, bao); //顯示 報(bào)
play16(48, 6, shi); //顯示 時(shí)
play16(64, 6, maohao); //顯示 冒號(hào)
if (Clock_flag)
play16(80, 6, kai); //顯示 開
else
play16(80, 6, guan); //顯示 關(guān)
for (t=0; t<30000; t++)
{ key_val = scan_key(); //鍵盤掃描 獲取鍵值
if (key_val > 1) //判斷數(shù)據(jù)
break;
else if (key_val == 1) //判斷數(shù)據(jù)
{
if (Alarm_flag)
play16(48, 0|0x80, kai);//顯示 開
else
play16(48, 0|0x80, guan);//關(guān)
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
仿真與代碼51hei附件下載:
智能時(shí)鐘.zip
(447.09 KB, 下載次數(shù): 115)
2021-9-24 16:49 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1