日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀] .H文件預處理typedef unsignedcharINT8U;//0~255typedef signedcharINT8S;//-128~127typedef unsigned int INT16U;//0~65535typedef signed int INT16S;//-32768~32767typedef unsigned long INT32U;//

 

.H文件預處理

 

typedef unsignedcharINT8U;//0~255

typedef signedcharINT8S;//-128~127

typedef unsigned int INT16U;//0~65535

typedef signed int INT16S;//-32768~32767

typedef unsigned long INT32U;//0~0xFFFFFFFF

typedef signed long INT32S;//0x8000 0000~7FFFFFFF

typedef float FP32;//Single precision floating point

typedef double FP64; //Double precision floating point

 

 

#defineXTAL 1//晶振頻率,單位MHz

#definem_delayus(x)__delay_cycles((unsigned long)(x*XTAL))

#definem_delayms(x)__delay_cycles((unsigned long)(x*XTAL*1000UL))

#definem_delays(x)__delay_cycles((unsigned long)(x*XTAL*1000000UL))

 

 

#defineBIT0 0x01

#defineBIT1 0x02

#defineBIT2 0x04

#defineBIT3 0x08

#defineBIT4 0x10

#defineBIT5 0x20

#defineBIT6 0x40

#defineBIT7 0x80

//假設SCL是端口PD6,SDA是端口PD7,WP是端口PD5

#definem_EnE2pWrite PORTD&=~BIT5 //允許EEPROM讀寫

#definem_DiE2pWrite PORTD|=BIT5 //EEPROM只讀

#definem_I2CWritePort DDRD|=BIT7//I2C寫時,SDA端口方向為輸出

#definem_I2CReadPort DDRD&=~BIT7//I2C讀時,SDA端口方向為輸入

#definem_SetSCLPORTD|=BIT6 //PD6=1,SCL置位

#definem_ClrSCLPORTD&=~BIT6 //PD6=0,SCL清0

#definem_SetSDA PORTD|=BIT7 //PD7=1,SDA置位

#definem_ClrSDA PORTD&=~BIT7//PD7=0,SDA清0

#definem_SDAIn (PIND&BIT7) //SDA讀入

#definem_I2C_Delaym_delayus(5)//I2C延時,不同器件可能不同

#definem_I2C_StopDelay m_delayms(10)//在下一次產生Start之前,總線空閑時間

 

 

 

void I2C_Start();//產生I2C總線的起始狀態(tài)

void I2C_Write(INT8U dat);//向I2C總線寫1個字節(jié)的數(shù)據(jù)

INT8U I2C_Read();//從從機讀取1個字節(jié)的數(shù)據(jù)

INT8U I2C_GetAck();//讀取從機應答位

void I2C_PutAck(INT8U ack);//主機產生應答位或非應答位

void I2C_Stop();//產生I2C總線的停止狀態(tài)

INT8U I2C_Puts(INT8U SlaveAddr,INT16U SubAddr,INT8U SubMod,INT8U *dat,INT16U Size);//I2C總線綜合發(fā)送函數(shù),向從機發(fā)送多個字節(jié)的數(shù)據(jù)

INT8U I2C_Gets(INT8U SlaveAddr,INT16U SubAddr,INT8U SubMod,INT8U *dat,INT16U Size);//I2C總線綜合接收函數(shù),從從機接收多個字節(jié)的數(shù)據(jù)

INT8U I2C_DigitalPot(INT8U SlaveAddr,INT8U dat);//I2C總線數(shù)字電位器發(fā)送程序


.C文件

 

void I2C_Start()

{

m_I2CWritePort;//端口方向為輸出

m_SetSDA;

m_I2C_Delay;

m_SetSCL;

m_I2C_Delay;

m_ClrSDA;

m_I2C_Delay;

m_ClrSCL;

m_I2C_Delay;

}

 

void I2C_Write(INT8Udat)

{

m_I2CWritePort;//端口方向為輸出

for(INT8U t=0;t<8;t++)

{

if ((dat&0x80)!=0)

{

m_SetSDA; //SDA=1

}

else

{

m_ClrSDA; //SDA=0

}

m_I2C_Delay;

dat<<=1;

m_SetSCL; //SCK=1

m_I2C_Delay;

m_ClrSCL; //SCK=0

m_I2C_Delay;

}

}

 

INT8UI2C_Read()

{

INT8U dat;

m_I2CReadPort;//端口方向為輸入

for(INT8U t=0;t<8;t++)

{

m_SetSCL;//SCK=1

dat<<=1;

if(m_SDAIn)

{

dat|=0x01;

}

m_ClrSCL;//SCK=0

m_I2C_Delay;

}

return dat;

}

 

INT8UI2C_GetAck()

{

INT8Uack=0;

m_I2CReadPort;//端口方向為輸入

//總線準備,接受應答

m_SetSDA;

m_I2C_Delay;

m_SetSCL;

m_I2C_Delay;

if(m_SDAIn!=0)

ack =1;

m_ClrSCL;

m_I2C_Delay;

return ack;

}


/******************************************************************************

函數(shù):I2C_PutAck()

功能:主機產生應答位或非應答位

參數(shù):

ack=0:主機產生應答位;ack=1:主機產生非應答位

說明:

主機在接收完每一個字節(jié)的數(shù)據(jù)后,都應當產生應答位

主機在接收完最后一個字節(jié)的數(shù)據(jù)后,應當產生非應答位

******************************************************************************/

void I2C_PutAck(INT8Uack)

{

m_I2CWritePort;//端口方向為輸出

if(ack==0)

{

m_ClrSDA;

}

else

{

m_SetSDA;

}

m_I2C_Delay;

m_SetSCL;

m_I2C_Delay;

m_ClrSCL;

m_I2C_Delay;

m_SetSDA;

}

/******************************************************************************

函數(shù):I2C_Stop()

功能:產生I2C總線的停止狀態(tài)

說明:

SCL處于高電平期間,當SDA出現(xiàn)上升沿時停止I2C總線

不論SDA和SCL處于什么電平狀態(tài),本函數(shù)總能正確產生停止狀態(tài)

本函數(shù)執(zhí)行后,I2C總線處于空閑狀態(tài)

******************************************************************************/

void I2C_Stop()

{

m_I2CWritePort;//端口方向為輸出

m_ClrSDA;

m_I2C_Delay;

m_SetSCL;

m_I2C_Delay;

m_SetSDA;

m_I2C_StopDelay;

}


/******************************************************************************

函數(shù):I2C_Puts()

功能:I2C總線綜合發(fā)送函數(shù),向從機發(fā)送多個字節(jié)的數(shù)據(jù)

參數(shù):

SlaveAddr:從機地址(7位純地址,不含讀寫位,0xxx xxxx)

SubAddr:從機的子地址

SubMod:子地址模式,0-無子地址,1-單字節(jié)子地址,2-雙字節(jié)子地址

*dat:要發(fā)送的數(shù)據(jù)

Size:數(shù)據(jù)的字節(jié)數(shù)

返回:

0:發(fā)送成功

1:在發(fā)送過程中出現(xiàn)異常

說明:

本函數(shù)能夠很好地適應所有常見的I2C器件,不論其是否有子地址

當從機沒有子地址時,參數(shù)SubAddr任意,而SubMod應當為0

******************************************************************************/

INT8UI2C_Puts(INT8USlaveAddr,INT16USubAddr,INT8USubMod,INT8U*dat,INT16USize)

{

m_EnE2pWrite; //允許EEPROM讀寫

INT8Ua[3];

if (Size==0) return1;//檢查長度,在接收過程中出現(xiàn)異常

a[0]=(SlaveAddr<<1);//準備從機地址

if (SubMod>2) SubMod = 2;//檢查子地址模式

 

//確定子地址

switch (SubMod)

{

case 0:

break;

case 1:

a[1]=(INT8U)(SubAddr);

break;

case 2:

a[1]=(INT8U)(SubAddr >> 8);

a[2]=(INT8U)(SubAddr);

break;

default:

break;

}


//主機發(fā)送從機地址(a[0]),接著發(fā)送子地址(如果有子地址的話)(a[1],a[2])

I2C_Start();

for (INT8Ut=0;t<=SubMod;t++)

{

I2C_Write(a[t]);

if (I2C_GetAck())

{

I2C_Stop();

m_DiE2pWrite;//EEPROM只讀

return 1;

}

}

 

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

while(Size--)

{

I2C_Write(*dat++);

if (I2C_GetAck())

{

I2C_Stop();

m_DiE2pWrite;//EEPROM只讀

return 1;

}

}

 

//發(fā)送完畢,停止I2C總線,并返回結果

I2C_Stop();

m_DiE2pWrite;//EEPROM只讀

return 0;//發(fā)送成功

}


/******************************************************************************

函數(shù):I2C_Gets()

功能:I2C總線綜合接收函數(shù),從從機接收多個字節(jié)的數(shù)據(jù)

參數(shù):

SlaveAddr:從機地址(7位純地址,不含讀寫位,0xxx xxxx)

SubAddr:從機的子地址

SubMod:子地址模式,0-無子地址,1-單字節(jié)子地址,2-雙字節(jié)子地址

*dat:保存接收到的數(shù)據(jù)

Size:數(shù)據(jù)的字節(jié)數(shù)

返回:

0:接收成功

1:在接收過程中出現(xiàn)異常

說明:

本函數(shù)能夠很好地適應所有常見的I2C器件,不論其是否有子地址

當從機沒有子地址時,參數(shù)SubAddr任意,而SubMod應當為0

******************************************************************************/

INT8UI2C_Gets(INT8USlaveAddr,INT16USubAddr,INT8USubMod,INT8U*dat,INT16USize)

{

m_EnE2pWrite; //允許EEPROM讀寫

INT8Ua[3];

if(Size=

 

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉