基于Proteus的單片機(jī)設(shè)計與調(diào)試 課件 第3、4章 擴(kuò)展模塊設(shè)計與調(diào)試;競賽試題設(shè)計與測試_第1頁
基于Proteus的單片機(jī)設(shè)計與調(diào)試 課件 第3、4章 擴(kuò)展模塊設(shè)計與調(diào)試;競賽試題設(shè)計與測試_第2頁
基于Proteus的單片機(jī)設(shè)計與調(diào)試 課件 第3、4章 擴(kuò)展模塊設(shè)計與調(diào)試;競賽試題設(shè)計與測試_第3頁
基于Proteus的單片機(jī)設(shè)計與調(diào)試 課件 第3、4章 擴(kuò)展模塊設(shè)計與調(diào)試;競賽試題設(shè)計與測試_第4頁
基于Proteus的單片機(jī)設(shè)計與調(diào)試 課件 第3、4章 擴(kuò)展模塊設(shè)計與調(diào)試;競賽試題設(shè)計與測試_第5頁
已閱讀5頁,還剩144頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第3章擴(kuò)展模塊設(shè)計與調(diào)試前頁

返回3.1實時鐘DS1302

☆3.2溫度傳感器DS18B20

☆3.3串行EEPROMAT24C02

☆3.48位ADC/DACPCF8591

☆3.5超聲波距離測量

☆3.6頻率測量

☆2025/6/5基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS1302DS1302是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,可以對年、月、日、星期、時、分和秒進(jìn)行計時,具有閏年補(bǔ)償功能。DS1302采用三線接口與CPU進(jìn)行同步通信,可采用突發(fā)方式一次傳送多個字節(jié)的時鐘或RAM數(shù)據(jù)。DS1302的工作電壓為2.5~5.5V,8引腳封裝,引腳說明如表3.1所示。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS1302DS1302的控制字節(jié)如圖3.1所示。控制字節(jié)的第7位為1,第6位為0時對實時鐘進(jìn)行操作,為1時對RAM進(jìn)行操作,第5~1位為數(shù)據(jù)地址,第0位為0時執(zhí)行寫操作,為1時執(zhí)行讀操作。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS1302DS1302的讀寫時序如圖3.2所示。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS1302寫時第一個字節(jié)是控制字節(jié)(第0位為0),第二個字節(jié)是數(shù)據(jù)字節(jié),控制字節(jié)和數(shù)據(jù)字節(jié)在SCLK的上升沿有效,低位在前高位在后,寫期間RST信號必須為高電平。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS1302讀時首先寫控制字節(jié)(第0位為1),然后再讀數(shù)據(jù)字節(jié),寫控制字節(jié)上升沿有效,讀數(shù)據(jù)字節(jié)下降沿有效,也是低位在前高位在后,讀期間RST信號也必須為高電平。從讀寫時序可以看出,DS1302的讀寫操作和SPI類似,但由于讀寫數(shù)據(jù)用的是一根數(shù)據(jù)線,所以無法用SPI接口直接實現(xiàn),只能用并行口仿真實現(xiàn)。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS1302DS1302的實時鐘寄存器如表3.2所示。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS1302設(shè)計要求:用并行口仿真實現(xiàn)DS1302實時鐘的設(shè)置、獲取與顯示。DS1302設(shè)計在矩陣按鍵設(shè)計的基礎(chǔ)上完成:在“D:\MCS51”文件夾中將“204_KEY”文件夾復(fù)制粘貼為“301_DS1302”文件夾。3.1.1原理圖繪制3.1.2源代碼設(shè)計3.1.3源代碼調(diào)試第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.1原理圖繪制DS1302原理框圖如圖3.3所示。系統(tǒng)包括:MCU、矩陣按鍵、LED、數(shù)碼管

DS1302DS1302通過P13(RST)、P17(SCLK)和P23(I/O)與MCU相連。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.1原理圖繪制在原理圖中添加器件“DS1302”和儀器“OSCILLOSCOPE”(示波器),按圖3.4的布局和連接關(guān)系繪制原理圖。系統(tǒng)包括:MCU、矩陣按鍵、LED、數(shù)碼管

DS1302第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.1原理圖繪制為了簡化電路,將譯碼電路用“子電路”模式實現(xiàn),方法如下:①選擇譯碼電路,右擊電路,在彈出菜單中單擊“剪切到剪貼板”。②單擊原理圖繪制左側(cè)的“子電路模式”按鈕,在原理圖中繪制子電路。③雙擊子電路,將子電路名稱(Name)修改為“DECODE”。④在子電路左右邊緣添加端口(PORT)P25~P27(輸入)和Y4C~Y7C(輸出)。⑤在子電路外部添加終端(TERMINAL)P25~P27(輸入)和Y4C~Y7C(輸出)。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.1原理圖繪制為了簡化電路,將譯碼電路用“子電路”模式實現(xiàn),方法如下:⑥右擊子電路,在彈出菜單中單擊“跳轉(zhuǎn)到子圖”。⑦在子圖中右擊,在彈出菜單中單擊“從剪貼板粘貼”,將譯碼電路粘貼到子圖中。⑧右擊子電路,在彈出菜單中單擊“退出到父圖”。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計DS1302源代碼設(shè)計包括tim.c修改、ds1302.h設(shè)計、ds1302.c設(shè)計和main.c設(shè)計。(1)tim.c修改刪除下列外部變量聲明和語句:

externunsignedintuiKey_Time;//按鍵按下計時

uiKey_Time++;(2)ds1302.h設(shè)計

voidRTC_Set(unsignedchar*pucRtc);

voidRTC_Get(unsignedchar*pucRtc);第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(3)ds1302.c設(shè)計

sfrP1=0x90;

sfrP2=0xA0;

sbitRST=P1^3;//DS1302復(fù)位

sbitSCK=P1^7;//DS1302時鐘

sbitSDA=P2^3;//DS1302數(shù)據(jù)第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(3)ds1302.c設(shè)計

//DS1302寫操作

voidDS1302_Write(unsignedcharucData)

{unsignedchari;

for(i=0;i<8;i++){

SCK=0;

SDA=ucData&1;

ucData>>=1;

SCK=1;

}

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(3)ds1302.c設(shè)計

//DS1302寫字節(jié):ucAddr的最低位為0

voidDS1302_WriteByte(unsignedcharucAddr,

unsignedcharucData)

{

RST=0;

SCK=0;

RST=1;

DS1302_Write(ucAddr);

DS1302_Write(ucData);

RST=0;

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(3)ds1302.c設(shè)計

//DS1302讀字節(jié):ucAddr的最低位為1

unsignedcharDS1302_ReadByte(unsignedcharucAddr)

{

unsignedchari,temp=0;

RST=0;

SCK=0;

RST=1;

DS1302_Write(ucAddr);第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(3)ds1302.c設(shè)計

//DS1302讀字節(jié):ucAddr的最低位為1

for(i=0;i<8;i++)

{

SCK=0;

temp>>=1;

if(SDA)temp|=0x80;

SCK=1;

}

RST=0;

SDA=0;

returntemp;

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(3)ds1302.c設(shè)計

//設(shè)置RTC時鐘:pucRtc-時鐘值(時分秒:BCD碼)

voidRTC_Set(unsignedchar*pucRtc)

{

DS1302_WriteByte(0x8E,0);//WP=0:允許寫操作

DS1302_WriteByte(0x84,pucRtc[0]);

//設(shè)置時

DS1302_WriteByte(0x82,pucRtc[1]);

//設(shè)置分

DS1302_WriteByte(0x80,pucRtc[2]);

//設(shè)置秒

DS1302_WriteByte(0x8E,0x80);//WP=1:禁止寫操作

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(3)ds1302.c設(shè)計

//獲取RTC時鐘:pucRtc-時鐘值(時分秒:BCD碼)

voidRTC_Get(unsignedchar*pucRtc)

{

pucRtc[0]=DS1302_ReadByte(0x85);

//讀取時

pucRtc[1]=DS1302_ReadByte(0x83);

//讀取分

pucRtc[2]=DS1302_ReadByte(0x81);

//讀取秒

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(4)main.c設(shè)計

*程序說明:設(shè)置RTC,獲取RTC并顯示,S4和S5切換狀態(tài),LED顯示狀態(tài)

#include<stdio.h>

#include"tim.h"

#include"seg.h"

#include"key.h"

#include"ds1302.h"

voidSeg_Proc(void);

voidKey_Proc(void);第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(4)main.c設(shè)計

unsignedcharucState=1;//系統(tǒng)狀態(tài)

unsignedcharucSec;//秒值

unsignedintuiSeg_Dly;//顯示刷新延時

unsignedcharucSeg_Dly;//顯示移位延時

unsignedcharpucSeg_Char[12];//顯示字符

unsignedcharpucSeg_Code[8];//顯示代碼

unsignedcharucSeg_Pos;//顯示位置

unsignedcharucKey_Dly;//按鍵延時

unsignedcharucKey_Old;//按鍵值

unsignedcharucLed;//LED值

unsignedcharpucRtc[3]={0x23,0x59,0x50};第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(4)main.c設(shè)計

voidmain(void)

{

Close_Peripheral();

T1_Init();

RTC_Set(pucRtc);//設(shè)置RTC時鐘

while(1)

{

T1_Proc();

Seg_Proc();

Key_Proc();

}

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(4)main.c設(shè)計

voidSeg_Proc(void)

{

if(uiSeg_Dly>500)

{//500ms時間到uiSeg_Dly=0;

switch(ucState){

case0://顯示T1時鐘

sprintf(pucSeg_Char,"1%06u",(unsignedint)ucSec);

break;第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(4)main.c設(shè)計

case1://顯示RTC時鐘

RTC_Get(pucRtc);//獲取RTC時鐘

sprintf(pucSeg_Char,"2%02x.%02x.%02x",\

(unsignedint)pucRtc[0],(unsignedint)pucRtc[1],\

(unsignedint)pucRtc[2]);

}

Seg_Tran(pucSeg_Char,pucSeg_Code);

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(4)main.c設(shè)計

if(ucSeg_Dly>2)

{

ucSeg_Dly=0;

Seg_Disp(pucSeg_Code,ucSeg_Pos);

ucSeg_Pos=++ucSeg_Pos&7;//數(shù)碼管循環(huán)顯示

}

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(4)main.c設(shè)計

voidKey_Proc(void)

{

unsignedcharucKey_Val,ucKey_Dn,ucKey_Up;

if(ucKey_Dly<10)//10ms時間未到

return;//延時消抖

ucKey_Dly=0;

ucKey_Val=Key_Read();//讀取按鍵值

ucKey_Dn=ucKey_Val&(ucKey_Old^ucKey_Val);

ucKey_Up=~ucKey_Val&(ucKey_Old^ucKey_Val);

ucKey_Old=ucKey_Val;//保存按鍵值第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計(4)main.c設(shè)計

switch(ucKey_Dn)

{

case4://S4鍵

ucState=0;

break;

case5://S5鍵

ucState=1;

}

ucLed=1<<ucState;

Led_Disp(ucLed);//LED顯示狀態(tài)

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計程序流程圖如圖3.5所示。思考:DS1302的時分秒采用什么編碼?顯示時有什么特別之處?擴(kuò)展:用DS1302實現(xiàn)年月日和星期設(shè)置、獲取和顯示。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.2源代碼設(shè)計注意:由于代碼長度超過2KB,默認(rèn)工程設(shè)置不能滿足要求,構(gòu)建出錯??赏ㄟ^下列設(shè)置解決:單擊“構(gòu)建”菜單中的“工程設(shè)置”菜單項,打開工程選項對話框,選擇“Options”標(biāo)簽,將選項“ROM”的值由“SMALL”修改為“COMPACT”或“LARGE”。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.3源代碼調(diào)試DS1302源代碼調(diào)試包括設(shè)置RTC時鐘調(diào)試和獲取RTC時鐘調(diào)試。(1)設(shè)置RTC時鐘調(diào)試①單擊“跳進(jìn)函數(shù)”按鈕,進(jìn)入設(shè)置RTC時鐘函數(shù)RTC_Set(),pucRtc[3]的值為0x23、0x59和0x50(時鐘BCD碼)。②設(shè)置示波器為“One-Shot”(單次捕捉),單擊“單步”按鈕,運行下列語句:

DS1302_WriteByte(0x8E,0);//WP=0:允許寫操作示波器顯示結(jié)果如圖3.6所示(參考圖3.2(a))。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.3源代碼調(diào)試(1)設(shè)置RTC時鐘調(diào)試③單擊“調(diào)試”菜單中“DS1302”菜單項中的“Clock”菜單項,顯示DS1302中的時間(Time)和日期(Date)。④單擊“單步”按鈕,運行設(shè)置RTC時鐘程序,DS1302中的時間(Time)變?yōu)椤?3-59-50”。⑤單擊“跳出函數(shù)”按鈕,退出設(shè)置RTC時鐘函數(shù)。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.3源代碼調(diào)試(2)獲取RTC時鐘調(diào)試①單擊Seg_Proc()中的下列語句:RTC_Get(pucRtc);//獲取RTC時鐘

單擊“跳到光標(biāo)處”按鈕,運行到上列語句。②單擊“跳進(jìn)函數(shù)”按鈕,進(jìn)入獲取RTC時鐘函數(shù)RTC_Get()。③再次設(shè)置示波器為“One-Shot”(單次捕捉),運行下列語句:

pucRtc[0]=DS1302_ReadByte(0x85);//讀取時示波器顯示結(jié)果如圖3.7所示(參考圖3.2(b))。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.1實時鐘DS13023.1.3源代碼調(diào)試(2)獲取RTC時鐘調(diào)試④單擊“跳出函數(shù)”按鈕,獲取RTC時鐘并退出獲取RTC時鐘函數(shù)。⑤單擊“運行仿真”按鈕,數(shù)碼管顯示“223.59.50”并開始計時,L2點亮。⑥單擊“S4”按鍵,L1點亮,數(shù)碼管顯示“1000005”(T1時鐘)。⑦單擊“S5”按鍵,L2點亮,數(shù)碼管重新顯示RTC時鐘。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B20溫度傳感器是一種將溫度轉(zhuǎn)換為可傳送的標(biāo)準(zhǔn)化輸出信號的傳感器。溫度傳感器按測量方式可分為接觸式和非接觸式兩大類,按照傳感器材料及電子元件特性分為熱電阻和熱電偶兩類。多用于溫度探測、檢測、顯示、溫度控制和過熱保護(hù)等領(lǐng)域。接觸式溫度傳感器的檢測部分與被測對象有良好的接觸,又稱溫度計。溫度計通過傳導(dǎo)或?qū)α鬟_(dá)到熱平衡,從而使溫度計的示值能直接表示被測對象的溫度,一般測量精度較高。在一定的測溫范圍內(nèi),溫度計也可測量物體內(nèi)部的溫度分布。但對于運動體、小目標(biāo)或熱容量很小的對象則會產(chǎn)生較大的測量誤差。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B20常用的溫度計有雙金屬溫度計、玻璃液體溫度計、壓力式溫度計、電阻溫度計、熱敏電阻和溫差電偶等。它們廣泛應(yīng)用于工業(yè)、農(nóng)業(yè)和商業(yè)等部門。在日常生活中人們也常常使用這些溫度計。非接觸式溫度傳感器的敏感元件與被測對象不接觸,又稱非接觸式測溫儀表。這種儀表可用來測量運動物體、小目標(biāo)和熱容量小或溫度變化迅速(瞬變)對象的表面溫度,也可用于測量溫度場的溫度分布。非接觸測溫優(yōu)點是:測量上限不受感溫元件耐溫程度的限制,因而對最高可測溫度原則上沒有限制。對于1800℃以上的高溫,主要采用非接觸測溫方法。隨著紅外技術(shù)的發(fā)展,輻射測溫逐漸由可見光向紅外線擴(kuò)展,700℃以下直至常溫都已采用,且分辨率很高。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B20DS18B20是單線接口數(shù)字溫度傳感器,測量范圍是-55℃~+125℃,-10℃~+85℃范圍內(nèi)精度是±0.5℃,測量分辨率為9~12位(復(fù)位值為12位,最大轉(zhuǎn)換時間為750ms)。DS18B20包括寄生電源電路、64位ROM和單線接口電路、暫存器、EEPROM、8位CRC生成器和溫度傳感器等。寄生電源電路可以實現(xiàn)外部電源供電和單線寄生供電,64位ROM中存放的48位序列號用于識別同一單線上連接的多個DS18B20,以實現(xiàn)多點測溫。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B20DS18B20的操作包括下列3步:

●復(fù)位

●ROM命令

●功能命令DS18B20ROM命令如表3.3所示。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B20DS18B20功能命令如表3.4所示。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B20DS18B20復(fù)位時序如圖3.8所示。DS18B20寫時序如圖3.9所示。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B20DS18B20寫時序如圖3.9所示。DS18B20讀時序如圖3.10所示。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B20DS18B20的暫存器如表3.5所示。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B20設(shè)計要求:編程實現(xiàn)DS18B20測量溫度的讀取與顯示。DS18B20設(shè)計在DS1302設(shè)計的基礎(chǔ)上完成:在“D:\MCS51”文件夾中將“301_DS1302”文件夾復(fù)制粘貼為“302_DS18B20”文件夾。3.2.1原理圖繪制3.2.2源代碼設(shè)計3.2.3源代碼調(diào)試第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.1原理圖繪制DS18B20原理框圖如圖3.11所示。系統(tǒng)包括:MCU、矩陣按鍵、LED、數(shù)碼管

DS1302、DS18B20DS18B20通過P14(DQ)與MCU相連。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.1原理圖繪制在原理圖中添加器件“DS18B20”,按圖3.12的布局和連接關(guān)系繪制原理圖。系統(tǒng)包括:MCU、矩陣按鍵、LED、數(shù)碼管

DS1302、DS18B20第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.2源代碼設(shè)計DS18B20源代碼設(shè)計包括ds18b20.h設(shè)計、ds18b20.c設(shè)計和main.c修改。(1)ds18b20.h設(shè)計

unsignedintTemp_Read(void);(2)ds18b20.c設(shè)計

sfrP1=0x90;

sbitDQ=P1^4;//單總線接口第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.2源代碼設(shè)計(2)ds18b20.c設(shè)計

//DS18B20延時函數(shù)

voidDS18B20_Delay(unsignedintt)

{

#ifndefIAP15

while(t--);

#else

unsignedchari;

while(t--)

for(i=0;i<12;i++);

#endif

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.2源代碼設(shè)計(2)ds18b20.c設(shè)計

//DS18B20初始化

bitDS18B20_Init(void)

{

bitflag=0;

DQ=1;

DS18B20_Delay(12);

DQ=0;DS18B20_Delay(80);

DQ=1;DS18B20_Delay(10);

flag=DQ;

DS18B20_Delay(5);

returnflag;

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.2源代碼設(shè)計(2)ds18b20.c設(shè)計

//DS18B20寫字節(jié)

voidDS18B20_Write(unsignedchardat)

{unsignedchari;

for(i=0;i<8;i++){

DQ=0;

DQ=dat&1;

DS18B20_Delay(5);

DQ=1;

dat>>=1;}

DS18B20_Delay(5);

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.2源代碼設(shè)計(2)ds18b20.c設(shè)計

//DS18B20讀字節(jié)

unsignedcharDS18B20_Read(void)

{unsignedchari,dat;

for(i=0;i<8;i++){

DQ=0;

dat>>=1;

DQ=1;

if(DQ)dat|=0x80;

DS18B20_Delay(5);

}

returndat;

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.2源代碼設(shè)計(2)ds18b20.c設(shè)計

unsignedintTemp_Read(void)

{

unsignedcharlow,high;

DS18B20_Init();//初始化

DS18B20_Write(0xCC);//跳過ROM

DS18B20_Write(0x44);//啟動溫度轉(zhuǎn)換第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.2源代碼設(shè)計(2)ds18b20.c設(shè)計

DS18B20_Init();

DS18B20_Write(0xCC);

DS18B20_Write(0xBE);//讀取溫度值

low=DS18B20_Read();//低字節(jié)

high=DS18B20_Read();//高字節(jié)

return(high<<8)+low;

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.2源代碼設(shè)計(3)main.c修改

*程序說明:讀取溫度值并顯示,S4和S5切換狀態(tài),LED顯示狀態(tài)①包含下列頭文件:

#include"ds18b20.h"②添加下列全局變量聲明:

unsignedintuiTemp;//溫度值第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.2源代碼設(shè)計(3)main.c修改③將Seg_Proc()中的下列語句:switch(ucState){case0://顯示T1時鐘sprintf(pucSeg_Char,"1%06u",(unsignedint)ucSec);break;case1://顯示RTC時鐘RTC_Get(pucRtc);//獲取RTC時鐘sprintf(pucSeg_Char,"2%02x.%02x.%02x",\(unsignedint)pucRtc[0],(unsignedint)pucRtc[1],\(unsignedint)pucRtc[2]);}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.2源代碼設(shè)計(3)main.c修改

替換為:switch(ucState)

{case0://顯示RTC時鐘RTC_Get(pucRtc);//獲取RTC時鐘sprintf(pucSeg_Char,"1%02x.%02x.%02x",\(unsignedint)pucRtc[0],(unsignedint)pucRtc[1],\(unsignedint)pucRtc[2]);break;case1://顯示溫度值uiTemp=Temp_Read();sprintf(pucSeg_Char,"2%04.2f",uiTemp/16.0);}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.2源代碼設(shè)計思考:DS18B20的最大轉(zhuǎn)換時間是多少?如何縮短轉(zhuǎn)換時間?擴(kuò)展:將DS18B20設(shè)置為9位分辨率。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.3源代碼調(diào)試DS18B20源代碼調(diào)試包括讀取溫度調(diào)試①單擊“開始仿真”按鈕,進(jìn)入調(diào)試狀態(tài)。②單擊Seg_Proc()中的下列語句:uiTemp=Temp_Read();

單擊“跳到光標(biāo)處”按鈕,運行到上列語句。③單擊“跳進(jìn)函數(shù)”按鈕,進(jìn)入讀取溫度函數(shù)Temp_Read()。④單擊“單步”按鈕,啟動溫度轉(zhuǎn)換,并讀取溫度值,low的值為0x50,high的值為0x05,返回值為0x0550(85℃)。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.3源代碼調(diào)試⑤單擊“運行仿真”按鈕,運行程序,數(shù)碼管顯示“285.00”,然后顯示DS18B20的溫度值,L2點亮。用示波器測量P14的波形如圖3.13所示。⑥單擊DS18B20的上下箭頭可以增大或減小溫度值。⑦單擊“S4”按鍵,L1點亮,數(shù)碼管顯示“200.00.08”(RTC時鐘)。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.2溫度傳感器DS18B203.2.3源代碼調(diào)試⑧單擊“S5”按鍵,L2點亮,數(shù)碼管重新顯示溫度值。⑨單擊“停止仿真”按鈕,停止程序運行。注意:在實訓(xùn)平臺上運行程序時,可以用手捏住DS18B20,數(shù)碼管顯示的值增大。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C02AT24C02是2Kbit串行EEPROM,內(nèi)部組織為256*8bit,支持16Byte頁寫,寫周期內(nèi)部定時(小于5ms),2線I2C接口,可實現(xiàn)8個器件共用1個接口,工作電壓1.8~6.0V,8引腳封裝,引腳說明如表3.6所示。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C02AT24C02的字節(jié)讀寫格式如圖3.14所示。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C02AT24C02的字節(jié)讀寫格式如圖3.14所示。寫數(shù)據(jù)時,首先寫器件地址(最低位為0:寫操作),然后寫數(shù)據(jù)地址和寫字節(jié)數(shù)據(jù),應(yīng)答(ACK)由AT24C02發(fā)出,作為寫操作的響應(yīng)。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C02AT24C02的字節(jié)讀寫格式如圖3.14所示。讀數(shù)據(jù)時,首先寫器件地址(最低位為0:寫操作)和數(shù)據(jù)地址,然后再寫器件地址(最低位為1:讀操作)和讀字節(jié)數(shù)據(jù)。應(yīng)答(ACK)由AT24C02發(fā)出,作為寫操作的響應(yīng),非應(yīng)答(NAK)由控制器發(fā)出,作為讀操作的響應(yīng)。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C02設(shè)計要求:用AT24C02記錄系統(tǒng)啟動次數(shù)并顯示。AT24C02設(shè)計在DS18B20設(shè)計的基礎(chǔ)上完成:在“D:\MCS51”文件夾中將“302_DS18B20”文件夾復(fù)制粘貼為“303_AT24C02”文件夾。3.3.1原理圖繪制3.3.2源代碼設(shè)計3.3.3源代碼調(diào)試第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.1原理圖繪制AT24C02原理框圖如圖3.15所示。系統(tǒng)包括:MCU、矩陣按鍵、LED、數(shù)碼管

EEPROMAT24C02通過P20(SCK)和P21(SDA)與MCU相連。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.1原理圖繪制在原理圖中添加器件“24C02C”和儀器“OSCILLOSCOPE”(示波器),按圖3.16的布局和連接關(guān)系繪制原理圖。系統(tǒng)包括:MCU、矩陣按鍵、LED、數(shù)碼管

EEPROM第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計AT24C02源代碼設(shè)計包括i2c.h設(shè)計、i2c.c設(shè)計和main.c設(shè)計。(1)i2c.h設(shè)計

voidAT24C02_Write(unsignedchar*pucBuf,

unsignedcharaddr,unsignedcharnum);

voidAT24C02_Read(unsignedchar*pucBuf,

unsignedcharaddr,unsignedcharnum);第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(2)i2c.c設(shè)計

#defineDELAY_TIME5

//I2C引腳定義

sfrP2=0xA0;

sbitSCL=P2^0;//時鐘線

sbitSDA=P2^1;//數(shù)據(jù)線

voidI2C_Delay(unsignedchari)

{

while(i--);

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(2)i2c.c設(shè)計

//I2C起始條件

voidI2C_Start(void)

{

SDA=1;

SCL=1;

I2C_Delay(DELAY_TIME);

SDA=0;

I2C_Delay(DELAY_TIME);

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(2)i2c.c設(shè)計

//I2C停止條件

voidI2C_Stop(void)

{

SDA=0;

SCL=1;

I2C_Delay(DELAY_TIME);

SDA=1;

I2C_Delay(DELAY_TIME);

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(2)i2c.c設(shè)計

//I2C發(fā)送應(yīng)答:0-應(yīng)答,1-非應(yīng)答

voidI2C_SendAck(bitackbit)

{

SCL=0;

SDA=ackbit;

I2C_Delay(DELAY_TIME);

SCL=1;

I2C_Delay(DELAY_TIME);

SCL=0;

SDA=1;

I2C_Delay(DELAY_TIME);

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(2)i2c.c設(shè)計

//I2C等待應(yīng)答

bitI2C_WaitAck(void)

{

bitackbit;

SCL=1;I2C_Delay(DELAY_TIME);

ackbit=SDA;

SCL=0;I2C_Delay(DELAY_TIME);

returnackbit;

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(2)i2c.c設(shè)計

//I2C發(fā)送數(shù)據(jù)

voidI2C_SendByte(unsignedchardat)

{

unsignedchari;

for(i=0;i<8;i++)

{

SCL=0;

I2C_Delay(DELAY_TIME);

if(dat&0x80)SDA=1;

elseSDA=0;

I2C_Delay(DELAY_TIME);

SCL=1;

dat<<=1;

I2C_Delay(DELAY_TIME);

}

SCL=0;

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(2)i2c.c設(shè)計

//I2C接收數(shù)據(jù)

unsignedcharI2C_RecvByte(void)

{unsignedchari,dat;

for(i=0;i<8;i++){

SCL=1;I2C_Delay(DELAY_TIME);

dat<<=1;

if(SDA)dat|=1;

SCL=0;I2C_Delay(DELAY_TIME);}

returndat;

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(2)i2c.c設(shè)計

//AT24C02緩存器寫:pucBuf-數(shù)據(jù),ucAddr-地址,ucNum-數(shù)量

voidAT24C02_Write(unsignedchar*pucBuf,

unsignedcharucAddr,unsignedcharucNum)

{

I2C_Start();

I2C_SendByte(0xa0);

//發(fā)送器件地址及控制位(寫)

I2C_WaitAck();

I2C_SendByte(ucAddr);

//發(fā)送數(shù)據(jù)地址

I2C_WaitAck();第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(2)i2c.c設(shè)計

//AT24C02緩存器寫:pucBuf-數(shù)據(jù),ucAddr-地址,ucNum-數(shù)量

while(ucNum--)

{

I2C_SendByte(*pucBuf++);//發(fā)送數(shù)據(jù)

I2C_WaitAck();

I2C_Delay(200);

}

I2C_Stop();

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(2)i2c.c設(shè)計

//AT24C02緩存器讀:pucBuf-數(shù)據(jù),ucAddr-地址,ucNum-數(shù)量

voidAT24C02_Read(unsignedchar*pucBuf,

unsignedcharucAddr,unsignedcharucNum)

{

I2C_Start();

I2C_SendByte(0xa0);//發(fā)送器件地址及控制位(寫)

I2C_WaitAck();

I2C_SendByte(ucAddr);//發(fā)送數(shù)據(jù)地址

I2C_WaitAck();第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(2)i2c.c設(shè)計

//AT24C02緩存器讀:pucBuf-數(shù)據(jù),ucAddr-地址,ucNum-數(shù)量

I2C_Start();

I2C_SendByte(0xa1);//發(fā)送器件地址及控制位(讀)

I2C_WaitAck();

while(ucNum--)

{

*pucBuf++=I2C_RecvByte();//接收數(shù)據(jù)

if(ucNum)I2C_SendAck(0);

elseI2C_SendAck(1);}

I2C_Stop();

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(3)main.c設(shè)計

*程序說明:用AT24C02記錄系統(tǒng)啟動次數(shù)并顯示,S4切換狀態(tài),LED顯示狀態(tài)

#include<stdio.h>

#include"tim.h"

#include"key.h"

#include"seg.h"

#include"i2c.h"

voidSeg_Proc(void);

voidKey_Proc(void);第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(3)main.c設(shè)計

unsignedcharucState=1;//系統(tǒng)狀態(tài)

unsignedcharucSec;//秒值

unsignedintuiSeg_Dly;//顯示刷新延時

unsignedcharucSeg_Dly;//顯示移位延時

unsignedcharpucSeg_Char[12];//顯示字符

unsignedcharpucSeg_Code[8];//顯示代碼

unsignedcharucSeg_Pos;//顯示位置

unsignedcharucKey_Dly;//按鍵延時

unsignedcharucKey_Old;//按鍵舊值

unsignedcharucLed;//LED值

unsignedcharucCnt;//系統(tǒng)啟動次數(shù)第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(3)main.c設(shè)計

voidmain(void)

{

Close_Peripheral();

T1_Init();

AT24C02_Read((unsignedchar*)&ucCnt,0,1);

ucCnt++;

AT24C02_Write((unsignedchar*)&ucCnt,0,1);第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(3)main.c設(shè)計

while(1)

{

T1_Proc();

Seg_Proc();

Key_Proc();

}

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(3)main.c設(shè)計

voidSeg_Proc(void)

{

if(uiSeg_Dly>500){//500ms時間到

uiSeg_Dly=0;

switch(ucState)

{

case0://顯示T1時鐘

sprintf(pucSeg_Char,"1%06u",(unsignedint)ucSec);

break;

case1://顯示系統(tǒng)啟動次數(shù)

sprintf(pucSeg_Char,"2%06u",(unsignedint)ucCnt);}

Seg_Tran(pucSeg_Char,pucSeg_Code);

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(3)main.c設(shè)計

if(ucSeg_Dly>2)

{

ucSeg_Dly=0;

Seg_Disp(pucSeg_Code,ucSeg_Pos);

ucSeg_Pos=++ucSeg_Pos&7;//數(shù)碼管循環(huán)顯示

}

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(3)main.c設(shè)計

voidKey_Proc(void)

{

unsignedcharucKey_Val,ucKey_Dn,ucKey_Up;

if(ucKey_Dly<10)//10ms時間未到

return;//延時消抖

ucKey_Dly=0;

ucKey_Val=Key_Read();//讀取按鍵值

ucKey_Dn=ucKey_Val&(ucKey_Old^ucKey_Val);

ucKey_Up=~ucKey_Val&(ucKey_Old^ucKey_Val);

ucKey_Old=ucKey_Val;//保存按鍵值第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計(3)main.c設(shè)計

switch(ucKey_Dn){

case4://S4鍵

if(++ucState==2)//切換狀態(tài)

ucState=0;

break;

case5://S5鍵

break;}

ucLed=1<<ucState;

Led_Disp(ucLed);//LED顯示狀態(tài)

}第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.2源代碼設(shè)計思考:對比AT24C02的字節(jié)讀寫格式,兩者有什么相同點和不同點?第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.3源代碼調(diào)試AT24C02源代碼調(diào)試包括AT24C02緩沖器讀調(diào)試和AT24C02緩沖器寫調(diào)試①單擊“開始仿真”按鈕,進(jìn)入調(diào)試狀態(tài)。②單擊“單步”按鈕,運行關(guān)閉外設(shè)函數(shù)Close_Peripheral()和T1初始化函數(shù)T1_Init()。③單擊“調(diào)試”菜單中的“I2CMemoryInternalMemory”菜單項,顯示AT24C02存儲器的內(nèi)容,其中地址0的內(nèi)容為05(實際內(nèi)容可能不同)。④單擊“單步”按鈕,運行AT24C02緩沖器讀函數(shù)AT24C02_Read(),從地址0讀出1個字節(jié)的數(shù)據(jù)到ucCnt,并將ucCnt的值加1。⑤單擊“單步”按鈕,運行AT24C02緩沖器寫函數(shù)AT24C02_Write(),將ucCnt的值寫到地址0,地址0的內(nèi)容為06。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.3串行EEPROMAT24C023.3.3源代碼調(diào)試AT24C02源代碼調(diào)試包括AT24C02緩沖器讀調(diào)試和AT24C02緩沖器寫調(diào)試注意:可以用示波器觀察緩沖器讀寫時SCL和SDA的波形。⑥單擊“運行仿真”按鈕,運行程序,數(shù)碼管顯示“2000006”(啟動次數(shù)為6)。⑦單擊“停止仿真”按鈕,停止程序運行。⑧單擊“運行仿真”按鈕,重新運行程序,數(shù)碼管顯示“2000007”(啟動次數(shù)為7)。⑨單擊“停止仿真”按鈕,停止程序運行。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.48位ADC/DACPCF8591ADC(模數(shù)轉(zhuǎn)換器)的主要功能是將模擬信號轉(zhuǎn)化為數(shù)字信號,以便于微控制器進(jìn)行數(shù)據(jù)處理。ADC按轉(zhuǎn)換原理分為逐次比較型、雙積分型和S-D型。逐次比較型ADC通過逐次比較將模擬信號轉(zhuǎn)化為數(shù)字信號,轉(zhuǎn)換速度快,但精度較低,是最常用的ADC。雙積分型ADC通過兩次積分將模擬信號轉(zhuǎn)化為數(shù)字信號,精度高,抗干擾能力強(qiáng),但速度較慢,主要用于萬用表等測量儀器。S-D型ADC具有逐次比較型和雙積分型的雙重優(yōu)點,正在逐步廣泛地得到應(yīng)用。ADC的主要參數(shù)有采樣速率、轉(zhuǎn)換精度(位數(shù))和轉(zhuǎn)換時間。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.48位ADC/DACPCF8591DAC(數(shù)模轉(zhuǎn)換器)的主要功能是將數(shù)字信號轉(zhuǎn)化為模擬信號,DAC的核心是權(quán)電阻網(wǎng)絡(luò)和運算放大器,用于將數(shù)字信號轉(zhuǎn)換成模擬電流和電壓。PCF8591是8位ADC/DAC器件,具有4個模擬輸入AIN0~3、1個模擬輸出AOUT和1個I2C接口,工作電壓2.5~6.0V。PCF8591的控制字節(jié)格式如圖3.17所示。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.48位ADC/DACPCF8591PCF8591的控制字節(jié)格式如圖3.17所示。其中:AOE為模擬輸出允許(1有效)AI1和AI0為模擬量輸入選擇(00-四路單端輸入、01-三路差分輸入、10-兩路單端與一路差分輸入、11-兩路差分輸入)AIF為自動增加標(biāo)志(1有效,AD通道自動增加)AD1和AD0為AD通道號(00-通道0,01-通道1,10-通道2,11-通道3)。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.48位ADC/DACPCF8591設(shè)計要求:用PCF8591實現(xiàn)電位器電壓的模數(shù)轉(zhuǎn)換和數(shù)模轉(zhuǎn)換并顯示。PCF8591設(shè)計在AT24C02設(shè)計的基礎(chǔ)上完成:在“D:\MCS51”文件夾中將“303_AT24C02”文件夾復(fù)制粘貼為“304_PCF8591”文件夾。3.4.1原理圖繪制3.4.2源代碼設(shè)計3.4.3源代碼調(diào)試第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.48位ADC/DACPCF85913.4.1原理圖繪制PCF8591原理框圖如圖3.18所示。系統(tǒng)包括:MCU、矩陣按鍵、LED、數(shù)碼管

EEPROM、ADC/DACPCF8591通過P20(SCK)和P21(SDA)與MCU相連,PCF8591的AIN1連接光敏電阻RD1,AIN3連接電位器RB2。第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.48位ADC/DACPCF85913.4.1原理圖繪制在原理圖中添加元器件“PCF8591”、LDR(光敏電阻)和“POT-HG”(電位器),按圖3.19的布局和連接關(guān)系繪制原理圖。系統(tǒng)包括:MCU、矩陣按鍵、LED、數(shù)碼管

EEPROM、ADC/DAC第3章擴(kuò)展模塊設(shè)計與調(diào)試09:02:10基于Proteus的單片機(jī)設(shè)計與調(diào)試前頁

返回3.48位ADC/DACPCF85913.4.2源代碼設(shè)計PCF8591源代碼設(shè)計包括i2c.h修改、i2c.c修改和main.c修改。(1)i2c.h修改在i2c.h中增加下列函數(shù)聲明:

unsignedcharPCF8591_Adc(unsignedcharucAin)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論