柚子快報激活碼778899分享:藍(lán)橋杯學(xué)習(xí)筆記(二)
柚子快報激活碼778899分享:藍(lán)橋杯學(xué)習(xí)筆記(二)
文章目錄
八、PWM脈寬調(diào)制基本概念
九、串口通信原理SCON寄存器
任務(wù)1任務(wù)2
十、IO擴(kuò)展與存儲器映射擴(kuò)展十一、DS18B20溫度傳感器基礎(chǔ)知識完成室溫傳感
十二、DS1302十三、NE555定時器十四、PCF8591十五、AT24C02十六、超聲波傳感器
八、PWM脈寬調(diào)制
任務(wù):在CT107D單片機(jī)綜合訓(xùn)練平臺上,利用PWM脈寬信號實現(xiàn)獨(dú)立按鍵S7對L1指示燈亮度變化的控制。 具體要求如下: 1.PWM脈寬信號的頻率為100Hz。 2.系統(tǒng)上電后L1指示燈處在熄滅狀態(tài)。 3.L1指示燈有4種亮度模式,分別是完全熄滅、10%的亮度、 50%的亮度和90%的亮度。 4.按下S7按鍵,循環(huán)切換L1指示燈的四種亮度模式。
基本概念
脈沖寬度調(diào)制:是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù)??梢酝ㄟ^改變脈沖列的周期進(jìn)行調(diào)頻,改變脈沖的寬度或占空比進(jìn)行調(diào)壓。(采用適當(dāng)控制方法可使電壓與頻率協(xié)調(diào)變化) 占空比是指在一個脈沖循環(huán)內(nèi),通電時間相對于總時間所占的比例。占空比為30%,則接高電平時間占30%,低電平占70%。 實現(xiàn):
#include "reg52.h"
sbit L1 = P0^0;
sbit S7 = P3^0;
void SelectHC573()
{
P2 = (P2 & 0x1f) |0x80; //LED
}
unsigned char count = 0; //頻率
unsigned char pwm_duty = 0; //占空比
void InitTimer0()
{
TMOD = 0x01;
TH0 = (65535 - 100) / 256;
TL0 = (65535 - 100) % 256;
ET0 = 1;
EA = 1;
}
void ServiceTimer0() interrupt 1
{
TH0 = (65535 - 100) / 256;
TL0 = (65535 - 100) % 256;
count++;
if(count == pwm_duty) //計時達(dá)到占空比則由低電平變?yōu)楦唠娖?/p>
{
L1 = 1;
}
else if(count == 100) //頻率達(dá)到100
{
L1 = 0;
count = 0;
}
}
void Delay(unsigned int t)
{
while(t--);
}
unsigned char stat = 0; //狀態(tài)參數(shù)
void ScanKeys()
{
if(S7 == 0)
{
Delay(100);
if(S7==0)
{
switch(stat)
{
case 0: //10亮度
L1 = 0;
TR0 = 1;
pwm_duty = 10;
stat = 1;
break;
case 1:
pwm_duty = 50; //50
stat = 2;
break;
case 2:
pwm_duty = 90; //90
stat = 3;
break;
case 3:
L1 = 1; //關(guān)燈
TR0 = 0;
stat = 0;
break;
}
while(S7 == 0); //使按鍵靈敏
}
}
}
void main()
{
SelectHC573();
L1 = 0; //剛上電L1熄滅
InitTimer0();
while(1)
{
ScanKeys();
}
}
九、串口通信
原理
微控制器與外部設(shè)備的數(shù)據(jù)通信,根據(jù)連線結(jié)構(gòu)和傳送方式的不同,可以分為兩種: 并行通信:指數(shù)據(jù)的各位同時發(fā)送或接收,每個數(shù)據(jù)位使用一條導(dǎo)線。 串行通信:指數(shù)據(jù)一位接一位地順序發(fā)送或接收。 串行通信有°SPL、IC、UART等多種,最常見最通用的是指UART,大多數(shù)情況下,串口通信指的就是UART。 串行通信的制式有:單工、半雙工、全雙工三種。 RS485總線是半雙工的通信制式。 串行通信的主要方式有兩種:同步和異步。 同步串行通信:需要使用同一個時鐘,以數(shù)據(jù)塊為單位傳送數(shù)據(jù)。 異步串行通信:每個設(shè)備都有自己的時鐘信號,通信中雙方的波特率要保持一致,以字符為單位進(jìn)行數(shù)據(jù)幀傳送,一次傳送一個幀。 波特率:串口每秒鐘傳輸?shù)奈粩?shù)。 在51單片機(jī)的串口通信中,模式1與模式3的波特率是可變的,取決于定時器1的溢出率。 (定時器每溢出一次就發(fā)送一次數(shù)據(jù)) 通常使用定時器1的工作模式2(8位自動重裝)來產(chǎn)生波特率。(不用改計數(shù)初值) TL1作為脈沖計數(shù)寄存器,TH1作為自動重裝寄存器,當(dāng)計數(shù)達(dá)到最大值溢出時,TH1的值會自動裝到TL1中。 波特率的計算公式// 波特率=(2^SMoD / 32)×T1的溢出率 SMOD=0時,TH1參數(shù)=256 - fosc / 12 / 32 / 波特率 SMOD=1時,TH1參數(shù)=256 - fosc / 12 / 16 / 波特率 (翻倍) 12M晶振或11.0592M晶振的情況下,要產(chǎn)生9600BPS的波特率, SMOD=0時,參數(shù)為0xfd; SMOD=1時,參數(shù)為0xfa。
下面以UART口為例介紹串口數(shù)據(jù)發(fā)送接收。 串行口中有兩個緩沖寄存器SBUF,一個是發(fā)送寄存器,一個是接收寄存器,在物理結(jié)構(gòu)上是完全獨(dú)立的。它們都是字節(jié)尋址的寄存器,字節(jié)地址均為99H。 這個重疊的地址靠讀/寫指令區(qū)分: 串行發(fā)送時,CPU向SBUF寫入數(shù)據(jù),此時99H表示發(fā)送緩存SBUF。 串行接收時,CPU從SBUF讀出數(shù)據(jù),此時99H表示接收緩存SBUF。 數(shù)據(jù)發(fā)送,把數(shù)據(jù)扔進(jìn)SBUF后,內(nèi)核會自動將數(shù)據(jù)發(fā)送出去,內(nèi)容發(fā)生完成后,會將TI標(biāo)志位置1. 發(fā)送數(shù)據(jù)程序:SBUF=數(shù)據(jù)/變量; 如:SBUF=0x58; 數(shù)據(jù)接收,內(nèi)核從串口接收到一個完整的數(shù)據(jù)后,會將RI標(biāo)志位置1,用戶用SBUF直接讀取即可。 接收數(shù)據(jù)程序:變量=SBUF; 如:dat=SBUF;(實際上就是賦值)
SCON寄存器
最常用的是模式1,SM0、SM1最常用是”01“,RB8、TB8一般在奇偶校驗使用,不用則輸入0即可。 異步8位UART并且允許接收:SCON=0x50;(大多數(shù)時候SCON直接輸這個就行 ) 對于IAP15F2K61S2單片機(jī),你還要對輔助寄存器AUXR(0x8e)進(jìn)行設(shè)置。
任務(wù)1
任務(wù)1:在CT107D單片機(jī)綜合訓(xùn)練平臺上,利用51單片機(jī)的串行接口與上位機(jī)建 立傳輸信道進(jìn)行數(shù)據(jù)的收發(fā)。采用8位的UART模式,即模式1,波特率為9600BPS。數(shù)據(jù)發(fā)送采用查詢方式,數(shù)據(jù)接收采用中斷方式。系統(tǒng)上電初始化之后,單片機(jī)向上位機(jī)發(fā)送兩個字節(jié):0x5a和0xa5,然后等待接收上位機(jī)的數(shù)據(jù),每接收到一個字節(jié)后,在該字節(jié)的基礎(chǔ)上加1,然后返回給上位機(jī)。
#include "reg52.h"
sfr AUXR = 0x8e; //IAP15F2K61S2需要的
unsigned char urdat;
void SendByte(unsigned char dat);
void InitUart() //采用的是定時器1
{
TMOD = 0x20; //設(shè)置自動重裝計數(shù)器
TH1 = 0xfd; //設(shè)置重新裝入值
TL1 = 0xfd;
TR1 = 1; //啟動定時器
SCON = 0x50; //設(shè)置串口
AUXR = 0x00;
//IE寄存器
ES = 1; //打開串口
EA = 1; //打開總開關(guān)
}
void ServiceUart() interrupt 4
{
if(RI == 1)
{
RI = 0;
urdat = SBUF; //發(fā)送
SendByte(urdat+1);
}
}
void SendByte(unsigned char dat)
{
SBUF = dat; //接收
while(TI == 0);
TI = 0;
}
void main()
{
InitUart();
SendByte(0x5a);
SendByte(0xa5);
while(1);
}
結(jié)果:
任務(wù)2
任務(wù)2:在CT107D單片機(jī)綜合訓(xùn)練平臺上,利用51單片機(jī)的串行接口與上位機(jī)建立傳數(shù)據(jù)輸信道。采用8位的UART模式,即模式1,波特率為9600BPS。數(shù)據(jù)發(fā)送采用查詢方式,數(shù)據(jù)接收采用中斷方式。 1.系統(tǒng)上電初始化之后,關(guān)閉蜂鳴器和繼電器等無關(guān)設(shè)備,并向上位機(jī)發(fā)送字符串:“Welcome to XMF system!”,回車換行。 2.上位機(jī)通過串口發(fā)送單字節(jié)命令可以控制下位機(jī)的8個LED燈開關(guān)。 3.上位機(jī)通過串口發(fā)送單字節(jié)命令可以讀取下位機(jī)運(yùn)行信息。 4.通信規(guī)約如下表: 實現(xiàn):
#include "reg52.h"
sfr AUXR =0x8e;
unsigned char command=0x00;
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2=P2&0x1f|0x80;
break;
case 5:
P2=P2&0x1f|0xa0;
break;
case 6:
P2=P2&0x1f|0xc0;
break;
case 7:
P2=P2&0x1f|0xe0;
break;
case 0:
P2=P2&0x1f|0x00;
break;
}
}
void InitSystem()
{
SelectHC573(5);
P0=0x00;
SelectHC573(4); //4要在5后邊,保證后邊LED會亮
P0=0xff;
}
void InitUART()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
ES=1;
EA=1;
AUXR=0x00;
}
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位數(shù)據(jù),可變波特率
AUXR |= 0x40; //定時器時鐘1T模式
AUXR &= 0xFE; //串口1選擇定時器1為波特率發(fā)生器
TMOD &= 0x0F; //設(shè)置定時器模式
TL1 = 0xE0; //設(shè)置定時初始值
TH1 = 0xFE; //設(shè)置定時初始值
ET1 = 0; //禁止定時器%d中斷
TR1 = 1; //定時器1開始計時
ES=1;
EA=1;
}
void ServiceUART() interrupt 4
{
if(RI==1)
{
command=SBUF;
RI=0;
}
}
void SendByte(unsigned char dat)
{
SBUF=dat; //command接收dat或者*str
while(TI==0);
TI=0;
}
void SendString(unsigned char *str)
{
while(*str != '\0')
{
SendByte(*str++);
}
}
void Working()
{
if(command!=0x00)
{
switch (command&0xf0) //取高四位
{
case 0xa0: //第一位是0
P0=(P0&0xf0)|((~command)&0x0f);
command=0x00;
break;
case 0xb0: //第二位是0
P0=(P0&0x0f)|((~command<<4) &0xf0);
command=0x00;
break;
case 0xc0: //第三位是0
SendString("The System is running!\r\n");
command=0x00;
break;
}
}
}
void main()
{
InitSystem();
// InitUART();
UartInit();
SendString("Welcome to blue bridge cup!\r\n");
while(1)
{
Working();
}
}
P0=(P0&0xf0)|((~command)&0x0f); 將P0的高四位和取反后的command的低四位合并,并賦值給P0。 P0=(P0&0x0f)|((~command<<4) &0xf0); 同上,不過command要先左移再取反。
十、IO擴(kuò)展與存儲器映射擴(kuò)展
任務(wù):在CT107D單片機(jī)綜合訓(xùn)練平臺上,分別用/O擴(kuò)展方式與存儲器擴(kuò)展方式對LED燈和數(shù)碼管進(jìn)行基本的控制。 1.首先點(diǎn)亮指示燈低4位,關(guān)閉高4位,延時片刻,點(diǎn)亮指示燈的高4位,關(guān)閉低4位,延時片刻,關(guān)閉所有指示燈。 2.然后依次逐個點(diǎn)亮數(shù)碼管的所有段碼,每次只點(diǎn)亮一個數(shù)碼管。 3.循環(huán)執(zhí)行上述功能。 外部資源的地址映射關(guān)系: 0x8000–指示燈 0xa000–蜂鳴器與繼電器 0xc000-數(shù)碼管位選 0xe000–數(shù)碼管段碼
通俗而言,IO擴(kuò)展就是直接用HC138譯碼器進(jìn)行輸入輸出。 存儲器映射擴(kuò)展就是通過外擴(kuò)RAM和ROM空間,進(jìn)行外設(shè)的操作。
實現(xiàn): 如果是IO擴(kuò)展:
#include "reg52.h"
void Delay(unsigned int t)
{
while(t--);
while(t--);
}
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
void LEDRunning()
{
SelectHC573(4);
P0 = 0xf0;
Delay(60000);
Delay(60000);
P0 = 0x0f;
Delay(60000);
Delay(60000);
P0 = 0xff;
Delay(60000);
Delay(60000);
}
void SMGRunning()
{
unsigned char i;
for(i = 0;i < 8;i++)
{
SelectHC573(6);
P0 = 0x01 << i;
SelectHC573(7);
P0 = 0x00;
Delay(60000);
Delay(60000);
}
P0 = 0xff;
Delay(60000);
Delay(60000);
}
void main()
{
while(1)
{
LEDRunning();
SMGRunning();
}
}
存儲器擴(kuò)展:
#include "reg52.h"
#include "absacc.h"
void Delay(unsigned int t)
{
while(t--);
while(t--);
}
void LEDRunning()
{
XBYTE[0x8000]=0xf0;
Delay(65535);
Delay(65535);
XBYTE[0x8000]=0x0f;
Delay(65535);
Delay(65535);
XBYTE[0X8000]=0xff;
}
void DigitalTubeRunning()
{
unsigned char i;
for(i=0;i<8;i++)
{
XBYTE[0xc000]=0x01<
XBYTE[0xe000]=0x00;
Delay(65535);
Delay(65535);
}
XBYTE[0xe000]=0xff;
Delay(65535);
Delay(65535);
}
void main()
{
while(1)
{
DigitalTubeRunning();
LEDRunning();
}
}
*注意:1.進(jìn)行存儲器映射擴(kuò)展,CT107D平臺的J13要將1-2腳短接。 2.引入“absacc.h”,通過XBYTE關(guān)鍵字來直接操作擴(kuò)展資源。 3.存儲器映射擴(kuò)展方式要占用單片機(jī)的P3.6引腳。
十一、DS18B20溫度傳感器
基礎(chǔ)知識
DS18B20是一款常用的高精度的單總線數(shù)字溫度測量芯片。
溫度轉(zhuǎn)換與讀取流程: 【1】DS18B20復(fù)位。 【2】寫入字節(jié)0xCC,跳過ROM指令。(忽略ID匹配過程)
【3】寫入字節(jié)0x44,開始溫度轉(zhuǎn)換。
【4】延時700~900ms。 【5】DS18B20復(fù)位。 【6】寫入字節(jié)0xCC,跳過ROM指令。 【7】寫入字節(jié)0xBE,讀取高速暫存器。
【8】讀取暫存器的第0字節(jié),即溫度數(shù)據(jù)的LSB。 【9】讀取暫存器的第1字節(jié),即溫度數(shù)據(jù)的MSB。 【10】DS18B20復(fù)位。表示讀取數(shù)據(jù)結(jié)束。 【11】將LSB和MSB整合成為一個16位數(shù)據(jù)。 【12】判斷讀取結(jié)果的符號,進(jìn)行正負(fù)溫度的數(shù)據(jù)處理。(DS18B20以16位帶符號位擴(kuò)展的二進(jìn)制補(bǔ)碼形式讀出。)
由于一個本單片機(jī)只有一個DS18B20,可以直接用SKIP RAM無需發(fā)送地址信息實現(xiàn)功能。 數(shù)據(jù)處理: DS18B20的分辨率為0.0625。讀出數(shù)據(jù)為正溫度時,將LSB和MSB整合成的16位整數(shù),直接乘以0.0625即可。讀出數(shù)據(jù)為負(fù)溫度時,則需要將LSB和MSB整合成的16位整數(shù),取反加1后,再乘以0.0625。 注意:在上電復(fù)位的時候,溫度寄存器中的值為0x0550,即+85攝氏度。
完成室溫傳感
#include "reg52.h"
#include "onewire.h"
#include "absacc.h"
unsigned char code DTNumber[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //數(shù)字帶點(diǎn)
unsigned char code DTNumberWithDot[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //不帶點(diǎn)
int temp=0;
unsigned char LSB,MSB;
void DTDynDisplay(void);
void Delay(unsigned int t)
{
while(t--);
}
void DelayWithDT(unsigned int t)
{
while(t--)
{
DTDynDisplay();
}
}
void DTStaticDisplay(unsigned char pos,value)
{
XBYTE[0xe000]=0xff;
XBYTE[0xc000]=0x01< XBYTE[0xe000]=value; } void DTDynDisplay() { XBYTE[0xc000]=0xff; XBYTE[0xe000]=0xff; DTStaticDisplay(0,0xff); DTStaticDisplay(1,0xff); DTStaticDisplay(2,0xff); DTStaticDisplay(3,0xff); //如果溫度是負(fù)數(shù)的時候,這個要改 DTStaticDisplay(4,0xff); DTStaticDisplay(5,DTNumber[temp/100]); //第一位 Delay(5000); DTStaticDisplay(6,DTNumberWithDot[temp%100/10]); //第二位 Delay(5000); DTStaticDisplay(7,DTNumber[temp%10]); //小數(shù)點(diǎn)后一位 Delay(5000); } void ReadTemp() { init_ds18b20(); Write_DS18B20(0xCC); Write_DS18B20(0x44); DelayWithDT(100); init_ds18b20(); Write_DS18B20(0xCC); Write_DS18B20(0xBE); LSB=Read_DS18B20(); MSB=Read_DS18B20(); // init_ds18b20(); temp=MSB; temp=(temp << 8) | LSB; if((temp&0xf800) == 0x0000) //讀取符號位,說明是正數(shù) { temp>>=4; temp=temp*10; temp=(LSB&0x0f)*0.0625*10+temp; //這一行為小數(shù)部分的換算,&0x0f將高四位變成0, //低四位不變,*0.0625即乘上2^(-4),將整數(shù)表示的小數(shù)部分真正變成小數(shù),后*10用于將小數(shù)部分寫入temp的個位 } // if((temp&0xf800) == 0xf800) //當(dāng)溫度是負(fù)的時候 // { // temp=~temp+1; //由于讀到的是補(bǔ)碼,所以取反加1,由于后邊運(yùn)算跟符號位無關(guān),所以不用管前五位,直接取反。 // temp=(temp>>4) * 10; // temp=((~LSB+1)&0x0f)*0.625+temp; // } } void main() { XBYTE[0x8000]=0xff; while (1) { ReadTemp(); DTDynDisplay(); } } 其中onewire模塊: #include "reg52.h" sbit DQ = P1^4; //單總線接口 //單總線延時函數(shù) void Delay_OneWire(unsigned int t) //STC89C52RC { while(t--); } //通過單總線向DS18B20寫一個字節(jié) void Write_DS18B20(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { DQ = 0; DQ = dat&0x01; Delay_OneWire(60); DQ = 1; dat >>= 1; } Delay_OneWire(60); } //從DS18B20讀取一個字節(jié) unsigned char Read_DS18B20(void) { unsigned char i; unsigned char dat; for(i=0;i<8;i++) { DQ = 0; dat >>= 1; DQ = 1; if(DQ) { dat |= 0x80; } Delay_OneWire(60); } return dat; } //DS18B20設(shè)備初始化 bit init_ds18b20(void) { bit initflag = 0; DQ = 1; Delay_OneWire(144); DQ = 0; Delay_OneWire(960); DQ = 1; Delay_OneWire(120); initflag = DQ; Delay_OneWire(60); return initflag; } 十二、DS1302 采用SPI三線接口與MCU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘參數(shù)和RAM數(shù)據(jù)。 在DS1302中有兩塊存儲器:日歷時鐘寄存器和靜態(tài)RAM存儲器。前者用于記錄實時時間,后者用于記錄其他數(shù)據(jù)。 DS1302介紹 注: 要記得在操作 DS1302 之前關(guān)閉寫保護(hù);不然指令是無法進(jìn)入控制寄存器的 下面進(jìn)行實操說明: #include "reg52.h" #include "absacc.h" #include "ds1302.h" void Delay(unsigned int t) { while(t--); } code unsigned char SMG_number[18]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90, 0x88,0x80,0xc6,0xc0,0x86, 0x8e,0xbf,0x7f}; void WriteDS() { char i; Write_Ds1302_Byte(0x8e,0x00); // 禁止寫保護(hù) for(i=0;i<7;i++) { Write_Ds1302_Byte(WriteDS_Addr[i],Time[i]); // 將時間數(shù)據(jù)寫入DS1302的指定地址 } Write_Ds1302_Byte(0x8e,0x80); // 開啟寫保護(hù) } void ReadDS() { char i; for(i=0;i<7;i++) { Time[i]=Read_Ds1302_Byte(ReadDS_Addr[i]); 從DS1302的指定地址讀取時間數(shù)據(jù) } } void DTDrive(unsigned char pos, value) { XBYTE[0xc000]=0x01< XBYTE[0xe000]=SMG_number[value]; // 顯示對應(yīng)的數(shù)碼管編碼 Delay(1000); // 延時 } void DTDisplay() { XBYTE[0xc000]=0xff; XBYTE[0xe000]=0xff; DTDrive(0,Time[5]/16); DTDrive(1,Time[5]%16); DTDrive(2,16); DTDrive(3,Time[4]/16); DTDrive(4,Time[4]%16); DTDrive(5,16); DTDrive(6,Time[3]/16); DTDrive(7,Time[3]%16); } void main() { WriteDS(); // 初始化DS1302的時間 while(1) { ReadDS(); // 讀取DS1302的時間 DTDisplay(); // 顯示時間 } } 十三、NE555定時器 整個NE555的電路沒有與單片機(jī)的其它引腳相通,是一個完整電路,可自發(fā)生成方波。 在NE555內(nèi)部,有3個5K的電阻分壓,故稱555定時器。 555定時器的基本原理: 低電平觸發(fā)端TRIG和高電平觸發(fā)端THR: 兩者電壓均小于各自的參考電壓時,U0=1,放電管截至。 兩者電壓均大于各自的參考電壓時,U0=0,放電管導(dǎo)通。 通過AUXR第七位確定是否分頻。 計數(shù)器就是計傳入方波的數(shù)量,定時器通過固定頻率計脈沖數(shù)來計算經(jīng)過時間。 十四、PCF8591 A/D將模擬信號(正弦波)轉(zhuǎn)為數(shù)字信號(方波),D/A數(shù)轉(zhuǎn)模。 PCF8591是一款單芯片、單電源、低功耗8位CMOS數(shù)據(jù)采集設(shè)備具有四個模擬輸入、一個模擬輸出和一個串行12c總線接口。 串行數(shù)據(jù)線SDA——負(fù)責(zé)在設(shè)備間傳輸串行數(shù)據(jù)? 串行時鐘線SCL——負(fù)責(zé)產(chǎn)生同步時鐘脈沖 SCL\SDA是I2C總線的信號線。 IIC I2C總線具有兩根雙向信號線,一根是數(shù)據(jù)線SDA,另一根是時鐘線SCL。 多主機(jī)會產(chǎn)生總線裁決問題。當(dāng)多個主機(jī)同時想占用總線時,企圖啟動總線傳輸數(shù)據(jù),就叫做總線競爭。I2C通過總線仲裁,以決定哪臺主機(jī)控制總線. 對于其中的address 前4位固定,最后一位低電平“寫”,高電平“讀”。(讀取地址:0x91,寫入地址:0x90) 對于“control byte” 第三第四位一般用00。 控制光敏電阻設(shè)置0x41,可調(diào)電阻0x43。 十五、AT24C02 EEPROM與RAM: EEPROM:帶點(diǎn)可擦只讀存儲器 RAM:隨機(jī)存儲器 運(yùn)作模式: 十六、超聲波傳感器 超聲波傳感器主要用于測距。原理還是s=(2/t)*v(聲速) 發(fā)出信號,整個U18相當(dāng)于起信號放大作用 接收信號 J2處跳線帽連接1、3,2、4則選用超聲波模式,選用3、5,4、6則選用紅外模式 柚子快報激活碼778899分享:藍(lán)橋杯學(xué)習(xí)筆記(二) 參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。