標(biāo)題: 基于51單片機(jī)的萬年歷設(shè)計(jì) [打印本頁]

作者: disable    時(shí)間: 2017-6-6 10:54
標(biāo)題: 基于51單片機(jī)的萬年歷設(shè)計(jì)



電子萬年歷是一種非常廣泛日常計(jì)時(shí)工具,給人們的帶來了很大的方便,在社會(huì)上越來越流行。 它可以對(duì)年、月、日、時(shí)、分、秒進(jìn)行計(jì)時(shí),采用直觀的數(shù)字顯示,可以同時(shí)顯示年月日時(shí)分秒和溫度等信息,還有時(shí)間校準(zhǔn)、鬧鐘等功能。該電子萬年歷主要采用STC89C52單片機(jī)作為主控核心,用DS1302時(shí)鐘芯片作為時(shí)鐘、液晶12864顯示屏顯示。STC89C52單片機(jī)是由宏晶公司推出的,功耗小,電壓可選用46V電壓供電;DS1302時(shí)鐘芯片是美國DALLAS公司推出的具有細(xì)電流充電功能的低功耗實(shí)時(shí)時(shí)鐘芯片,它可以對(duì)年、月、日、星期、時(shí)、分、秒進(jìn)行計(jì)時(shí),還具有閏年補(bǔ)償?shù)榷喾N功能,而且DS1302的使用壽命長(zhǎng),誤差小;數(shù)字顯示是采用的12864液晶顯示屏來顯示,可以同時(shí)顯示年、月、日、星期、時(shí)、分、秒和溫度等信息。此外,該電子萬年歷還具有時(shí)間校準(zhǔn)等功能。

2.1 功能要求


本萬年歷能動(dòng)態(tài)顯示年、月、日、星期、小時(shí)、分鐘、秒、溫度。

2.2 方案論證
2.2.1技術(shù)可行性
方案一:采用傳統(tǒng)的51單片機(jī)作為整個(gè)電路的控制核心。單片機(jī)算術(shù)運(yùn)算功能強(qiáng),軟件編程靈活、自由度大,可用軟件編程實(shí)現(xiàn)各種算法和邏輯控制,并且由于其功耗低、體積小、技術(shù)成熟和成本低等優(yōu)點(diǎn),使其在各個(gè)領(lǐng)域應(yīng)用廣泛。

方案二:采用FTC10F04單片機(jī),還帶有非易失性Flash程序存儲(chǔ)器。它是一種高性能、低功耗的8CMOS微處理芯片,市場(chǎng)應(yīng)用最多。其主要特點(diǎn)如下:8KB Flash ROM,可以擦除1000次以上,數(shù)據(jù)保存10年。

由于方案一已能滿足設(shè)計(jì)要求,故選用方案一。

2.2.3顯示模塊的選擇                       
方案一:使用液晶顯示屏顯示時(shí)間數(shù)字。液晶顯示屏(LCD)具有輕薄短小、低耗電量、無輻射危險(xiǎn),平面直角顯示以及影象穩(wěn)定不閃爍等優(yōu)勢(shì),可視面積大,畫面效果好,分辨率高,抗干擾能力強(qiáng)等特點(diǎn)。液晶顯示屏分兩種,一種是以點(diǎn)陣的模式顯示各種符號(hào),需要利用控制芯片創(chuàng)建字符庫,編程工作量大,控制器的資源占用較多,其成本也偏高。在使用時(shí),不能有靜電干擾,否則易燒壞液晶的顯示芯片,不易維護(hù),另外一種是帶字庫版本,省去了編程字符庫的過程操作簡(jiǎn)單便捷便于使用。

方案二:使用傳統(tǒng)的LED數(shù)碼管顯示。 數(shù)碼管具有:低能耗、低損耗、低壓、壽命長(zhǎng)、耐老化、防曬、防潮、防火、防高(低)溫,對(duì)外界環(huán)境要求低,易于維護(hù),同時(shí)其精度比較高,稱重輕,精確可靠,操作簡(jiǎn)單。數(shù)碼管采用BCD編碼顯示數(shù)字,程序編譯容易,資源占用較少。  

根據(jù)以上的論述,雖然LED的各方面性能比較好,但是目前在已有的原件中有一塊帶字庫的LCD,省去了創(chuàng)建字庫符的編程且控制相對(duì)簡(jiǎn)單,故采用方案。

2.2.4鍵盤模塊的選擇
在對(duì)日期和時(shí)間進(jìn)行切換,對(duì)日期和時(shí)間進(jìn)行調(diào)節(jié)校準(zhǔn)過程中,系統(tǒng)需要,產(chǎn)生激勵(lì)電流,因此需要用按鍵。   

方案一:使用獨(dú)立式鍵盤。獨(dú)立式鍵盤是指直接用I/O口線構(gòu)成的單個(gè)按鍵電路。獨(dú)立式按鍵電路配置靈活,軟件結(jié)構(gòu)簡(jiǎn)單。  

方案二:使用矩陣式鍵盤。矩陣式鍵盤是由行線和列線組成,按鍵位于行、列的交叉點(diǎn)上,行線、列線分別連接到按鍵開關(guān)的兩端。其特點(diǎn)是簡(jiǎn)單且不增加成本,這種鍵盤適合按鍵數(shù)量較多的場(chǎng)合。  

根據(jù)以上的論述,因本系統(tǒng)需要的按鍵不多,上下左右調(diào)節(jié)四個(gè)按鍵、功能控制兩個(gè)按鍵,要求簡(jiǎn)單。所以采用方案一獨(dú)立式鍵盤。

2.2.5 總體方案論證與選擇


3 硬件電路設(shè)計(jì)及概述
3.1 系統(tǒng)的結(jié)構(gòu)設(shè)計(jì)
本設(shè)計(jì)采用的是宏晶公司的STC89C52單片機(jī)為核心,通過單片機(jī)與時(shí)鐘芯片DS1302通信來對(duì)時(shí)間的讀寫,保證時(shí)鐘時(shí)間的穩(wěn)定性,并帶有內(nèi)部電源模塊,使系統(tǒng)斷電時(shí)時(shí)鐘數(shù)據(jù)不會(huì)丟失,以DS18B20溫度感應(yīng)芯片作為溫度電路的核心,向單片機(jī)發(fā)出獲取到的溫度數(shù)據(jù),并通過LCD12864將時(shí)間、顯示出來,并可以通過按鍵調(diào)整時(shí)間日期和鬧鐘時(shí)間。



3.1

3.2 單片機(jī)的系統(tǒng)結(jié)構(gòu)
3.2.1 單片機(jī)的內(nèi)部結(jié)構(gòu)
一個(gè)基本的MCS-51單片機(jī)通常包括:中央處理器、ROM、

RAM、定時(shí)/計(jì)數(shù)器和I/O口等各功能部件,各個(gè)功能由內(nèi)部的總線連接起來,從而實(shí)現(xiàn)數(shù)據(jù)通信。其內(nèi)部框圖如圖3.2所示



3.2

3.2.2 單片機(jī)的引腳
常見的51單片機(jī)中一般采用雙列直插(DIP)封裝,共40個(gè)引腳。圖3.3為引腳排列圖。其中的40個(gè)引腳大致可以分為4類:電源、時(shí)鐘、控制和I/O引腳。






3.2.3 最小系統(tǒng)的介紹
單片機(jī)最小系統(tǒng)主要由電源、復(fù)位、振蕩電路以及擴(kuò)展部分等部分組成。最小系統(tǒng)原理圖如圖3.4所示。




3.4

3.3 按鍵開關(guān)去抖動(dòng)
鍵盤在單片機(jī)系統(tǒng)中是一個(gè)很重要的部件。為了輸入數(shù)據(jù)、查詢和控制系統(tǒng)的工作狀態(tài),都要用到鍵盤,鍵盤是人工干預(yù)計(jì)算機(jī)的主要手段。

鍵盤可分為編碼和非編碼鍵盤兩種。編碼鍵盤采用硬件線線路來實(shí)現(xiàn)鍵盤編碼,每按下一個(gè)鍵,鍵盤能自動(dòng)生成按鍵代碼,鍵數(shù)較多,而且還具有去抖動(dòng)功能。這種鍵盤使用方便,但硬件較復(fù)雜,PC機(jī)所用的鍵盤就屬于這種。非編碼鍵盤僅提供按鍵開關(guān)工作狀態(tài),其他工作由軟件完成,這種鍵盤鍵數(shù)較少,硬件簡(jiǎn)單,一般在單片機(jī)應(yīng)用系統(tǒng)中廣泛使用。此處主要介紹該類非編碼鍵盤及其與單片機(jī)的接口。

按鍵開關(guān)在電路中的連接如圖3.5a)所示。按鍵未按下時(shí),A點(diǎn)電位為高電平5V;按鍵按下時(shí),A點(diǎn)電位為低電平。A點(diǎn)電位就用于向CPU傳遞按鍵的開關(guān)狀態(tài)。但是由于按鍵的結(jié)構(gòu)為機(jī)械彈性開關(guān),在按鍵按下和斷開時(shí),觸點(diǎn)在閉合和斷開瞬間還會(huì)接觸不穩(wěn)定,引起A點(diǎn)電平不穩(wěn)定,如圖3.5b)所示,鍵盤的抖動(dòng)時(shí)間一般為510ms,抖動(dòng)現(xiàn)象會(huì)引起CPU對(duì)一次鍵操作進(jìn)行多次處理,從而可能產(chǎn)生錯(cuò)誤。因此必須設(shè)法消除抖動(dòng)的不良后果。




消除抖動(dòng)的不良后果的方法有硬、軟件兩種。

為了節(jié)省硬件,通常在單片機(jī)系統(tǒng)中,一般不采用硬件方法消除鍵的抖動(dòng),而是用軟件消除抖動(dòng)的方法。根據(jù)抖動(dòng)特性,在第一次檢測(cè)到按鍵按下后,執(zhí)行一段延時(shí)5~10ms讓前延抖動(dòng)消失后再一次檢測(cè)鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認(rèn)真正有鍵按下。當(dāng)檢測(cè)到按鍵釋放后,也要給5~10ms的延時(shí),待后延抖動(dòng)消失后才轉(zhuǎn)入該鍵處理程序。

3.4 鍵盤掃描控制方式
在單片機(jī)應(yīng)用系統(tǒng)中,對(duì)鍵盤的處理工作僅是CPU工作內(nèi)容的一部分,CPU還要進(jìn)行數(shù)據(jù)處理、顯示和其他輸入輸出操作,因此鍵盤處理工作既不能占用CPU太多時(shí)間,又需要CPU對(duì)鍵盤操作及時(shí)作出響應(yīng)。CPU對(duì)鍵盤處理控制的工作方式有以下幾種:


程序控制掃描方式是在CPU工作空余,調(diào)用鍵盤掃描子程序,響應(yīng)鍵輸入信號(hào)要求。

2 定時(shí)控制掃描方式

定時(shí)控制掃描方式是利用定時(shí)/計(jì)數(shù)器每隔一段時(shí)間產(chǎn)生定時(shí)中斷,CPU響應(yīng)中斷后對(duì)鍵盤進(jìn)行掃描,并在有鍵閉合時(shí)轉(zhuǎn)入該鍵的功能子程序。

3)中斷控制掃描方式

中斷控制掃描方式是利用外部中斷源,響應(yīng)輸入信號(hào)。當(dāng)無按鍵按下時(shí),CPU執(zhí)行正常工作程序。當(dāng)有按鍵按下時(shí),CPU立即產(chǎn)生中斷。在中斷服務(wù)子程序中掃描鍵盤,判斷是哪一個(gè)鍵被按下,然后執(zhí)行該鍵的功能子程序。這種控制方式克服了前兩種控制方式可能產(chǎn)生的空掃描和不能及時(shí)響應(yīng)鍵輸入的缺點(diǎn),既能及時(shí)處理鍵輸入,又能提高CPU運(yùn)行效率,但要占用一個(gè)寶貴的中斷資源。

因?yàn)闀r(shí)間的走時(shí)需要不斷的進(jìn)行掃描,并且在任何時(shí)刻都可能進(jìn)行時(shí)間調(diào)整,所以需要按鍵在任何時(shí)候都能控制整個(gè)系統(tǒng),故采用中斷掃描方式。

3.5  DS1302工作方式簡(jiǎn)介及數(shù)據(jù)操作原理
DS1302可以對(duì)年、月、日、星期、時(shí)、分、秒進(jìn)行計(jì)時(shí), 且具有閏年補(bǔ)償功能, 工作電壓寬達(dá)2.5~5.5V。采用三線接口與CPU進(jìn)行同步通信, 并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。DS1302內(nèi)部有一個(gè)33x8的用于臨時(shí)性存放數(shù)據(jù)的RAM寄存器。DS1302是的DS1202升級(jí)產(chǎn)品, DS1202兼容, 但增加了主電源/后背電源雙電源引腳, 同時(shí)提供了對(duì)后背電源進(jìn)行涓細(xì)電流充電的能力。

file:///C:/Users/13909/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg

3.6


DS1302在任何數(shù)據(jù)傳送時(shí)必須先初始化,把RST腳置為高電平,然后把8位地址和命令字裝入移位寄存器,數(shù)據(jù)在SCLK的上升沿被訪問到。在開始8個(gè)時(shí)鐘周期,把命令字節(jié)裝入移位寄存器后,另外的時(shí)鐘周期在讀操作時(shí)輸出數(shù)據(jù),在寫操作時(shí)寫入數(shù)據(jù)。時(shí)鐘脈沖的個(gè)數(shù)在單字節(jié)方式下為8+8,在多字節(jié)方式下為8+字節(jié)數(shù),最大可達(dá)248字節(jié)數(shù)。如果在傳送過程中置RST腳為低電平,則會(huì)終止本次數(shù)據(jù)傳送,并且I/O引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在Vcc2.5V之前,RST腳必須保持低電平。只有在SCLK為低電平時(shí),才能將RST置為高電平。

DS1302的控制字如圖所示?刂谱止(jié)的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中。位6如果為0,則表示存取日歷時(shí)鐘數(shù)據(jù);為1則表示存取RAM數(shù)據(jù)。位51A4A0)指示操作單元的地址。最低有效位(位0)如果為0,則表示藥進(jìn)行寫操作;為1表示進(jìn)行讀操作?刂谱止(jié)總是從最低位開始輸入/輸出。

為了提高對(duì)32個(gè)地址尋址能力(地址/命令位15=邏輯1,可以把時(shí)鐘/日歷或RAM寄存器規(guī)定為多字節(jié)(burst)方式。位6規(guī)定時(shí)鐘或RAM,而位0規(guī)定讀或?qū)。在時(shí)鐘/日歷寄存器中的地址931RAM寄存器中的地址31不能存儲(chǔ)數(shù)據(jù)。在多字節(jié)方式下,讀或?qū)憦牡刂?/font>0的位0開始。必須按數(shù)據(jù)傳送的次序?qū)懽钕鹊?/font>8個(gè)寄存器。但是,當(dāng)以多字節(jié)方式寫RAM時(shí),為了傳送數(shù)據(jù)不必寫所有的31字節(jié),不管是否寫了全部31字節(jié),所寫的每一字節(jié)都將傳送至RAM。

DS1302共有12個(gè)寄存器,其中有7個(gè)寄存器與日歷、時(shí)鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式。其日歷、時(shí)間寄存器及其控制字如下表所示,其中奇數(shù)為讀操作,偶數(shù)為寫操作。


3.7


時(shí)鐘暫停:秒寄存器的位7定義位時(shí)鐘暫停位。當(dāng)它為1時(shí),DS1302停止振蕩,進(jìn)入低功耗的備份方式,通常在對(duì)DS1302進(jìn)行寫操作時(shí)(如進(jìn)入時(shí)鐘調(diào)整程序),停止振蕩。當(dāng)它為0時(shí),時(shí)鐘將開始啟動(dòng)。

AM-PM/12-24小時(shí)方式:小時(shí)寄存器的位7定義為1224小時(shí)方式選擇位。它為高電平時(shí),選擇12小時(shí)方式。在此方式下,位5為第二個(gè)10小時(shí)位(2023h)。

DS1302的晶振選用32768Hz,電容推薦值為6pF。因?yàn)檎袷庮l率較低,也可以不接電容,對(duì)計(jì)時(shí)精度影響不大。

3.6 DS18B20數(shù)據(jù)原理


3.8


DS18B20測(cè)溫原理如圖3.8所示。圖中低溫度系數(shù)晶振的振蕩頻率受溫度影響很小,用于產(chǎn)生固定頻率的脈沖信號(hào)送給計(jì)數(shù)器1。高溫度系數(shù)晶振隨溫度變化其振蕩率明顯改變,所產(chǎn)生的信號(hào)作為計(jì)數(shù)器2的脈沖輸入。計(jì)數(shù)器1和溫度寄存器被預(yù)置在-55℃所對(duì)應(yīng)的一個(gè)基數(shù)值。計(jì)數(shù)器1對(duì)低溫度系數(shù)晶振產(chǎn)生的脈沖信號(hào)進(jìn)行減法計(jì)數(shù),當(dāng)計(jì)數(shù)器1的預(yù)置值減到0時(shí),溫度寄存器的值將加1,計(jì)數(shù)器1的預(yù)置將重新被裝入,計(jì)數(shù)器1重新開始對(duì)低溫度系數(shù)晶振產(chǎn)生的脈沖信號(hào)進(jìn)行計(jì)數(shù),如此循環(huán)直到計(jì)數(shù)器2計(jì)數(shù)到0時(shí),停止溫度寄存器值的累加,此時(shí)溫度寄存器中的數(shù)值即為所測(cè)溫度。斜率累加器用于補(bǔ)償和修正測(cè)溫過程中的非線性,其輸出用于修正計(jì)數(shù)器1的預(yù)置值。



  
        
預(yù)置
   
   
  

3.9

3.7 系統(tǒng)模塊介紹


4.1.1 主程序流程



4.1.2 DS1302與按鍵控制流程
4.2



4.2 程序編寫
采用Keil uVision4編譯軟件,具體程序編寫說明參照附錄1。



附錄1:程序代碼
#include<reg51.h>

#include<intrins.h>

#include<LCD1602.h>

#include<DS18b20.h>

#include<DS1302.h>

#ifndef __DS1302_H__

#define __DS1302_H__


#include<reg51.h>

#include<intrins.h>  //包含_nop_()函數(shù)定義的頭文件

#define uchar unsignedchar

#define uint unsignedint

#ifndef __LCD1602_H__

#define __LCD1602_H__


#include<reg51.H>

#include<intrins.h>  //包含_nop_()函數(shù)定義的頭文件

#define uint unsignedint

#define uchar unsignedchar

#define OUT P0   

#define yh 0x80                              

#define er0x80+0x40                          

//液晶屏的與C51之間的引腳連接定義


#ifndef __DS18b20_H__

#define __DS18b20_H__


#include<reg51.h>

#include<intrins.h>

#define uchar unsignedchar

#define uint unsignedint

uint tvalue;

uchar tflag;

sbit DQ=P3^3;

sbit rs=P2^0;

sbit en=P2^2;

sbit rw=P2^1;                               //如果硬件上rw接地,就不用寫這句和后面的rw=0

sbit BF=P0^7;



void delay_18B20(unsigned int i)

{

    while(i--);

}


void ds1820rst()

{ unsigned char x=0;

       DQ = 1;         

       delay_18B20(4);  

       DQ = 0;         

       delay_18B20(100);

       DQ = 1;         

       delay_18B20(40);   

   }  

  

   uchar ds1820rd()

  { unsigned char i=0;

       unsigned char dat = 0;

       for (i=8;i>0;i--)

       {   DQ = 0;

               dat>>=1;

    可調(diào)用**************/

uchar BusyTest(void)

  {

    bit result;

      rs=0;       //根據(jù)規(guī)定,RS為低電平,RW為高電平時(shí),可以讀狀態(tài)

    rw=1;

    en=1;       //E=1,才允許讀寫

    _nop_();  //空操作

    _nop_();

    _nop_();

    _nop_();  //空操作四個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間      

    result=BF; //將忙碌標(biāo)志電平賦給result

      en=0;

    return result;

  }

/********液晶寫入指令函數(shù)與寫入數(shù)據(jù)函數(shù),以后可調(diào)用**************/


write_1602com(uchar com)                      //****液晶寫入指令函數(shù)****

{

      while(BusyTest()==1);

      rs=0;                                    //數(shù)據(jù)/指令選擇置為指令

      rw=0;                                   //讀寫選擇置為寫

      OUT=com;                                 //送入數(shù)據(jù)

      delay(1);

      en=1;                                   //拉高使能端,為制造有效的下降沿做準(zhǔn)備

      delay(1);

      en=0;                                    //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令

}



voidwrite_1602dat(uchar dat)                       //***液晶寫入數(shù)據(jù)函數(shù)****

{

      while(BusyTest()==1);

      rs=1;                                    //數(shù)據(jù)/指令選擇置為數(shù)據(jù)

      rw=0;                                   //讀寫選擇置為寫

      OUT=dat;                                  //送入數(shù)據(jù)

      delay(1);

      en=1;                                    //en置高電平,為制造下降沿做準(zhǔn)備

      delay(1);

      en=0;                                    //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令

}


void lcd_init()                                     //***液晶初始化函數(shù)****

{

      write_1602com(0x38);                      //設(shè)置液晶工作模式,意思:16*2行顯示,5*7點(diǎn)陣,8位數(shù)據(jù)

      write_1602com(0x0c);                      //開顯示不顯示光標(biāo)

      write_1602com(0x06);                      //整屏不移動(dòng),光標(biāo)自動(dòng)右移

      write_1602com(0x01);                      //清顯示


}



#endif


//DS1302時(shí)鐘芯片與C51之間的引腳連接定義

sbit IO=P1^7;

sbit SCLK=P1^6;

sbit RST=P1^5;

sbit ACC0=ACC^0;

sbit ACC7=ACC^7;


/***************DS1302有關(guān)子函數(shù)********************/


void write_byte(uchardat)//寫一個(gè)字節(jié)

{    uchar a;

      ACC=dat;

      RST=1;

      for(a=8;a>0;a--)

      {

             IO=ACC0;

             SCLK=0;

             SCLK=1;

             ACC=ACC>>1;

      }

}

uchar read_byte()                                   //讀一個(gè)字節(jié)

{    uchar a;

      RST=1;

      for(a=8;a>0;a--)

      {

             ACC7=IO;

             SCLK=1;

             SCLK=0;

             ACC=ACC>>1;


      }

      return (ACC);

}

//----------------------------------------

void write_1302(ucharadd,uchar dat)                   //1302芯片寫函數(shù),指定寫入地址,數(shù)據(jù)

{


      RST=0;

      SCLK=0;

      RST=1;

      write_byte(add);

      write_byte(dat);

      SCLK=1;

      RST=0;

}

uchar read_1302(ucharadd)                          //1302讀數(shù)據(jù)函數(shù),指定讀取數(shù)據(jù)來源地址

{

      uchar temp;

      RST=0;

      SCLK=0;

      RST=1;

      write_byte(add);

      temp=read_byte();

      SCLK=1;

      RST=0;

      return(temp);

}

uchar BCD_Decimal(ucharbcd)                //BCD碼轉(zhuǎn)十進(jìn)制函數(shù),輸入BCD,返回十進(jìn)制

{

       uchar Decimal;

       Decimal=bcd>>4;

       return(Decimal=Decimal*10+(bcd&=0x0F));

}

//--------------------------------------

void ds1302_init()                           //1302芯片初始化子函數(shù)(2010-01-07,12:00:00,week4)

{

      RST=0;

      SCLK=0;

      

      write_1302(0x8e,0x00);                      //允許寫,禁止寫保護(hù)

      write_1302(0x80,0x00);                     //DS1302內(nèi)寫秒寄存器80H寫入初始秒數(shù)據(jù)00

      write_1302(0x82,0x00);                     //DS1302內(nèi)寫分寄存器82H寫入初始分?jǐn)?shù)據(jù)00

      write_1302(0x84,0x12);                     //DS1302內(nèi)寫小時(shí)寄存器84H寫入初始小時(shí)數(shù)據(jù)12

      write_1302(0x8a,0x05);                     //DS1302內(nèi)寫周寄存器8aH寫入初始周數(shù)據(jù)4

      write_1302(0x86,0x18);                     //DS1302內(nèi)寫日期寄存器86H寫入初始日期數(shù)據(jù)07

      write_1302(0x88,0x03);                     //DS1302內(nèi)寫月份寄存器88H寫入初始月份數(shù)據(jù)01

      write_1302(0x8c,0x16);                     //DS1302內(nèi)寫年份寄存器8cH寫入初始年份數(shù)據(jù)10

      write_1302(0x8e,0x80);                      //打開寫保護(hù)


}


#endif




      uchar     a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;

void      write_sfm(uchar  add,uchar      dat);

void      write_week(uchar       week);

void      write_nyr(uchar   add,uchar      dat);


sbit key1=P1^1;

sbit key2=P1^2;

sbit key3=P1^3;

sbit buzzer=P1^3;


uchar    code       tab1[]={"20  - -  "};

uchar    code       tab2[]={"  : :  "};


void     write_temp(uchar       add,uchar      dat)

{

      uchar     gw,sw;

      gw=dat%10;

      sw=dat/10;

      write_1602com(er+add);

      if(tflag==0)

      write_1602dat('   ');

      else

      write_1602dat('-');

      if(sw==0)

      {write_1602dat(' ');write_1602dat(0x30+gw);}

      else

      {write_1602dat(0x30+sw);

             write_1602dat(0x30+gw);}


         write_1602dat(0xdf);

         write_1602dat(0x43);

}


void      write_sfm(uchar  add,uchar      dat)

{

      uchar     gw,sw;

      gw=dat%10;

      sw=dat/10;

      write_1602com(er+add);

      write_1602dat(0x30+sw);

      write_1602dat(0x30+gw);


}


void      write_nyr(uchar   add,uchar      dat)

{

      uchar     gw,sw;

      gw=dat%10;

      sw=dat/10;

      write_1602com(yh+add);

      write_1602dat(0x30+sw);

      write_1602dat(0x30+gw);        

}


void      write_week(uchar       week)

{

      write_1602com(yh+0x0c);

      switch(week)

      {

             case 1:write_1602dat('M');

                      write_1602dat('O');

                      write_1602dat('N');

                       break;


             case 2:write_1602dat('T');

                      write_1602dat('U');

                      write_1602dat('E');

                       break;


             case 3:write_1602dat('W');

                      write_1602dat('E');

                      write_1602dat('D');

                       break;


             case 4:write_1602dat('T');

                      write_1602dat('H');

                      write_1602dat('U');

                       break;


             case 5:write_1602dat('F');

                      write_1602dat('R');

                      write_1602dat('I');

                       break;


             case 6:write_1602dat('S');

                      write_1602dat('T');

                      write_1602dat('R');

                       break;


             case 7:write_1602dat('S');

                      write_1602dat('U');

                      write_1602dat('N');

                       break;



      }


}


void      keyscan()

{

      if(key1==0)

      {

             delay(9);

             if(key1==0)

             {

                    buzzer=0;

                    delay(20);

                    buzzer=1;

                    while(!key1);

                    key1n++;

                    if(key1n==9)

                           key1n=1;

                    switch(key1n)

                    {

             case 1:    TR0=0;

                           write_1602com(er+0x09);

                           write_1602com(0x0f);

                           temp=(miao)/10*16+(miao)%10;

                           write_1302(0x8e,0x00);

                           write_1302(0x80,0x80|temp);

                           write_1302(0x8e,0x80);

                           break;

             case 2:    write_1602com(er+6);

                           break;

             case 3:write_1602com(er+3);

                           break;

             case 4:write_1602com(yh+0x0e);

                           break;

             case 5:write_1602com(yh+0x0a);

                           break;

             case 6:write_1602com(yh+0x07);

                           break;

             case 7:write_1602com(yh+0x04);

                           break;

             case 8:

                            write_1602com(0x0c);

                            TR0=1;

                            temp=(miao)/10*16+(miao)%10;

                            write_1302(0x8e,0x00);

                            write_1302(0x80,0x00|temp);

                            write_1302(0x8e,0x80);

                            break;

                    }

             }

      }



if(key1n!=0)

{

      if(key2==0)

        {

             delay(10);

             if(key2==0)

             {

                    buzzer=0;

                    delay(20);

                    buzzer=1;

                    while(!key2);


                    switch(key1n)

                    {

                    case 1:miao++;

                                  if(miao==60)

                                         miao=0;

                                         write_sfm(0x08,miao);

                                         temp=(miao)/10*16+(miao)%10;

                                         write_1302(0x8e,0x00);

                                         write_1302(0x80,temp);

                                         write_1302(0x8e,0x80);

                                         write_1602com(er+0x09);

                                         break;

                    case 2:fen++;

                                  if(fen==60)

                                         fen=0;

                                         write_sfm(0x05,fen);

                                         temp=(fen)/10*16+(fen)%10;

                                         write_1302(0x8e,0x00);

                                         write_1302(0x80,temp);

                                         write_1302(0x8e,0x80);

                                         write_1602com(er+6);

                                         break;

                    case 3:shi++;

                                  if(shi==24)

                                         shi=0;

                                         write_sfm(2,shi);

                                         temp=(shi)/10*16+(shi)%10;

                                         write_1302(0x8e,0x00);

                                         write_1302(0x80,temp);

                                         write_1302(0x8e,0x80);

                                         write_1602com(yh+0x0e);

                                         break;

                    case 4:week++;

                                  if(week==8)

                                         week=1;

                                         write_1602com(yh+0x0C);

                                         write_week(week);

                                         temp=(week)/10*16+(week)%10;

                                         write_1302(0x8e,0x00);

                                         write_1302(0x80,temp);

                                         write_1302(0x8e,0x80);

                                         write_1602com(yh+0x0e);

                                         break;

                    case 5:ri++;

                                  if(ri==32)

                                         ri=1;

                                         write_nyr(9,ri);

                                         temp=(ri)/10*16+(ri)%10;

                                         write_1302(0x8e,0x00);

                                         write_1302(0x80,temp);

                                         write_1302(0x8e,0x80);

                                         write_1602com(yh+10);

                                         break;

                    case 6:yue++;

                                  if(yue==13)

                                         yue=1;

                                         write_nyr(6,yue);

                                         temp=(yue)/10*16+(yue)%10;

                                         write_1302(0x8e,0x00);

                                         write_1302(0x80,temp);

                                         write_1302(0x8e,0x80);

                                         write_1602com(yh+7);

                                         break;

                    case 7:nian++;

                                  if(nian==100)

                                         nian=0;

                                         write_nyr(3,nian);

                                         temp=(nian)/10*16+(nian)%10;

                                         write_1302(0x8e,0x00);

                                         write_1302(0x80,temp);

                                         write_1302(0x8e,0x80);

                                         write_1602com(yh+4);

                                         break;

                    }


        }

        

  }


}



      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;

                                         write_sfm(0x08,miao);

                                         temp=(miao)/10*16+(miao)%10;

                                         write_1302(0x8e,0x00);

                                         write_1302(0x80,temp);

                                         write_1302(0x8e,0x80);

                                         write_1602com(er+0x09);

                                         break;

                    

                 case 2:fen--;

                                  if(fen==-1)

                                         fen=59;

                                         write_sfm(5,fen);

                                         temp=(fen)/10*16+(fen)%10;

                                         write_1302(0x8e,0x00);

                                         write_1302(0x80,temp);

                                         write_1302(0x8e,0x80);

                                         write_1602com(er+6);

                                         break;


                 case 3:shi--;

                                  if(shi==-1)

                                         fen=23;

                                         write_sfm(2,shi);

                                         temp=(shi)/10*16+(shi)%10;

                                         write_1302(0x8e,0x00);

                                         write_1302(0x80,temp);

                                         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;

                                         write_1302(0x8e,0x00);

                                         write_1302(0x80,temp);

                                         write_1302(0x8e,0x80);

                                         write_1602com(yh+0x0e);

                                         break;


                 case 5:ri--;

                                  if(ri==-1)

                                         ri=31;

                                         write_nyr(9,ri);

                                         temp=(ri)/10*16+(ri)%10;

                                         write_1302(0x8e,0x00);

                                         write_1302(0x80,temp);

                                         write_1302(0x8e,0x80);

                                         write_1602com(yh+10);

                                         break;


                 case 6:ri--;

                                  if(yue==0)

                                         yue=12;

                                         write_nyr(6,yue);

                                         temp=(yue)/10*16+(yue)%10;

                                         write_1302(0x8e,0x00);

                                         write_1302(0x80,temp);

                                         write_1302(0x8e,0x80);

                                         write_1602com(yh+7);

                                         break;                  

                 write_nyr(9,ri);

             write_nyr(6,yue);

          write_nyr(3,nian);

             write_week(week);

}                                                                                       

                                                                                                              

作者: 51真小白    時(shí)間: 2018-6-16 19:27
編譯出錯(cuò)啊。。。
作者: 51真小白    時(shí)間: 2018-6-17 10:33
51真小白 發(fā)表于 2018-6-16 19:27
編譯出錯(cuò)啊。。。

貌似是缺少幾個(gè)庫文件,樓主能發(fā)下相應(yīng)的那幾個(gè)嗎,我在網(wǎng)上找不到
作者: Coliny    時(shí)間: 2018-6-18 14:01
51真小白 發(fā)表于 2018-6-17 10:33
貌似是缺少幾個(gè)庫文件,樓主能發(fā)下相應(yīng)的那幾個(gè)嗎,我在網(wǎng)上找不到

請(qǐng)問你解決了嗎

作者: Coliny    時(shí)間: 2018-6-18 16:03
樓主,求發(fā)定義的三個(gè)芯片的頭文件
作者: 安史之亂    時(shí)間: 2019-1-7 23:41
不錯(cuò),值得借鑒
作者: Aqqqqq    時(shí)間: 2021-4-10 08:58
不錯(cuò),值得借鑒
作者: 曉楠?dú)懩?nbsp;   時(shí)間: 2021-6-12 22:27
有頭文件嗎?




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1