×
单片机 > 单片机程序设计 > 详情

注释很详细的IIC做从机发送数据源程序

发布时间:2021-03-18 发布时间:
|

感觉写的很好,有参考价值,毕竟写主发从列程很多。从发主列程是真的少

单片机源程序如下:


/*************        用户系统配置        **************/


#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应答信 



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析