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

📄 icc_s.c

📁 通过atmega16接收到主设备的数据通过串口到PC上完成通讯
💻 C
字号:
/**************************************************************************
        文件名:icc_s.c
		功  能;半双工 同步 串行通讯 从机例程
		        采用中断/查询方式
		  MCU :Mega16L
		晶  振:内部8MHz
		硬  件:主机        从机
		        PC0(SCL)--- PC0(SCL)
				PC1(SDA)--- PC1(SDA)
		说  明:从机地址000 1000
		连 线:主机PORTD与LED相连
		运行说明:从机完成传输后,都会点亮LED,LED的亮暗与从机发送的数据相对应
		     将/*...*/注释部分的注释符去掉,将中断程序和主程序变为注释,
		     可以运行查询方式
		已通过实验验证! 
**************************************************************************/
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/delay.h>
#include <avr/wdt.h>
#include <compat/twi.h>

#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
 
#define slave 0x10

#define read   1
#define write  0

uchar k=0,j=0xf0,l,c=0x00;
uchar rbuf[100];

void Initial_IO(void)
{SREG&=0xEF;                      //关全局中断
 DDRC=0x00;
 PORTC=(1<<PC0)|(1<<PC1);
 DDRD=0xff;
 PORTD=0xff;
 /********看门狗设置*********/
 wdt_enable(WDTO_250MS);//看门狗定时器开启,定时时间1.0s
 /*******全局中断使能********/
 SREG=SREG|0x80;
}

//初始化TWI从机模式
void Initial_TWI_s(void)
{TWAR=slave|(1<<TWGCE);     //设置从机地址,使能广播应答
 TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);
 //清除TWI中断标志位,使能应答,使能TWI,使能TWI中断
 //TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);
}

int main(void)
{Initial_IO();
 Initial_TWI_s();
 while(1)
 {wdt_reset();
  _delay_ms(100);}
}
  
SIGNAL(SIG_2WIRE_SERIAL)
{uchar i,c;
 i=TW_STATUS;
 wdt_reset();
 switch(i)
 {case TW_SR_SLA_ACK:  //TW_STATUS=0x60,收到本机SLA+W,ACK已返回
                       //清TWINT,下一步接收数据,返回ACK
                       break;    
  case TW_SR_DATA_ACK: //TW_STATUS=0x80,以前SLA+W被寻址,收到数据,ACK已返回
                       //接收数据
                       c=TWDR;            
					   //清TWINT,下一步接收数据,返回ACK
                       break;                                                
  case TW_ST_SLA_ACK:  //TW_STATUS=0xa8,收到本机SLA+R,ACK已返回
                       //下一步发送数据,清TWINT,接收NACK或ACK
					   TWDR=++j; 
					   break;
  case TW_ST_DATA_ACK: //TW_STATUS=0xb8,发送数据,ACK已收到
                       //下一步发送数据,清TWINT,接收NACK或ACK
                       TWDR=j;            
					   break;
  case TW_ST_DATA_NACK://TW_STATUS=0xc0,发送数据,NACK已收到
                       //清TWINT,下一步接收停止或重新发送信号
					   break;
  case TW_SR_STOP:     //TW_STATUS=0xA0,清TWINT,收到STOP或RESTART 
                       break;           
  default:             break;      
 }
  TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);
  while(1)
 {PORTD=j;
  wdt_reset();
  _delay_ms(100);
  SREG=SREG|0x80;
 }
}
/*
int main(void)
{uchar i;
 Initial_IO();
 Initial_TWI_s();
 while(1)
 {wdt_reset();
  while(!(TWCR&(1<<TWINT)));
  i=TW_STATUS;
  switch(i)
  {case TW_SR_SLA_ACK: //TW_STATUS=0x60,收到本机SLA+W,ACK已返回
                       //清TWINT,下一步接收数据,返回ACK
					   break;    
   case TW_SR_DATA_ACK: //TW_STATUS=0x80,以前SLA+W被寻址,收到数据,ACK已返回
                       //接收数据
                       c=TWDR;            
					   //清TWINT,下一步接收数据,返回ACK
                       break;                                                
   case TW_ST_SLA_ACK: //TW_STATUS=0xa8,收到本机SLA+R,ACK已返回
                       //下一步发送数据,清TWINT,接收NACK或ACK
					   TWDR=j; 
					   break;
   case TW_ST_DATA_ACK: //TW_STATUS=0xb8,发送数据,ACK已收到
                       //下一步发送数据,清TWINT,接收NACK或ACK
                       TWDR=j;            
					   break;
   case TW_ST_DATA_NACK://TW_STATUS=0xc0,发送数据,NACK已收到
                       //清TWINT,下一步停止发送
					   break;
   case TW_SR_STOP:     //TW_STATUS=0xA0,清TWINT,收到STOP或RESTART 
                       break;           
   default:            break;      
  }
 TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);
 PORTD=c;
 _delay_ms(100);
 }
}*/

⌨️ 快捷键说明

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