久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2529|回復: 1
打印 上一主題 下一主題
收起左側

基于BQ26500電池測量設計論文與源碼下載

[復制鏈接]
跳轉到指定樓層
樓主
ID:336398 發表于 2018-5-23 12:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
摘要

鋰離子電池與其他種類的電池相比有著諸多優勢,已經成為我們日常生活中必不可少的一部分。相信在使用鋰離子電池的過程中,我們常會考慮還剩多少電量的問題,但是又找不到好的電量檢測方法,針對該要求,本文設計了一種基于單片機的鋰離子電池電量檢測系統,該檢測系統可以滿足我們日常生活中對鋰離子電池電量檢測的需求,以全面掌握鋰離子電池的電量狀態。
本文主要敘述了基于單片機的鋰離子電池電量檢測系統的研究和設計,該系統主要由模擬量采集、鋰離子電池檢測模塊、單片機模塊、以及LED驅動顯示電量等相應的部分組成,介紹了鋰離子電池的特點、電池電量檢測原理、系統的結構及性能,重點介紹了該系統的軟硬件設計等。
考慮到檢測系統的復雜程度、精確性、可靠性等各個方面,本文介紹的設計方案能夠滿足我們對鋰離子電池電量檢測的要求。隨著電力系統電量的日益擴大和電壓運行等級的不斷提高,傳統的電量檢測系統暴露出越來越多的缺點,難以滿足現代電網向自動化、數字化發展的需要。本文首先概述了系統的設計,LCD顯示部分方面的設計。然后介紹了AT89C51和BQ26500中電子接口的各項特性,同時對單元的結構原理和功能劃分進行了分析和研究,提出了軟件系統方面的設計方案,主程序和子程序的流程方案。
目錄

摘要

abstract

1. 緒論

1.1 研究背景

1.2研究意義

1.3 主要研究內容

2. 總體方案設計

2.1方案選擇

2.2 LCD顯示部分

2.2.1 LCD12864 概述

2.2.2 LCD12864基本用途

2.3  電池電量檢測芯片BQ26500

2.3.1 測量原理

2.3.2  電路圖設計

2.4  數據傳輸存儲芯片24C64

2.4.1  24C64概述

2.4.2  24C64引腳說明

2.4.3  24C64特性介紹

2.5  時鐘芯片DS1302

2.5.1  DS1302概述

2.5.2  DS1302引腳說明

3.軟件系統設計            

3.1 C語言簡介            

3.2  程序設計流程

3.2.1  初始化

3.2.2  主程序流程圖

3.2.3A/D轉換與中斷服務

3.3  BQ26500總線時序

4.總結

致謝

參考文獻

附錄



1. 緒論
1.1 研究背景
電池(電池)是指將電解質溶液和金屬電極保持在杯、槽、或其他容器或復合容器空間的一部分中產生電流的裝置,其將化學能轉化為電能。這是一個積極的和消極的觀點。隨著科學技術的進步,電池通常是指發電的小型設備。比如太陽能電池。電池的性能參數主要包括電動勢、容量、比能和電阻。
采用電池作為能源,可獲得穩定的電壓、穩定的電流、長時間穩定的電源、受外界影響小的電流、電池結構簡單、攜帶方便、充放電操作容易、不受外界氣候和溫度的影響。RE,穩定可靠的性能,以及在現代社會生活中。所有方面都起著很大的作用,如手機、手表等電子數字便攜設備!
額定電壓
電池在常溫下的典型工作電壓也稱為標稱電壓。為選擇不同類型的電池提供參考。電池的實際工作電壓等于正壓電極和負電極的平衡電極電位的差值。它僅與電極中活性物質的類型有關,而與活性物質的量無關。電池電壓本質上是直流電壓,但在某些特殊條件下,由電極反應引起的金屬晶體或某些相膜的相變將引起電壓的輕微波動。這種現象被稱為噪聲。波動幅度很小,但頻率范圍很寬,因此可以區別于電路中的自激噪聲。
開路電壓
開路電壓下的電池端電壓稱為開路電壓。電池的開路電壓等于電池正極電勢與負極電極電位在電池開路時的差值(即,沒有電流通過兩極)。電池的開路電壓由V表示,即V開路=++-,其中,++和C分別是電池的正極和負極電位。電池的開路電壓通常小于其電動勢。這是因為電池兩極電解液中的電極電位通常不是一個平衡的電極電位,而是一個穩定的電極電位。通常可以認為,電池的開路電壓是電池的電動勢。
1.2研究意義
鋰離子電池自問世以來,到現在已經發展成為我們每個人眾多生活必需品當中的一部分,是如今人們在日常生活中使用極其廣泛的一種電池。我國通訊、電力電子等相關行業的飛速發展,使人們對鋰離子電池的利用率和維護工作的重視程度不斷提高,鋰離子電池電量檢測的市場需求隨之越來越大。然而現在的實際情況卻是由于國內目前的一些檢測設備的檢測方法不精確等原因,使其不能完全滿足我們對鋰離子電池電量檢測的需求,同時國外的同類檢測設備雖然性能較好,但是價格太高,不適合我們日常檢測使用。微處理器技術的發展與電池電量檢測方法的不斷改善,為提高鋰離子電池電量檢測系統的性能和降低其制造成本提供了可能。針對該要求,本文設計了一種基于單片機的鋰離子電池電量檢測系統,該檢測系統的設計對全面掌握鋰離子電池的電量狀態,提高其利用率具有現實意義。本設計的研究成果如果能夠得到大家的一致認同,以致今后被廣泛應用于我們的日常生活當中,比如應用于生活中常用的或常見的便攜式電子產品領域,這必將提高人們的日常生活質量,并且還能起到提高鋰離子電池利用率的作用,從另一方面看,這也是從某種程度上響應了國家“節能減排”政策。
1.3 主要研究內容
該課題是設計一個鋰離子電池電量檢測系統,研究對象為符合國標GB/T 18287-2000的鋰離子電池,其主要參數有:標稱電壓3.7V,標稱容量1050mAH,充電電壓4.2V。在做畢業設計的這段時間里,自己通過互聯網查詢、圖書館書籍資料搜索等多種途徑,對該課題的研究內容進行了充分的理解與學習,使我對鋰離子電池的電量檢測原理,以及一些基于單片機的C程序編寫等內容,都有了進一步的了解與掌握。
本課題研究如何設計一個滿足我們日常生活要求的鋰離子電池電量檢測系統,要求適用于日常使用,必須控制成本,并且需要滿足精度的要求。本文的設計思路是利用單片機及一些市場上常見的功能芯片,經過綜合所有應考慮的重要因素后,最終確定了該檢測系統里的一些重要器件類型,其鋰離子電池的電量檢測部分就選用流行于目前市場上并且較專業的電池電量檢測芯片BQ26500,輸出部分決定采用LCD輸出顯示。利用電池電量檢測芯片BQ26500,并且數碼輸出顯示我們所需數據的鋰離子電池電量檢測系統,該系統由模擬量參數采集部分、電量檢測部分、中央處理控制部分(單片機)以及LED驅動顯示等相應模塊組成,前兩部分可由BQ26500完成。至此,該基于單片機的鋰離子電池電量檢測系統的整體框架便已明了。
本文重點介紹了該鋰離子電池電量檢測系統的硬件設計和軟件設計。硬件設計的主要職責就是將系統分割成的各個功能部分組合成一個合理的可行性方案。





2. 總體方案設計2.1方案選擇
該系統總體結構可以劃分為幾個重要部分:鋰離子電池模擬量參數采集部分、電量檢測部分、中央處理控制部分(單片機)和LED驅動顯示部分。每個部分重要器件的選型已經在前面具體說明,將系統總體結構分為以上各部分后,整個系統的工作原理及重要模塊等信息便簡單明了,系統每個部分都有著其自己重要的責任,只有系統內的每個模塊都按其職責正常運行,整個鋰離子電池電池檢測系統才能正常工作。如圖2-1所示,該圖為鋰離子電池電量檢測系統的總體結構框圖,其中模擬量參數采集部分負責通過傳感器及測量電路等來采集鋰離子電池的模擬量參數,這些參數包括鋰離子在放電過程中的電流(壓)大小、檢測到的溫度值等相關參數;電量檢測部分主要負責依據上部分已經采集到的參數,對鋰離子電池的電量進行檢測與計算,這兩個部分可由BQ26500完成;中央處理控制部分即單片機負責對整個系統進行控制;LCD驅動顯示部分負責驅動LCD,并對被測鋰離子電池的剩余電量信息進行數碼輸出顯示。
⑴根據設計要求,選擇STC89C51單片機為核心控制器件。
⑵A/D轉換采用ADC0809實現,與單片機的接口為P1口和P2口的高四位引腳。
⑶將轉換結果進行運算,化為測量值。
方案一:
硬件電路設計由6個部分組成:A/D轉換電路,STC89C51單片機系統,LCD顯示系統、時鐘電路、復位電路以及測量電壓輸入電路。硬件電路設計框圖如圖所示。
方案二:
硬件電路設計由6個部分組成:A/D轉換電路,STC89C51單片機系統,LCD12864顯示系統、時鐘電路、復位電路以及測量電壓輸入電路。硬件電路設計框圖如圖所示。



方案論證:
    兩種方案相比較,第二種方案擁有明顯優勢。首先方案一的功能太過單一,雖然達成了設計任務,但實用性較差,沒有實際價值。如果對其進行功能擴展的話,雖然可以解決功能單一的缺陷,但又會由于過多的顯示內容而導致由LED數碼管構成的顯示模塊過于復雜,對焊接工作造成困難,同時顯示效果一般。反觀方案二,在吸取方案一的優點的前提之下,將顯示模塊升級為LCD12864,這樣做就可以彌補方案一中的諸多不足,具有顯示內容豐富,編程簡單,電路復雜程度低等優勢。
    綜上所述,方案二是一套更為切實可行的方案。
2.2 LCD顯示部分

LCD 12864 外觀圖

2.2.1 LCD12864 概述
12864 是一種具有4 位/8 位并行、2 線或3 線串行多種接口方式,內部含有國標一級、二級簡體 中文字庫的點陣圖形液晶顯示模塊;其顯示分辨率為128×64, 內置8192 個16*16 點漢字,和128 個16*8 點ASCII 字符 集.利用該模塊靈活的接口方式和簡單、方便的操作指令,可構成全中文人機交互圖形界面。可以顯示8×4 行16×16 點 陣的漢字. 也可完成圖形顯示.低電壓低功耗是其又一顯著特點。由該模塊構成的液晶顯示方案與同類型的圖形點陣液晶 顯示模塊相比,不論硬件電路結構或顯示程序都要簡潔得多,且該模塊的價格也略低于相同點陣的圖形液晶模塊。 被測電流信號 ﹝或被測電壓信號 ﹞經電流測頭1﹝或電壓測頭2﹞隔離變換,在二次回路形成高精度毫安級跟蹤電流,經采樣電路3轉換為跟蹤電壓信號,在經定標放大器4進行放大、定標,形成跟蹤電壓輸出Vg;跟蹤電壓信號經AC/DC轉換器5后,形成直流電壓輸出 。 輸出經V/I轉換器6后形成直流輸出 , 輸出經V/F變換器7后形成頻率輸出 。只有輸出跟蹤電壓 的產品才使用正負電源﹝+E,-E﹞,其他產品才使用單一正電源。
圖2-1中電流測頭1和電壓測頭2是本系列產品的關鍵部件,屬于精密互感器系列,承擔隔離和線性變換的雙重作用,改變電流測頭規格或改變電壓測頭的輸入電阻可以改變傳感器的測量范圍。定標放大器4是一個寬帶交流放大器,它產生的電壓輸出 ,在波形和相位上快速跟蹤輸入信號的變化, 輸出型傳感器適用于交流采樣系統。轉換器5是配套研發的專用厚膜集成器件,它把交流電壓信號變換為直流電壓或直流電流輸出。轉換原理分為平均值轉換和真有效值轉換,平均值轉換器成本低,適用于標準正弦交流信號轉換;真有效值轉換器適用于含有多次諧波的交流信號(如三角波、矩形波、梯形波、可控硅調功波等),單成本較高。轉換器5(或轉換器6) 的“基準波”接地時,他輸出0~5V(或0~20mA);為它們配加以個高穩定的偏置電路,就形成1V~5V(或4mA~20mA);為它們配加一個高穩定的偏置電路,就形成了1V~5V(4mA~20mA)輸出。
2.2.2 LCD12864基本用途
1.使用前的準備
先給模塊加上工作電壓,再按照下圖的連接方法調節LCD的對比度,使其顯示出黑色的底影。此過程亦可以初步檢測LCD有無缺段現象。
2.字符顯示
帶中文字庫的128X64-0402B每屏可顯示4行8列共32個16×16點陣的漢字,每個顯示RAM可顯示1個中 文字符或2個16×8點陣全高ASCII碼字符,即每屏最多可實現32個中文字符或64個ASCII碼字符的顯示。帶中文字庫的128X64-0402B內部提供128×2字節的字符顯示RAM緩沖區(DDRAM)。字符顯示是通過將字符顯示編碼寫入該字符顯示RAM實現的。根據寫入內容的不同,可分別在液晶屏上顯示CGROM(中文字庫)、HCGROM(ASCII碼字庫)及CGRAM(自定義字形)的內容。三種不同字符/字型的選擇編碼范圍為:0000~0006H(其代碼分別是0000、0002、0004、0006共4個)顯示自定義字型,02H~7FH顯示半寬ASCII碼字符,A1A0H~F7FFH顯示8192種GB2312中文字庫字形。字符顯示RAM在液晶模塊中的地址80H~9FH。字符顯示的RAM的地址與32個字符顯示區域有著一一對應的關系,其對應關系如下表所示。
80H
81H
82H
83H
84H
85H
86H
87H
90H
91H
92H
93H
94H
95H
96H
97H
88H
89H
8AH
8BH
8CH
8DH
8EH
8FH
98H
99H
9AH
9BH
9CH
9DH
9EH
9FH
3、圖形顯示
先設垂直地址再設水平地址(連續寫入兩個字節的資料來完成垂直與水平的坐標地址)
垂直地址范圍 AC5...AC0
水平地址范圍 AC3…AC0
2.3  電池電量檢測芯片BQ26500
2.3.1 測量原理
BQ26500的電量檢測原理我們也需要做簡單的了解,BQ26500內置了溫度傳感器,它通過內置的溫度傳感器和內部計數器來估算被測鋰離子電池的放電程度,放電的同時還可以根據溫度需要進行溫度補償,并且能夠通過鋰離子電池的放電周期,校準鋰離子電池的實際容量,外接內部寫有初始化程序的EEPROM,負責控制電池的管理工作,串口和外部EEPROM可以用來編程。
在日常生活中,使用鋰離子電池是一般都不需要進行溫度保護,因為日常情況下,鋰離子電池工作所在環境溫度不會超過其工作溫度范圍之外,除非需要該鋰離子電池一直處于長期的持續的工作狀態,這時候應該采取適當的溫度保護措施。但是BQ26500是一款流行與目前市場上相當專業的電池電量檢測芯片,BQ26500對被測鋰離子電池進行電量檢測的同時,會檢測鋰離子電池的溫度情況,因為BQ2040內置了溫度傳感器,可以進行過熱保護等控制措施,不需要外接熱敏電阻,如果檢測到溫度過低,這時候BQ26500還可以進行溫度補償,不需要外接諧振器等相關器件,進一步減少了器件,降低了設計成本。
2.3.2  電路圖設計
作為一款電池電量檢測芯片,BQ2040負責完成鋰離子電池的電量檢測模塊的功能,它先采集所需被測鋰離子電池的信號參數,然后按照原先已經設定好的算法檢測計算出被測鋰離子電池的電量,通過I2C總線與單片機部分進行數據交換,最終通過LCD驅動顯示部分數碼輸出顯示鋰離子電池的電量信息給用戶。電量檢測結果用LCD數碼輸出顯示,從而讓我們及時了解電量信息,完全掌握鋰離子電池的用電狀態,提高利用率。
本系統電量檢測部分采用電池電量檢測芯片BQ2040,除了支持對鋰離子電池的高精度電量檢測,還滿足其他多種電池的電量檢測工作,比如能夠很好的檢測鎳鎘電池、鎳氫電池的電量。
                                  BQ26500 電路圖


2.4  數據傳輸存儲芯片24C642.4.1  24C64概述
24C64芯片屬于24C系列里面常見的一款,該系列的主要功能是數據的存儲及傳輸。既然是數據傳輸存儲芯片,那么就會有每款芯片帶有多少存儲位的問題,該系列的芯片擁有多少存儲位可以從24C后面的數字讀出來。如ATMEL的24C64,從后面的數字可以讀出其存儲位為64K。這個系列的芯片具有許多的優勢,例如能重復擦寫1百萬次以上,并且在其內部已經存儲成功的數據能夠長期保持,時間達100年之久。24C64具有多種封裝形式可供選擇,現如今已被廣大電子行業從業者所接受,廣泛應用于電力電子各個領域。
ATMEL的24C64是I2C 總線的EEPROM,I2C總線(Inter Integrated Circuit 內部集成電路總線)是兩線式串行總線,只占用微處理器的2個I/O 引腳,僅需要時鐘和數據兩根線就可以進行數據傳輸,令用戶使用起來十分便捷。
2.4.2  24C64引腳說明
圖2-6  24C64引腳分布

表2.5  24C64引腳說明
引腳符號
引腳名稱
引腳描述
A0到A2
地址輸入端
確定連接器件的地址
SDA
串行數據端
需要附加一個上拉電阻,雙向引腳,可以輸出或輸入地址及數據。
SCL
串行時鐘輸入端
產生串行同步時鐘信號
VCC
電源輸入端
電源電壓輸入
GND
接地端
接地

2.4.3  24C64特性介紹
  •   低功耗器件
  •   2線串行接口
  •   雙向數據傳輸協議
  •   寫保護引腳用于硬件數據保護
  •   高可靠性

2.5  時鐘芯片DS13022.5.1  DS1302概述
DS1302是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。通過簡單的串行接口,采用三線接口與CPU進行同步通信,內部有一個31×8的用于臨時性存放數據的靜態RAM。它具有主電源/后備電源雙電源引腳,VCC1為后備電源,VCC2為主電源。在主電源關閉的情況下,也能保持時鐘的連續運行。DS1302由VCC1或VCC2兩者中的較大者供電。當Vcc2大于Vcc1+0.2V時,DS1302由VCC2供電;當VCC2小于VCC1時,DS1302由VCC1供電。
DS1302功能:①日期時間信息;②每月的天數和閏年的天數可自動調整;③通過AM/PM指示決定采用24或12小時格式;④保持數據和時鐘信息時功率小于1mW。
2.5.2  DS1302引腳說明
圖2-7  DS1302引腳分布



表2.6  DS1302引腳說明
引腳符號
引腳名稱
引腳描述
X1、X2
晶振引腳
32.768KHz
GND
接地引腳
接地
CE
復位腳
在讀/寫數據期間必須為高
I/O
數據輸入/輸出
三線接口時的雙向數據線
SCLK
串行時鐘引腳
控制數據的輸入與輸出
VCC1、VCC2
電源供電引腳
VCC1:主電源;VCC2:備份電源





3.軟件系統設計3.1 C語言簡介

C語言是近年來在國內外普遍使用的一種程序設計語言。C語言功能豐富,表達能力強應用廣,既有高級語言的特點,也有匯編語言的特點。C是中級語言。它把高級語言的基本結構和語句與低級語言的實用性結合起來。C 語言可以像匯編語言一樣對位、字節和地址進行操作, 而這三者是計算機最基本的工作單元。

C是結構式語言。結構式語言的顯著特點是代碼及數據的分隔化,即程序的各個部分除了必要的信息交流外彼此獨立。這種結構化方式可使程序層次清晰,便于使用、維護以及調試。C 語言是以函數形式提供給用戶的,這些函數可方便的調用,并具有多種循環、條件語句控制程序流向,從而使程序完全結構化。

C語言功能齊全。具有各種各樣的數據類型,并引入了指針概念,可使程序效率更高。另外C語言也具有強大的圖形功能,支持多種顯示器和驅動器。而且計算功能、邏輯判斷功能也比較強大。

3.2 程序設計流程3.2.1  初始化

初始化程序流程圖

初始化程序的功能就是初始化各個端口,使其各部件完成先前的準備工作。設置好各個端口的功能,比如哪些端口設置為中斷的輸入口,哪些設置為外部模塊。設置完成以后就可以打開各個中斷使能,使系統響應相對應的中斷跳轉程序。


3.2.2  主程序流程圖

主程序流程圖
3.2.3A/D轉換與中斷服務
AT89C51內部有兩個16位的可編程定時器/計數器,T0和T1。定時器實際上是工作在計數方式下 ,只不過對固定平率的脈沖計數,由于脈沖周期也固定,由計數值可以計算出計數時就愛你,有定時的功能。AT89C51的T/C是加1計數的。當工作在定時器方式時,對振蕩源12分頻的脈沖計數,即每個機器周期計數值加1,計數速率1/12fosc,當fosc=12MHz時,計數速率=1000KHz,即計數器每加1用時1us。


  A/D轉換與中斷服務流程圖
3.3  BQ26500總線時序
BQ26500采用電源系統管理Veil.0(SMBus)協議,支持智能電池數據管理命令(SBData)和智能電池充電控制(SBData)功能,通過串行接口可以檢測鋰離子電池的充電狀態、剩余電量、放電剩余時間、電池材料等信息。
SMBus是System Management Bus的縮寫,譯為系統管理總線,SMBus是一種二線制串行總線,它大部分基于I2C(Inter-Integrated Circuit)總線規范。I2C兩線(串行數據SDA和串行時鐘SCL線)式串行總線,用于連接微控制器及其外圍設備,是微電子通信控制領域廣泛采用的一種總線標準。I2C是同步通信的一種特殊形式,具有接口線少,控制方式簡單,器件封裝形式小,通信速率較高等優點。和I2C一樣,SMBus不需增加額外引腳,但是工作頻率只能在10kHz到最高100kHz范圍內,且專門面向智能電池管理應用。SMBus為系統電源管理等任務提供了一條控制總線,使用SMBus的系統,設備之間發送和接收消息都是通過SMBus,而不是使用單獨的控制線,這樣可以節省設備的管腳數。
SMBus最初的目的是為智能電池、充電電池和與其他系統通信的微控制器之間的通信鏈路而定義的,如今也被用來連接各種設備,包括電源相關設備,系統傳感器,EEPROM通訊設備等等,但SMBus最適用于筆記本電腦上,檢測各元件狀態并更新硬件設置。

4.總結
    硬件設計完成將待設計的系統分割成各個功能模塊,然后組合成一個合理的可行性方案的任務,用Protel等相關軟件完成硬件原理圖的設計后,制成PCB板。軟件設計則負責根據系統相關的功能要求,進行模塊的編程等,完成硬件設計后,我們可以通過Keil4.0等類似軟件對單片機燒入程序,最后便可進行鋰離子電池電量檢測系統的檢測試驗,定時記錄相關數據,對鋰離子電池電量檢測結果的準確性進行測試。
系統測試的思路可以針對BQ2040內的三個重要寄存器:Full Charge Capacity(FCC)、Remaining Capacity(RM)、Discharge Count Register(DCR)。通過每隔一定時間讀取這三個寄存器的數據,這樣記錄多組數據后,可以通過以下幾個主要關系進行驗證分析系統的準確性及可靠性:
  • RM ≤ FCC。
  • 放電的逆過程即充電,充電期間,RM數值停止遞增,則RM=FCC,這時我們讀取的RM應近似等于FCC,此時DCR=0。若要鋰離子電池充分充電,我們還可以根據BQ2040進行充電控制,向RM寫入一個用戶自定義的值。
  • DCR隨著RM的遞減逐漸增大,直到RM=0,鋰離子電池放電和自放電都會使DCR增大,但當RM=0后,只有放電才使DCR增大。

我做的基于單片機的電量檢測系統課程設計完成了,基本上達到了預期的目的。當初拿到這個題目的時候都不知道怎么入手,但在老師的指導下,自己找資料、看書,總算完成了。通過此次的畢業設計,使我對單片機有了更深一層的了解,從理論和實踐我都得到了很大的提高,所以這次任務的完成使我學到了很多知識。首先,豐富了自己的知識面,學通了以前沒學通的東西,具體了解了怎么去完成一個電路的設計。在此次的設計中,學到了單片機AT89C51的內部結構及工作原理,了解了時鐘電路和控制電路的工作原理,還有共陽極數碼管的工作原理,同時也提高了我的C語言使用能力,并且挺高了自己分析問題和解決問題的能力,有了理論聯系實際的機會,為以后從事這個方面的工作打好了基礎,這也是這次畢業設計的最大收獲。
這次的畢業設計總的來說還是比較成功的,能夠實現電壓顯示,如果單獨查看電壓或電流,可以通過安檢控制查看電壓或電流,但是還是有許多不足之處,不過的確從中學到了很多,也發現了自己的很多問題,為自己以后的學習、進步打下了不錯的基礎。
致謝

經過兩個多月的時間,我在導師廖建文的指導下,完成了整個系統的設計和制作。在這段時間當中,感受最深的就是解決問題的一些方法、技巧。在整個設計過程中,我遇到了很多的問題,通過查閱相關資料、冷靜理性的分析、方案的對比和實驗證明,最終解決了所遇到的問題。

對我而言,知識上的收獲重要,精神上的豐收更加可喜。挫折是一份財富,經歷是一份擁有。這次實習必將成為我人生旅途上一個非常美好的回憶!此次課程設計,學到了很多課內學不到的東西,比如獨立思考解決問題,出現差錯的隨機應變,和與人合作共同提高,都受益匪淺,今后的制作應該更輕松,自己也都能扛的起并高質量的完成項目。對于我來說,收獲最大的是自己主動去解決問題,并在試驗中總結解決方法,學會去分析問題出現的原因,以及應該從哪個部分去解決,但無法出現正確結果是,需耐心的檢查電路,因為大多數出問題都是因為一兩根線沒接或接錯的問題。
總體來說,通過這次課程設計學習,讓我對各種電路都有了大概的了解,也學會了常用繪圖軟件的使用,在平時的理論學習中遇到的問題都一一解決,加深了我對專業的了解,培養了我對學習的興趣,為以后的學習打下了好的開端,我受益匪淺。同時,讓我明白:這些電路還是應該自己動手實際操作才會有深刻理解,才會有收獲,所謂“一行勝千言”果然不假。
最后,我要感謝我系安排了此次課程設計,這為我們以后的畢業設計奠定了良好的基礎,并更好地復習和鞏固了以前學過的理論知識。總之,本次課程設計讓我們受益匪淺!

單片機源程序如下:
  1. #include<reg51.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int


  5. #define LCD_data  P0       //數據口
  6. uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  7. sbit CLK=P1^3;   //時鐘信號
  8. sbit ST=P1^2;    //啟動信號
  9. sbit EOC=P1^1;   //轉換結束信號
  10. sbit AD_OE=P1^0;    //輸出使能
  11. sbit LCD_RS  =  P2^6;      //寄存器選擇輸入
  12. sbit LCD_RW  =  P2^5;      //液晶讀/寫控制
  13. sbit LCD_EN  =  P2^7;      //液晶使能控制
  14. sbit LCD_PSB =  P3^2;      //串/并方式控制
  15. sbit LCD_RST =  P3^7;      //液晶復位端口
  16. sbit OE = P3^0;
  17. sbit LE = P3^1;
  18. signed char result = 0;
  19. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  20. /*********************************************************/
  21. uchar code  DIS1[] = {"**電壓測量系統**"};
  22. uchar code  DIS2[] = {"**U = --.- (V)**"};
  23. uchar code  DIS3[] = {"**I = --.- (A)**"};
  24. uchar code  DIS4[] = {"**P = --.- (W)**"};
  25. /*********************************************************/

  26. void DelayMS(uint ms)   //延時
  27. {
  28.               uchar i;
  29.               while(ms--)
  30.                             for(i=0;i<120;i++)
  31.                             {;}
  32. }

  33. void Display_Result(uchar d)   //顯示轉換結果
  34. {
  35.               P2=0xf7;  //第4個數碼管顯示個位數
  36.               P0=DSY_CODE[d%10];

  37.               DelayMS(5);

  38.               P2=0xfb;   //第3個數碼管顯示十位數
  39.               P0=DSY_CODE[d%100/10];

  40.               DelayMS(5);
  41.                                                                                                                                                                                                                                              
  42.               P2=0xfd;  //第2個數碼管顯示百位數
  43.               P0=DSY_CODE[d/100];
  44.               DelayMS(5);
  45. }

  46. void delay(int ms)
  47. {
  48.     while(ms--)
  49.               {
  50.       uchar i;
  51.                 for(i=0;i<150;i++)
  52.                  {
  53.                   _nop_();                                            
  54.                             _nop_();
  55.                             _nop_();
  56.                             _nop_();
  57.                  }
  58.               }
  59. }            
  60. /*******************************************************************/
  61. /*                                                                 */
  62. /*  延時函數                                                       */
  63. /*                                                                 */
  64. /*******************************************************************/
  65. void delay1(int ms)
  66. {
  67.     while(ms--)
  68.               {
  69.       uchar y;
  70.                 for(y=0;y<100;y++) ;
  71.               }
  72. }                                         
  73. /*******************************************************************/
  74. /*                                                                 */
  75. /*檢查LCD忙狀態                                                    */
  76. /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。      */
  77. /*                                                                 */
  78. /*******************************************************************/
  79. bit lcd_busy()
  80. {                        
  81.     bit result;

  82.               LE = 1;
  83.               delay(1);

  84.               LCD_RS = 0;
  85.     LCD_RW = 1;
  86.     LCD_EN = 1;
  87.     delayNOP();
  88.     result = (bit)(P0&0x80);
  89.     LCD_EN = 0;
  90.             
  91.     delay(1);
  92.               LE = 0;

  93.     return(result);
  94. }
  95. /*******************************************************************/
  96. /*                                                                 */
  97. /*寫指令數據到LCD                                                  */
  98. /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
  99. /*                                                                 */
  100. /*******************************************************************/
  101. void lcd_wcmd(uchar cmd)
  102. {                        
  103.    while(lcd_busy());
  104.     LE = 1;
  105.               delay(1);
  106.             
  107.               LCD_RS = 0;
  108.     LCD_RW = 0;
  109.     LCD_EN = 0;
  110.     _nop_();
  111.     _nop_();
  112.     P0 = cmd;
  113.     delayNOP();
  114.     LCD_EN = 1;
  115.     delayNOP();
  116.     LCD_EN = 0;
  117.             
  118.               delay(1);
  119.               LE = 0;
  120. }
  121. /*******************************************************************/
  122. /*                                                                 */
  123. /*寫顯示數據到LCD                                                  */
  124. /*RS=H,RW=L,E=高脈沖,D0-D7=數據。                               */
  125. /*                                                                 */
  126. /*******************************************************************/
  127. void lcd_wdat(uchar dat)
  128. {                        
  129.    while(lcd_busy());
  130.                
  131.               LE = 1;
  132.               delay(1);
  133.     LCD_RS = 1;
  134.     LCD_RW = 0;
  135.     LCD_EN = 0;
  136.               delay(1);
  137.               LE = 0;

  138.     P0 = dat;
  139.     delayNOP();
  140.               LE = 1;
  141.               delay(1);
  142.     LCD_EN = 1;
  143.     delayNOP();
  144.     LCD_EN = 0;
  145.               delay(1);
  146.               LE = 0;
  147. }
  148. /*******************************************************************/
  149. /*                                                                 */
  150. /*  LCD初始化設定                                                  */
  151. /*                                                                 */
  152. /*******************************************************************/
  153. void LCD12864_init()
  154. {
  155.     LCD_PSB = 1;         //并口方式

  156.               LCD_RST = 0;                            //液晶復位
  157.     delay(3);                  
  158.     LCD_RST = 1;     
  159.     delay(3);

  160.     lcd_wcmd(0x34);      //擴充指令操作
  161.     delay(5);
  162.     lcd_wcmd(0x30);      //基本指令操作
  163.     delay(5);
  164.     lcd_wcmd(0x0C);      //顯示開,關光標
  165.     delay(5);
  166.     lcd_wcmd(0x01);      //清除LCD的顯示內容
  167.     delay(5);
  168. }

  169. void T1_INIT(void )
  170. {
  171.               TMOD=0x02;  //T1工作模式2
  172.               TH0=0x14;
  173.               TL0=0x00;
  174.               IE=0x82;
  175.               TR0=1;
  176.               P1=0x3f;  //選擇ADC0809的通道3(0111)(P1.4~P1.6)
  177. }
  178. void Locker_init(void )
  179. {
  180.               OE = 0;
  181.               LE = 1;                           
  182. }
  183. /*********************************************************/
  184. /*                                                       */
  185. /* 設定顯示位置                                          */
  186. /*                                                       */
  187. /*********************************************************/
  188. void lcd_pos(uchar X,uchar Y)
  189. {                        
  190.    uchar  pos;
  191.    if (X==1)
  192.      {X=0x80;}
  193.    else if (X==2)
  194.      {X=0x90;}
  195.    else if (X==3)
  196.      {X=0x88;}
  197.    else if (X==4)
  198.      {X=0x98;}
  199.    pos = X+Y ;

  200.    lcd_wcmd(pos);     //顯示地址
  201. }
  202. /*********************************************************
  203. *                                                        *
  204. * 清屏函數                                               *
  205. *                                                        *
  206. *********************************************************/
  207. void  clr_screen()
  208. {
  209.    lcd_wcmd(0x34);      //擴充指令操作
  210.    delay(5);   
  211.    lcd_wcmd(0x30);      //基本指令操作
  212.    delay(5);
  213.    lcd_wcmd(0x01);      //清屏
  214.    delay(5);   
  215. }

  216. void Various(uchar line,uchar num)
  217. {
  218.               uchar a,b,c;
  219.               a = 48+num/100;
  220.               b = 48+num%100/10;
  221.               c = 48+num%10;
  222.             
  223.               switch( line )
  224.               {
  225.                             case 1:line = 0x80;
  226.                                              break;
  227.                             case 2:line = 0x90;
  228.                                              break;
  229.                             case 3:line = 0x88;
  230.                                              break;
  231.                             case 4:line = 0x98;
  232.                                              break;
  233.                             default:break;
  234.               }
  235.             
  236.               lcd_wcmd(line+3);      //寫入垂直坐標值
  237.               lcd_wdat(a);
  238.               lcd_wdat(b);
  239.               lcd_wdat('.');
  240.               lcd_wdat(c);            
  241. }

  242. void UI_Display(void )
  243. {
  244.               uchar i;
  245.             
  246.                  lcd_pos(1,0);             //設置顯示位置為第一行
  247.               for(i=0;i<16;i++)
  248.      {
  249.        lcd_wdat(DIS1[i]);
  250.        delay(30);
  251.      }

  252.      lcd_pos(2,0);             //設置顯示位置為第二行
  253.      for(i=0;i<16;i++)
  254.      {
  255.        lcd_wdat(DIS2[i]);
  256.        delay(30);
  257.      }
  258.      lcd_pos(3,0);             //設置顯示位置為第三行
  259.      for(i=0;i<16;i++)
  260.      {
  261.        lcd_wdat(DIS3[i]);
  262.        delay(30);
  263.      }
  264.      lcd_pos(4,0);             //設置顯示位置為第四行
  265.      for(i=0;i<16;i++)
  266.      {
  267.        lcd_wdat(DIS4[i]);
  268.        delay(30);
  269.      }
  270. }

  271. void AD_gather(void )
  272. {
  273.               ST=0;ST=1;ST=0; //啟動A/D轉換
  274. ……………………

  275. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
基于BQ26500電池測量.doc (871.46 KB, 下載次數: 31)


評分

參與人數 2黑幣 +58 收起 理由
穿著安踏去拉薩 + 8 51有你更精彩
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:779899 發表于 2021-1-9 16:52 | 只看該作者
十分不錯的思路!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 五月天综合网 | 免费99视频 | 黄在线| 亚洲美女视频 | 欧美性成人 | 欧美亚洲网站 | 亚洲综合在线视频 | 亚洲看片网站 | 黄免费观看视频 | 国产精品网址 | 欧美一区二区在线观看 | 国产精品久久久久久福利一牛影视 | 一区二区精品 | 狠狠天天 | 欧美高清成人 | 国产亚洲一区二区在线观看 | 成人激情免费视频 | 久久精品视频一区二区三区 | 99成人 | 日韩在线观看网站 | 大象一区 | av网站免费看 | 成人av观看 | 国产一区二区三区 | 久草精品视频 | 91精品国产91久久久久久三级 | 日韩视频 中文字幕 | 精品一区二区三区在线观看国产 | 国产精品视频在线播放 | 欧美日韩国产三级 | 91av在线电影 | av天天看 | 久久久123| 国产高清免费 | 久久综合九色综合欧美狠狠 | 国产一区免费 | 亚洲欧美精品在线观看 | 日韩三级视频 | 激情五月婷婷丁香 | 亚洲精品一区中文字幕乱码 | 日韩欧美中文字幕在线观看 |