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

📄 smbus_m_t.c

📁 这是《C8051F系列单片机开发与C语言编程》 配套的源代码
💻 C
字号:
///////////主机发送调试程序////////////////
////////Smbus_M_T.c/////////////////////////////////
#include "smbus.h"
#define S_AD_R 0x6f
#define S_AD_W 0x6e
void config(){
//看门狗禁止
	WDTCN = 0x07;	
    WDTCN = 0xDE;   
   	WDTCN = 0xAD;
	SFRPAGE = 0x0F;
//交叉开关配置,SMBUS配置到P0.0和P0.1上
	XBR0 = 0x01;	
	XBR1 = 0x00;	
	XBR2 = 0x40;
 	XBR3 = 0x01;   
//管脚输出配置,P0口为开漏输出,其中P0.6接上拉电阻,P0为数字输入口
 	SFRPAGE = 0x0F;
 	P0MDOUT = 0x00; 
 	P1MDIN = 0xFF;  
//晶振配置,采用内部晶振8分频
	SFRPAGE = 0x0F;
 	CLKSEL = 0x00;  
	OSCXCN = 0x00;	
	OSCICN = 0x84;	
}
void main(){
	char i;
	config();
	smbus_cfg(0x40,0xf1,0x70);
	/*
	smbus使能,AA=0,SCL高电平和低电平超时禁止
	smbus时钟频率为100khz
	自身从机地址为0x70/2,即为56(十进制),且广播寻址禁止
	*/
	EA=1;//打开全局中断
	smbusMasterStart();//主机发送起始位
	while(1);//此句很重要,若无此句,main()函数执行完以上代码可能复位重新执行程序
	
}
/*
以下空中断的作用是使相应中断矢量空间保留,使keil c不将其空间用来存放程序代码。
若没有空中断定义,代码空间0x0003-0x003a地址存放程序代码,采用空中断后,这些地址
均编译成RETI指令,其好处是若程序受到干扰产生误中断能保证正常退出中断。
*/
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 smbusInt() interrupt 7{//smbus中断,此中断只考虑关键状态处理,以便调试
	SFRPAGE=0x00;//此句可省略,在此设断点观察寄存器变化
	if(SMB0STA==0x08){//起始位发送成功
		SMB0DAT=S_AD_W;//将地址和写控制装入发送缓冲区
		k=1;
		STA=0;//将STA清零,注意,若不清零则将一直为重发状态
	}
	if(SMB0STA==0x28||SMB0STA==0x18){//数据或地址发送成功处理
		if(k>=7)
			STO=1;//数据发送完毕,将STO置1,结束发送
		if(k==1)
			SMB0DAT=0x30;//发送第一个调试数据
		if(k==2)
			SMB0DAT=0x31;
		if(k==3)
			SMB0DAT=0x32;
		if(k==4)
			SMB0DAT=0x33;
		if(k==5)
			SMB0DAT=0x34;
		if(k==6)
			SMB0DAT=0x35;//一共发送6个数据
		k++;
	}
	if(SMB0STA==0x10){
	//若处于重发状态,则将从机地址和写控制重新发送,并将STA清零
			SMB0DAT=0x6e;
			STA=0;
	}
		SI=0;
}

⌨️ 快捷键说明

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