導航:首頁 > 操作系統 > 基於單片機的日歷設計方案

基於單片機的日歷設計方案

發布時間:2024-06-28 16:32:34

1. 單片機日歷時鍾系統

//給你一個DS1302的庫函數
//液晶那個庫要的話也能給你哈

//#include "intrins.h"
sbit DS1302_clk=0xa0;
sbit DS1302_data=0xa1;
sbit DS1302_cs=0xa2;

unsigned char year,month,date,hour,minute,second,week;
//unsigned char display_buffer[6];

void short_ds1302_delay();//短延時
void long_ds1302_delay();//長延時
void DS1302_write(unsigned char DS1302_temp); //寫入一個位元組
unsigned char DS1302_read(void); //讀一位元組
void DS1302_init();//ds1302初始化
void DS1302_write_time(int command,int dat);//寫入second or minute or hour...... or 寫入一個命令
unsigned char DS1302_read_time(int command);//讀取second or minute or hour......

void short_ds1302_delay()
{
unsigned char i;
for(i=0;i<5;i++);
}

void long_ds1302_delay()
{
unsigned char i;
for(i=0;i<25;i++);
}

void DS1302_write(unsigned char DS1302_temp) //寫入一個位元組
{
unsigned char i,temp;
long_ds1302_delay();
temp=DS1302_temp;
for(i=0;i<8;i++)
{
DS1302_data=temp&0x01;
short_ds1302_delay();
DS1302_clk=1;
short_ds1302_delay();
DS1302_clk=0;
temp=temp>>1;
}
}

unsigned char DS1302_read(void) //讀一位元組
{
unsigned char i,temp;
long_ds1302_delay();
temp=0;
for(i=0;i<8;i++)
{
temp=temp>>1;
if(DS1302_data==1)
temp=temp+0x80;
DS1302_clk=1;
short_ds1302_delay();
DS1302_clk=0;
short_ds1302_delay();
}
return temp;
}
/*
/////////寫操作設置,當a=0x80時禁止寫操作,a=0x00時允許////////////////

void DS1302_write_able(unsigned char a)
{
DS1302_cs=0;

DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x8e);
DS1302_data=1;
DS1302_write(a);
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
}

/////////讀操作設置,當a=0x80時禁止讀操作,a=0x00時允許////////////////

void DS1302_read_able(unsigned char a)
{
DS1302_cs=0;

DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x8f);
DS1302_data=1;
DS1302_write(a);
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
}
*/
////////////////////ds1302初始化////////////////////////
void DS1302_init()
{
unsigned char i;
DS1302_write_time(0x8e,0x00); //允許寫操作

DS1302_cs=0;

DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x81);
DS1302_data=1;
i=DS1302_read();
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
second=((i>>4)&0x07)*10+(i&0x0f);

DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x80);
DS1302_data=1;
DS1302_write(0x7f&i);
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;

DS1302_clk=0; //充電設置
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x90);
DS1302_data=1;
// DS1302_write(0xa6); //允許充電,一個二極體 4k電阻
DS1302_write(0x00); //禁止充電
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;

DS1302_write_time(0x8e,0x80); //禁止寫操作
}

unsigned char DS1302_read_time(int command)//讀取second or minute or hour......
{
unsigned char i;
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(command);
DS1302_data=1;
i=DS1302_read();
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
return i;
}
void DS1302_readdate()
{
unsigned char i;
DS1302_cs=0;

//讀取second
i=DS1302_read_time(0x81);
second=((i>>4)&0x07)*10+(i&0x0f);

//讀取分minute
i=DS1302_read_time(0x83);
minute=((i>>4)&0x07)*10+(i&0x0f);

//讀取時hour
i=DS1302_read_time(0x85);
hour=((i>>4)&0x03)*10+(i&0x0f);

//讀取日date
i=DS1302_read_time(0x87);
date=((i>>4)&0x03)*10+(i&0x0f);

//讀取月份month
i=DS1302_read_time(0x89);
month=((i>>4)&0x01)*10+(i&0x0f);

//讀取周week
i=DS1302_read_time(0x8b);
week=i&0x07;

//讀取年份year
i=DS1302_read_time(0x8d);
year=((i>>4)&0x0f)*10+(i&0x0f);
}

void DS1302_write_time(int command,int dat)//寫入second or minute or hour...... or 寫入一個命令
{
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(command);
DS1302_data=1;
DS1302_write(dat);
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
}

void DS1302_writedate()
{

DS1302_write_time(0x8e,0x00); //允許寫操作
DS1302_cs=0;

//寫second
DS1302_write_time(0x80,0x7f&(((second/10)<<4)+(second%10)));

//minute
DS1302_write_time(0x82,0x7f&(((minute/10)<<4)+(minute%10)));

//hour
DS1302_write_time(0x84,0x3f&(((hour/10)<<4)+(hour%10)));

//date
DS1302_write_time(0x86,0x3f&(((date/10)<<4)+(date%10)));

//month
DS1302_write_time(0x88,0x1f&(((month/10)<<4)+(month%10)));

//week
DS1302_write_time(0x8a,0x07&week);

//year
DS1302_write_time(0x8c,((year/10)<<4)+(year%10));

DS1302_write_time(0x8e,0x80); //禁止寫操作
}

2. 跪求 51單片機+12864液晶+1302時鍾製成的萬年歷c程序

頂層文件 萬年歷.C
#include<reg51.h>
#include "LCD1602.h"
#include "DS1302.h"
#define uchar unsigned char
#define uint unsigned int
sbit speaker=P2^4;
bit key_flag1=0,key_flag2=0;
SYSTEMTIME adjusted;
uchar sec_add=0,min_add=0,hou_add=0,day_add=0,mon_add=0,yea_add=0;
uchar data_alarm[7]={0};
/************鍵盤控制******************************/
int key_scan() //掃描是否有鍵按下
{ int i=0;
uint temp;
P1=0xf0;
temp=P1;
if(temp!=0xf0)
i=1;
else
i=0;
return i;
}
uchar key_value() //確定按鍵的值
{
uint m=0,n=0,temp;
uchar value;
uchar v[4][3]={'2','1','0','5','4','3','8','7','6','b','a','9'} ;
P1=0xfe; temp=P1; if(temp!=0xfe)m=0;
P1=0xfd;temp=P1 ;if(temp!=0xfd)m=1;
P1=0xfb;temp=P1 ;if(temp!=0xfb)m=2;
P1=0xf7;temp=P1 ;if(temp!=0xf7)m=3;
P1=0xef;temp=P1 ;if(temp!=0xef)n=0;
P1=0xdf;temp=P1 ;if(temp!=0xdf)n=1;
P1=0xbf;temp=P1 ;if(temp!=0xbf)n=2;
value=v[m][n];
return value;
}
/***************************設置鬧鈴函數*******************************/
void naoling(void)
{
uchar i=0,l=0,j;
init1602();
while(key_flag2&&i<12)
if(key_scan()){j=key_value();write_data(j);if(i%2==0)data_alarm[l]=(j-'0')*10;else {data_alarm[l]+=(j-'0');l++;}i++;delay(600);}
write_com(0x01);
}
uchar according(void)
{ uchar k;
if(data_alarm[0]==adjusted.Year&&data_alarm[1]==adjusted.Month&&data_alarm[2]==adjusted.Day&&data_alarm[3]==adjusted.Hour&&data_alarm[4]==adjusted.Minute&&data_alarm[5]==adjusted.Second)
k=1;
else k=0;
return k;
}
void speak(void)
{uint i=50;
while(i)
{speaker=0;
delay(1);
speaker=1;
delay(1);
i--;
}
}
void alarm(void)
{uint i=10;
while(i)
{
speak();
delay(10);
i--;
}
}
/**************************修改時間操作********************************/
void reset(void)
{
sec_add=0;
min_add=0;
hou_add=0;
day_add=0;
mon_add=0;
yea_add=0 ;
}
void adjust(void)
{

if(key_scan()&&key_flag1)
switch(key_value())
{case '0':sec_add++;break;
case '1':min_add++;break;
case '2':hou_add++;break;
case '3':day_add++;break;
case '4':mon_add++;break;
case '5':yea_add++;break;
case 'b':reset();break;
default: break;
}
adjusted.Second+=sec_add;
adjusted.Minute+=min_add;
adjusted.Hour+=hou_add;
adjusted.Day+=day_add;
adjusted.Month+=mon_add;
adjusted.Year+=yea_add;
if(adjusted.Second>59) adjusted.Second=adjusted.Second%60;

if(adjusted.Minute>59) adjusted.Minute=adjusted.Minute%60;

if(adjusted.Hour>23) adjusted.Hour=adjusted.Hour%24;

if(adjusted.Day>31) adjusted.Day=adjusted.Day%31;

if(adjusted.Month>12) adjusted.Month=adjusted.Month%12;

if(adjusted.Year>100) adjusted.Year=adjusted.Year%100;

}

/**************************中斷處理函數*********************************/
void changing(void) interrupt 0 using 0 //需要修改時間和日期,或者停止修改
{
if(key_flag1)key_flag1=0;
else key_flag1=1;
}
void alarming(void) interrupt 3 using 0 //需要設置鬧鈴或者停止設置
{
if(key_flag2)key_flag2=0;
else key_flag2=1;
}
/********************************主函數***********************************/
main()
{uint i;
uchar *l;
uchar p1[]="D:",p2[]="T:";
SYSTEMTIME T;
EA=1;
EX0=1;
IT0=1;
EA=1;
EX1=1;
IT1=1;
init1602();
Initial_DS1302() ;

while(1)
{ write_com(0x80);
write_string(p1,2);
write_com(0xc0);
write_string(p2,2);
DS1302_GetTime(&T) ;
adjusted.Second=T.Second;
adjusted.Minute=T.Minute;
adjusted.Hour=T.Hour;
adjusted.Week=T.Week;
adjusted.Day=T.Day;
adjusted.Month=T.Month;
adjusted.Year=T.Year;
for(i=0;i<9;i++)
{
adjusted.DateString[i]=T.DateString[i];
adjusted.TimeString[i]=T.TimeString[i];
}
adjust();
if(key_flag2)naoling();
if(according())alarm();
DateToStr(&adjusted);
TimeToStr(&adjusted);
write_com(0x82);
write_string(adjusted.DateString,8);
write_com(0xc2);
write_string(adjusted.TimeString,8);
delay(10);
}
(二)頭文件1 顯示模塊 LCD1602.H
#ifndef LCD_CHAR_1602_2009_5_9
#define LCD_CHAR_1602_2009_5_9
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs = P2^0;
sbit lcdrw = P2^1;
sbit lcden = P2^2;
void delay(uint z) // 延時
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) // 寫入指令數據到 lcd
{
lcdrw=0;
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void write_data(uchar date) // 寫入字元顯示數據到 lcd
{
lcdrw=0;
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init1602() // 初始化設定
{
lcdrw=0;
lcden=0;
write_com(0x3C);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
void write_string(uchar *pp,uint n)
{
int i;
for(i=0;i<n;i++)
write_data(pp[i]);
}
#endif
(三)頭文件2 時鍾模塊 DS1302.H
#ifndef _REAL_TIMER_DS1302_2009_5_20_
#define _REAL_TIMER_DS1302_2003_5_20_

sbit DS1302_CLK = P2^6; //實時時鍾時鍾線引腳
sbit DS1302_IO = P2^7; //實時時鍾數據線引腳
sbit DS1302_RST = P2^5; //實時時鍾復位線引腳
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;

typedef struct SYSTEM_TIME
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week;
unsigned char Day;
unsigned char Month;
unsigned char Year;
unsigned char DateString[9]; //用這兩個字元串來放置讀取的時間
unsigned char TimeString[9];
}SYSTEMTIME; //定義的時間類型

#define AM(X) X
#define PM(X) (X+12) // 轉成24小時制
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
#define DS1302_RAM(X) (0xC0+(X)*2) //用於計算 DS1302_RAM 地址的宏

/******內部指令**********/
void DS1302InputByte(unsigned char d) //實時時鍾寫入一位元組(內部函數)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0;
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC = ACC >> 1; //因為在前面已經定義了ACC0 = ACC^0;以便再次利用DS1302_IO = ACC0;
}
}

unsigned char DS1302OutputByte(void) //實時時鍾讀取一位元組(內部函數)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return(ACC);
}
/********************************/

void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要寫的數據
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 寫1Byte數據
DS1302_CLK = 1;
DS1302_RST = 0;
}

unsigned char Read1302(unsigned char ucAddr) //讀取DS1302某地址的數據
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OutputByte(); // 讀1Byte數據
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);
}

void DS1302_SetProtect(bit flag) //是否防寫
{
if(flag)
Write1302(0x8E,0x10);
else
Write1302(0x8E,0x00);
}

void DS1302_SetTime(unsigned char Address, unsigned char Value) // 設置時間函數
{
DS1302_SetProtect(0);
Write1302(Address, ((Value/10)<<4 | (Value%10))); //將十進制數轉換為BCD碼
} //在DS1302中的與日歷、時鍾相關的寄存器存放的數據必須為BCD碼形式

void DS1302_GetTime(SYSTEMTIME *Time)
{
unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將BCD碼轉換為十進制數
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_HOUR);
Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_DAY);
Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_WEEK);
Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MONTH);
Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_YEAR);
Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
}
unsigned char *DataToBCD(SYSTEMTIME *Time)
{
unsigned char D[8];
D[0]=Time->Second/10<<4+Time->Second%10;
D[1]=Time->Minute/10<<4+Time->Minute%10;
D[2]=Time->Hour/10<<4+Time->Hour%10;
D[3]=Time->Day/10<<4+Time->Day%10;
D[4]=Time->Month/10<<4+Time->Month%10;
D[5]=Time->Week/10<<4+Time->Week%10;
D[6]=Time->Year/10<<4+Time->Year%10;
return D;
}
void DateToStr(SYSTEMTIME *Time)
{
//將十進制數轉換為液晶顯示的ASCII值
Time->DateString[0] = Time->Year/10 + '0';
Time->DateString[1] = Time->Year%10 + '0';
Time->DateString[2] = '-';
Time->DateString[3] = Time->Month/10 + '0';
Time->DateString[4] = Time->Month%10 + '0';
Time->DateString[5] = '-';
Time->DateString[6] = Time->Day/10 + '0';
Time->DateString[7] = Time->Day%10 + '0';
Time->DateString[8] = '\0';
}

void TimeToStr(SYSTEMTIME *Time)
{
//將十進制數轉換為液晶顯示的ASCII值
Time->TimeString[0] = Time->Hour/10 + '0';
Time->TimeString[1] = Time->Hour%10 + '0';
Time->TimeString[2] = ':';
Time->TimeString[3] = Time->Minute/10 + '0';
Time->TimeString[4] = Time->Minute%10 + '0';
Time->TimeString[5] = ':';
Time->TimeString[6] = Time->Second/10 + '0';
Time->TimeString[7] = Time->Second%10 + '0';
Time->DateString[8] = '\0';
}
void Initial_DS1302(void)
{
unsigned char Second;
Second=Read1302(DS1302_SECOND);
if(Second&0x80) //初始化時間
DS1302_SetTime(DS1302_SECOND,0);
}
void DS1302_TimeStop(bit flag) // 是否將時鍾停止
{
unsigned char Data;
Data=Read1302(DS1302_SECOND);
DS1302_SetProtect(0);
if(flag)
Write1302(DS1302_SECOND, Data|0x80);
else
Write1302(DS1302_SECOND, Data&0x7F);
}
#endif

3. c璇璦51鍗曠墖鏈烘棩鍘嗘樉紺猴紙鎴愬姛閫100鍒嗭級

浣犲厛鍋氫竴涓鏁村艦鏁扮粍瀛樻斁榪欎簺榪愮畻緇撴灉錛岀劧鍚庡啀鍐欎竴涓瀛楃︿覆鍜屾暣褰㈣漿鎹㈢殑紼嬪簭錛屾妸榪欎釜鏁扮粍杞鎹㈡垚涓涓瀛楃︿覆灝卞ソ浜嗐傝繖鏍蜂綘灝卞彲浠ユ椂闂存瘡鏀瑰彉涓嬈′慨鏀逛竴涓鏁村艦鏁扮粍錛岀劧鍚庤皟鐢ㄤ竴嬈¤漿鎹銆 浣犲簲璇ユ槸璁╂樉紺哄湪LCD涓婇潰鍚э紝濡傛灉緙栫▼鏈夐棶棰樼殑璇濓紝鏅氫笂鍥炲幓鎴戝彲浠ュ府浣犲啓涓鐐廣

4. 我用單片機c程序寫的一個日歷,求高手幫我補充下主函數部分的年月日閏年平年的判斷條件

year++;
if(((year%100)==0)&&((year%400)==0))||(((year%100)!=0)&&((year%4)==0))
{
February=29;//2月有29天
}
else
{
February=28;//2月有28天
}

註:符合磨做氏下面兩種情況中的一種就是潤年:1.能被100整除而且能被400整除瞎散胡灶
2.不能被100整除但是能被4整除

5. 電子日歷單片機製作

實現日歷的顯示、鬧鍾設置、日期和時間的設置功能

6. 51單片機 製作 日歷時鍾 用匯編語言 要詳細的代碼和硬體圖示

你好這是基於DS1302日歷時鍾的單片機匯編程序 51單片機
ORG 0000H
MOV SP,#30H
LOAD EQU P2.0
CLR LOAD
MOV R0,#0FH
MOV R1,#0AH ;亮度
ACALL TRT

MOV R0,#02H
MOV R1,#0BH ;掃描位數
ACALL TRT

MOV R0,#0FFH
MOV R1,#09H ;解碼
ACALL TRT

MOV R0,#01H
MOV R1,#0CH
CALL TRT
SETB P1.0
MOV 22H,#00H
;以下為按鍵掃描輸入初值子程序
KEYSET: MOV 73H,#01H ;設溫度初值為10度
MOV 74H,#00H
MOV 75H,#00H
CALL DISPLAY
KEY1: CALL KS1 ;調判斷有無鍵按下子程序
JNZ LK1 ;有鍵按下(A)<>0轉消抖延時
AJMP KEY1 ;無鍵按下返回,等鍵按下
LK1: CALL DEL10MS ;延時
CALL KS1 ;若有鍵按下則為真實按下
JNZ KEYI ;鍵按下(A)<>0轉鍵掃描
AJMP KEY1 ;不是鍵按下返回
KEYI: JNB ACC.0,KEYR ;加1鍵未按下,轉查減1鍵
LK2: CALL KS1 ;等待鍵釋放
CALL DEL10MS
JNZ LK2 ;未釋放,等待
INC 75H ;末位加1
MOV A,75H
CJNE A,#0AH,PPA
MOV 75H,#00H
INC 74H
MOV A,74H
CJNE A,#0AH,PPA
MOV 74H,#00H
INC 73H
PPA: CALL DISPLAY
AJMP KEY1 ;轉再次掃描
KEYR: JNB ACC.1,KEYH ;減1鍵未按下,轉查上限確認鍵
LK3: CALL KS1
CALL DEL10MS
JNZ LK3
MOV A,75H
CJNE A,#00H,PPC
MOV 75H,#09H
MOV A,74H
CJNE A,#00H,PPD
MOV 74H,#09H
DEC 73H
AJMP PPB
PPD: DEC 74H
AJMP PPB
PPC: DEC 75H
PPB: CALL DISPLAY
AJMP KEY1 ;再次掃描
KEYH: JNB ACC.2,KEYL ;上限鍵未按下,轉查下限確認鍵
LK4: CALL KS1
CALL DEL10MS
JNZ LK4
MOV A,73H
MOV 70H,A ;保存上限
MOV A,74H
MOV 71H,A
MOV A,75H
MOV 72H,A
AJMP KEY1
;KEYL: JNB ACC.3,KEY1
LK5: CALL KS1
CALL DEL10MS
JNZ LK5
MOV A,73H
MOV 6DH,A ;保存下限
MOV A,74H
MOV 6EH,A
MOV A,75H
MOV 6FH,A

EX_CON: ;CPL P1.3 ;使用儀器測試時用
CALL DS18B20 ;轉DS18B20采樣子程序
CALL DISPLAY
;以下為後向通道控制部分
CONTROL:MOV A,73H
CJNE A,6DH,NEQA
MOV A,74H
CJNE A,6EH,NEQB
CLR P1.5
CLR P1.6
JMP EX_CON ;樣溫=下限,返回採樣
NEQA: JNC NEQD ;CY=0,即(73H)>(6DH)時轉比上限
SETB P1.5
CLR P1.6
JMP EX_CON
NEQB: JNC NEQD
SETB P1.5
CLR P1.6
JMP EX_CON
NEQD: MOV A,73H
CJNE A,70H,NEQE
MOV A,74H
CJNE A,71H,NEQF
CLR P1.5
CLR P1.6
JMP EX_CON ;樣溫=上限,返回採樣
NEQE: JNC NEQH ;CY=0,即(73H)>(70H)時轉打開降溫開關
CLR P1.5
CLR P1.6
JMP EX_CON
NEQF: JNC NEQH
CLR P1.5
CLR P1.6
JMP EX_CON
NEQH: CLR P1.5
SETB P1.6
JMP EX_CON

KS1: MOV P0,#0FFH
MOV A,P0
CPL A
ANL A,#0FH
RET
DEL10MS:MOV R7,#20
S2: MOV R6,#250
S1: DJNZ R6,S1
DJNZ R7,S2
RET

;以下為顯示
DISPLAY:MOV A,73H ;字碼
MOV R0,A
MOV R1,#01H ;位置
ACALL TRT

MOV A,74H
MOV R0, A
MOV R1,#02H
ACALL TRT

MOV A,75H
MOV R0,A
MOV R1,#03H
ACALL TRT
RET
;JMP DIS

DS18B20:LCALL RESET ;測試溫度探頭存在否?
MOV A,#0CCH
LCALL WRITE
MOV A,#44H
LCALL WRITE ;命令字寫入探頭內
MOV R7,#70D ;延時
CALL DE11
LCALL RESET
MOV A,#0CCH
LCALL WRITE
MOV A,#0BEH
LCALL WRITE
LCALL READ ;讀取探頭內的溫度值
MOV B,A
MOV 21H,A ;保存溫度值低位
LCALL READ
MOV 20H,A ;保存溫度值高位
LCALL EXCHANG ;溫度值B轉D並送入顯示緩存
RET

RESET:
LA: SETB P1.0 ;復位
NOP
LB: CLR P1.0 ;480US < TS < 960US
MOV R7,#36D
CALL DE11
SETB P1.0 ;60US < T <90US
LC: MOV R7,#6D
CALL DE11
CLR C
ORL C,P1.0
JC LB
LF: MOV R7,#18D ;T > 270
CALL DE11
SETB P1.0
RET

WRITE:
MOV R3,#8
WR1: SETB P1.0
CLR P1.0 ;延時
MOV R4,#2
WR2: DJNZ R4,WR2
RRC A
MOV P1.0,C ;寫的數據在線上需延時
MOV R4,#18
WR3: DJNZ R4,WR3
NOP
SETB P1.0
DJNZ R3,WR1
SETB P1.0
RET

READ:
MOV R3,#8
RD1: CLR C
SETB P1.0 ;適當延時
NOP
NOP
CLR P1.0 ;適當延時
NOP
NOP
SETB P1.0 ;延時
MOV R4,#9
RD2: DJNZ R4,RD2
MOV C,P1.0
RRC A
MOV R5,#23
RD3: DJNZ R5,RD3
DJNZ R3,RD1
RET

DELAY: MOV R7,#10
DL2: MOV R6,#200
DL1: MOV R5,#250
DL0: DJNZ R5,DL0
DJNZ R6,DL1
DJNZ R7,DL2
RET

EXCHANG: MOV A,21H
SWAP A
ANL A,#0FH
MOV 24H,A
MOV A,20H
ANL A,#07H
SWAP A
ADD A,24H
MOV B,#10D
DIV AB
MOV 73H,A
MOV 74H,B
MOV A,21H
ANL A,#0FH
mov dptr,#SADDR ;小數部分的轉換查表
movc a,@a+dptr
MOV 75H,A
ret
SADDR: DB 00H,1H,02h ; bo_ying address in eeprom 0800h-0A08H
DB 03H,3H,04h ; da_ling address in eeprom 0A10H-0AD3H
DB 04H,05H,06h ;shou_ying address in eeprom 0AE0H-0C25H
DB 06H,7H,08h ; lu_ying address in eeprom 0C30H-0D75H
DB 08H,9H,9h,9H

DELAY15US: ;12MHZ ,15US
DE11: NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,DE11
RET

TRT: CLR P2.0 ;LOAD
MOV R2,#08H
MOV A,R1
T_1: CLR P2.2 ;SETB P2.2 ;CLK
RLC A
MOV P2.1,C ;DATA
CALL TDELAY
SETB P2.2 ;CLR P2.2
DJNZ R2,T_1
CALL TDELAY
MOV R2, #08H
MOV A,R0
TT2: CLR P2.2 ;SETB P2.2
RLC A
MOV P2.1,C
CALL TDELAY
SETB P2.2 ;CLR P2.2
DJNZ R2,TT2
SETB P2.0 ;CLR P2.0
RET

TDELAY: MOV R6,#01H
TMS0: MOV R7,#03H
TMS1: DJNZ R7,TMS1
DJNZ R6,TMS0
RET

7. 基於51系列的單片機和DS1302時鍾晶元以及液晶顯示的lcd1602電子萬年歷畢業設計,萬分感謝。

#include<reg51.h>
#include"DS18B20_3.H"
#define uint unsigned int
#define uchar unsigned char
uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
//flag用於讀取頭文件中的溫度值,和顯示溫度值

#define yh 0x80 //LCD第一行的初始位置,因為LCD1602字元地址首位D7恆定為1(100000000=80)
#define er 0x80+0x40 //LCD第二行初始位置(因為第二行第一個字元位置地址是0x40)

//液晶屏的與C51之間的引腳連接定義(顯示數據線接C51的P0口)
sbit rs=P1^0;
sbit en=P1^2;
sbit rw=P1^1; //如果硬體上rw接地,就不用寫這句和後面的rw=0了
sbit led=P3^7; //LCD背光開關

//DS1302時鍾晶元與C51之間的引腳連接定義
sbit IO=P2^2;
sbit SCLK=P2^1;
sbit RST=P2^2;

sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
/************************************************************
ACC累加器=A
ACC.0=E0H

ACC.0就是ACC的第0位。Acc可以位定址。

累加器ACC是一個8位的存儲單元,是用來放數據的。但是,這個存儲單元有其特殊的地位,
是單片機中一個非常關鍵的單元,很多運算都要通過ACC來進行。以後在學習指令時,
常用A來表示累加器。但有一些地方例外,比如在PUSH指令中,就必須用ACC這樣的名字。
一般的說法,A代表了累加器中的內容、而ACC代表的是累加器的地址。
***************************************************************/

//校時按鍵與C51的引腳連接定義
sbit key1=P2^4; //設置鍵
sbit key2=P2^5; //加鍵
sbit key3=P2^6; //減鍵

sbit buzzer=P2^0;//蜂鳴器,通過三極體9012驅動,埠低電平響

/**************************************************************/

uchar code tab1[]={"20 - - "}; //年顯示的固定字元
uchar code tab2[]={" : : "};//時間顯示的固定字元

//延時函數,後面經常調用
void delay(uint xms)//延時函數,有參函數
{
uint x,y;
for(x=xms;x>0;x--)
for(y=120;y>0;y--);
}

/********液晶寫入指令函數與寫入數據函數,以後可調用**************/

/*在這個程序中,液晶寫入有關函數會在DS1302的函數中調用,所以液晶程序要放在前面*/

write_1602com(uchar com)//****液晶寫入指令函數****
{
rs=0;//數據/指令選擇置為指令
rw=0; //讀寫選擇置為寫
P0=com;//送入數據
delay(1);
en=1;//拉高使能端,為製造有效的下降沿做准備
delay(1);
en=0;//en由高變低,產生下降沿,液晶執行命令
}

write_1602dat(uchar dat)//***液晶寫入數據函數****
{
rs=1;//數據/指令選擇置為數據
rw=0; //讀寫選擇置為寫
P0=dat;//送入數據
delay(1);
en=1; //en置高電平,為製造下降沿做准備
delay(1);
en=0; //en由高變低,產生下降沿,液晶執行命令
}

lcd_init()//***液晶初始化函數****
{
write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
write_1602com(0x0c);//開顯示不顯示游標
write_1602com(0x06);//整屏不移動,游標自動右移
write_1602com(0x01);//清顯示

write_1602com(yh+1);//日歷顯示固定符號從第一行第1個位置之後開始顯示
for(a=0;a<14;a++)
{
write_1602dat(tab1[a]);//向液晶屏寫日歷顯示的固定符號部分
//delay(3);
}
write_1602com(er+2);//時間顯示固定符號寫入位置,從第2個位置後開始顯示
for(a=0;a<8;a++)
{
write_1602dat(tab2[a]);//寫顯示時間固定符號,兩個冒號
//delay(3);
}

}

/*********************over***********************/

/***************DS1302有關子函數********************/

void write_byte(uchar dat)//寫一個位元組
{
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte()//讀一個位元組
{
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;

}
return (ACC);
}
//----------------------------------------
void write_1302(uchar add,uchar dat)//向1302晶元寫函數,指定寫入地址,數據
{

RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add)//從1302讀數據函數,指定讀取數據來源地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)//BCD碼轉十進制函數,輸入BCD,返回十進制
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
//--------------------------------------
void ds1302_init() //1302晶元初始化子函數(2010-01-07,12:00:00,week4)
{
RST=0;
SCLK=0;

write_1302(0x8e,0x00); //允許寫,禁止防寫
write_1302(0x80,0x00); //向DS1302內寫秒寄存器80H寫入初始秒數據00
write_1302(0x82,0x00);//向DS1302內寫分寄存器82H寫入初始分數據00
write_1302(0x84,0x12);//向DS1302內寫小時寄存器84H寫入初始小時數據12
write_1302(0x8a,0x04);//向DS1302內寫周寄存器8aH寫入初始周數據4
write_1302(0x86,0x07);//向DS1302內寫日期寄存器86H寫入初始日期數據07
write_1302(0x88,0x01);//向DS1302內寫月份寄存器88H寫入初始月份數據01
write_1302(0x8c,0x10);//向DS1302內寫年份寄存器8cH寫入初始年份數據10
write_1302(0x8e,0x80); //打開防寫

}

//------------------------------------
//溫度顯示子函數
void write_temp(uchar add,uchar dat)//向LCD寫溫度數據,並指定顯示位置
{
uchar gw,sw;
gw=dat%10;//取得個位數字
sw=dat/10;//取得十位數字
write_1602com(er+add);//er是頭文件規定的值0x80+0x40
write_1602dat(0x30+sw);//數字+30得到該數字的LCD1602顯示碼
write_1602dat(0x30+gw);//數字+30得到該數字的LCD1602顯示碼
write_1602dat(0xdf);//顯示溫度的小圓圈符號,0xdf是液晶屏字元庫的該符號地址碼
write_1602dat(0x43); //顯示"C"符號,0x43是液晶屏字元庫里大寫C的地址碼
}

//------------------------------------
//時分秒顯示子函數
void write_sfm(uchar add,uchar dat)//向LCD寫時分秒,有顯示位置加、現示數據,兩個參數
{
uchar gw,sw;
gw=dat%10;//取得個位數字
sw=dat/10;//取得十位數字
write_1602com(er+add);//er是頭文件規定的值0x80+0x40
write_1602dat(0x30+sw);//數字+30得到該數字的LCD1602顯示碼
write_1602dat(0x30+gw);//數字+30得到該數字的LCD1602顯示碼

}

//-------------------------------------
//年月日顯示子函數
void write_nyr(uchar add,uchar dat)//向LCD寫年月日,有顯示位置加數、顯示數據,兩個參數

{
uchar gw,sw;
gw=dat%10;//取得個位數字
sw=dat/10;//取得十位數字
write_1602com(yh+add);//設定顯示位置為第一個位置+add
write_1602dat(0x30+sw);//數字+30得到該數字的LCD1602顯示碼
write_1602dat(0x30+gw);//數字+30得到該數字的LCD1602顯示碼

}

//-------------------------------------------
void write_week(uchar week)//寫星期函數
{
write_1602com(yh+0x0c);//星期字元的顯示位置
switch(week)
{
case 1:write_1602dat('M');//星期數為1時,顯示
write_1602dat('O');
write_1602dat('N');
break;

case 2:write_1602dat('T');//星期數據為2時顯示
write_1602dat('U');
write_1602dat('E');
break;

case 3:write_1602dat('W');//星期數據為3時顯示
write_1602dat('E');
write_1602dat('D');
break;

case 4:write_1602dat('T');//星期數據為4是顯示
write_1602dat('H');
write_1602dat('U');
break;

case 5:write_1602dat('F');//星期數據為5時顯示
write_1602dat('R');
write_1602dat('I');
break;

case 6:write_1602dat('S');//星期數據為6時顯示
write_1602dat('T');
write_1602dat('A');
break;

case 7:write_1602dat('S');//星期數據為7時顯示
write_1602dat('U');
write_1602dat('N');
break;

}

}

//****************鍵盤掃描有關函數**********************

void keyscan()
{
if(key1==0)//---------------key1為功能鍵(設置鍵)--------------------
{
delay(9);//延時,用於消抖動
if(key1==0)//延時後再次確認按鍵按下
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
while(!key1);
key1n++;
if(key1n==9)
key1n=1;//設置按鍵共有秒、分、時、星期、日、月、年、返回,8個功能循環
switch(key1n)
{

case 1: TR0=0;//關閉定時器
//TR1=0;
write_1602com(er+0x09);//設置按鍵按動一次,秒位置顯示游標
write_1602com(0x0f);//設置游標為閃爍
temp=(miao)/10*16+(miao)%10;//秒數據寫入DS1302
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80);
break;
case 2: write_1602com(er+6);//按2次fen位置顯示游標

//write_1602com(0x0f);
break;
case 3: write_1602com(er+3);//按動3次,shi
//write_1602com(0x0f);
break;
case 4: write_1602com(yh+0x0e);//按動4次,week
//write_1602com(0x0f);
break;
case 5: write_1602com(yh+0x0a);//按動5次,ri
//write_1602com(0x0f);
break;
case 6: write_1602com(yh+0x07);//按動6次,yue
//write_1602com(0x0f);
break;
case 7: write_1602com(yh+0x04);//按動7次,nian
//write_1602com(0x0f);
break;
case 8:
write_1602com(0x0c);//按動到第8次,設置游標不閃爍
TR0=1;//打開定時器
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao數據寫入DS1302
write_1302(0x8e,0x80);
break;

}

}

}
//------------------------------加鍵key2----------------------------
if(key1n!=0)//當key1按下以下。再按以下鍵才有效(按鍵次數不等於零)
{

if(key2==0) //上調鍵
{
delay(10);
if(key2==0)
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
while(!key2);
switch(key1n)
{
case 1:miao++;//設置鍵按動1次,調秒
if(miao==60)
miao=0;//秒超過59,再加1,就歸零
write_sfm(0x08,miao);//令LCD在正確位置顯示"加"設定好的秒數
temp=(miao)/10*16+(miao)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00); //允許寫,禁止防寫
write_1302(0x80,temp); //向DS1302內寫秒寄存器80H寫入調整後的秒數據BCD碼
write_1302(0x8e,0x80); //打開防寫
write_1602com(er+0x09);//因為設置液晶的模式是寫入數據後,游標自動右移,所以要指定返回
//write_1602com(0x0b);
break;
case 2:fen++;
if(fen==60)
fen=0;
write_sfm(0x05,fen);//令LCD在正確位置顯示"加"設定好的分數據
temp=(fen)/10*16+(fen)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x82,temp);//向DS1302內寫分寄存器82H寫入調整後的分數據BCD碼
write_1302(0x8e,0x80);//打開防寫
write_1602com(er+6);//因為設置液晶的模式是寫入數據後,指針自動加一,在這里是寫回原來的位置
break;
case 3:shi++;
if(shi==24)
shi=0;
write_sfm(2,shi);//令LCD在正確的位置顯示"加"設定好的小時數據
temp=(shi)/10*16+(shi)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x84,temp);//向DS1302內寫小時寄存器84H寫入調整後的小時數據BCD碼
write_1302(0x8e,0x80);//打開防寫
write_1602com(er+3);//因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C);//指定'加'後的周數據顯示位置
write_week(week);//指定周數據顯示內容
temp=(week)/10*16+(week)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x8a,temp);//向DS1302內寫周寄存器8aH寫入調整後的周數據BCD碼
write_1302(0x8e,0x80);//打開防寫
write_1602com(yh+0x0e);//因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;
case 5:ri++;
if(ri==32)
ri=1;
write_nyr(9,ri);//令LCD在正確的位置顯示"加"設定好的日期數據
temp=(ri)/10*16+(ri)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x86,temp);//向DS1302內寫日期寄存器86H寫入調整後的日期數據BCD碼
write_1302(0x8e,0x80);//打開防寫
write_1602com(yh+10);//因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);//令LCD在正確的位置顯示"加"設定好的月份數據
temp=(yue)/10*16+(yue)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x88,temp);//向DS1302內寫月份寄存器88H寫入調整後的月份數據BCD碼
write_1302(0x8e,0x80);//打開防寫
write_1602com(yh+7);//因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;
case 7:nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);//令LCD在正確的位置顯示"加"設定好的年份數據
temp=(nian)/10*16+(nian)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x8c,temp);//向DS1302內寫年份寄存器8cH寫入調整後的年份數據BCD碼
write_1302(0x8e,0x80);//打開防寫
write_1602com(yh+4);//因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;

}

}

}
//------------------減鍵key3,各句功能參照'加鍵'注釋---------------
if(key3==0)
{
delay(10);//調延時,消抖動
if(key3==0)
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
while(!key3);
switch(key1n)
{
case 1:miao--;
if(miao==-1)
miao=59;//秒數據減到-1時自動變成59
write_sfm(0x08,miao);//在LCD的正確位置顯示改變後新的秒數
temp=(miao)/10*16+(miao)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00); //允許寫,禁止防寫
write_1302(0x80,temp); //向DS1302內寫秒寄存器80H寫入調整後的秒數據BCD碼
write_1302(0x8e,0x80); //打開防寫
write_1602com(er+0x09);//因為設置液晶的模式是寫入數據後,指針自動加一,在這里是寫回原來的位置
//write_1602com(0x0b);
break;
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(5,fen);
temp=(fen)/10*16+(fen)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x82,temp);//向DS1302內寫分寄存器82H寫入調整後的分數據BCD碼
write_1302(0x8e,0x80);//打開防寫
write_1602com(er+6);//因為設置液晶的模式是寫入數據後,指針自動加一,在這里是寫回原來的位置
break;

case 3:shi--;
if(shi==-1)
shi=23;
write_sfm(2,shi);
temp=(shi)/10*16+(shi)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x84,temp);//向DS1302內寫小時寄存器84H寫入調整後的小時數據BCD碼
write_1302(0x8e,0x80);//打開防寫
write_1602com(er+3);//因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;
case 4:week--;
if(week==0)
week=7;

write_1602com(yh+0x0C);//指定'加'後的周數據顯示位置
write_week(week);//指定周數據顯示內容
temp=(week)/10*16+(week)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x8a,temp);//向DS1302內寫周寄存器8aH寫入調整後的周數據BCD碼
write_1302(0x8e,0x80);//打開防寫
write_1602com(yh+0x0e);//因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;
case 5:ri--;
if(ri==0)
ri=31;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x86,temp);//向DS1302內寫日期寄存器86H寫入調整後的日期數據BCD碼
write_1302(0x8e,0x80);//打開防寫
write_1602com(yh+10);//因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;
case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x88,temp);//向DS1302內寫月份寄存器88H寫入調整後的月份數據BCD碼
write_1302(0x8e,0x80);//打開防寫
write_1602com(yh+7);//因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;
case 7:nian--;
if(nian==-1)
nian=99;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x8c,temp);//向DS1302內寫年份寄存器8cH寫入調整後的年份數據BCD碼
write_1302(0x8e,0x80);//打開防寫
write_1602com(yh+4);//因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;

}

}

}

}

}

//-------------------------------
void init() //定時器、計數器設置函數
{
TMOD=0x11; //指定定時/計數器的工作方式為3
TH0=0; //定時器T0的高四位=0
TL0=0; //定時器T0的低四位=0
EA=1; //系統允許有開放的中斷
ET0=1; //允許T0中斷
TR0=1; //開啟中斷,啟動定時器

}

//*******************主函數**************************
//***************************************************
void main()
{
lcd_init(); //調用液晶屏初始化子函數
ds1302_init(); //調用DS1302時鍾的初始化子函數
init(); //調用定時計數器的設置子函數
led=0; //打開LCD的背光電源
buzzer=0;//蜂鳴器長響一次
delay(80);
buzzer=1;
while(1) //無限循環下面的語句:
{

keyscan(); //調用鍵盤掃描子函數

}
}

void timer0() interrupt 1 //取得並顯示日歷和時間
{

//Init_DS18B20();//溫度感測器DS18b2初始化子函數,在頭文件中
flag=ReadTemperature();//將18b2頭文件運行返回的函數結果送到變數FLAG中,用於顯示

//讀取秒時分周日月年七個數據(DS1302的讀寄存器與寫寄存器不一樣):

miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));

//顯示溫度、秒、時、分數據:

write_temp(12,flag);//顯示溫度,從第二行第12個字元後開始顯示
write_sfm(8,miao);//秒,從第二行第8個字後開始顯示(調用時分秒顯示子函數)
write_sfm(5,fen);//分,從第二行第5個字元後開始顯示
write_sfm(2,shi);//小時,從第二行第2個字元後開始顯示

//顯示日、月、年數據:
write_nyr(9,ri);//日期,從第二行第9個字元後開始顯示
write_nyr(6,yue);//月份,從第二行第6個字元後開始顯示
write_nyr(3,nian);//年,從第二行第3個字元後開始顯示
write_week(week);

}

閱讀全文

與基於單片機的日歷設計方案相關的資料

熱點內容
程序員那麼可愛渣男 瀏覽:669
韓les電影 瀏覽:322
a7怎麼安裝app 瀏覽:172
電影電視劇網站免費網址 瀏覽:324
Python如何下載cv2庫 瀏覽:307
phpmcryptencrypt 瀏覽:799
魔術家app怎麼設置 瀏覽:401
headerphp跳轉頁面 瀏覽:549
支持oled的單片機 瀏覽:524
3d卡通電影 瀏覽:894
老公經常看片自己解決也不找我 瀏覽:716
內地漏點電影 瀏覽:51
日本的跟飛機杯里放頭發的電影 瀏覽:680
python免費工具 瀏覽:310
最新電影在線觀看網址免費 瀏覽:125
雲伺服器試用在線選購 瀏覽:985
台灣的同性電影 瀏覽:633
船上收費電影剛生完孩子然後 瀏覽:379
黃色恐怖片 瀏覽:206
如何將頁面轉成app 瀏覽:428