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

📄 i2c.#3

📁 采用CYGNAL F015单片机
💻 #3
字号:

#include <c8051f015.h> 
// SFR声明 //-------------------------------------------------------------------- 
// 全局常量 
//--------------------------------------------------------------------
 #define WRITE 0x00 // SMBus 写命令 
#define READ 0x01 // SMBus 读命令 
// 器件地址7位最低位没使用 
#define CHIP_A 0x16 // 芯片A的器件地址 
// SMBus状态 
// MT = 主发送器 
// MR = 主接收器 
#define SMB_BUS_ERROR 0x00 // 对所有方式总线错误 
#define SMB_START 0x08 // (MT & MR)起始条件已发送 
#define SMB_RP_START 0x10 // (MT & MR)重复起始条件 
#define SMB_MTADDACK 0x18 // (MT) 从地址 + W 已发送收到ACK 
#define SMB_MTADDNACK 0x20 // (MT) 从地址 + W 已发送收到NACK 
#define SMB_MTDBACK 0x28 // (MT) 数据字节已发送收到ACK 
#define SMB_MTDBNACK 0x30 // (MT) 数据字节已发送收到NACK 
#define SMB_MTARBLOST 0x38 // (MT) 竞争失败 
#define SMB_MRADDACK 0x40 // (MR) 从地址 + R 已发送收到ACK 
#define SMB_MRADDNACK 0x48 // (MR) 从地址 + W 已发送收到NACK 
#define SMB_MRDBACK 0x50 // (MR) 收到数据字节ACK已发送 
#define SMB_MRDBNACK 0x58 // (MR) 收到数据字节NACK已发送 
#define TC_100ms	16000							// approx number of counts of 1.9MHz/12
#define MAXLEN 10;

#define OSCEN  0//0为使用外部晶振,1 为使用内部晶振

//DA
#define DAH         0x00     //DA TIMER0 high data
#define DAL         0x00     //DA TIMER0 low data

//串口
#define	BAUDRATE	115200						// User-definable SW_UART baud rate
#if OSCEN
#define	SYSCLK		16000000					// System clock derived from 18.432MHz XTL
#else
#define	SYSCLK		24000000					// System clock derived from 18.432MHz XTL
#endif
#define RBUFSIZE    50       //定义串口缓冲区大小
#define SBUFSIZE    30       //定义串口缓冲区大小
#define ADDRESS    0       //定义串口缓冲区大小

//串口指令数据

#define CHARGE   'F'
#define UNCHARGE  'C'   //WorkState(F:充电,C:放电,E:无操作,N:无电池) 
#define NOPERATION  'E'
#define NOBAT  'N'

#define CONNECT  'A'   //A:连接
#define NHDATA   'B'   //C:无自主操作数据,应答
#define EHDATA    'D'    //'D':有自主操作数据,应答
#define ACONTROL    'F'// 'F'传送动作控制代码
#define LSAMPLE  'S'   //'S':采样数据
#define LCONTROL 'L'   //'L':通道控制
#define GREPLY 'G'     //'G':通用应答
#define HDATA  'H'     //'H': 历史操作数据
#define ROMREAD 'R'    //'R':读,
#define ROMWRITE 'W'  //'W':写
//-------------------------------------------------------------------- 
//全局变量 
//-------------------------------------------------------------------- 
struct Bat_Record  // flash 中历史数据结构
  {
    struct Bat_Record *next;  
    unsigned char action;   
    unsigned int voltage;
    unsigned int current;
    unsigned int volume;
  };

struct Run_Step  //工步执行格式
 {
    //struct Bat_Record *next; //下一条记录指针
    //struct Bat_Record *jmpnext; //下一条跳转到的记录指针
    //unsigned char jmptimes;	 //跳转下一条记录次数,为0时直接执行下一个连续地址   
    unsigned char action;	    
    unsigned int ref_exe;	    
    unsigned int ref_stp;	       
 };


char COMMAND; // 在SMBus中断服务程序中用于 
// 保存从地址 + R/W 位 
char WORD; // 保持SMBus要发送的数据字节 
// 或刚收到的数据 
char BYTE_NUMBER; // 在中用于检查发送的是什么数据 
// 高地址字节低地址字节或数据字节 
char RBYTE_NUMBER; // 用于检测数据是否读取完毕
unsigned char LOW_ADD; // EEPROM存储器地址的高低字节 
unsigned char RECVLEN; 
bit SM_BUSY; // 该位在发送或接收开始时被置1 
bit Flash_Data;//表示FLASH区有否历史数据
bit Action_Control;//1表示进行动作,0表示停止
bit S_SMBUS;//1表示进行动作,0表示停止

// 操作结束后由中断服务程序清0 
//sbit LED=P1^6;
unsigned char DAHIGH;
unsigned char DALOW;

sbit MODECON = P2^0; //充放电模式控制(0为放电,1为充电)
sbit CH =P1^1;  //接电池CH,一般应为高电平
sbit RT =P1^0;  //接电池RT,一般应为底电平

char RECVCHARS[10];
unsigned char STEP;//0表示还未写地址,1表示地址已写,2表示读到第一个字节,3表示读到第一个字节。。。

unsigned int DataSended;//串口已发送次数
xdata  unsigned char RData[RBUFSIZE]_at_ 0x100;                //串口接收数据缓冲区定义为30字节
idata unsigned char SData[SBUFSIZE]  _at_ 0x50; 
unsigned char Pos;   //定义当前指向的缓冲区位置(结束位置)
unsigned char Head;   //定义当前指向的缓冲区位置(起始位置)
unsigned char DataNo;   //定义当前指向的缓冲区剩下数据个数
xdata struct Run_Step RunStep[50] _at_ 0x200;
unsigned char RStepNo;
unsigned char TStepNo;

unsigned char TestVar;
unsigned char TestVar1;
unsigned char TestVar2;
unsigned char TestVar3;
unsigned char TestVar4;
unsigned char TestVar5;
unsigned char TestVar6;
unsigned char RECVTIMES;

unsigned char Edition=49;
unsigned char WorkType='C';

//下面是不断从电池智能芯片中取得值
unsigned int RfrhTms;
unsigned int Current;
unsigned int Voltage;
unsigned int VolumeRatio;
unsigned int TimeRemain;
// <CurrentLow>+<CurrentHigh>(2)+<VoltageLow>+<VoltageHigh>(2) 
	//  + VolumeRatio(2) + TimeRemain(2)]
//-------------------------------------------------------------------- 
// 函数原型 
//-------------------------------------------------------------------- 
void SMBus_ISR (void); 
void SM_Send (char chip_select, unsigned int byte_address, char out_byte); 
void SM_Receive (char chip_select, unsigned char byte_address,unsigned char byte_length); 
void RBuf (void) ;
void DAC_Init(void);
void Timer0_ISR (void);
void Timer2_ISR (void);
void Timer3_ISR (void);

void Sys_Init(void);
void Var_Init(void);
unsigned char OutCheckSum(void);
unsigned char RBufJudge();
unsigned char DoWithCommand(void);
void delay(int time);
//-----------------------------------------------------------------------------
void ReadFlash(void);
void WriteFlash(void);

⌨️ 快捷键说明

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