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

下載本文檔

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

文檔簡介

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

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

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

0011011011110000

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

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

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

DQ=1;//先拉高for(num=0;num<2;num++);//延時,不嚴(yán)格DQ=0;//拉低for(num=0;num<200;num++);//延時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)答信號}返回值為低電平,檢測到DS18B20返回值為高電平,則沒有檢測DS18B20二、DS18B20芯片簡介寫入時序DQ=0;延時(>1μs);DQ=0/1;保持(15~60μs);DQ=1;延時(>1μs);

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

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

DQ=0;//拉低

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

//延時1us

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

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

//移入byte最后1位

DQ=1;//拉高

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

}

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

_nop_();//延時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_();//延時

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個字節(jié)函數(shù)二、DS18B20芯片簡介DS18B20讀取溫度及處理:①檢測DS18B20是否存在;②

發(fā)送跳過ROM命令0xCC;③發(fā)送啟動溫度轉(zhuǎn)換0x44;④延時;⑤再判斷DS18B20存在;⑥發(fā)送跳過ROM命令0xCC;⑦再發(fā)送讀溫度命令0xBE;⑧先讀低8位;⑨再讀高8位;⑩讀完后將低11位的二進制數(shù)轉(zhuǎn)化為十進制數(shù)再乘以0.0625voidDS18B20_Temperature() //溫度讀取及處理函數(shù){uchartemperaturel=0;uchartemperatureh=0;if(init_DS18B20()==0){DS18B20_WR_CHAR(0xcc);//跳過ROMDS18B20_WR_CHAR(0x44);//啟動溫度轉(zhuǎn)換,結(jié)果存入內(nèi)部RAMdelay(1000);if(init_DS18B20()==0)//初始化返回值為0,器件存在{ DS18B20_WR_CHAR(0xcc);//跳過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ù)點后面只//取1位,并四舍五入,溫度比正常大10倍

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

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

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

軟件設(shè)計四、

軟件設(shè)計voidmain(){LCD_init();delay(1000);while(1){if(flag==0) //flag=0,說明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ù)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è)計溫度測量系統(tǒng)并實時顯示,且具有越線報警功能。五、仿真1在KeilC中編寫、編譯代碼,生成hex文件。任務(wù)要求:設(shè)計溫度測量系統(tǒng)并實時顯示,且具有越線報警功能。五、仿真2在Preteus中繪制電路圖,加載hex文件運行。任務(wù)要求:設(shè)計溫度測量系統(tǒng)并實時顯示,且具有越線報警功能?;贒S18B20的溫度測量系統(tǒng)設(shè)計9.1介紹多.c文件編程方法。任務(wù)要求:設(shè)計溫度測量系統(tǒng)并實時顯示,且具有越線報警功能。一、多.c文件編程方法二、程序拆解(9.1.2節(jié)代碼)一、多.c文件編程方法單.C文件編程:將所有功能的程序代碼寫在一個.c文件中進行調(diào)試和編譯。(9.1.2節(jié))不足:隨硬件模塊使用的增多,代碼會變得比較大、功能比較復(fù)雜。任務(wù)要求:設(shè)計溫度測量系統(tǒng)并實時顯示,且具有越線報警功能。一、多.c文件編程方法多.C文件編程:將不同功能的程序分別用不同的.c文件封裝,再用.h文件進行外部聲明,當(dāng)在其他項目里需要用到相同功能時,將之前寫好的.c和.h文件復(fù)制到新項目中。優(yōu)勢:可讀性、可移植性和可維護性好。一、多.c文件編程方法多.c文件編程通常要遵循幾個原則:①每一個功能的.c文件對應(yīng)一個同名的.h頭文件。②頭文件中只能放置接口的聲明,不能放置具體的實現(xiàn)。每個.h頭文件里都必須聲明它對應(yīng)的.c文件里的所有定義函數(shù)和全局變量。③.c文件中應(yīng)放置函數(shù)的實現(xiàn)、變量的賦值、語句的操作等。.c文件中應(yīng)包含同名.h頭文件。④.c文件只要使用其他.c文件的函數(shù),要將對應(yīng)的.h頭文件包含到該.c文件中,⑤聲明一個全局變量必須加extern關(guān)鍵字,同時千萬不能在聲明全局變量的時候賦

初始值。在使用該變量的一個.c文件中進行變量定義及賦初值等操作即可。一、多.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.編譯①延時程序;②DS18B20溫度采集程序;

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

如果頭文件不加條件編譯語句⑤,則C51對工程進行編譯時,就會對delay.h進行重復(fù)編譯,頭文件的這種重復(fù)引用不但增加了編譯的工作量,降低編譯效率,而且如果在h文件中聲明了全局變量,那么編譯過程可能會出現(xiàn)變量重復(fù)定義的錯誤。#include<delay.h>//②voiddelay(uintz)//延時函數(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ù)要求:采用單片機設(shè)計溫度測量系統(tǒng)并實時顯示,并具有越線報警功能。⑤聲明一個全局變量必須加extern關(guān)鍵字,同時千萬不能在聲明全局變量的時候賦

初始值。在使用該變量的一個.c文件中進行變量定義及賦初值等操作即可。②頭文件中只能放置接口的聲明,不能放置具體的實現(xiàn)。每個.h頭文件里都必須聲明它對應(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ù)要求:采用單片機設(shè)計溫度測量系統(tǒng)并實時顯示,并具有越線報警功能。二、程序拆解(4)編寫main.c任務(wù)要求:采用單片機設(shè)計溫度測量系統(tǒng)并實時顯示,并具有越線報警功能。#include<reg52.h>#include<LCD1602.h>#include<DS18B20.h> sbitbuzzer=P1^4;//蜂鳴器

voidmain(){

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

if(flag==0) //檢測到flag=0,說明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ù),要將對應(yīng)的.h頭文件包含到該.c文件中。09單片機的串行擴展技術(shù)01單總線擴展技術(shù)02I2C總線擴展技術(shù)03SPI總線擴展技術(shù)基于AT24C02的存儲卡設(shè)計仿真實例9.2介紹

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

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

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

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

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

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

(一)I2C總線基本結(jié)構(gòu)各I2C器件掛在同一條總線,每個器件都有唯一的地址各I2C器件輸出端為漏級開路,故必須接上拉電阻主控器通常由單片機來擔(dān)當(dāng)。帶有I2C接口單片機可直接與具有I2C接口器件連接,單片機沒有I2C接口,可采用I/O口線結(jié)合軟件實現(xiàn)I2C總線的時序模擬從器件必須帶有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)寫一個字節(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_();}①總線初始化②起始信號③寫一個字節(jié)①②③初始化④(二)I2C總線數(shù)據(jù)通信格式ucharread_byte(){

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

SCL=1;delay5us();

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

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

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

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

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

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

硬件電路設(shè)計任務(wù)要求:設(shè)計存儲卡,通過按鍵控制存儲卡的讀寫,并在顯示器上顯示寫入或讀出的內(nèi)容。四、軟件設(shè)計①按下“寫入”按鍵在AT24C02地址0x01里寫入5,在1602上顯示“write:5” ②按下“讀出”按鍵讀取AT24C02地址0x01里數(shù)據(jù),在1602上顯示“read:”+讀出數(shù)據(jù)③“寫入”按鍵采用外部中斷0,“讀出”按鍵采用外部中斷1任務(wù)要求:通過按鍵控制存儲卡讀寫,在顯示器上顯示寫入或讀出的內(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ù),實現(xiàn)在AT24C02的0x01里寫入數(shù)據(jù)0x05;flag=2,讀出0x01里的數(shù)據(jù)寫在LCD顯示器上。sbitSDA=P1^3;//AT24C02的數(shù)據(jù)端口接P1.3sbitSCL=P1^4;//AT24C02的時鐘端接P1.4四、

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

start();

//發(fā)送啟動信號

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

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

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

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

軟件設(shè)計指定地址讀操作時序voidread_add(ucharaddress){uchardate;start();//發(fā)送啟動信號

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

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

Ack(); //應(yīng)答信號start();//發(fā)送啟動信號

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

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

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

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

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

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

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)移到第二行第一個位置

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

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ù)要求:通過按鍵控制存儲卡讀寫,在顯示器上顯示寫入或讀出的內(nèi)容。五、仿真1在KeilC中編寫、編譯代碼,生成hex文件。五、仿真2在Preteus中繪制電路圖,加載hex文件運行。09單片機的串行擴展技術(shù)01單總線擴展技術(shù)02I2C總線擴展技術(shù)03SPI總線擴展技術(shù)基于TLC2543的電源電壓檢測器9.3介紹SPI器件TLC2543的使用方法。任務(wù)要求:采用單片機作為控制單元,采用TLC2543檢測電源的輸出電壓,在LCD上顯示電源電壓,并顯示電壓的百分比,當(dāng)?shù)陀陂撝禃r報警。基于TLC2543的電源電壓檢測器9.3

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

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

單片機在啟動一次傳送時,

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

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

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

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

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

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

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

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

uchartdata=0;CLK=1;//時鐘為高

CS=0;//選擇從機

while(n--)

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

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

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

if(SDO)tdata=tdata|0x01;

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

CLK=1;}return(tdata);}

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

SDO一、

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

uinttdata=0;CLK=0;//時鐘為高

CS=0;//選擇從機

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);}單片機發(fā)送一個字節(jié)命令字,并接收12位的數(shù)據(jù)

SDICLK

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

12

位輸

出;01:

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

16

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

=0高位在前;D1

=1低位在前。D0(數(shù)據(jù)的極性位):用來選擇數(shù)據(jù)的極性。D0=0無符號數(shù);

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

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

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

//channel左移4位,將通道號移到高四位,低四位為0000

temp=channel;

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

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

uintx,y;

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

for(y=z;y>0;y--);}delay.c四、軟件設(shè)計①循環(huán)采集TLC2543的AIN0通道的模擬電壓,并在LCD上顯示。②顯示電壓的百分比。③電壓低于閾值,紅色LED點亮報警,這里閾值設(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è)計(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ā)送一個字節(jié)ucharSPIreceiveByte();//接收一個字節(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點亮報警,這里閾值設(shè)為量程電壓的25%。TLC2543.h#ifndefTLC2543_H_#defineTLC2543_H_#include<reg52.h>#include<delay.h>uintGetAdcData(ucharchannel);//獲取轉(zhuǎn)換結(jié)果,//channel為通道號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點亮報警,這里閾值設(shè)為量程電壓的25%。TLC2543.h#ifndefTLC2543_H_#defineTLC2543_H_#include<reg52.h>#include<delay.h>uintGetAdcData(ucharchannel);//獲取轉(zhuǎn)換結(jié)果,//channel為通道號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);//啟動0通道轉(zhuǎn)換,第一次轉(zhuǎn)換結(jié)果無意義while(1){_nop_();_nop_();_nop_();//延時

AdResult=GetAdcData(0);//讀取本次轉(zhuǎn)換結(jié)果,同時啟動下次轉(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個位置write_str("AIN0:");//顯示“AIN0:”write_cmd(0x86);//把光標(biāo)移到第1行第7個位置write_str(str);//顯示AIN0通道采集電壓ADCvalToStrratio(str,AdResult);//計算電壓比write_cmd(0xc0);//把光標(biāo)移到第2行第1個位置write_str("VolRatio:");//顯示“VolRatio:”write_cmd(0xCA);//把光標(biāo)移到第2行第11個位置write_str(str);//顯示百分比if(AdResult<1024)LED=0;//小于25%LED亮

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

Peripheral

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

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

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

【解】

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

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

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

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

{key1=1;

if(key1==0)//

{

delay(10);//延時去抖

if(key1==0)

{

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

}

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

}

key2=1;

if(key2==0)//{

delay(10);//延時去抖

if(key2==0)

{

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

}

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

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

{

delay(10);//延時去抖

if(key3==0)

{

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

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

}

}

while(1)

{keyscan();switch(flag)

{case1:TR0=1;

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

break;

case2:TR0=1;

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

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論