欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
注釋很詳細的IIC做從機發送數據源程序
[打印本頁]
作者:
qq1182560902
時間:
2019-12-23 11:42
標題:
注釋很詳細的IIC做從機發送數據源程序
感覺寫的很好,有參考價值,畢竟寫主發從列程很多。從發主列程是真的少
單片機源程序如下:
/************* 用戶系統配置 **************/
#define MAIN_Fosc 12000000L //定義主時鐘, 模擬串口和紅外接收會自動適應。5~36MHZ
#define D_TIMER0 125 //選擇定時器時間, us, 紅外接收要求在60us~250us之間
#define User_code 0xFD02 //定義紅外接收用戶碼
#define DECVICE_ADD 0x55<<1
/************* 以下宏定義用戶請勿修改 **************/
#include "reg51.H"
#include "string.H"
#define uchar unsigned char
#define uint unsigned int
//#define freq_base (MAIN_Fosc / 1200)
//#define Timer0_Reload (65536 - (D_TIMER0 * freq_base / 10000))
/************* 本地常量聲明 **************/
/************* 本地變量聲明 **************/
sbit SDA = P3^0; //SDA
sbit SCL = P3^1; //SCL
bit PreState;
bit NowState;
bit START_flag;
bit STOP_flag;
//uchar IR_SampleCnt; //采樣計數
uchar NN;
uchar DEVICE_ADR; //器件地址
uchar WORD_ADR; //內存地址
uchar REC_DATA; //接收到的內容
unsigned int *send_ptr;//
code unsigned AA0[9] = {0x70,0x2c,0x6e,0x2a,0x00,0x00,0x00,0xc0}; //
code unsigned AA8[2] = {0xff,0x2c}; //
//code unsigned AA0[9] = {0x70,0x2c,0x6e,0x2a,0x00,0x00,0x00,0xc0}; //
code unsigned A00[33] = {0xed,0xcf,0x48,0xe6,0x89,0xe8,0x0c,0xe8,
0x97,0xaf,0xd2,0x40,0x6d,0xc2,0xc4,0x04,
0xca,0xd5,0xea,0xa7,0xae,0x43,0x37,0xe2,
0x12,0x05,0x3b,0x59,0xb7,0xfb,0x3d,0xa5
}; //
code unsigned A20[33] = {0xCB,0x85,0x8b,0x54,0x6d,0x97,0x3c,0x05,
0x46,0x0f,0x45,0xb4,0xd1,0x0a,0xb8,0x9b,
0xdf,0xa2,0x43,0x8d,0xe6,0x7a,0x6f,0xf8,
0x7f,0xaa,0x52,0x37,0xa6,0x8f,0xdc,0x71
}; //
code unsigned A40[33] = {
0x15,0x67,0xc5,0x82,0xfe,0x01,0x87,0x44,
0x10,0xcd,0xf8,0xe2,0xd7,0xb1,0x7d,0xb6,
0x53,0xc0,0x43,0x39,0x3a,0xb3,0x32,0xba,
0x5d,0x84,0xf1,0x03,0x13,0xcd,0x74,0x28
}; //
code unsigned A60[33] = {
0x34,0x39,0xab,0x32,0x3b,0x32,0x76,0x4b,
0xff,0x6f,0x2d,0xd6,0x20,0xab,0x8c,0x73,
0x6b,0xd0,0xad,0xa6,0x83,0xdf,0x60,0xe0,
0x63,0x51,0xe4,0x76,0x1e,0x58,0x9f,0x52
}; //
uchar temp;
/************* 外部函數和變量聲明 *****************/
void init(void);//初如化函數
void delay_24C02(void); // 延時 5us
void ACK(void);//應答
void WaitACK(void);//等待主機回復
/********************* 主函數 *************************/
void main(void)
{
uchar gg,MM,i,count;
init();//初如化
while(1)
{
NN=50;
PreState = SDA;
while(SCL && NN--)
{
NowState = SDA;
if(PreState && !NowState) //啟動
{
START_flag = 1;
//_DINT();
}
if(!PreState && NowState) //結束
{
STOP_flag = 1;
//_EINT();
}
PreState = NowState;
if(START_flag) //如果是啟動的話
{
START_flag=0;
while(SCL); //START時的SCL高電平狀態就等待
for(gg=8;gg>0;gg--) //接收器件地址
{
while(!SCL); //SCL低電平狀態就等待
DEVICE_ADR<<=1;
if(SDA) //數據的第一個CLK高電平來臨
DEVICE_ADR |= 0x01;
while(SCL); //SCL高電平狀態就等待
}
ACK(); //對設備地址ACK應答信
//-----------以上收到了設備地址,并知曉主機要對從機進行讀還是寫操作---
for(gg=8;gg>0;gg--) //接收內存單元地址
{
while(!SCL);
WORD_ADR<<=1;
if(SDA)
WORD_ADR |= 0x01;
while(SCL);
}
//-----------以上就已經接收到內存單元地址------------
ACK(); //對內存單元ACK應答信號
//--------------------- 以上就已經接收到內存單元地址 -------------------------
delay_24C02();//5us
delay_24C02();
delay_24C02();//5us
delay_24C02();
MM=50;
PreState = SDA;
while(SCL && MM--)
{
NowState = SDA;
if(PreState && !NowState) // 如果 SDA 下降沿且 SCL 為高 , 則示開始信號
{
START_flag = 1;
}
}
//--------------------START_Flag=1: 表示隨即讀數據 -------------------------
if(START_flag==1)
{
//--------------------------- 讀取器件地址 ---------------------------------
//while(!SCL);
START_flag=0; // 清除標志位
while(SCL); //START 時的 SCL 高電平狀態就等待
for(gg=8;gg>0;gg--) // 接收器件地址
{
while(!SCL); //SCL 低電平狀態就等待
DEVICE_ADR<<=1; // 高位在前
if(SDA) // 數據的第一個 CLK 高電平來臨
DEVICE_ADR |= 0x01; // 上升沿讀取數據位
while(SCL); //SCL 高電平狀態就等待
}
ACK(); // 對設備地址 ACK 應答信
//------------------ 判斷地址是否為 0xa1 ,表示讀數據指令 -------------------
if(DEVICE_ADR == 0xab) //( DECVICE_ADD+1)
{
switch(WORD_ADR)
{
case 0xa0: count=8; send_ptr =AA0; // memcpy(temp,AA0,count);
break;
case 0xa8: count=1; send_ptr =AA8; // memcpy(temp,AA8,count);
break;
case 0x00: count=32; send_ptr =A00; // memcpy(temp,A00,count);
break;
case 0x20: count=32; send_ptr =A20;// memcpy(temp,A20,count);
break;
case 0x40: count=32; send_ptr =A40; // memcpy(temp,A40,count);
break;
case 0x60: count=32; send_ptr =A60;// / memcpy(temp,A60,count);
break;
}
for(i=0;i<count;i++) // 要 讀 多 少 字 節 , 由
{
//*send_ptr =WORD_ADR;
temp = send_ptr[i];
for(gg=8;gg>0;gg--) // 輸出數據給主機
{
while(SCL);//如果為高,保持
if( temp & 0x80)
{
SDA=1; // 輸出 1
}
else
{
SDA=0; // 輸出 0
}
while(!SCL);
//while(SCL); //SCL 為 1 ,就保持 SDA 輸出不變
// SDA=1;
//*send_ptr <<=1;
temp <<=1;
}
WaitACK();//主機回復ACK
//send_ptr++;
}
}//if(DEVICE_ADR==0xa1)
else //如果不是,退出
{
}
}//if(START_flag==1)
else // 如果 START_flag!=1 則表示主機對從機進行寫操作
{
if(WORD_ADR == 0xa9)
{
for(i=0;i<8;i++)
{
for(gg=8;gg>0;gg--) // 讀取主機發來的數據
{
// while(!SCL);
// //READ_BUF[i] <<=1;
// //SDA=0;
// if(SDA)
// ;
// //READ_BUF[i] |= 0x01;
// //SDA=0;
// while(SCL);
while(!SCL);
while(SCL);
}
ACK(); // 對設備地址 ACK 應答信
}
}
}
}// if(START_flag)
}//end while(SCL && NN--)
}//end while(1)
}
/********************************************************************
函數功能:初始化函數
入口參數:無
返 回:無。
備 注:無。
********************************************************************/
void init(void)
{
SDA=1; // 初始數據引腳
SCL=1; // 初始時鐘引腳
// EA=1; // 開總中斷
// IP=0x90; // 中斷優先級設定,設為串口 >INTO>T0>INT1>T1
// EX0=1; // 開外部中斷 0
}
/********************************************************************
函數功能:從機應答函數
入口參數:無
返 回:無。
備 注:應答函數,保證在兩個時鐘跳變沿 SDA 為低,則主機認為是從機應答
********************************************************************/
void ACK(void)
{
// while(!SCL);
// SDA=0; // 第 9 個 CLK 變高的情況下, SDA 輸出 0
// while(SCL);
// SDA=1; // 第 9 個 CLK 變低的情況下, SDA 輸出 1
while(SCL); //低就阻塞
delay_24C02();
SDA=0; // 第 9 個 CLK 變高的情況下, SDA 輸出 0
while(!SCL); //低就阻塞
while(SCL); //高就阻塞
delay_24C02();
SDA=1; // 第 9 個 CLK 變低的情況下, SDA 輸出 1
}
/********************************************************************
函數功能:主機應答函數
入口參數:無
返 回:無。
備 注:應答函數,保證在兩個時鐘跳變沿 SDA 為低,則主機認為是從機應答
********************************************************************/
void WaitACK(void)
{
// while(!SCL);
// SDA=0; // 第 9 個 CLK 變高的情況下, SDA 輸出 0
// while(SCL);
// SDA=1; // 第 9 個 CLK 變低的情況下, SDA 輸出 1
while(SCL); //高就阻塞
delay_24C02();
SDA=1; // 第 9 個 CLK 變高的情況下, SDA 輸出 0
while(!SCL); //低就阻塞
while(SCL); //高就阻塞
delay_24C02();
//SDA=1; // 第 9 個 CLK 變低的情況下, SDA 輸出 1
}
/********************************************************************
函數功能:延時 us
入口參數:無
返 回:無。
備 注:函數是用來實現短暫延時,用于對接上主機時鐘
********************************************************************/
void delay_24C02(void) // 延時 5us
{
//; ; ; ; ;
uchar i;
i=3;
while(i--);
}
復制代碼
所有資料51hei提供下載:
IICSTC2.rar
(40.35 KB, 下載次數: 178)
2019-12-23 11:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
kevine1207
時間:
2022-10-11 17:48
感謝分享,試試看能不能行
作者:
steven66
時間:
2022-10-16 14:46
看起來感覺不錯, 感謝分享.
作者:
meiryfu
時間:
2022-10-17 15:01
現在的MCU都集成了硬件IIC功能。實際工程都用硬件的IIC。
作者:
join22life
時間:
2024-9-4 22:21
找了很久,自己調一直不通,多謝
作者:
王秋冬
時間:
2024-9-5 09:01
謝謝樓主,這個程序即解決了問題,又給初學者提供了學習的興趣,注釋的比較詳細。
作者:
herohuang
時間:
2025-10-23 17:40
能不能用有沒人說下
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1