久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

ATMEGA16讀寫iic(24c02) C語言程序 測試通過

作者:未知   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2014年04月01日   【字體:

#include <iom16v.h>
#include "I2C.h"
#include "1602.h"
#include "delay.h"

/*通過AVR往IIC寫數(shù)據(jù),并通過串口把數(shù)據(jù)讀出顯示出來*/
//===============================================================
void uart_init(void)          //UART初始化
{ DDRD = 0x02;
     PORTD = 0x00;

UCSRA = 0x02; /*無倍速*/
     UCSRB = 0x18; /*允許接收和發(fā)送*/
     UCSRC = 0x06; /*8位數(shù)據(jù),1位停止位,無校驗*/
     UBRRH = 0x00;
     UBRRL = 12; /*9600*/

}


//===============================================================
void USART_TXD(float data) //發(fā)送采用查詢方式
{
while( !(UCSRA & BIT(UDRE)) );
UDR=data;
while( !(UCSRA & BIT(TXC )) );
UCSRA|=BIT(TXC);
}


void main(void)

{
unsigned char i;
//LCD_init();

uart_init();//TART初始化
SEI(); //全局中斷使能

   while(1)
   {/*
I2C_Write('n',0x00);
I2C_Write('c',0x01);
I2C_Write('e',0x02);
I2C_Write('p',0x03);
I2C_Write('u',0x04);
*/
i=I2C_Read(0x00);
//LCD_write_char(0,0,i);
   USART_TXD(i);
i=I2C_Read(0x01);
//LCD_write_data(i);
   USART_TXD(i);
i=I2C_Read(0x02);
//LCD_write_data(i);
   USART_TXD(i);
i=I2C_Read(0x03);
//LCD_write_data(i);
   USART_TXD(i);
   i=I2C_Read(0x04);
//LCD_write_data(i);
   USART_TXD(i);
 
   }

}

/*上面上主函數(shù)部分*/

#include <macros.h>
#include "delay.h"

//I2C 狀態(tài)定義
//MT 主方式傳輸 MR 主方式接受
#define START    0x08
#define RE_START   0x10
#define MT_SLA_ACK   0x18
#define MT_SLA_NOACK 0x20
#define MT_DATA_ACK   0x28
#define MT_DATA_NOACK 0x30
#define MR_SLA_ACK   0x40
#define MR_SLA_NOACK 0x48
#define MR_DATA_ACK   0x50
#define MR_DATA_NOACK 0x58

#define RD_DEVICE_ADDR 0xA1   //前4位器件固定,后三位看連線,最后1位是讀寫指令位
#define WD_DEVICE_ADDR 0xA0

//常用TWI操作(主模式寫和讀)
#define Start()    (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))   //啟動I2C
#define Stop()    (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))   //停止I2C
#define Wait()    {while(!(TWCR&(1<<TWINT)));}     //等待中斷發(fā)生
#define TestAck()   (TWSR&0xf8)          //觀察返回狀態(tài)
#define SetAck    (TWCR|=(1<<TWEA))        //做出ACK應(yīng)答
#define SetNoAck   (TWCR&=~(1<<TWEA))        //做出Not Ack應(yīng)答
#define Twi()    (TWCR=(1<<TWINT)|(1<<TWEN))        //啟動I2C
#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}   //寫數(shù)據(jù)到TWDR

unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress);
unsigned char I2C_Read(unsigned RegAddress);

/*********************************************
I2C總線寫一個字節(jié)
返回0:寫成功
返回1:寫失敗
**********************************************/
unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress)
{

   Start();       //I2C啟動
   Wait();
   if(TestAck()!=START)
   return 1;      //ACK
 
   Write8Bit(WD_DEVICE_ADDR); //寫I2C從器件地址和寫方式
   Wait();
   if(TestAck()!=MT_SLA_ACK)
   return 1;      //ACK
 
   Write8Bit(RegAddress);   //寫器件相應(yīng)寄存器地址
   Wait();
   if(TestAck()!=MT_DATA_ACK)
   return 1;        //ACK
 
   Write8Bit(Wdata);    //寫數(shù)據(jù)到器件相應(yīng)寄存器
   Wait();
   if(TestAck()!=MT_DATA_ACK)
   return 1;        //ACK
 
   Stop();        //I2C停止
    delay_nms(10);     //延時
   return 0;
}

/*********************************************
I2C總線讀一個字節(jié)
返回0:讀成功
返回1:讀失敗
**********************************************/

unsigned char I2C_Read(unsigned RegAddress)

{
    unsigned char temp;
    Start();//I2C啟動
    Wait();
    if (TestAck()!=START)
       return 1;       //ACK  
  
    Write8Bit(WD_DEVICE_ADDR); //寫I2C從器件地址和寫方式
    Wait();
    if (TestAck()!=MT_SLA_ACK)
       return 1;        //ACK
  
    Write8Bit(RegAddress);   //寫器件相應(yīng)寄存器地址
    Wait();
    if (TestAck()!=MT_DATA_ACK)
       return 1;
  
    Start();           //I2C重新啟動
    Wait();
    if (TestAck()!=RE_START)
       return 1;
  
    Write8Bit(RD_DEVICE_ADDR); //寫I2C從器件地址和讀方式
    Wait();
    if(TestAck()!=MR_SLA_ACK)
       return 1;       //ACK
  
    Twi();        //啟動主I2C讀方式
    Wait();
    if(TestAck()!=MR_DATA_NOACK)
    return 1;      //ACK
  
    temp=TWDR;//讀取I2C接收數(shù)據(jù)
       Stop();//I2C停止
    return temp;
      }

/*以上是IIC.h頭文件部分,需要對照技術(shù)文檔好好研究*/

*-----------------------------------------------------------------------
延時函數(shù)
編譯器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
目標(biāo)芯片 : M16
時鐘: 8.0000Mhz
作者:archeng504
-----------------------------------------------------------------------*/
#ifndef __delay_h
#define __delay_h
void delay_nus(unsigned int n);
void delay_nms(unsigned int n);
void delay_1us(void);
void delay_1ms(void) ;

void delay_1us(void)                 //1us延時函數(shù)
{
   asm("nop");
}

void delay_nus(unsigned int n)       //N us延時函數(shù)
{
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1us();
}

void delay_1ms(void)                 //1ms延時函數(shù)
{
   unsigned int i;
   for (i=0;i<1140;i++);
}

void delay_nms(unsigned int n)       //N ms延時函數(shù)
{
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
}

#endif
/*以上是delay.h部分,再加上IIC中自帶的iom16v.h 和macros.h就可以編譯通過*/

/*注意點:本程序在實驗板ATMEGA16上測試通過,在示波器把SCL,SDA信號線有數(shù)據(jù),移值到自己電路上可以放心使用,在ATMEGA32上一樣使用,本人24C02的A2,A1,A0都是接地,若地址不一樣,在程序相應(yīng)位置改一下就可以,串口上調(diào)試單片機(jī)的基礎(chǔ),所以它一定要會用*/

/*本程序調(diào)試軟件環(huán)境是ICC6.31*/

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 久久er精品 | 黄色片在线 | 亚洲精品一区二区三区四区高清 | 国产精品18久久久 | 国产91在线 | 亚洲 | 成人超碰 | 亚洲精品久久区二区三区蜜桃臀 | 午夜精品影院 | 欧美精品一区二区三区四区 | 日韩在线一区二区三区 | 欧美精品一区在线发布 | 免费 视频 1级 | 亚洲精选一区二区 | 久久精品久久精品久久精品 | 一级毛片大全免费播放 | 亚洲午夜小视频 | 精品视频亚洲 | 日本久久综合网 | av在线免费观看不卡 | 久久久久久国产 | 国产偷录叫床高潮录音 | 免费视频久久 | 国产精品一区二 | 在线观看成年人视频 | 日本五月婷婷 | 狠狠av| 中文字幕日韩专区 | 日韩精品专区在线影院重磅 | 成人av电影免费在线观看 | 天堂av在线影院 | 亚洲精品国产成人 | 国产精品日韩 | 91小视频在线 | 怡红院成人在线视频 | 精品久久久久久久久久久院品网 | 久久精品免费观看 | 在线不卡av | 成年无码av片在线 | 午夜成人在线视频 | 亚洲欧美在线视频 | 国产区在线免费观看 |