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

📄 s_m.c

📁 很有用的CYGNAL C语言程序,
💻 C
字号:
#include<c8051f020.h>
void SYS_CLK(void);
void delay(long int);
void XBR_Config(void);
void SMBus_Config(void);
void TMR3(void);
void smbusMasterStart(void);
void senddata(unsigned char,unsigned char);
void setoff(void);

unsigned char k=0,dat1,dat2[7];
void int0() interrupt 0{
}
void int1() interrupt 1{
}
void int2() interrupt 2{
}
void int3() interrupt 3{
}
void int4() interrupt 4{
}
void int5() interrupt 5{
}
void int6() interrupt 6{
}
void SMBus_Int(void) interrupt 7
{	dat1=0x02;
/***********************************************此时SMBus0处于主发送方式
	if(SMB0STA==0x08){//起始位发送成功
		SMB0DAT=dat1;//将地址和写控制装入发送缓冲区
		STA=0;//将STA清零,注意,若不清零则将一直为重发状态
	}
	if(SMB0STA==0x28||SMB0STA==0x18){//数据或地址发送成功处理
		if(k>=7)
			STO=1;//数据发送完毕,将STO置1,结束发送
		if(k==1)
			SMB0DAT=0x01;//发送第一个调试数据
			senddata(1,1);
		if(k==2)
			SMB0DAT=0x02;
			senddata(2,2);
		if(k==3)
			SMB0DAT=0x03;
			senddata(3,3);
		if(k==4)
			SMB0DAT=0x04;
			senddata(4,4);
		if(k==5)
			SMB0DAT=0x05;
			senddata(5,5);
		if(k==6)
			SMB0DAT=0x06;//一共发送6个数据
			senddata(6,6);//并显示
	}
	if(SMB0STA==0x10){
	//若处于重发状态,则将从机地址和写控制重新发送,并将STA清零
			SMB0DAT=0x6e;
			STA=0;
	}
		SI=0;*/
/**************************************************此时SMBus0处于主接收方式*/
	dat1=0x02;
	if(SMB0STA==0x08){//起始位发送成功,将地址+读控制装入发送缓冲区
		SMB0DAT=dat1;
		k=0;
		STA=0;//将STA清零,否则将处于重发状态
	}
	if(SMB0STA==0x40){
//地址+读控制发送成功,此时SMB0DAT里的数据无意义,不作为接收数据,
		k=0;
		AA=1;
//要确保AA为1,因为接下去是主机发送ACK确认信号
	}
	if(SMB0STA==0x50){//数据成功接收,ACK成功发送
		if(k>=4)//共接收5个数据,所以在接收到第四个时将AA清零,注意第一个数据是从k=1时接收
			AA=0;
		dat2[k]=SMB0DAT;
	}
	if(SMB0STA==0x10){//重发状态的处理
			SMB0DAT=0x6f;
			STA=0;
	}
	if(SMB0STA==0x58){//最后一个数据接收成功,将STO置1,释放总线
			STO=1;
			dat2[k]=SMB0DAT;
			senddata(k,dat2[k]);
	}
	k++;
	SI=0;
}

void TMR3_Int(void) interrupt 14
{
	ENSMB=0;
	ENSMB=1;
	TMR3CN&=0x7f;
}

main()
{
	SYS_CLK();					/*系统时钟:外部振荡器12M*/
	XBR_Config();				/*交叉开关配置*/
	SMBus_Config();				/*SMBus初始化*/
	EA=1;						//允许所有中断
	EIE1|=0x02;					//ESMB0=1;允许SMBus0中断
	EIE2|=0x01;					//EX3=1;允许定时器3中断
	EIP2=0x01;					//PT3=1;TMR3优先级高
	setoff();
	smbusMasterStart();			//发送起始条件
	k=0;//将smbus数据索引指向0
	TMR3();						
	while(1);
}

void SYS_CLK(void)				
{
	unsigned char e;
	WDTCN=0xde;					//关 看 门 狗
	WDTCN=0xad;
	OSCXCN=0x67;				//使用外部晶振
	delay(10000);
    delay(10000);
	e=!OSCXCN&0x80;
	while(e); 
    OSCICN|=0x08;
}

⌨️ 快捷键说明

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