C8051F040的SMBus程序5
- 格式:pdf
- 大小:95.55 KB
- 文档页数:10
用了半个月才调通的,希望大家收藏,下载,交流//SMBus.c文件/*************************************************************//* 例程是新华龙官网的原来用的是A T24C256现在用A T24C08 *//* 地址原来用高位和地位现在把它改成只是一个读写地址*//*************************************************************/#define INT_ISR_C#include <c8051f310.h>#include <intrins.h>#include "smbus.h"#include "uart0.h"#include "delay.h"unsigned char i=0; // Used by the ISR to count theunsigned char temp;/************************************************************//* STA:SMBus 起始标志ARBLOST :SMBus 竞争失败标志/* STO :SMBus 停止标志ACK :SMBus 确认标志/* ACKRQ :SMBus 确认请求SI :SMBus 中断标志/***********************************************************/void I2C_Init(void){TMOD |= 0x02; //自动重装载的8 位计数器/定时器CKCON |= 0x04; //定时器0 使用系统时钟TH0 = 0xEC; //400k/s 400kHZEIE1 = 0x01; //Enable SMBus interrupt 允许SMB0 的中断请求SMB0CF |= 0xD0; //Enable SMBus and 允许SDA建立和保持时间扩展禁止从方式SMB0CN |= 0x80; //SMBus 工作在主方式TR0 = 1; //Enable timer1}void Timer3_Init(void){TMR3RLL = 0x9F; //Timer3 will overflow at 25msTMR3RLH = 0x38;EIE1 |= 0x80; //Enable timer3 interrupt 允许TF3L 或TF3H 标志的中断请求TMR3CN = 0x04; //使能定时器3}//------------------------------------------------------------------------------------// Timer3 Interrupt Service Routine (ISR)//------------------------------------------------------------------------------------//// A Timer3 interrupt indicates an SMBus SCL low timeout.// The SMBus is disabled and re-enabled here//void Timer3_ISR (void) interrupt 14{SMB0CF &= ~0x80; // 禁止SMBusSMB0CF |= 0x80; // 重新启动SMBusTMR3CN &= ~0x80; // 中断标志清零}//------------------------------------------------------------------------------------// SMBus Interrupt Service Routine (ISR) SMB0DA T存放地址的//------------------------------------------------------------------------------------//// SMBus ISR state machine// - Master only implementation - no slave or arbitration states defined// - All incoming data is written starting at the global pointer <pSMB_DA TA_IN>// - All outgoing data is read from the global pointer <pSMB_DA TA_OUT>//void SMBus_ISR (void) interrupt 7{bit FAIL = 0; // Used by the ISR to flag failed// transfers// number of data bytes sent or// receivedstatic bit SEND_START = 0; // Send a startswitch (SMB0CN & 0xF0) // Status vector 高四位&上不变低四位都为零{// Master Transmitter/Receiver: START condition transmitted.case SMB_MTSTA://【送器件地址】//开始传送case 是0xE0 SMB0DA T = (TARGET|SMB_RW); // Load address of the target slave//0XA1// SMB0DA T |= SMB_RW // Load R/W bitSTA = 0; // Manually clear START bit STA:SMBus 起始标志i = 0;// reset data byte counterbreak;/*为什么一开始第一步EEPROM_ByteRead()就要返回值?结果到最后temp里有值却不返回*//*按照每个地址存一个一不应该下下移啊找的原因了*/// Master Transmitter: Data byte (or Slave Address) transmittedcase SMB_MTDB://case 是0xC0 // (MT) 数据字节传送SMB0CN :SMBus 控制寄存器if (ACK) /*时序上是低电平这个也可能是原因*/// Slave Address or Data Byte 接收到“确认”{ // Acknowledged?if (SEND_START) //{ /*按照时序应答之后开始根据程序的话会先进入判断之后再开始*/STA = 1; //SMBus开始SEND_START = 0;break;}if(SMB_SENDWORDADDR) // Are we sending the w ord address? 高八位{SMB_SENDWORDADDR = 0; // Clear flag 高八标志位SMB0DA T = WORD_ADDR; /*因为是A T24C08这只送一位地址*///【送高位地址】end word's high 8bits addressif (SMB_RANDOMREAD){SEND_START = 1; // send a START after the next ACK cycleSMB_RW = READ;}break;}// else if(SMB_SENDWORDADDR1) // Are we sending the word address? 低八位// {// SMB_SENDWORDADDR1 = 0; // Clear flag// SMB0DA T = WORD_ADDR1;//【送低位地址】send word's low 8bits address // /*一下注销部分移到上面因为只传一位地址*///// if (SMB_RANDOMREAD)//// {//// SEND_START = 1; // send a START after the next ACK cycle//// SMB_RW = READ;//// }//// break;// }if (SMB_RW==WRITE) // Is this transfer a WRITE?{if (i < SMB_DA TA_LEN) // Is there data to send? SMB_DA TA_LEN = 1;{ //【写数据】SMB0DA T = *pSMB_DA TA_OUT; // send data byte *pSMB_DA TA_OUT是指针指的是地址pSMB_DA TA_OUT++; // increment data out pointer数据++是加地址指向例如从0x00>>0x01i++;}else{STO = 1; // set STO to terminte transfer 传送接收SMBUS_WRITE_FLAG=1; //加标志位i = 0; //i 清零}}else {} // If this transfer is a READ,// then take no action. Slave// address was transmitted. A// separate 'case' is defined// for data byte recieved.}else // If slave NACK,{if(SMB_ACKPOLL){STA = 1; // Restart transfer}else{FAIL = 1; // Indicate failed transfer} // and handle at end of ISR}break;// Master Receiver: byte receivedcase SMB_MRDB: //0x80 //(MR) 数据字节接收P0:端口0 寄存器if(ACK){if(SMB_RW==READ){i++;temp = SMB0DA T;if (i == SMB_DA TA_LEN) // This is the last byte{ACK = 0; // Send NACK to indicate last byteSMBUS_RECV_FLAG=1; // of this transferSTO = 1;i = 0; // Send STOP to terminate transfer}}}break;default: //所以的case事件都不成立的执行的事件FAIL = 1; // Indicate failed transfer// and handle at end of ISRbreak;}if (FAIL) // If the transfer failed,{SMB0CN &= ~0x40; // Reset communicationSMB0CN |= 0x40; //先清零再发送模式}SI=0; // clear interrupt flag 清中断}//------------------------------------------------------------------------------------// Functions//------------------------------------------------------------------------------------//------------------------------------------------------------------------------------// EEPROM_ByteWrite ()//------------------------------------------------------------------------------------//// This function writes the value in <dat> to location <addr> in the EEPROM then// polls the EEPROM until the write is complete./*addr原为int型unsigned int addr 现改成unsigned char addr */void EEPROM_ByteWrite( unsigned char addr, unsigned char dat ) //地址数据{// Set SMBus ISR parametersTARGET = EEPROM_ADDR; // Set target slave addressSMB_RW = WRITE; // Mark next transfer as a writeSMB_SENDWORDADDR = 1; // Send high 8bits Word Address after Slave Address// SMB_SENDWORDADDR1 = 1; /*原来为256两位地址现注销掉*/ Send low 8bits Word Address after Slave AddressSMB_RANDOMREAD = 0; // Do not send a START signal after// the word addressSMB_ACKPOLL = 1; // Enable Acknowledge Polling (The ISR// will automatically restart the// transfer if the slave does not// acknoledge its address.// Specify the Outgoing DataWORD_ADDR = addr; /*A T24C08 一位地址修改*/// WORD_ADDR = addr/256; /*原来为256两位地址现注销掉*/Set the target address in the// EEPROM's internal memory space// WORD_ADDR1 = addr%256; /*原来为256两位地址现注销掉*/Set the target address in the// EEPROM's internal memory spaceSMB_SINGLEBYTE_OUT = dat; // store dat (local variable) in a global// variable so the ISR can read it after// this function exitspSMB_DA TA_OUT = &SMB_SINGLEBYTE_OUT; // The outgoing data pointer points toSMB_DA TA_LEN = 1; // Specify to ISR that the next transfer// will contain one data byte// Initiate SMBus TransferSTA = 1;}//------------------------------------------------------------------------------------// EEPROM_ByteRead ()//------------------------------------------------------------------------------------//// This function returns a single byte from location <addr> in the EEPROM then// polls the <SMB_BUSY> flag until the read is complete.//unsigned char EEPROM_ByteRead( unsigned char addr) //读的时候只能读一个字节,其他的是没有存,存不住的{ //即使放到了temp_char[8]中,但是在上电时就会失去了// Set SMBus ISR parametersTARGET = EEPROM_ADDR; // Set target slave addressSMB_RW = WRITE; // A random read starts as a write// then changes to a read after// the repeated start is sent. The// ISR handles this switchover if// the <SMB_RANDOMREAD> bit is set.SMB_SENDWORDADDR = 1; // Send high 8bits Word Address after Slave Address// SMB_SENDWORDADDR1 = 1;/*原为256两位地址现注销掉*/ // Send low 8bits Word Address after Slave AddressSMB_RANDOMREAD = 1; //SMB_RW = READ; // Send a START after the w ord addressSMB_ACKPOLL = 1; // Enable Acknowledge Polling// Specify the Incoming DataWORD_ADDR = addr; /*A T24C08 一位地址修改*/// WORD_ADDR = addr/256;/*原来为256两位地址现注销掉*/Set the target address in the// EEPROM's internal memory space// WORD_ADDR1 = addr%256;/*原来为256两位地址现注销掉*/Set the target address in the// EEPROM's internal memory spaceSMB_DA TA_LEN = 1; // Specify to ISR that the next transfer// will contain one data byte// Initiate SMBus TransferSTA = 1;while(SMBUS_RECV_FLAG==0); /*原两句注销到了,所以每次STA = 1之后就开始返回*/SMBUS_RECV_FLAG=0; /*加上之后是等STO = 1也就是结束之后再返回这个值*///有return retval 就相当于A=retval return temp;}//SMBus.h文件///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////extern void I2C_Init(void);extern void Timer3_Init(void);extern unsigned char temp_char[12];extern bit SMBUS_RECV_FLAG;extern bit SMBUS_WRITE_FLAG;sfr16 DP = 0x82;sfr16 ADC0 = 0xbd;sfr16 ADC0GT = 0xc3;sfr16 ADC0LT = 0xc5;sfr16 RCAP2 = 0xeb;sfr16 TMR2 = 0xcc;sfr16 TMR3 = 0x94;#ifdef INT_ISR_C#define WRITE 0x00 // SMBus WRITE command#define READ 0x01 // SMBus READ command// Device addresses (7 bits, lsb is a don't care)#define Write_EE_Addr 0xA0 //器件写地址+写命令#define Read_EE_Addr 0xa1 //器件写地址+读命令#define EEPROM_ADDR 0xA0 // 铁电存储器的地址// Note: This address is specified// in the Microchip 24C256// datasheet.// SMBus Buffer Size#define SMB_BUFF_SIZE 0x08//接收和发送的长度可以改吗?// Defines the maximum number of bytes//应该是没用上这个声明// that can be sent or received in a// single transfer// Status vector - top 4 bits only#define SMB_MTSTA0xE0 // (MT) 开始传送ACC:累加器#define SMB_MTDB 0xC0 // (MT) 数据字节传送SMB0CN :SMBus 控制寄存器#define SMB_MRDB 0x80 // (MR) 数据字节接收P0:端口0 寄存器// End status vector definition//------------------------------------------------------------------------------------// Global V ARIABLES//------------------------------------------------------------------------------------unsigned char* pSMB_DA TA_IN; // Global pointer for SMBus data// All receive data is written hereunsigned char SMB_SINGLEBYTE_OUT; // Global holder for single byte writes.unsigned char* pSMB_DA TA_OUT; // Global pointer for SMBus data.// All transmit data is read from hereunsigned char SMB_DA TA_LEN; // Global holder for number of bytes// to send or receive in the current// SMBus transfer.unsigned char WORD_ADDR; // Global holder for the EEPROM word// high 8bits address that will be accessed in// the next transferunsigned char WORD_ADDR1; // Global holder for the EEPROM word// low 8bits address that will be accessed in// the next transferunsigned char TARGET; // Target SMBus slave address// EEPROM_ByteRead() or// EEPROM_ByteWrite()// functions have claimed the SMBusbit SMB_RW; // Software flag to indicate the// direction of the current transferbit SMB_SENDWORDADDR; // When set, this flag causes the ISR// to send the high 8-bit <WORD_ADDR>// after sending the slave address.bit SMB_SENDWORDADDR1; // When set, this flag causes the ISR// to send the low 8-bit <WORD_ADDR>// after sending the slave address.bit SMB_RANDOMREAD; // When set, this flag causes the ISR// to send a START signal after sending// the word address.bit SMB_ACKPOLL; // When set, this flag causes the ISR// to send a repeated START until the// slave has acknowledged its address#endifvoid EEPROM_ByteWrite(unsigned char addr, unsigned char dat); /*A T24C08一位地址修改成char原int型*/unsigned char EEPROM_ByteRead(unsigned char addr); /*A T24C08一位地址修改成char原int型*/void Port_IO_Init(void);void Oscillator_Init(void);void UART_Init(void);void UART_Isr(void);void I2C_Init(void);void Timer3_Init(void);void Timer3_ISR (void);void SMBus_ISR (void);。
附录一://内部温度传感器调试程序////利用过采样实现16位精度////ADC0_TEMP_PRO.c#include <C8051F040.h>#define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage#define STACK_LEN 128//采样128次,再将128个数据总和除以8//处理后的数据相当于16个原始数据之和,在数值表现形式上为16bittypedef unsigned int uint;typedef unsigned char uchar;typedef unsigned long ulong;sfr16 RCAP2=0xca;sfr16 RCAP3=0xca;sfr16 RCAP4=0xca;sfr16 TMR4=0xcc;sfr16 TMR3=0xcc;sfr16 TMR2=0xcc;sfr16 PCA0CP0=0xfb;sfr16 PCA0CP1=0xfd;sfr16 PCA0CP2=0xe9;sfr16 PCA0CP3=0xeb;sfr16 PCA0CP4=0xed;sfr16 PCA0CP5=0xe1;sfr16 ADC0V AL=0xbe;sfr16 ADC0GT=0xc4;sfr16 ADC0LT=0xc6;uchar temppage;bit isnewdata;uint kk;float temp;uchar stack_index;ulong total;xdata float t[20];//存放温度检测数据,为20个数据xdata uint mystack[STACK_LEN];//过采样数据数组void adc0_mux(uchar type,uchar source);void adc0_source(uchar source);void p3anolog_ini(uchar port);void HVDA_ini(uchar gaind);void adc0_ini();void delay1ms(uint time);void config();void adc0_mux(uchar type,uchar source){//type 配置测量方式为差动还是单端输入//source 为ADC0通道选择(共有9个通道)SFRPAGE=0x00;AMX0CF=type;AMX0SL=source;}void adc0_source(uchar source){//ADC0通道选择,为adc0_mux()的简化函数SFRPAGE=0x00;AMX0SL=source;}void p3anolog_ini(uchar port){//配置p3口模拟输入管脚SFRPAGE=0x00;AMX0PRT=port;SFRPAGE=0x0f;P3MDIN&=~port;//将相应管脚配置成模拟输入口}void HVDA_ini(uchar gaind){//高压差动放大器配置SFRPAGE=0x00;HV A0CN=gaind;}void adc0_ini(){SFRPAGE=0x00;ADC0CF=0x80;//ADC0时钟为系统时钟17分频,PGA增益为1ADC0CN=0x80;/*AD0EN=1,ADC0模块使能AD0TM=0,ADC0为连续跟踪模式AD0CM1:AD0CM0=00b,为AD0BUSY启动方式AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高四位*/REF0CN&=0x0f;//AD0VRS=0,ADC0参考电压为VREFAREF0CN|=0x07;//TEMPE=1,内部温度传感器工作/*BIASE=1,偏移产生器工作REFBE=1,内部参考电平工作,电路部分须将VREF参考输出(C8051F40的第12管脚)与VREF0(C8051F040的16管脚相连,并最好并联一个4.7uF和0.1uF的旁路电容以电平滤波*/adc0_source(9);//选择第9通道,即选择温度信号为AD转换EIE2 |= 0x02; //开ADC0中断}void delay1ms(uint time){//延迟1msuint i;uint j;for (i=0;i<time;i++){for(j=0;j<300;j++);}}void config(){//crossbar 使能,但并没有进行外围设备配置WDTCN = 0x07; // Watchdog Timer Control RegisterWDTCN = 0xDE; // Disable WDTWDTCN = 0xAD;SFRPAGE = 0x0F;XBR0 = 0x00; // XBAR0: Initial Reset V alueXBR1 = 0x00; // XBAR1: Initial Reset V alueXBR2 = 0x40; // crossbar使能与否并不影响此程序运行XBR3 = 0x00; // XBAR3: Initial Reset V alueSFRPAGE = 0x0F;P0MDOUT = 0x00; // Output configuration for P0P1MDOUT = 0x00; // Output configuration for P1P2MDOUT = 0x00; // Output configuration for P2P3MDOUT = 0x00; // Output configuration for P3P4MDOUT = 0x00; // Output configuration for P4P5MDOUT = 0x00; // Output configuration for P5P6MDOUT = 0x00; // Output configuration for P6P7MDOUT = 0x00; // Output configuration for P7P1MDIN = 0xFF; // Input configuration for P1P2MDIN = 0xFF; // Input configuration for P2P3MDIN = 0xFF; // Input configuration for P3SFRPAGE = 0x0F;CLKSEL = 0x00; // Oscillator Clock SelectorOSCXCN = 0x00; // EXTERNAL Oscillator Control Register OSCICN = 0x84; // Internal Oscillator Control Register}void main(){char i;config();adc0_ini();//ADC0初始化ADC0START;//ADC0启动EA=1;i=0;stack_index=0;while(1){if(isnewdata){//由该位查询ADC0转化值是否更新if(stack_index==STACK_LEN)for(i=0,total=0;i<STACK_LEN;i++)total+=stack[i];total/=8;//此时total的值即为16bit精度采样值temp=(float)total/65536.0;temp*=2.43;temp-=0.776;temp/=0.00286;//将测量值转化成真实温度值isnewdata=0;t[i]=temp;//将温度检测值存入长度为20的数组中i++;if(i>19)i=0;//在此设断点,观察程序运行结果delay1ms(100);ADC0START;}}}void ADC0_ISR() interrupt 15{//ADC0中断SFRPAGE=0x00;AD0INT=0;isnewdata=1;if(stack_index>=STACK_LEN)//STACK_LEN需小于等于256,否则stack_index要定义成uint型数据stack_index=0;stack[stack_index]=ADC0V AL;stack_index++;}。
C8051F020单片机初始化程序和编译步骤2011-02-15 12:20:06| 分类:默认分类| 标签:|字号大中小订阅C8051F020编程步骤一、编程步骤:1、看门狗设置2、系统初始化3、端口初始化4、对应功能初始化(如:串口,定时器,I2C,SPI,PCA,DAC/ADC,中断等等)5、功能函数或中断函数(如需要)6、包含的头文件7、项目说明二、对应功能初始化要点:1、Uart:(1)串口工作模式由SCON设定(2)定时器工作方式设定TMOD (3)波特率TH 载入值设定(4)启动TR1 (5)时钟基准CKCON (6)波特率加倍设定PCON(7)开中断使能TI2、Time:(1)工作方式设定TMOD (2)定时器时钟基准CKCON (3)启动/停止TCON设定TRn3、Interrupt:(1)中断允许IE (2)触发方式设定(上下沿,电平)(3)对应控制位允许设定,如ES串口允许C8051F020单片机初始化程序; $INCLUDE (C8051F020.inc) /C8051F020单片机功能强大,初始化也比较繁杂,为了便于初始化各功能模块,我们编了此程序可看着“说明”初始化。
ORG SYS_INIT;※▲◆●◎★☆△;◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆;■-- <1> --电源管理; PCON ; POWER CONTROL;■-- <2> --系统时钟和振荡器; OSCXCN ; EXTERNAL OSCILLA TOR CONTROL; OSCICN ; INTERNAL OSCILLA TOR CONTROL;■-- <3> --复位及看门狗管理; RSTSRC ; RESET SOURCE; WDTCN ; W A TCHDOG TIMER CONTROL;■-- <4> --FLASH存储器编程和安全管理; FLSCL ; FLASH MEMORY TIMING PRESCALER; PSCTL ; PROGRAM STORE R/W CONTROL; FLACL ; FLASH ACESS LIMIT;■-- <5> --中断控制; IE ; INTERRUPT ENABLE; EIE1 ; EXTERNAL INTERRUPT ENABLE 1; EIE2 ; EXTERNAL INTERRUPT ENABLE 2; IP ; INTERRUPT PRIORITY; EIP1 ; EXTERNAL INTERRUPT PRIORITY REGISTER 1; EIP2 ; EXTERNAL INTERRUPT PRIORITY REGISTER 2; P3IF ; PORT 3 EXTERNAL INTERRUPT FLAGS;■-- <6> --端口IO初始化及交叉开关设置; XBR0 ; DIGITAL CROSSBAR CONFIGURA TION REGISTER 0; XBR1 ; DIGITAL CROSSBAR CONFIGURA TION REGISTER 1; XBR2 ; DIGITAL CROSSBAR CONFIGURA TION REGISTER 2; P0MDOUT ; PORT 0 OUTPUT MODE CONFIGURA TION; P1MDOUT ; PORT 1 OUTPUT MODE CONFIGURA TION; P2MDOUT ; PORT 2 OUTPUT MODE CONFIGURA TION; P3MDOUT ; PORT 3 OUTPUT MODE CONFIGURA TION; P74OUT ; PORTS 4 - 7 OUTPUT MODE;■-- <7> --外部RAM和片内XRAM; EMI0CN ; EXTERNAL MEMORY INTERFACE CONTROL; EMI0CF ; EXTERNAL MEMORY INTERFACE (EMIF) CONFIGURA TION ; EMI0TC ; EXTERNAL MEMORY;■-- <8> --定时器设置; TMOD ; TIMER MODE; TCON ; TIMER CONTROL; T2CON ; TIMER 2 CONTROL; T4CON ; TIMER 4 CONTROL; TMR3CN ; TIMER 3 CONTROL; TMR3RLL ; TIMER 3 RELOAD REGISTER - LOW BYTE; TMR3RLH ; TIMER 3 RELOAD REGISTER - HIGH BYTE; TMR3L ; TIMER 3 - LOW BYTE; TMR3H ; TIMER 3 - HIGH BYTE;■-- <9> --串行通讯; SCON0 ; SERIAL PORT 0 CONTROL; SCON1 ; SERIAL PORT 1 CONTROL; SBUF1 ; SERAIL PORT 1 DA TA; SADDR1 ; SERAIL PORT 1; PCON ; POWER CONTROL; RCAP2L ; TIMER 2 CAPTURE REGISTER - LOW BYTE; RCAP2H ; TIMER 2 CAPTURE REGISTER - HIGH BYTE; RCAP4L ; TIMER 4 CAPTURE REGISTER - LOW BYTE; RCAP4H ; TIMER 4 CAPTURE REGISTER - HIGH BYTE; SADDR0 ; SERIAL PORT 0 SLA VE ADDRESS;■-- <10> --可编程计数器阵列; PCA0CN ; PCA 0 COUNTER CONTROL; PCA0MD ; PCA 0 COUNTER MODE; PCA0CPM0 ; CONTROL REGISTER FOR PCA 0 MODULE 0; PCA0CPM1 ; CONTROL REGISTER FOR PCA 0 MODULE 1; PCA0CPM2 ; CONTROL REGISTER FOR PCA 0 MODULE 2; PCA0CPM3 ; CONTROL REGISTER FOR PCA 0 MODULE 3; PCA0CPM4 ; CONTROL REGISTER FOR PCA 0 MODULE 4;■-- <11> --SMBus通讯; SMB0CN ; SMBUS 0 CONTROL; SMB0CR ; SMBUS 0 CLOCK RA TE; SMB0STA; SMBUS 0 STA TUS; SMB0DA T ; SMBUS 0 DA TA; SMB0ADR ; SMBUS 0 SLA VE ADDRESS;■-- <12> --SPI总线通讯; SPI0CKR ; SERIAL PERIPHERAL INTERFACE 0 CLOCK RA TE CONTROL ; SPI0DA T ; SERIAL PERIPHERAL INTERFACE 0 DA TA; SPI0CFG ; SERIAL PERIPHERAL INTERFACE 0 CONFIGURA TION; SPI0CN ; SERIAL PERIPHERAL INTERFACE 0 CONTROL;-- <13> --ADC转换; AMX0CF ; ADC 0 MUX CONFIGURA TION; AMX0SL ; ADC 0 MUX CHANNEL SELECTION; ADC0CF ; ADC 0 CONFIGURA TION; ADC0CN ; ADC 0 CONTROL; ADC0L ; ADC 0 DA TA - LOW BYTE; ADC0H ; ADC 0 DA TA - HIGH BYTE; ADC1CF ; ADC 1 ANALOG MUX CONFIGURA TION; AMX1SL ; ADC 1 ANALOG MUX CHANNEL SELECT; ADC1CN ; ADC 1 CONTROL; ADC0GTL ; ADC 0 GREA TER-THAN REGISTER - LOW BYTE; ADC0GTH ; ADC 0 GREA TER-THAN REGISTER - HIGH BYTE; ADC0LTL ; ADC 0 LESS-THAN REGISTER - LOW BYTE; ADC0LTH ; ADC 0 LESS-THAN REGISTER - HIGH BYTE; REF0CN ; VOLTAGE REFERENCE 0 CONTROL; ADC1 ; ADC 1 DA TA;■-- <14> --DAC转换; PCA0L ; PCA 0 TIMER - LOW BYTE; PCA0H ; PCA 0 TIMER - HIGH BYTE; DAC0CN ; DAC 0 CONTROL; DAC1L ; DAC 1 REGISTER - LOW BYTE; DAC1H ; DAC 1 REGISTER - HIGH BYTE; DAC1CN ; DAC 1 CONTROL;■-- <15> --比较器设置; CPT0CN ; COMPARA TOR 0 CONTROL; CPT1CN ; COMPARA TOR 1 CONTROL; EMI0TC ; EMIF TIMING CONTROL;■-- <16> --时钟/电压基准设置; CKCON ; CLOCK CONTROL; SADEN1 ; SERIAL PORT 1 SLA VE ADDRESS MASK; SADEN0 ; SERIAL PORT 0 SLA VE ADDRESS MASK; P1MDIN ; PORT 1 INPUT MODE; PSW ; PROGRAM STA TUS WORD; B ; B REGISTER; WDTCN ; W A TCHDOG TIMER CONTROL;◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆;;==================================================================== ; function: Init_CTS 定时器/计数器,中断和串行通讯初始化子程序; input: -----------------; output: -----------------; usage: -----------------;==================================================================== THS0 equ 0a8hTLS0 equ 09ah; THS1 equ 0fah;0feh;0fah;-4800;0f4h; TLS1 equ 0fah;0feh;0fah;-4800;0f4h;; THS2 equ 0ffh;0feh;0fah;-4800;0f4h; TLS2 equ 0b8h;0feh;0fah;-4800;0f4hInit_TCS: ;定时器/计数器,中断和串行通讯初始化子程序;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓; ◆◆◆8051内部控制寄存器◆◆◆;****************************************************************************** ******;|名称| 代号| 地址|位寻| B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|电源控制| PCON | 87H | NO |SMOD | -- | -- | -- | GF1 | GF0 | PD | IDL |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|计时控制| TCON | 88H | YE |TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|计时模式| TMOD | 89H | NO |1GA TE| 1C/T | 1M1 | 1M0 | 0GA TE| 0C/T | 0M1 | 0M0 | ;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|串行控制| SCON | 98H | YE |SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|中断允许| IE | A8H | YE |EA| -- | ET2 | ES | ET1 | EX1 | ET0 | EX0 |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|中断优先| IP| B8H | YE |-- | -- | PT2 | PS | PT1 | PX1 | PT0 | PX0 |;****************************************************************************** ******;时钟频率为:11.059200MHz;;机器周期为:12/fosc=1.085069μs;;CT0定时器设定延时为:2000μs;;CT0定时器工作于模式0;;CT0溢出处理采用中断方式;;CT0选择内部时钟;;CT0启动由TR0的0/1决定;;设定波特率为:4800bps;;串口0工作于方式1--T1定时器工作于方式2;;串口1工作于模式3--T2定时器用于波特率发生器4800bpsmov TH0, #THS0mov TL0, #TLS0; mov TH1, #THS1; mov TL1, #TLS1; mov TH2, #THS2; mov TL2, #TLS2;▲■-- <1> --电源管理;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓;87H---PCON-------电源控制寄存器;复位值: 00000000;位7-2:保留。
/* SMBUS传输实验多字节传输————YZ **********************************************************************//*-----------------------------------------------------------------------------------------------*/#include <c8051f020.h>#define DS3231 0xD0;#define CA T24C256 0xA0;char SLA VE;unsigned char addr_h; rec_h;unsigned char addr_l; rec_l;char sendchar[8];char receivechar[8];int LENGTH,data_length;int length_rec;int sum;int sum_rec;int i=0;int j=0;int n;//char p=0;//发送子程序从地址+R/W位void send(char chip,unsigned int address,int data_length) //chip从地址,address数据地址,dat数据{while(BUSY==1);// SMB0CN=0x44;BUSY=1;n=2;i=0;sum=1;SLA VE=chip|0x00;addr_h=(address>>8)&0xff;addr_l=(address&0xff);LENGTH=data_length;STA=1;while(BUSY==1); //等待完成}//接收子程序void receive(char chip,char l){while(BUSY==1);// SMB0CN=0x44;BUSY=1;j=0;sum_rec=0;length_rec=l;SLA VE=chip|0x01;STA=1;while(BUSY==1); //等待完成}// SMBUS中断子程序一共28个状态,在此次试验中只用到了主发送接收的12种状态void SMBUS_ISR() interrupt 7{// SI=0;switch(SMB0STA){case 0x08:SMB0DA T=(SLA VE);STA=0;break;case 0x10:SMB0DA T=SLA VE;STA=0;break;/*******主发送器****************************/case 0x18:SMB0DA T=addr_h;sum=1;break;case 0x20:i++;if(i<10){STO=1;STA=1; }else{STO=1;BUSY=0;} //超过十次错误则释放总线break;case 0x28:switch(n){ case 2:SMB0DA T=addr_l;n=1;break;case 1:if((LENGTH-sum)>=0){sum--;SMB0DA T=sendchar[sum];sum=sum+2;}else{STO=1;BUSY=0;}break;}break;case 0x30:if((LENGTH-sum)==0){STO=1;BUSY=0;}else{ i++;if(i<10){STO=1;STA=1;}else{STO=1;BUSY=0;}}break;case 0x38:i++;if(i<10){ STO=1;STA=1; }else{STO=1;BUSY=0;}break;/********主接收器********************************/ case 0x40:if(length_rec==1)AA=0;break;case 0x48:j++;if(j<10){ STO=1;STA=1;}else{ STO=1;BUSY=0;}break;case 0x50:receivechar[sum_rec]=SMB0DA T;sum_rec++;if((length_rec-sum_rec)==1)AA=0;break;case 0x58:receivechar[sum_rec]=SMB0DA T;STO=1;BUSY=0;break;default: //其余情况恢复总线j++;if(j<10){ STO=1;STA=1;}else{STO=1;BUSY=0;}break;}SI=0;}//系统时钟设置void SYSCLK_INT(){int a;// OSCICN=0x88;OSCXCN=0x67;for(a=1;a<300;a++);while( OSCXCN&&0x80==0); OSCXCN=0x67;OSCICN=0x88;}//端口设置void PORT_INT(){XBR0=0x05;XBR1=0x14;XBR2=0x40;P0MDOUT=0x01;}//主程序void main(){ int q=0;WDTCN = 0xde;WDTCN = 0xad; //关看门狗SYSCLK_INT();PORT_INT();P0MDOUT=0x11;SMB0CN=0x44;SMB0CR=0xc4;EA=1; //开中断ES0=1; //使能UART0中断EIE1=0x02; //允许SMBUS中断EIE2=0x42; //允许ADC0中断sendchar[0]=0x00;sendchar[1]=0x02;sendchar[2]=0x03;sendchar[3]=0x04;sendchar[4]=0x05;sendchar[5]=0x06;sendchar[6]=0x07;sendchar[7]=0x00;send(0xa0,0x000,7); //测试while(BUSY==1);for(q=0;q<10000;q++);sendchar[0]=0x1c;sendchar[1]=0x00;send(0xa0,0x000e,2);while(BUSY==1);for(q=0;q<10000;q++);send(0xa0,0x0000,0);for(q=0;q<1000;q++);length_rec=8;receive(0xa0,8);while(BUSY==1);for(q=0;q<5000;q++);while(1);}。
摘要:本文介绍了基于C8051F的SMBus串行接口实现的智能测温系统,利用硬件SMBus资源和具有SMBus接口的双通道智能温度传感器MAX6654进行数据通信,并应用于智能测温系统中。
文中介绍了该系统的工作原理,并给出了软硬件的设计思想和方法。
该系统具有检测精度高且不易受环境干扰的优点。
关键词:测温系统;智能温度传感器;C8051F单片机;SMBus1 引言C8051F005是美国Cygnal公司推出的一种高性能混合信号系统级单片机,即SOC(System on chip)。
C8051F系列器件使用CYGNAL的专利:CIP-51微控制器内核。
C8051F系列单片机内部有一个全双工的UART、SPI总线以及I2C/SMBus[1]。
每种串行总线都完全用硬件实现,都能向CIP-51产生中断,因此很少需要CPU的干预。
这些串行总线不共享定时器中断或I/O端口,可以按需要使用一个或全部。
本文介绍的是基于这种具有硬件实现I2C/ SMBus的单片机和具有SMBus接口的双通道智能温度传感器MAX6654进行数据通信而构成的智能测温系统。
利用该系统可对PC机、笔记本电脑和服务器中CPU的温度进行监控等[2]。
2 C8051F005的SMBus配置和信号时序C8051F系列单片机的SMBus串行接口完全符合系统管理总线标准1.1版。
SMBus接口的工作电压可以在(3.0~5.0) V之间。
总线上不同器件的工作电压可以不同。
因为SCL串行时钟线和SDA串行数据线是双向的,因此两条线上都需要上拉电阻或类似电路将它们连到电源电压,在没有数据传输时,两条线都处于高电平。
典型的SMBus配置如图1所示。
SMBus采用多种线路条件作为器件的握手信号。
在一次数据传输过程中,SDA只能在SCL为低电平时改变。
在SCL为高电平时,SDA发生改变则代表如下的开始和停止信号:⑴开始。
该条件启动一次传输过程,当SCL为高电平时,SDA上出现一个下降沿。
第一章 C8051F040开发系统板简介1.1 开发系统的组成Cygnal C8051F040单片机开发系统主要由Cygnal 片上系统单片机开发工具、C8051F040片上系统单片机和系统试验板三部分组成,应用该系统可进行片上系统单片机较典型应用的试验,请参见以下介绍。
1.2 Cygnal C8051F单片机开发工具简介开发工具概述Cygnal 的开发工具实质上就是计算机IDE 调试环境软件及计算机RS-232到C8051F单片机JTAG 口的协议转换器(EC2-N1)的组合。
Cygnal C8051F系列全部的单片机片内均设计有调试电路该调试电路通过边界扫描方式获得单片机片内信息,通过10线的JTAG接口与开发工具连接以便于进行对单片机在片编程调试。
该开发系统板中的核心部分是Cygnal C8051F040单片机。
适配器(EC2-N1)一端与计算机相连,另一端与C8051F单片机的JTAG口相连,应用Cygnal 供应的IDE调试环境就可以进行非侵入式、全速的在系统编程(ISP)和调试。
Cygnal 开发工具支持视察和修改存储器和寄存器支持断点、视察点、堆栈指示器、单步、运行和停止吩咐。
调试时不须要额外的目标RAM、程序存储器、定时器或通信通道,并且全部的模拟和数字外设都正常工作。
开发工具主要技术指标●支持的目标系统:全部C8051Fxxx 系列单片机;●系统时钟:最大可达25MHz;●通过RS232接口与PC机连接;●支持汇编语言和C51源代码级调试;●第三方工具支持Keil C。
IDE 软件运行环境要求PC机能够运行开发工具软件并能与串行适配器通信。
对PC机有如下系统要求:●Windows 95/98/Me/NT/2000/XP 操作系统;●32MB RAM;●40MB 自由硬盘空间;●空闲的COM 口。
开发工具与PC 机硬件连接硬件连接及软件安装:●将JTAG 扁平电缆与串行示配器EC2 连接●将JTAG 扁平电缆的另一端与目标系统连接●将RS232 串行电缆的一端与EC2 连接●连接RS232 串行电缆的另一端到PC●给目标系统上电●插入CD 并运行SETUP.EXE 将IDE 软件安装到您的PC 机●在PC 机的起先菜单的程序项中选择Cygnal IDE 点击Cygnal 图标运行IDE软件。