⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 twi.c

📁 ATMEL单片机的TWI接收和发送程序
💻 C
字号:
#include <iom88v.h>
#include <macros.h>
#pragma interrupt_handler twi_tov:25
void i2cbytewrite(unsigned int ,unsigned char );//写24C16
unsigned char i2cbyteread(unsigned int );//读24C16
void Cwrite_EEPROM(unsigned int ,unsigned char );
unsigned int addat(unsigned char );//读AD转换 第2路为压力
void disph(unsigned int);         //显示  
void dispra(unsigned char);
void delay1(unsigned int);        //延时
unsigned char temp=0,sw=0,sw1=0;
unsigned int addat2=0,addat1;
//extern signed char temeeprom;
extern signed int tem_press;
extern signed int rate_ser[4];
extern unsigned char TWI_AR;
signed char angle_temp(unsigned char);
void autotwi(void)
{
 unsigned char rdata;
 TWBR=0x14;          //波特率设置,须不小于10
 TWAR=(TWI_AR<<1);             //设置该机的地址
 TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);         //开TWI控制寄存器设置从机接收模式 基于中断
 delay1(400);
 if(sw==0)                                            //temp未被寻址标识
  {
    TWCR=0;                            //关闭TWI 跳出自动校正...
    return;
  }
  tem_press=angle_temp((addat(6)+rate_ser[2])/4);
 //tem_in=addat(7); //内温
  //tem_in*=5;
 //tem_in=angle_temp(addat(7)/4)+rate_ser[2];
 //tem_in=253-((tem_in*61)/100);
 Cwrite_EEPROM(20,tem_press);            //存储校正时的基准温度值
 TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);
 while(1)
 {
  WDR();
  }
 /*while((TWCR&0x80)==0){
 {
  WDR();
  temp++;
  if(temp>100)
  break;
 }*/
 //TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);          //TWI控制寄存器设置 从机接收
 //write(0x01,88);
 //rdata=read(0x01);
 //disph(rdata); 
}
void twi_tov(void)
{
 WDR();
 switch(TWSR)                    //TWI状态寄存器,该程序只工作于主机发送与接收模式
 {
  case 0x60:sw=0xff;disph(101);TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
  case 0x68:disph(102);TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;   
  case 0x70:disph(103);TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;   //被广播寻址,反回ACK
  case 0x78:disph(104);TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
  case 0x80:temp++;                //数据已接收,返回ACK
            if(temp==1)
			{
			 addat1=TWDR;
            }
			if(temp==2)
			 {
			  temp=0;
			  addat1=(addat1<<8)+TWDR;
			  
			  //dispra(tem_in);
			  addat2=addat(2);
			  disph(addat1);
			  addat1=addat1-addat2;
			  i2cbytewrite(addat2,addat1);
			  //i2cbytewrite(addat2-100,addat1>>8);//存高位
			  }
			TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE); 
			break;
  case 0x88:disph(106);TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
  case 0x90:disph(107);TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
  case 0x98:disph(108);TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
  case 0xa0:TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
  case 0xf8:break;
  //case 0x00:TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE)|(1<<TWSTO);break;
  /*case 0xa8://该行以下为发送 自已被寻址
            TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);
            break; 
  case 0xb0:TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
  case 0xb8:{
			TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE);
			}
			break;
  case 0xc0:TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE); break;
  case 0xc8:TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;*/
  default:disph(109);/*TWSR=0xf8;*/TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;//停止指令
 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -