版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度酒店消防系統(tǒng)設(shè)備更新與優(yōu)化合同3篇
- 2025年度私人承包數(shù)據(jù)中心節(jié)能減排建筑合同范本3篇
- 2025年教育培訓(xùn)機(jī)構(gòu)銷售居間代理協(xié)議3篇
- 2025年度個(gè)人股份質(zhì)押合同標(biāo)準(zhǔn)范本4篇
- 2025年度個(gè)人二手車轉(zhuǎn)讓協(xié)議書(全新升級(jí)版)3篇
- 美容院消防安全責(zé)任及管理協(xié)議書(二零二五年度)4篇
- 濕地湖施工方案
- 畢業(yè)答辯指導(dǎo)模板
- 2025年度個(gè)人裝修借款合同答辯狀編制指南4篇
- 2024年中級(jí)經(jīng)濟(jì)師考試題庫(kù)含答案(能力提升)
- pcs-985ts-x說(shuō)明書國(guó)內(nèi)中文版
- GB 11887-2012首飾貴金屬純度的規(guī)定及命名方法
- 小品《天宮賀歲》臺(tái)詞劇本手稿
- 醫(yī)院患者傷口換藥操作課件
- 欠薪強(qiáng)制執(zhí)行申請(qǐng)書
- 體檢報(bào)告單入職體檢模板
- 礦山年中期開采重點(diǎn)規(guī)劃
- 資源庫(kù)建設(shè)項(xiàng)目技術(shù)規(guī)范匯編0716印刷版
- GC2級(jí)壓力管道安裝質(zhì)量保證體系文件編寫提綱
- 預(yù)應(yīng)力混凝土簡(jiǎn)支小箱梁大作業(yè)計(jì)算書
- 燃燒機(jī)論文定型機(jī)加熱論文:天然氣直燃熱風(fēng)技術(shù)在定型機(jī)中的應(yīng)用
評(píng)論
0/150
提交評(píng)論