單片機(jī)原理與應(yīng)用(C51編程+Proteus仿真) 課件 劉霞 第9、10章 串行擴(kuò)展技術(shù)、單片機(jī)應(yīng)用系統(tǒng)綜合設(shè)計(jì)_第1頁(yè)
單片機(jī)原理與應(yīng)用(C51編程+Proteus仿真) 課件 劉霞 第9、10章 串行擴(kuò)展技術(shù)、單片機(jī)應(yīng)用系統(tǒng)綜合設(shè)計(jì)_第2頁(yè)
單片機(jī)原理與應(yīng)用(C51編程+Proteus仿真) 課件 劉霞 第9、10章 串行擴(kuò)展技術(shù)、單片機(jī)應(yīng)用系統(tǒng)綜合設(shè)計(jì)_第3頁(yè)
單片機(jī)原理與應(yīng)用(C51編程+Proteus仿真) 課件 劉霞 第9、10章 串行擴(kuò)展技術(shù)、單片機(jī)應(yīng)用系統(tǒng)綜合設(shè)計(jì)_第4頁(yè)
單片機(jī)原理與應(yīng)用(C51編程+Proteus仿真) 課件 劉霞 第9、10章 串行擴(kuò)展技術(shù)、單片機(jī)應(yīng)用系統(tǒng)綜合設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩180頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

單片機(jī)的串行擴(kuò)展技術(shù)09介紹介紹單片機(jī)系統(tǒng)中常用的單總線、I2C總線以及SPI總線串行擴(kuò)展技術(shù)。09單片機(jī)的串行擴(kuò)展技術(shù)01單總線擴(kuò)展技術(shù)02I2C總線擴(kuò)展技術(shù)03SPI總線擴(kuò)展技術(shù)基于DS18B20的溫度測(cè)量系統(tǒng)設(shè)計(jì)9.1介紹單總線器件DS18B20的使用。任務(wù)要求:設(shè)計(jì)溫度測(cè)量系統(tǒng)并實(shí)時(shí)顯示,且具有越線報(bào)警功能。基于DS18B20的溫度測(cè)量系統(tǒng)設(shè)計(jì)9.1介紹單總線器件按DS18B20的使用。任務(wù)要求:設(shè)計(jì)溫度測(cè)量系統(tǒng)并實(shí)時(shí)顯示,且具有越線報(bào)警功能。一、單總線串行技術(shù)簡(jiǎn)介三、硬件電路設(shè)計(jì)四、軟件設(shè)計(jì)五、仿真二、DS18B20芯片簡(jiǎn)介一、單總線串行技術(shù)簡(jiǎn)介單總線技術(shù):只用一條信號(hào)線的串行擴(kuò)展技術(shù)。只有一條信號(hào)線,既傳輸時(shí)鐘信號(hào)又傳輸輸入/輸出數(shù)據(jù)。單總線系統(tǒng)中配置的各種器件,都掛接在這根信號(hào)線上。單總線協(xié)議從芯片都有64位ROM:48位序列號(hào)+8位家族代碼和8位CRC碼。它是器件的地址編號(hào),確保它掛在總線上后,地址唯一地被確定。二、DS18B20芯片簡(jiǎn)介DS18B20三腳分布實(shí)物DS18B20八腳分布實(shí)物DQ:數(shù)據(jù)輸入/輸出信號(hào)線VDD:電源GND:地NC:空引腳①電壓范圍3.0V~5.5V,在寄生電源方式下可由數(shù)據(jù)線供電。②測(cè)溫范圍-55℃~+125℃,在-10℃~+85℃時(shí)精度為+0.5℃。③微處理器連接時(shí)僅需要一條口線即可實(shí)現(xiàn)雙向通信。④支持多點(diǎn)組網(wǎng)功能,多個(gè)DS18B20可以并聯(lián)在單總線上,實(shí)現(xiàn)多點(diǎn)測(cè)溫。⑤測(cè)量結(jié)果直接輸出數(shù)字溫度信號(hào),具有極強(qiáng)的抗干擾糾錯(cuò)能力。⑥可編程分辨率為9~12位,可實(shí)現(xiàn)高精度測(cè)溫。⑦在9位分辨率時(shí),最多在93.75ms內(nèi)把溫度轉(zhuǎn)換為數(shù)字;12位分辨率時(shí),最多在750ms內(nèi)把溫度值轉(zhuǎn)換為數(shù)字,轉(zhuǎn)換速度快。

⑧負(fù)壓特性。電源極性接反時(shí),芯片不會(huì)因發(fā)熱而燒毀,但不能正常工作。DS18B20溫度傳感器特性二、DS18B20芯片簡(jiǎn)介DS18B20典型連接單點(diǎn)DS18B20電路示意圖多點(diǎn)DS18B20電路示意圖8位產(chǎn)品類型標(biāo)號(hào)DS18B20芯片的48位自身序列號(hào)8位CRC碼DSI8B20芯片片內(nèi)都有唯一的64位光刻ROM編碼,出廠時(shí)已刻好二、DS18B20芯片簡(jiǎn)介DS18B20芯片的命令當(dāng)主機(jī)需要對(duì)單點(diǎn)測(cè)溫系統(tǒng)進(jìn)行操作時(shí)的步驟:①只要用跳過(guò)ROM(0xCC)命令,不需要讀取ROM編碼以及匹配ROM編碼。②執(zhí)行溫度轉(zhuǎn)換和讀取命令二、DS18B20芯片簡(jiǎn)介配置寄存器各位的定義TM位出廠時(shí)已被寫入0,用戶不能改變默認(rèn)分辨率12位0b0000000000010.0625°C前5位為0時(shí),溫度為正值,測(cè)得的數(shù)值乘以0.0625即可得到實(shí)際溫度值。前5位為1時(shí),溫度為負(fù)值,測(cè)到的數(shù)值取反加1再乘以0.0625才可得到實(shí)際溫度值【例】讀取的DS18B20溫度數(shù)據(jù)為0000011111010000時(shí)的實(shí)際溫度是多少?【例】讀取的DS18B20溫度數(shù)據(jù)為1111

110010010000時(shí)的實(shí)際溫度是多少?負(fù)號(hào)在顯示時(shí)顯示出即可DS18B20溫度數(shù)據(jù)存儲(chǔ)格式0000

0011011011110000

001101110000二、DS18B20芯片簡(jiǎn)介初始化時(shí)序DQ=1;延時(shí)(不嚴(yán)格);DQ=0;延時(shí)(480~960μs);DQ=1;延時(shí)(15~60

μs);讀DQ返回值延時(shí)(60~240

μs);DQ=1;bitinit_DS18B20() //DS18B20初始化{ucharnum;bitflag;

DQ=1;//先拉高for(num=0;num<2;num++);//延時(shí),不嚴(yán)格DQ=0;//拉低for(num=0;num<200;num++);//延時(shí)480-960us

DQ=1;//拉高for(num=0;num<20;num++); //等待>60us

flag=DQ;//讀DS18B20返回值for(num=0;num<150;num++);//60-240us

DQ=1;

//拉高,返回初始狀態(tài)returnflag;//返回初始化應(yīng)答信號(hào)}返回值為低電平,檢測(cè)到DS18B20返回值為高電平,則沒(méi)有檢測(cè)DS18B20二、DS18B20芯片簡(jiǎn)介寫入時(shí)序DQ=0;延時(shí)(>1μs);DQ=0/1;保持(15~60μs);DQ=1;延時(shí)(>1μs);

DQ=0;//拉低_nop_(); //延時(shí)1us_nop_();//延時(shí)1usDQ=1/0;//輸出1或0for(num=0;num<20;num++);//15~60usDQ=1; //拉高 _nop_();//延時(shí)1us_nop_();//延時(shí)1us寫1位數(shù)據(jù)voidDS18B20_WR_CHAR(ucharbyte) {

ucharnum;ucharnum1;for(num1=0;num1<8;num1++){

DQ=0;//拉低

_nop_();//延時(shí)1us_nop_();

//延時(shí)1us

DQ=byte&0x01;//寫入byte的最后1位for(num=0;num<20;num++);//延時(shí)

byte>>=1;//把要寫入的位

//移入byte最后1位

DQ=1;//拉高

_nop_();//延時(shí)1us_nop_();//延時(shí)1us

}

}寫1個(gè)字節(jié)函數(shù)二、DS18B20芯片簡(jiǎn)介讀數(shù)據(jù)時(shí)序DQ=0;延時(shí)(1us);DQ=1;延時(shí)(<10us);變量=DQ;延時(shí)(>60us);DQ=0; //拉低

_nop_();//延時(shí)DQ=1;//釋放總線for(num=0;num<1;num++);//<10us

byte=DQ;//讀1位數(shù)據(jù)for(num=0;num<20;num++);//>60us

讀1位數(shù)據(jù)ucharDS18B20_RD_CHAR() {ucharnum;ucharnum1;ucharbyte=0;for(num1=0;num1<8;num1++){DQ=0;//拉低

_nop_();//延時(shí)

DQ=1;//釋放總線

for(num=0;num<1;num++);//<10us

byte>>=1;if(DQ==1)

byte|=0x80;for(num=0;num<20;num++);//>60us

}returnbyte;}讀1個(gè)字節(jié)函數(shù)二、DS18B20芯片簡(jiǎn)介DS18B20讀取溫度及處理:①檢測(cè)DS18B20是否存在;②

發(fā)送跳過(guò)ROM命令0xCC;③發(fā)送啟動(dòng)溫度轉(zhuǎn)換0x44;④延時(shí);⑤再判斷DS18B20存在;⑥發(fā)送跳過(guò)ROM命令0xCC;⑦再發(fā)送讀溫度命令0xBE;⑧先讀低8位;⑨再讀高8位;⑩讀完后將低11位的二進(jìn)制數(shù)轉(zhuǎn)化為十進(jìn)制數(shù)再乘以0.0625voidDS18B20_Temperature() //溫度讀取及處理函數(shù){uchartemperaturel=0;uchartemperatureh=0;if(init_DS18B20()==0){DS18B20_WR_CHAR(0xcc);//跳過(guò)ROMDS18B20_WR_CHAR(0x44);//啟動(dòng)溫度轉(zhuǎn)換,結(jié)果存入內(nèi)部RAMdelay(1000);if(init_DS18B20()==0)//初始化返回值為0,器件存在{ DS18B20_WR_CHAR(0xcc);//跳過(guò)ROMDS18B20_WR_CHAR(0xBE);//發(fā)送讀溫度命令_nop_();

temperaturel=DS18B20_RD_CHAR();//讀溫度低8位

temperatureh=DS18B20_RD_CHAR();//讀溫度高8位

Temperature=(temperatureh*256+temperaturel)*0.0625*10+0.5;

//轉(zhuǎn)換乘以10表示小數(shù)點(diǎn)后面只//取1位,并四舍五入,溫度比正常大10倍

init_DS18B20();//DS18B20初始化} }}三

、硬件電路設(shè)計(jì)任務(wù)要求:設(shè)計(jì)溫度測(cè)量系統(tǒng)并實(shí)時(shí)顯示,且具有越線報(bào)警功能。四、

軟件設(shè)計(jì)sbitDQ=P1^3;//DS18B20#include<intrins.h>sbitlcdrs=P1^0; sbitlcdrw=P1^1; sbitlcden=P1^2;#defineoutP2四、

軟件設(shè)計(jì)四、

軟件設(shè)計(jì)voidmain(){LCD_init();delay(1000);while(1){if(flag==0) //flag=0,說(shuō)明DS18B20存在

{

DS18B20_Temperature();

write_cmd(0x80);write_str("Tem:");

write_data((Temperature/100)%10+48);

write_data((Temperature/10)%10+48);write_data('.');

write_data(Temperature%10+48);

write_data(0xdf);//顯示“°”

write_data('C');//顯示“C”

if(Temperature/10>=25)

{

buzzer=0;

}}}#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineOUTP2//LCD1602數(shù)據(jù)端sbitlcdrs=P1^0;//LCD命令數(shù)據(jù)控制sbitlcdrw=P1^1;//LCD1602讀寫端sbitlcden=P1^2;//LCD1602使能端sbitDQ=P1^3;//DS18B20數(shù)據(jù)端

sbitbuzzer=P1^4;//蜂鳴器

uintTemperature=0;bitflag;voiddelay(uintz);//延時(shí)函數(shù)voidLCD_init();//LCD1602初始化voidwrite_cmd(charcmd);//寫指令voidwrite_data(uchardat);//寫數(shù)據(jù)voidwrite_str(uchar*str);//寫字符串bitinit_DS18B20();//DS18B20初始化voidDS18B20_WR_CHAR(ucharbyte); ucharDS18B20_RD_CHAR();voidDS18B20_Temperature();任務(wù)要求:設(shè)計(jì)溫度測(cè)量系統(tǒng)并實(shí)時(shí)顯示,且具有越線報(bào)警功能。五、仿真1在KeilC中編寫、編譯代碼,生成hex文件。任務(wù)要求:設(shè)計(jì)溫度測(cè)量系統(tǒng)并實(shí)時(shí)顯示,且具有越線報(bào)警功能。五、仿真2在Preteus中繪制電路圖,加載hex文件運(yùn)行。任務(wù)要求:設(shè)計(jì)溫度測(cè)量系統(tǒng)并實(shí)時(shí)顯示,且具有越線報(bào)警功能?;贒S18B20的溫度測(cè)量系統(tǒng)設(shè)計(jì)9.1介紹多.c文件編程方法。任務(wù)要求:設(shè)計(jì)溫度測(cè)量系統(tǒng)并實(shí)時(shí)顯示,且具有越線報(bào)警功能。一、多.c文件編程方法二、程序拆解(9.1.2節(jié)代碼)一、多.c文件編程方法單.C文件編程:將所有功能的程序代碼寫在一個(gè).c文件中進(jìn)行調(diào)試和編譯。(9.1.2節(jié))不足:隨硬件模塊使用的增多,代碼會(huì)變得比較大、功能比較復(fù)雜。任務(wù)要求:設(shè)計(jì)溫度測(cè)量系統(tǒng)并實(shí)時(shí)顯示,且具有越線報(bào)警功能。一、多.c文件編程方法多.C文件編程:將不同功能的程序分別用不同的.c文件封裝,再用.h文件進(jìn)行外部聲明,當(dāng)在其他項(xiàng)目里需要用到相同功能時(shí),將之前寫好的.c和.h文件復(fù)制到新項(xiàng)目中。優(yōu)勢(shì):可讀性、可移植性和可維護(hù)性好。一、多.c文件編程方法多.c文件編程通常要遵循幾個(gè)原則:①每一個(gè)功能的.c文件對(duì)應(yīng)一個(gè)同名的.h頭文件。②頭文件中只能放置接口的聲明,不能放置具體的實(shí)現(xiàn)。每個(gè).h頭文件里都必須聲明它對(duì)應(yīng)的.c文件里的所有定義函數(shù)和全局變量。③.c文件中應(yīng)放置函數(shù)的實(shí)現(xiàn)、變量的賦值、語(yǔ)句的操作等。.c文件中應(yīng)包含同名.h頭文件。④.c文件只要使用其他.c文件的函數(shù),要將對(duì)應(yīng)的.h頭文件包含到該.c文件中,⑤聲明一個(gè)全局變量必須加extern關(guān)鍵字,同時(shí)千萬(wàn)不能在聲明全局變量的時(shí)候賦

初始值。在使用該變量的一個(gè).c文件中進(jìn)行變量定義及賦初值等操作即可。一、多.c文件編程方法多.C文件的編寫步驟:1.首先將程序按功能分塊2.在KeilC中新建工程3.新建main.c以及各功能.c和.h文件4.在工程中添加所有的.c文件5.編譯二、程序拆解多.C文件的編寫步驟:1.首先將程序按功能分塊2.在KeilC中新建工程3.新建main.c以及各功能.c和.h文件4.在工程中添加所有的.c文件5.編譯①延時(shí)程序;②DS18B20溫度采集程序;

③LCD1602顯示程序;④主程序;將程序按功能分塊任務(wù)要求:設(shè)計(jì)溫度測(cè)量系統(tǒng)并實(shí)時(shí)顯示,且具有越線報(bào)警功能。二、程序拆解任務(wù)要求:采用單片機(jī)設(shè)計(jì)溫度測(cè)量系統(tǒng)并實(shí)時(shí)顯示,并具有越線報(bào)警功能。(1)編寫delay.c和delay.h#ifndefDELAY_H_//⑤#defineDELAY_H_//⑤#defineucharunsignedchar//④#defineuintunsignedint//④voiddelay(uintz);//延時(shí)函數(shù)//③#endif//⑤delay.h⑤【條件編譯】

如果頭文件不加條件編譯語(yǔ)句⑤,則C51對(duì)工程進(jìn)行編譯時(shí),就會(huì)對(duì)delay.h進(jìn)行重復(fù)編譯,頭文件的這種重復(fù)引用不但增加了編譯的工作量,降低編譯效率,而且如果在h文件中聲明了全局變量,那么編譯過(guò)程可能會(huì)出現(xiàn)變量重復(fù)定義的錯(cuò)誤。#include<delay.h>//②voiddelay(uintz)//延時(shí)函數(shù)①{

uintx,y;

for(x=112;x>0;x--)

for(y=z;y>0;y--);}delay.c二、程序拆解(2)編寫DS18B20.c和DS18B20.h#include<DS18B20.h>bitflag=0;uintTemperature=0;bitinit_DS18B20() //DS18B20初始化{函數(shù)體略}voidDS18B20_WR_CHAR(ucharbyte) {函數(shù)體略}ucharDS18B20_RD_CHAR() {函數(shù)體略}voidDS18B20_Temperature(){函數(shù)體略}#ifndefDS18B20_H_#defineDS18B20_H_#include<reg52.h>#include<delay.h>sbitDQ=P1^3;//DS18B20數(shù)據(jù)端externuintTemperature;externbitflag;bitinit_DS18B20(); //DS18B20初始化voidDS18B20_WR_CHAR(ucharbyte); //寫字節(jié)ucharDS18B20_RD_CHAR(); //讀字節(jié)voidDS18B20_Temperature();//溫度處理函數(shù)#endifDS18B20.cDS18B20.h任務(wù)要求:采用單片機(jī)設(shè)計(jì)溫度測(cè)量系統(tǒng)并實(shí)時(shí)顯示,并具有越線報(bào)警功能。⑤聲明一個(gè)全局變量必須加extern關(guān)鍵字,同時(shí)千萬(wàn)不能在聲明全局變量的時(shí)候賦

初始值。在使用該變量的一個(gè).c文件中進(jìn)行變量定義及賦初值等操作即可。②頭文件中只能放置接口的聲明,不能放置具體的實(shí)現(xiàn)。每個(gè).h頭文件里都必須聲明它對(duì)應(yīng)的.c文件里的所有定義函數(shù)和全局變量。二、程序拆解(3)編寫LCD1602.c和LCD1602.h#include<LCD1602.h>voidLCD_init()//LCD初始化{函數(shù)體略}voidwrite_cmd(charcmd)//寫指令{函數(shù)體略}voidwrite_data(uchardat)//寫數(shù)據(jù){函數(shù)體略}voidwrite_str(uchar*str)//寫字符串{函數(shù)體略}#ifndefLCD1602_H_#defineLCD1602_H_#include<reg52.h>#include<delay.h>#defineOUTP2//LCD1602數(shù)據(jù)端sbitlcdrs=P1^0;//LCD1602命令數(shù)據(jù)控制端sbitlcdrw=P1^1;//LCD1602讀寫端sbitlcden=P1^2;//LCD1602使能端voidLCD_init();//LCD1602初始化voidwrite_cmd(ucharcmd);//寫指令函數(shù)voidwrite_data(uchardat);//寫數(shù)據(jù)函數(shù)voidwrite_str(uchar*str);//寫字符串函數(shù)#endifLCD1602.cLCD1602.h任務(wù)要求:采用單片機(jī)設(shè)計(jì)溫度測(cè)量系統(tǒng)并實(shí)時(shí)顯示,并具有越線報(bào)警功能。二、程序拆解(4)編寫main.c任務(wù)要求:采用單片機(jī)設(shè)計(jì)溫度測(cè)量系統(tǒng)并實(shí)時(shí)顯示,并具有越線報(bào)警功能。#include<reg52.h>#include<LCD1602.h>#include<DS18B20.h> sbitbuzzer=P1^4;//蜂鳴器

voidmain(){

LCD_init();delay(1000);while(1){

if(flag==0) //檢測(cè)到flag=0,說(shuō)明DS18B20存在{ DS18B20_Temperature();// write_cmd(0x80); write_str("Tem:"); write_data((Temperature/100)%10+48); write_data((Temperature/10)%10+48); write_data('.'); write_data(Temperature%10+48); write_data(0xdf); write_data('C'); if(Temperature/10>=25)buzzer=0;elsebuzzer=1;}}}④.c文件只要使用其他.c文件的函數(shù),要將對(duì)應(yīng)的.h頭文件包含到該.c文件中。09單片機(jī)的串行擴(kuò)展技術(shù)01單總線擴(kuò)展技術(shù)02I2C總線擴(kuò)展技術(shù)03SPI總線擴(kuò)展技術(shù)基于AT24C02的存儲(chǔ)卡設(shè)計(jì)仿真實(shí)例9.2介紹

I2C器件AT24C02的使用方法。任務(wù)要求:設(shè)計(jì)存儲(chǔ)卡,通過(guò)按鍵控制存儲(chǔ)卡的讀寫,并在顯示器

上顯示寫入或讀出的內(nèi)容?;贏T24C02的存儲(chǔ)卡設(shè)計(jì)仿真實(shí)例9.2介紹

I2C器件AT24C02的使用方法。任務(wù)要求:設(shè)計(jì)存儲(chǔ)卡,通過(guò)按鍵控制存儲(chǔ)卡的讀寫,并在顯示器上顯示寫入或讀出的內(nèi)容。一、

I2C總線擴(kuò)展技術(shù)三、硬件電路設(shè)計(jì)四、軟件設(shè)計(jì)五、仿真二、AT24C02芯片簡(jiǎn)介一、

I2C總線擴(kuò)展技術(shù)2根線:數(shù)據(jù)線SDA,時(shí)鐘線SCL,主從工作方式

I2C(InterInterfaceCircurt)總線全稱為芯片間總線,同步通信。

(一)I2C總線基本結(jié)構(gòu)各I2C器件掛在同一條總線,每個(gè)器件都有唯一的地址各I2C器件輸出端為漏級(jí)開路,故必須接上拉電阻主控器通常由單片機(jī)來(lái)?yè)?dān)當(dāng)。帶有I2C接口單片機(jī)可直接與具有I2C接口器件連接,單片機(jī)沒(méi)有I2C接口,可采用I/O口線結(jié)合軟件實(shí)現(xiàn)I2C總線的時(shí)序模擬從器件必須帶有I2C串行總線接口的器件。(二)I2C總線數(shù)據(jù)通信格式地址格式(8位)

寫入地址為1010

0000讀取地址為1010

0001(二)I2C總線數(shù)據(jù)通信格式voidI2C_init(){SCL=1;delay5us();SDA=1;delay5us();}voidstart(){

SCL=1;SDA=1;delay5us();SDA=0;delay5us();SCL=0;}voidwrite_byte(uchardate){uchari,temp;temp=date;for(i=0;i<8;i++)//每次寫1位,8次循環(huán)寫一個(gè)字節(jié){

temp=temp<<1;//左移1位,temp中的最高位移至CY

SCL=0;delay5us();

SDA=CY;//CY再送至SDA總線delay5us();

SCL=1;delay5us();}SCL=0;delay5us();SDA=1;delay5us();}voiddelay5us(){

_nop_(); _nop_();_nop_();_nop_();_nop_();}①總線初始化②起始信號(hào)③寫一個(gè)字節(jié)①②③初始化④(二)I2C總線數(shù)據(jù)通信格式ucharread_byte(){

uchari,k;SCL=0;delay5us();SDA=1;for(i=0;i<8;i++)//每次讀1位,8次循環(huán)讀一個(gè)字節(jié){

SCL=1;delay5us();

k=(k<<1)|SDA;//每次從SDA接收的數(shù)據(jù)都放在變量k的最低位delay5us();

SCL=0;delay5us();}delay5us();returnk;//返回讀取的1個(gè)字節(jié)數(shù)據(jù)}④讀一個(gè)字節(jié)①②③④初始化(二)I2C總線數(shù)據(jù)通信格式voidAck(){

uchari;SDA=0;SCL=1;delay5us();while((SDA==1)&&(i<255))i++;SCL=0;delay5us();}⑤應(yīng)答信號(hào)①②③④⑤⑥初始化非應(yīng)答信號(hào)voidNoAck(){SDA=1;SCL=1;delay5us();SCL=0;SDA=0;}voidstop(){

SDA=0;delay5us();SCL=1;delay5us();SDA=1;delay5us();}停止信號(hào)二、

AT24C02芯片簡(jiǎn)介ATMEL公司生產(chǎn)的AT24C系列存儲(chǔ)卡,主要型號(hào)有AT24C01/02/04/08/16等,其對(duì)應(yīng)的存儲(chǔ)容量分別為128*8/256*8/512*8/1024*8/2048*8。二、

AT24C02芯片簡(jiǎn)介AT24C02的位存儲(chǔ)容量為2Kb,字節(jié)存儲(chǔ)容量為256B,分為32頁(yè),每頁(yè)8B兩種尋址方式:芯片尋址和片內(nèi)子地址尋址0x00~0xFF(256B)(1)芯片地址(2)片內(nèi)子地址:字節(jié)寫入時(shí)序指定地址讀操作時(shí)序三、

硬件電路設(shè)計(jì)任務(wù)要求:設(shè)計(jì)存儲(chǔ)卡,通過(guò)按鍵控制存儲(chǔ)卡的讀寫,并在顯示器上顯示寫入或讀出的內(nèi)容。四、軟件設(shè)計(jì)①按下“寫入”按鍵在AT24C02地址0x01里寫入5,在1602上顯示“write:5” ②按下“讀出”按鍵讀取AT24C02地址0x01里數(shù)據(jù),在1602上顯示“read:”+讀出數(shù)據(jù)③“寫入”按鍵采用外部中斷0,“讀出”按鍵采用外部中斷1任務(wù)要求:通過(guò)按鍵控制存儲(chǔ)卡讀寫,在顯示器上顯示寫入或讀出的內(nèi)容。voidINT_init(){IT0=1;EX0=1;IT1=1;EX1=1;EA=1;}voidINT0_write()interrupt0{flag=1;}voidINT1_read()interrupt2{flag=2;}主程序中判斷flag=1,調(diào)用在指定地址寫入函數(shù),實(shí)現(xiàn)在AT24C02的0x01里寫入數(shù)據(jù)0x05;flag=2,讀出0x01里的數(shù)據(jù)寫在LCD顯示器上。sbitSDA=P1^3;//AT24C02的數(shù)據(jù)端口接P1.3sbitSCL=P1^4;//AT24C02的時(shí)鐘端接P1.4四、

軟件設(shè)計(jì)字節(jié)寫入時(shí)序voidwrite_add(ucharaddress,uchardate){

start();

//發(fā)送啟動(dòng)信號(hào)

write_byte(0xa0);//發(fā)送尋址寫命令0xA0Ack(); //應(yīng)答信號(hào)

write_byte(address);//發(fā)送寫入地址Ack(); //應(yīng)答信號(hào)

write_byte(date);//發(fā)送欲寫入的8位數(shù)據(jù)Ack(); //應(yīng)答信號(hào)

stop(); //發(fā)送停止信號(hào)}sbitSDA=P1^3;//AT24C02的數(shù)據(jù)端口接P1.3sbitSCL=P1^4;//AT24C02的時(shí)鐘端接P1.4四、

軟件設(shè)計(jì)指定地址讀操作時(shí)序voidread_add(ucharaddress){uchardate;start();//發(fā)送啟動(dòng)信號(hào)

write_byte(0xa0);//發(fā)送尋址寫命令A(yù)ck(); //應(yīng)答信號(hào)

write_byte(address);//發(fā)送讀地址

Ack(); //應(yīng)答信號(hào)start();//發(fā)送啟動(dòng)信號(hào)

write_byte(0xa1);//發(fā)送尋址讀命令A(yù)ck(); //應(yīng)答信號(hào)

date=read_byte();//讀AT24C02地址內(nèi)容NoAck();//發(fā)送非應(yīng)答信號(hào)

stop(); //發(fā)送停止信號(hào)

returndate;}sbitlcdrs=P1^0; sbitlcdrw=P1^1; sbitlcden=P1^2;#defineoutP2四、

軟件設(shè)計(jì)四、軟件設(shè)計(jì)while(1){if(flag==1){write_add(0x01,0x05);//往AT24C02的地址0x01內(nèi)寫入0x05

write_cmd(0x80);//把光標(biāo)移到第一行第一個(gè)位置

write_str("write:5");//在LCD1602顯示“write:5”flag=0;

}

if(flag==2){

readdate=read_add(0x01);//讀AT24C02地址0x01里的內(nèi)容

write_cmd(0xc0);//把光標(biāo)移到第二行第一個(gè)位置

write_str("read:");write_cmd(0xc6);//把光標(biāo)移到第二行第七個(gè)位置

write_data(readdate+0x30);//在LCD1602顯示讀取的數(shù)據(jù)flag=0;}}}#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineLCD_OUTP2sbitlcdrs=P1^0;sbitlcdrw=P1^1;sbitlcden=P1^2;sbitSDA=P1^3;sbitSCL=P1^4;ucharreaddate,flag;voidmain(){INT_init();LCD_init();I2C_init();①按下“寫入”按鍵在AT24C02地址01里寫入5,在1602上顯示“write:5” ②按下“讀出”按鍵讀取AT24C02地址01里數(shù)據(jù),在1602上顯示“read:”+讀出數(shù)據(jù)任務(wù)要求:通過(guò)按鍵控制存儲(chǔ)卡讀寫,在顯示器上顯示寫入或讀出的內(nèi)容。五、仿真1在KeilC中編寫、編譯代碼,生成hex文件。五、仿真2在Preteus中繪制電路圖,加載hex文件運(yùn)行。09單片機(jī)的串行擴(kuò)展技術(shù)01單總線擴(kuò)展技術(shù)02I2C總線擴(kuò)展技術(shù)03SPI總線擴(kuò)展技術(shù)基于TLC2543的電源電壓檢測(cè)器9.3介紹SPI器件TLC2543的使用方法。任務(wù)要求:采用單片機(jī)作為控制單元,采用TLC2543檢測(cè)電源的輸出電壓,在LCD上顯示電源電壓,并顯示電壓的百分比,當(dāng)?shù)陀陂撝禃r(shí)報(bào)警?;赥LC2543的電源電壓檢測(cè)器9.3

介紹SPI器件TLC2543的使用方法。任務(wù)要求:采用單片機(jī)作為控制單元,采用TLC2543檢測(cè)電源的輸出電壓,在LCD上顯示電源電壓,并顯示電壓的百分比,當(dāng)?shù)陀陂撝禃r(shí)報(bào)警。一、SPI總線擴(kuò)展技術(shù)三、硬件電路設(shè)計(jì)四、軟件設(shè)計(jì)五、仿真二、TLC2543芯片簡(jiǎn)介一、SPI總線擴(kuò)展技術(shù)(一)SPI總線的基本結(jié)構(gòu)SPI是Motorola公司推出的一種同步串行通信方式。是一種全雙工三線同步總線。SPI接口采用主從模式,主設(shè)備(Master)和一個(gè)或多個(gè)從設(shè)備(Slave)主設(shè)備SPI接口數(shù)量不足或不具備SPI接口,可用單片機(jī)的I/0口來(lái)模擬SPI時(shí)序。所有外圍器件的MOSI和MISO數(shù)據(jù)線和時(shí)鐘線SCK都掛接在總線上一、

SPI總線擴(kuò)展技術(shù)(二)SPI總線數(shù)據(jù)通信格式SPI是Motorola公司推出的一種同步串行通信方式。是一種全雙工三線同步總線。

單片機(jī)在啟動(dòng)一次傳送時(shí),

便產(chǎn)生8個(gè)時(shí)鐘,傳送給接口芯片作為同步時(shí)鐘。數(shù)據(jù)輸出通過(guò)MOSI線,數(shù)據(jù)在時(shí)鐘上升沿或下降沿時(shí)改變,在緊接著的下降沿或上升沿被讀取,完成一位數(shù)據(jù)傳輸。輸入原理相同。

SPI工作在主從模式下時(shí),是一個(gè)環(huán)形總線結(jié)構(gòu),在SCK的控制下,兩個(gè)8位雙向移位寄存器進(jìn)行數(shù)據(jù)交換。在SCK的下降沿?cái)?shù)據(jù)改變,上升沿一位數(shù)據(jù)被存入移位寄存器。主器件的SCK引腳提供時(shí)鐘,數(shù)據(jù)從MOSI引腳輸出,并鎖存MISO引腳上輸入的數(shù)據(jù)。從器件的SCK引腳為串行移位時(shí)鐘的輸入,該時(shí)鐘由主器件提供。一、

SPI總線擴(kuò)展技術(shù)voidSPISendByte(ucharch){ucharidatan=8;//向SDI上發(fā)送一個(gè)字節(jié)CLK=1;//時(shí)鐘拉高CS=0;//選擇從機(jī)while(n--){_nop_();_nop_();_nop_();CLK=0;//時(shí)鐘拉低

SDI=(bit)(ch&0x80);//寫入數(shù)據(jù):傳送位1_nop_();_nop_();_nop_();

ch=ch<<1;//數(shù)據(jù)左移一位CLK=1;//時(shí)鐘拉高}}SDICLK

SDO單片機(jī)發(fā)送一個(gè)字節(jié)命令字一、

SPI總線擴(kuò)展技術(shù)ucharSPIreceiveByte(){

ucharidatan=8;//讀取一個(gè)字節(jié)

uchartdata=0;CLK=1;//時(shí)鐘為高

CS=0;//選擇從機(jī)

while(n--)

{_nop_();_nop_();_nop_();CLK=0;//時(shí)鐘為低

_nop_();_nop_();_nop_();

tdata=tdata<<1;//左移一位

if(SDO)tdata=tdata|0x01;

//讀數(shù)據(jù)

CLK=1;}return(tdata);}

單片機(jī)接收一個(gè)字節(jié)數(shù)據(jù)SDICLK

SDO一、

SPI總線擴(kuò)展技術(shù)uintSPIsend_receiveByte(ucharch){uchari,n=12;

uinttdata=0;CLK=0;//時(shí)鐘為高

CS=0;//選擇從機(jī)

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

if(SDO)tdata=tdata|0x01;//讀入數(shù)據(jù)

SDI

=(bit)(ch&0x80);//寫入命令字

CLK=1;//上跳沿_nop_();_nop_();_nop_();CLK=0;//下跳沿

_nop_();_nop_();_nop_();

ch=ch<<1;//命令字左移一位

tdata<<=1;//讀入數(shù)據(jù)左移一位

}CS=1;

tdata>>=1;//抵消第12次左移

return(tdata);}單片機(jī)發(fā)送一個(gè)字節(jié)命令字,并接收12位的數(shù)據(jù)

SDICLK

SDO二、TLC2543芯片簡(jiǎn)介TLC2543是美國(guó)TI公司生產(chǎn)的SPI接口的逐次逼近式A/D轉(zhuǎn)換器(1)12位分辨率(2)轉(zhuǎn)換時(shí)間為10μs(3)11路模擬輸入通道,3個(gè)內(nèi)部自測(cè)電壓通道(4)線性誤差+1LSB(max),采樣率為66kbps(5)可編程的數(shù)據(jù)輸出長(zhǎng)度(6)模擬量輸入范圍為REF-~REF+二、TLC2543芯片簡(jiǎn)介TLC2543的命令字D7~D4(通道地址選擇):0000~1010分別是11路模擬量AIN0~AIN10D3D2(數(shù)據(jù)長(zhǎng)度):選擇轉(zhuǎn)換結(jié)果輸出位數(shù)00:

12

位輸

出;01:

8位輸出;10:12位輸出;11:

16

位輸出。D1(數(shù)據(jù)順序位):用來(lái)選擇數(shù)據(jù)輸出順序。D1

=0高位在前;D1

=1低位在前。D0(數(shù)據(jù)的極性位):用來(lái)選擇數(shù)據(jù)的極性。D0=0無(wú)符號(hào)數(shù);

D0=1有符號(hào)數(shù)。二、TLC2543芯片簡(jiǎn)介TLC2543的時(shí)序I/O周期:外部I/OCL0CK定義,延續(xù)8、12或16個(gè)時(shí)鐘周期,取決于選定輸出數(shù)據(jù)長(zhǎng)度前8個(gè)脈沖上升沿,以MSB前導(dǎo)方式從DATAINPUT端輸入8位數(shù)據(jù)到輸入寄存器前4位為輸入模擬通道地址

第4~8個(gè)I/OCLOCK脈沖的下降沿,對(duì)所選的信號(hào)進(jìn)行采樣(1)DATAINPUT串行輸出8位、12位或16位數(shù)據(jù)。(2)DATAOUTEOC上升沿,輸出數(shù)據(jù)是前1次轉(zhuǎn)換的結(jié)果命令字的寫入和轉(zhuǎn)換結(jié)果的輸出是同時(shí)進(jìn)行的,即在讀出轉(zhuǎn)換結(jié)果的同時(shí)也寫入下一次的命令字,采集11個(gè)數(shù)據(jù)要進(jìn)行12次轉(zhuǎn)換。第1次寫入的命令字是有實(shí)際意義的操作,但是第1次讀出的轉(zhuǎn)換結(jié)果是無(wú)意義的操作,應(yīng)丟棄;而第11次寫入的命令字是無(wú)意義的操作,而讀出的轉(zhuǎn)換結(jié)果是有意義的操作。二、TLC2543芯片簡(jiǎn)介命令字的寫入和轉(zhuǎn)換結(jié)果的輸出是同時(shí)進(jìn)行的,即在讀出轉(zhuǎn)換結(jié)果的同時(shí)也寫入下一次的命令字,采集11個(gè)數(shù)據(jù)要進(jìn)行12次轉(zhuǎn)換。第1次寫入的命令字是有實(shí)際意義的操作,但是第1次讀出的轉(zhuǎn)換結(jié)果是無(wú)意義的操作,應(yīng)丟棄;而第11次寫入的命令字是無(wú)意義的操作,而讀出的轉(zhuǎn)換結(jié)果是有意義的操作。uintGetAdcData(ucharchannel)//獲取轉(zhuǎn)換結(jié)果,channel為通道號(hào)0~10{uchartemp;uintReadAdData=0;//存放采集的數(shù)據(jù)

channel=channel<<4;//命令字(低四位0000,高四位為通道號(hào)),

//channel左移4位,將通道號(hào)移到高四位,低四位為0000

temp=channel;

ReadAdData=SPIsend_receiveByte(temp);//寫入命令字,并讀取12位轉(zhuǎn)換結(jié)果return(ReadAdData);}0高位在前0012位0無(wú)符號(hào)0000二、TLC2543芯片簡(jiǎn)介TLC2543的時(shí)序I/O周期:外部I/OCL0CK定義,延續(xù)8、12或16個(gè)時(shí)鐘周期,取決于選定輸出數(shù)據(jù)長(zhǎng)度前8個(gè)脈沖上升沿,以MSB前導(dǎo)方式從DATAINPUT端輸入8位數(shù)據(jù)到輸入寄存器前4位為輸入模擬通道地址

第4~8個(gè)I/OCLOCK脈沖的下降沿,對(duì)所選的信號(hào)進(jìn)行采樣(1)DATAINPUT串行輸出8位、12位或16位數(shù)據(jù)。(2)DATAOUTEOC上升沿,輸出數(shù)據(jù)是前1次轉(zhuǎn)換的結(jié)果轉(zhuǎn)換周期:最后一個(gè)I/OCLOCK脈沖下降沿,EOC變低,采樣值保持不變,轉(zhuǎn)換周期開始I/O周期和轉(zhuǎn)換周期交替進(jìn)行,從而可減少外部的數(shù)字噪聲對(duì)轉(zhuǎn)換精度的影響。三、硬件電路設(shè)計(jì)任務(wù)要求:采用單片機(jī)作為控制單元,采用TLC2543檢測(cè)電源的輸出電壓,在LCD上顯示電源電壓,并顯示電壓的百分比,當(dāng)?shù)陀陂撝禃r(shí)報(bào)警。四、軟件設(shè)計(jì)①循環(huán)采集TLC2543的AIN0通道的模擬電壓,并在LCD上顯示。②顯示電壓的百分比。③電壓低于閾值,紅色LED點(diǎn)亮報(bào)警,這里閾值設(shè)為量程電壓的25%。任務(wù)要求:采用單片機(jī)作為控制單元,采用TLC2543檢測(cè)電源的輸出電壓,在LCD上顯示電源電壓,并顯示電壓的百分比,當(dāng)?shù)陀陂撝禃r(shí)報(bào)警。①延時(shí)程序;②TLC2543轉(zhuǎn)換程序;③SPI時(shí)序程序④LCD1602顯示程序;主程序?qū)⒊绦虬垂δ芊謮K多.C文件的編寫步驟:1.首先將程序按功能分塊2.在KeilC中新建工程3.新建main.c以及各功能.c和.h文件4.在工程中添加所有的.c文件5.編譯四、軟件設(shè)計(jì)①循環(huán)采集TLC2543的AIN0通道的模擬電壓,并在LCD上顯示。②顯示電壓的百分比。③電壓低于閾值,紅色LED點(diǎn)亮報(bào)警,這里閾值設(shè)為量程電壓的25%。任務(wù)要求:采用單片機(jī)作為控制單元,采用TLC2543檢測(cè)電源的輸出電壓,在LCD上顯示電源電壓,并顯示電壓的百分比,當(dāng)?shù)陀陂撝禃r(shí)報(bào)警。(1)編寫delay.c和delay.h#ifndefDELAY_H_#defineDELAY_H_#defineucharunsignedchar#defineuintunsignedintvoiddelay(uintz);//延時(shí)函數(shù)#endifdelay.h#include<delay.h>voiddelay(uintz)//延時(shí)函數(shù){

uintx,y;

for(x=112;x>0;x--)

for(y=z;y>0;y--);}delay.c四、軟件設(shè)計(jì)①循環(huán)采集TLC2543的AIN0通道的模擬電壓,并在LCD上顯示。②顯示電壓的百分比。③電壓低于閾值,紅色LED點(diǎn)亮報(bào)警,這里閾值設(shè)為量程電壓的25%。(2)編寫LCD1602.c和LCD1602.h#include<LCD1602.h>voidLCD_init()//LCD初始化{函數(shù)體略}voidwrite_cmd(charcmd)//寫指令{函數(shù)體略}voidwrite_data(uchardat)//寫數(shù)據(jù){函數(shù)體略}voidwrite_str(uchar*str)//寫字符串{函數(shù)體略}#ifndefLCD1602_H_#defineLCD1602_H_#include<reg52.h>#include<delay.h>#defineOUTP2//LCD1602數(shù)據(jù)端sbitlcdrs=P1^0;//LCD1602命令數(shù)據(jù)控制端sbitlcdrw=P1^1;//LCD1602讀寫端sbitlcden=P1^2;//LCD1602使能端voidLCD_init();//LCD1602初始化voidwrite_cmd(ucharcmd);//寫指令函數(shù)voidwrite_data(uchardat);//寫數(shù)據(jù)函數(shù)voidwrite_str(uchar*str);//寫字符串函數(shù)#endifLCD1602.cLCD1602.h四、軟件設(shè)計(jì)(3)spi.c和spi.h的編寫#ifndefspizz_H_#definespizz_H_#include<reg52.h>sbitSDO=P1^3;//TLC2543的DATAOUTsbitSDI=P1^4;//TLC2543的DATAINPUTsbitCS=P1^5;//TLC2543的CSsbitCLK=P1^6;//TLC2543的I/OCLOCKsbitEOC=P1^7;//TLC2543的EOCvoidSPISendByte(ucharch);//發(fā)送一個(gè)字節(jié)ucharSPIreceiveByte();//接收一個(gè)字節(jié)uintSPIsend_receiveByte(ucharch);//發(fā)送接收#endifspi.h#include<spi.h>#include<delay.h>#include<intrins.h>voidSPISendByte(unsignedcharch){函數(shù)體略}unsignedcharSPIreceiveByte(){函數(shù)體略}uintSPIsend_receiveByte(ucharch)

{函數(shù)體略}spi.c(4)TLC2543.c和TLC2543.h的編寫①循環(huán)采集TLC2543的AIN0通道的模擬電壓,并在LCD上顯示。②顯示電壓的百分比。③電壓低于閾值,紅色LED點(diǎn)亮報(bào)警,這里閾值設(shè)為量程電壓的25%。TLC2543.h#ifndefTLC2543_H_#defineTLC2543_H_#include<reg52.h>#include<delay.h>uintGetAdcData(ucharchannel);//獲取轉(zhuǎn)換結(jié)果,//channel為通道號(hào)voidADCvalToStr(uchar*str,uintval);//標(biāo)度變換voidADCvalToStrratio(uchar*str,uintval);//電壓比#endifvoidADCvalToStr(uchar*str,uintval){unsignedintvalue;

value=val*1.221;//1.221=5000/4095(分辨率12位)str[0]=(value%10000/1000)+'0';str[1]='.';str[2]=(value%1000/100)+'0';str[3]=(value%100/10)+'0';str[4]=value%10+'0';str[5]='V';str[6]='\0';}

voidADCvalToStrratio(uchar*str,uintval){unsignedintvalue;

value=val*1.221/5;str[0]=(value%1000/100)+'0';str[1]=(value%100/10)+'0';str[2]='.';str[3]=value%10+'0';str[4]='%';str[5]='\0';}(4)TLC2543.c和TLC2543.h的編寫①循環(huán)采集TLC2543的AIN0通道的模擬電壓,并在LCD上顯示。②顯示電壓的百分比。③電壓低于閾值,紅色LED點(diǎn)亮報(bào)警,這里閾值設(shè)為量程電壓的25%。TLC2543.h#ifndefTLC2543_H_#defineTLC2543_H_#include<reg52.h>#include<delay.h>uintGetAdcData(ucharchannel);//獲取轉(zhuǎn)換結(jié)果,//channel為通道號(hào)voidADCvalToStr(uchar*str,uintval);//標(biāo)度變換voidADCvalToStrratio(uchar*str,uintval);//電壓比#endifTLC2543.c#include<TLC2543.h>#include<spi.h>uintGetAdcData(ucharchannel){函數(shù)體略}voidADCvalToStr(uchar*str,uintval){函數(shù)體略}voidADCvalToStrratio(uchar*str,uintval)

{函數(shù)體略}#include<TLC2543.h>#include<spi.h>#include<LCD1602.h>sbitLED=P3^3;unsignedintAdResult;voidmain(){unsignedcharstr[10];LCD_init();//LCD1602初始化

AdResult=GetAdcData(0);//啟動(dòng)0通道轉(zhuǎn)換,第一次轉(zhuǎn)換結(jié)果無(wú)意義while(1){_nop_();_nop_();_nop_();//延時(shí)

AdResult=GetAdcData(0);//讀取本次轉(zhuǎn)換結(jié)果,同時(shí)啟動(dòng)下次轉(zhuǎn)換

while(!EOC);//判是否轉(zhuǎn)換完畢,未轉(zhuǎn)換完則循環(huán)等待ADCvalToStr(str,AdResult);//模數(shù)轉(zhuǎn)換結(jié)果標(biāo)度變換write_cmd(0x80);//把光標(biāo)移到第1行第1個(gè)位置write_str("AIN0:");//顯示“AIN0:”write_cmd(0x86);//把光標(biāo)移到第1行第7個(gè)位置write_str(str);//顯示AIN0通道采集電壓ADCvalToStrratio(str,AdResult);//計(jì)算電壓比write_cmd(0xc0);//把光標(biāo)移到第2行第1個(gè)位置write_str("VolRatio:");//顯示“VolRatio:”write_cmd(0xCA);//把光標(biāo)移到第2行第11個(gè)位置write_str(str);//顯示百分比if(AdResult<1024)LED=0;//小于25%LED亮

}}任務(wù)要求:采用單片機(jī)作為控制單元,采用TLC2543檢測(cè)電源的輸出電壓,在LCD上顯示電源電壓,并顯示電壓的百分比,當(dāng)?shù)陀陂撝禃r(shí)報(bào)警。五、仿真1在KeilC中編寫、編譯代碼,生成hex文件。五、仿真2在Preteus中繪制電路圖,加載hex文件運(yùn)行。本章小結(jié)1.單總線(1-Wire)是由美國(guó)DALLAS公司研制開發(fā)的一種串行協(xié)議。只需一條信號(hào)線,具有接口線少、控制簡(jiǎn)單、件封裝形式小、抗干擾能力強(qiáng)等優(yōu)點(diǎn)。DS18B20是單總線數(shù)字溫度傳感器。2.I2C(InterInterfaceCircurt)總線全稱為芯片間總線,是近年來(lái)微電子通信控制領(lǐng)域廣泛采用的一種總線標(biāo)準(zhǔn),它是同步通信的一種特殊形式,有兩條信號(hào)線:一條是數(shù)據(jù)線SDA,另一條是時(shí)鐘線SCL。3.串行外圍設(shè)備接口SPI(Serial

Peripheral

Interface)是Motorola公司推出的一種同步串行通信方式。是一種全雙工三線同步總線,占用引腳少,簡(jiǎn)單易用。SPI接口有4條線,分別為MOSI、

MISO、SCL、CS。單片機(jī)應(yīng)用系統(tǒng)綜合設(shè)計(jì)10介紹幾個(gè)綜合設(shè)計(jì)案例,通過(guò)案例的分析,了解單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)的步驟和方法。10單片機(jī)應(yīng)用系統(tǒng)綜合設(shè)計(jì)01步進(jìn)電機(jī)控制器設(shè)計(jì)02直流電機(jī)控制器設(shè)計(jì)03基于DS1302的電子鐘設(shè)計(jì)04智能循跡避障車設(shè)計(jì)05遙控機(jī)器人設(shè)計(jì)步進(jìn)電機(jī)控制器仿真實(shí)例10.1介紹步進(jìn)電機(jī)的使用方法。任務(wù)要求:設(shè)計(jì)步進(jìn)電機(jī)控制器,通過(guò)按鍵控制電機(jī)的正轉(zhuǎn)、反轉(zhuǎn)、停止。步進(jìn)電機(jī):28BYJ-48永磁式減速步進(jìn)電機(jī)驅(qū)動(dòng):UNL2003反向驅(qū)動(dòng)器采用3個(gè)按鍵實(shí)現(xiàn)電機(jī)的正轉(zhuǎn)、反轉(zhuǎn)和停止步進(jìn)電機(jī)控制器仿真實(shí)例10.1介紹步進(jìn)電機(jī)的使用方法。任務(wù)要求:設(shè)計(jì)步進(jìn)電機(jī)控制器,通過(guò)按鍵控制電機(jī)的正轉(zhuǎn)、反轉(zhuǎn)、停止。一、步進(jìn)電機(jī)簡(jiǎn)介二、硬件電路設(shè)計(jì)三、軟件設(shè)計(jì)四、仿真一、步進(jìn)電機(jī)簡(jiǎn)介步進(jìn)電機(jī)是將脈沖信號(hào)轉(zhuǎn)變?yōu)榻俏灰苹蚓€位移的開環(huán)控制元件。相數(shù):電機(jī)內(nèi)部的線圈組數(shù)。步距角:控制系統(tǒng)每發(fā)一個(gè)脈沖信號(hào),電機(jī)所轉(zhuǎn)動(dòng)的角度。拍數(shù):完成一個(gè)磁場(chǎng)周期性變化所需脈沖數(shù)或?qū)щ姞顟B(tài)。勵(lì)磁方式一相勵(lì)磁:每一瞬間只有一組線圈導(dǎo)通步距角:360°/(8*4)=11.25°齒距角:45°4相4拍齒距角:一個(gè)磁場(chǎng)周期,電機(jī)所轉(zhuǎn)動(dòng)的角度。轉(zhuǎn)一圈需要:32拍(32個(gè)脈沖)一、步進(jìn)電機(jī)簡(jiǎn)介步距角:360°/(8*4)=11.25°齒距角:45°二相勵(lì)磁:每一瞬間有兩組線圈同時(shí)導(dǎo)通一-二相勵(lì)磁:每一瞬間一相勵(lì)磁與二相勵(lì)磁交替導(dǎo)通步距角:360°/(8*8)=5.625°齒距角:45°轉(zhuǎn)一圈需要:8*8=64拍(64個(gè)脈沖)一、步進(jìn)電機(jī)簡(jiǎn)介減速比:例1:64,電機(jī)殼里邊的部分轉(zhuǎn)64圈,電機(jī)殼外邊的部分轉(zhuǎn)1圈。節(jié)拍刷新時(shí)間:步進(jìn)電機(jī)每2拍之間需要一定的時(shí)間。定位:通過(guò)控制脈沖個(gè)數(shù)來(lái)控制角位移量,從而達(dá)到準(zhǔn)確定位的目的;調(diào)速:通過(guò)控制脈沖頻率來(lái)控制電機(jī)轉(zhuǎn)動(dòng)的速度和加速度,從而達(dá)到調(diào)速的目的。啟動(dòng)頻率:P.P.S(每秒脈沖數(shù))每秒給出550個(gè)脈沖的情況下電機(jī)可以正常啟動(dòng)。節(jié)拍刷新時(shí)間計(jì)算:控制節(jié)拍刷新時(shí)間大于1.8ms就可以了。1s/550=1.8ms。實(shí)際電機(jī)轉(zhuǎn)動(dòng)一圈需要的拍數(shù)轉(zhuǎn)子轉(zhuǎn)64圈,輸出軸才會(huì)轉(zhuǎn)一圈轉(zhuǎn)子轉(zhuǎn)一圈需要64個(gè)節(jié)拍(4相8拍)電機(jī)轉(zhuǎn)一圈:64*64=4096個(gè)節(jié)拍步距角:360°/(64*64)=5.625°/64約為0.08789°一、步進(jìn)電機(jī)簡(jiǎn)介轉(zhuǎn)動(dòng)任意角度步距角:360°/(64*64)=5.625°/64【例10-1】

電機(jī)轉(zhuǎn)過(guò)90°,則需要的拍數(shù)為多少?

【解】

注意:在實(shí)際運(yùn)行中,轉(zhuǎn)動(dòng)的角度會(huì)有一些誤差。在沒(méi)有精密儀器的情況下很難測(cè)量出誤差。但可以采用多轉(zhuǎn)幾圈的方式進(jìn)行測(cè)試。!單片機(jī)的I/O口電流驅(qū)動(dòng)能力有限,無(wú)法直接驅(qū)動(dòng)步進(jìn)電機(jī)??梢赃x用專用的電機(jī)驅(qū)動(dòng)模塊,如L298N、FT5754等;還可采用三極管驅(qū)動(dòng)電路、ULN2003驅(qū)動(dòng)電路等。步進(jìn)電機(jī)的驅(qū)動(dòng)二

、硬件電路設(shè)計(jì)任務(wù)要求:設(shè)計(jì)步進(jìn)電機(jī)控制器,通過(guò)按鍵控制電機(jī)的正轉(zhuǎn)、反轉(zhuǎn)、停止。1~7輸入端16~10輸出端9公共端接感性負(fù)載(電機(jī)、電感等)該腳接電源正極;接非感性負(fù)載(燈泡、電阻、電容等),該腳不接。UNL2003是反向驅(qū)動(dòng)器:內(nèi)含7個(gè)獨(dú)立的達(dá)林頓管MOTOR-STEPPER(單極性步進(jìn)電機(jī),代替28BYJ-48)三、

軟件設(shè)計(jì)任務(wù)要求:設(shè)計(jì)步進(jìn)電機(jī)控制器,通過(guò)按鍵控制電機(jī)的正轉(zhuǎn)、反轉(zhuǎn)、停止。按鍵處理:用flag標(biāo)記哪一個(gè)按鍵按下,根據(jù)flag標(biāo)志實(shí)現(xiàn)電機(jī)的正轉(zhuǎn)、反轉(zhuǎn)和停止。

用flagmotor做為電機(jī)正反轉(zhuǎn)的標(biāo)志位。voidkeyscan()

{key1=1;

if(key1==0)//

{

delay(10);//延時(shí)去抖

if(key1==0)

{

flag=1;//正轉(zhuǎn)按鍵按下

}

while(!key1);//松手檢測(cè)

}

key2=1;

if(key2==0)//{

delay(10);//延時(shí)去抖

if(key2==0)

{

flag=2;//反轉(zhuǎn)按鍵按下

}

while(!key2);//松手檢測(cè)

}key3=1;if(key3==0)//

{

delay(10);//延時(shí)去抖

if(key3==0)

{

flag=3;//停止按鍵按下

}while(!key3);//松手檢測(cè)

}

}

while(1)

{keyscan();switch(flag)

{case1:TR0=1;

flagmotor=1;//正轉(zhuǎn)1拍

break;

case2:TR0=1;

flagmotor=2;//反轉(zhuǎn)1拍

溫馨提示

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

評(píng)論

0/150

提交評(píng)論