📄 icc_s.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 + -