導航:首頁 > 操作系統 > 帶i方c協議的單片機

帶i方c協議的單片機

發布時間:2023-05-28 18:09:29

單片機中 I2C匯流排協議中的問題

SCL=0; //拉低時鍾線,准備接收數據,否則後面循環中就無法出第1個上升沿了
delay(); //延時
SDA=1; //釋放數據線(不驅動,懸浮)由發送方驅動此線
delay(); //延時
for(i=0;i<8;i++) //8次循環每次接收1位
{
SCL=1; //拉高時鍾線,出一個上升沿,讀取數據,發送方會保持數據在SDA線上
delay();
k=(k<<1)|SDA;//k的其他位左移,將數據線狀態保存在k的最低位
SCL=0; //拉低時鍾線,等待發送放在數據線上放下1位
delay();
}

㈡ 51單片機串口通信,和I2C串口通信協議有什麼區別和相同

串口通信准確的說叫RS232通信,串口通信和I2C都是串列通信,但串口通信是RS232協議,I2C通信是遵循I2C協議,舉個簡單例子,從A到B有條路,一個人走路過去,一個人坐車過去。串列通信就是相當於路,RS232和I2C協議相當於走路和坐車兩種不同的方式
贊同

㈢ 求:51單片機模擬i2c匯流排程序

//給你一個簡單的可斷電保存的計時程序,用的是24C08
#include <reg52.h> // 包含51單片機寄存器定義的頭文件
#include <intrins.h> //包含_nop_()函數定義的頭文件
#define OP_READ 0xa1 // 器件地址以及讀取操作,0xa1即為1010 0001B
#define OP_WRITE 0xa0 // 器件地址以及寫入操作,0xa1即為1010 0000B
sbit SCL=P3^4; //將串列時鍾匯流排SCL位定義在為P3.4引腳
sbit SDA=P3^5; //將串列數據匯流排SDA位定義在為P3.5引腳
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定義共陽數碼管顯示字型碼
unsigned char sec=0; //定義計數值,每過1秒,sec加1
unsigned int count; //定時中斷次數
bit write=0; //寫24C08的標志;
sbit shiwei=P2^6; //十位選通定義
sbit gewei=P2^7; //個位選通定義
sbit K5=P3^2; //清0按鍵
/*****************************************************
函數功能:延時1ms
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}

/*****************************************************
函數功能:延時若干毫秒
入口參數:n
***************************************************/
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/***************************************************
函數功能:開始數據傳送
***************************************************/
void start()
// 開始位
{
SDA = 1; //SDA初始化為高電平「1」
SCL = 1; //開始數據傳送時,要求SCL為高電平「1」
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
SDA = 0; //SDA的下降沿被認為是開始信號
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
SCL = 0; //SCL為低電平時,SDA上數據才允許變化(即允許以後的數據傳遞)
}
/***************************************************
函數功能:結束數據傳送
***************************************************/
void stop()// 停止位
{
SDA = 0; //SDA初始化為低電平「0」 _n
SCL = 1; //結束數據傳送時,要求SCL為高電平「1」
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
SDA = 1; //SDA的上升沿被認為是結束信號
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
SDA=0;
SCL=0;
}
/***************************************************
函數功能:檢測應答位
***************************************************/

bit Ask() //檢測應答
{
bit ack_bit; //儲存應答位
SDA = 1; // 發送設備(主機)應在時鍾脈沖的高電平期間(SCL=1)釋放SDA線,
//以讓SDA線轉由接收設備(AT24Cxx)控制
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
SCL = 1; //根據上述規定,SCL應為高電平
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
ack_bit = SDA; //接受設備(AT24Cxx)向SDA送低電平,表示已經接收到一個位元組
//若送高電平,表示沒有接收到,傳送異常 結束發送
SCL = 0; //SCL為低電平時,SDA上數據才允許變化(即允許以後的數據傳遞)
return ack_bit; // 返回AT24Cxx應答位

}

/***************************************************
函數功能:從AT24Cxx讀取數據
出口參數:x
***************************************************/
unsigned char ReadData()
// 從AT24Cxx移入數據到MCU
{
unsigned char i;
unsigned char x; //儲存從AT24Cxx中讀出的數據
for(i = 0; i < 8; i++)
{
SCL = 1; //SCL置為高電平
x<<=1; //將x中的各二進位向左移一位
x|=(unsigned char)SDA; //將SDA上的數據通過按位「或「運算存入x中
SCL = 0; //在SCL的下降沿讀出數據
}
return(x); //將讀取的數據返回
}
/***************************************************
函數功能:向AT24Cxx的當前地址寫入數據
入口參數:y (儲存待寫入的數據)
***************************************************/
//在調用此數據寫入函數前需首先調用開始函數start(),所以SCL=0
void WriteCurrent(unsigned char y)
{
unsigned char i;
for(i = 0; i < 8; i++) // 循環移入8個位
{
SDA = (bit)(y&0x80); //通過按位「與」運算將最高位數據送到S
//因為傳送時高位在前,低位在後
_nop_(); //等待一個機器周期
SCL = 1; //在SCL的上升沿將數據寫入AT24Cxx
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期

SCL = 0; //將SCL重新置為低電平,以在SCL線形成傳送數據所需的8個脈沖
y <<= 1; //將y中的各二進位向左移一位

}
}
/***************************************************
函數功能:向AT24Cxx中的指定地址寫入數據
入口參數:add (儲存指定的地址);dat(儲存待寫入的數據)
***************************************************/
void WriteSet(unsigned char add, unsigned char dat)
// 在指定地址addr處寫入數據WriteCurrent
{
start(); //開始數據傳遞
WriteCurrent(OP_WRITE); //選擇要操作的AT24Cxx晶元,並告知要對其寫入數據
Ask();
WriteCurrent(add); //寫入指定地址
Ask();
WriteCurrent(dat); //向當前地址(上面指定的地址)寫入數據
Ask();
stop(); //停止數據傳遞
delaynms(4); //1個位元組的寫入周期為1ms, 最好延時1ms以上
}
/***************************************************
函數功能:從AT24Cxx中的當前地址讀取數據
出口參數:x (儲存讀出的數據)
***************************************************/
unsigned char ReadCurrent()
{
unsigned char x;
start(); //開始數據傳遞
WriteCurrent(OP_READ); //選擇要操作的AT24Cxx晶元,並告知要讀其數據
Ask();
x=ReadData(); //將讀取的數據存入x
stop(); //停止數據傳遞
return x; //返回讀取的數據
}
/***************************************************
函數功能:從AT24Cxx中的指定地址讀取數據
入口參數:set_addr
出口參數:x
***************************************************/
unsigned char ReadSet(unsigned char set_addr)
// 在指定地址讀取
{
start(); //開始數據傳遞
WriteCurrent(OP_WRITE); //選擇要操作的AT24Cxx晶元,並告知要對其寫入數據
Ask();
WriteCurrent(set_addr); //寫入指定地址
Ask();
return(ReadCurrent()); //從指定地址讀出數據並返回
}
/***********************************************************/
void LEDshow() //LED顯示函數
{

P0=table[sec/10];
shiwei=0;
delaynms(2);
shiwei=1;

P0=table[sec%10];
gewei=0;
delaynms(2);
gewei=1;
}

/***********************************************************/
/***************************************************
函數功能:主函數
***************************************************/

void main(void)
{

TMOD=0x01; //定時器0工作在方式1
ET0=1;
EA=1;
TH0=(65536-50000)/256; //對TH0 TL0賦值
TL0=(65536-50000)%256; //使定時器0.05秒中斷一次
SDA = 1; // SDA=1,SCL=1,使主從設備處於空閑狀態
SCL = 1;
sec=ReadSet(2);//讀出保存的數據賦於sec
TR0=1; //開始計時
while(1)
{
LEDshow();
if(write==1) //判斷計時器是否計時一秒
{
write=0; //清零
WriteSet(2,sec); //在24c08的地址2中寫入數據sec
}

if(K5==0){
delaynms(10);
if(K5==0){
sec=0;
}
}
}
}

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

void t0(void) interrupt 1 using 0 //定時中斷服務函數
{
TH0=(65536-50000)/256; //對TH0 TL0賦值
TL0=(65536-50000)%256; //重裝計數初值
count++; //每過50ms tcnt加一
if(count==20) //計滿20次(1秒)時
{
count=0; //重新再計
sec++;
write=1; //1秒寫一次24C08
if(sec==100) //定時100秒,在從零開始計時
{sec=0;}
}
}

閱讀全文

與帶i方c協議的單片機相關的資料

熱點內容
編程第四關用冰雪火焰閃現通關 瀏覽:754
批處理當前文件夾參數 瀏覽:183
鴻蒙安卓如何下載 瀏覽:902
開3389命令 瀏覽:540
程序員大都單純嗎 瀏覽:913
APP如何實現下載功能 瀏覽:214
通達信源碼怎樣放到桌面 瀏覽:643
程序員的腦袋會禿嗎 瀏覽:453
為什麼eve登錄啟動不進去伺服器 瀏覽:270
微信招生app哪個好用 瀏覽:233
寶可夢劍盾啟動文件在哪個文件夾 瀏覽:765
壓縮機比容 瀏覽:117
python自動化測試面試 瀏覽:949
買便宜點的鞋子去哪個app買 瀏覽:890
android中個人頁面 瀏覽:711
程序員那麼可愛逸城前女友 瀏覽:577
我的世界如何獲得伺服器服主 瀏覽:19
相冊本地加密 瀏覽:228
壓縮文件夾共享 瀏覽:754
梁一端箍筋加密長度設置 瀏覽:447