C8051F020FM24C16收发测试程序.docx

上传人:b****2 文档编号:1252520 上传时间:2023-04-30 格式:DOCX 页数:22 大小:20.75KB
下载 相关 举报
C8051F020FM24C16收发测试程序.docx_第1页
第1页 / 共22页
C8051F020FM24C16收发测试程序.docx_第2页
第2页 / 共22页
C8051F020FM24C16收发测试程序.docx_第3页
第3页 / 共22页
C8051F020FM24C16收发测试程序.docx_第4页
第4页 / 共22页
C8051F020FM24C16收发测试程序.docx_第5页
第5页 / 共22页
C8051F020FM24C16收发测试程序.docx_第6页
第6页 / 共22页
C8051F020FM24C16收发测试程序.docx_第7页
第7页 / 共22页
C8051F020FM24C16收发测试程序.docx_第8页
第8页 / 共22页
C8051F020FM24C16收发测试程序.docx_第9页
第9页 / 共22页
C8051F020FM24C16收发测试程序.docx_第10页
第10页 / 共22页
C8051F020FM24C16收发测试程序.docx_第11页
第11页 / 共22页
C8051F020FM24C16收发测试程序.docx_第12页
第12页 / 共22页
C8051F020FM24C16收发测试程序.docx_第13页
第13页 / 共22页
C8051F020FM24C16收发测试程序.docx_第14页
第14页 / 共22页
C8051F020FM24C16收发测试程序.docx_第15页
第15页 / 共22页
C8051F020FM24C16收发测试程序.docx_第16页
第16页 / 共22页
C8051F020FM24C16收发测试程序.docx_第17页
第17页 / 共22页
C8051F020FM24C16收发测试程序.docx_第18页
第18页 / 共22页
C8051F020FM24C16收发测试程序.docx_第19页
第19页 / 共22页
C8051F020FM24C16收发测试程序.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C8051F020FM24C16收发测试程序.docx

《C8051F020FM24C16收发测试程序.docx》由会员分享,可在线阅读,更多相关《C8051F020FM24C16收发测试程序.docx(22页珍藏版)》请在冰点文库上搜索。

C8051F020FM24C16收发测试程序.docx

C8051F020FM24C16收发测试程序

//FM24C16收发测试程序(通过)

//收发有错误是因为收发数组定义长度问题

//ur0第一次收不到30而第二次收的数据又覆盖了部分第一的数据

//SMB的收发也有上述问题造成收发有错误

/**********************************************

文件描述:

三相电测量上报

功能说明:

测量ATT7022B完成

PCF8563上报定时(需校时)

FM24C256转换数据存储

UART0口用于RS232读数据

UART1控制无线模块上报数据

创建:

2006年12月5日

/*********************************

*函数:

main.

*入口:

*出口:

*功能说明:

接收UART端口命令

执行读ATT7022B的数据

进行处理、存储和回发数据

********************************/

//*****************************

//包含的文件

//******************************

#include

#include

#include

//*************************************************

//函数:

init_sysclk(void)

//功能:

时钟初始化

//入口:

//出口:

//说明:

使用外部时钟12M

//*************************************************

voidinit_sysclk(void)

{

uinti=0;

OSCXCN=0x67;//externaloscillatorwith12MHzcrystal

for(i=0;i<256;i++);//XTLVLDblanking

while(!

(OSCXCN&0x80));//Waitforcrystalosc.tosettle

OSCICN=0x88;//时钟丢失检测,选择外部时钟

CKCON=0x00;//时钟分频

}

/*********************************

函数:

voidenable_wdog(void)

voiddisable_wdog(void)

功能:

使能、禁止wdog

入口:

出口:

说明:

********************************/

voidenable_wdog(void)

{

WDTCN=0xA5;

//允许看门狗定时器工作

}

voiddisable_wdog(void)//禁止看门狗定时器工作

{

WDTCN=0xDE;

WDTCN=0xAD;

}

/***********************************

函数:

voidinit_ioport()

功能:

端口配置及端口位定义

入口:

出口:

说明:

*************************************/

voidinit_ioport()

{

XBR0=0x07;//TXD0-P0.0RXD0-P0.1,SPI_SCK-P0.2,SPI_MISO-P0.3

//SPI_MOSI-P0.4,SPI_NSS-P0.5,SDA-P0.6,SCL-P0.7,

XBR1=0X10;//INT1使能INT1--P1.2

XBR2=0x44;//端口I/O弱上拉允许,TX1-P1.0,RXD-P1.1交叉开关允许

P0MDOUT=0x08;//端口0输出方式寄存器:

0--漏极开路

P1MDIN=0XFF;//端口1输入方式寄存器:

0--配置为数字输入

P1MDOUT=0x00;//端口1输出方式寄存器,0--漏极开路

P1=0xff;

P2MDOUT=0x00;//端口2输出方式寄存器:

0--漏极开路

P2=0xff;

P3MDOUT=0X00;//端口3输出方式寄存器:

0--漏极开路

P3=0xff;

P74OUT=0x00;//端口7-4输出方式寄存器:

0--漏极开路

P4=0xff;

P5=0xff;

P6=0xff;

P7=0xff;

}

//--------------------------------------------------------------

//函数:

voidDelay_ms(unsignedms)

//功能:

实现延时功能Timer0_ms

//---------------------------------------------------------------

//

/*ConfigureTimer0todelay*/

voidDelay_ms(unsignedms)

{

uchari;//millisecondcounter

TCON&=~0x30;//STOPTimer0andclearoverflowflag

TMOD|=0x01;//configureTimer0to16-bitmode

CKCON|=0x08;//Timer0countsSYSCLKs

for(i=0;i

{

TR0=0;//STOPTimer0

TH0=(-SYSCLK/1000)>>8;//setTimer0tooverflowin1ms

TL0=-SYSCLK/1000;

TR0=1;//STARTTimer0

while(TF0==0);//waitforoverflow

TF0=0;//clearoverflowindicator

}

}

//-------------------------------------------------------

//函数:

voidDelay_us(unsignedus)

//功能:

实现延时功能Timer0_us

//-------------------------------------------------------

//

/*ConfigureTimer0todelay*/

voidDelay_us(unsignedus)

{

uchari;//microsecondscounter

TCON&=~0x30;//STOPTimer0andclearoverflowflag

TMOD|=0x01;//configureTimer0to16-bitmode

CKCON|=0x08;//Timer0countsSYSCLKs

for(i=0;i

{

TR0=0;//STOPTimer0

TH0=(-SYSCLK/1000000)>>8;//setTimer0tooverflowin1us

TL0=-SYSCLK/1000000;

TR0=1;//STARTTimer0

while(TF0==0);//waitforoverflow

TF0=0;//clearoverflowindicator

}

}

//***************************************

//函数:

unsignedcharmy_add(ucharmy_add)

//功能:

读开关状态确定子地址

//入口:

//出口:

子地址

//说明:

子地址存于myadd中(即设备号)

//****************************************

voidmy_add(void)

{

P74OUT|=0XD0;

myadd=P5;

}

//******************************************

//函数:

voidjiaob(ATT_JB[])

//功能:

写校表寄存器

//说明:

UART口接收校表时间并存于FM24C256中

//*****************************************

voidjiaob(void)

{

}

main()

{

disable_wdog();//关看门狗

init_sysclk();//时钟初始化

init_ioport();//交叉开关配置

my_add();//读设备子地址设置

UART0_Init();//UART0初始化

SPI0_Init();

init_smbus();

EX1=1;//开INT1

EA=1;//开中断//SPIEN=1;

uart0_flag=0;

while

(1)

{

if(uart0_flag)

{

uart0_flag=0;//ATT_Read(ur0_rxd[0]);

//写fm24c256字节数

//写fm24c256字节记数

fm_ram_add=0;//写fm24c256起始地址

smbus_send(fm_send_len);

fm_ram_add=0;

smbus_receive(fm_receive_len);

m=&fm_read_buf[0];

txd_string(m,30);

}

}

}

//*******************************************

voidinit_smbus(void)

{

SMB0CN=0x44;//IIC总线控制寄存器01000100

SMB0CR=0xA4;//-(SYSCLK/2*SCL);IIC总线速率寄存器SCL=100K

//允许IIC总线中断,标志位是SI(SMB0CN.3)

EIE1|=0x02;//SMBUS中断使能

EA=1;//中断使能

sm_busy=0;//总线空闲中断接收发完成标志开始置1

ENSMB=1;//SMBUS0使能

}

//-----向给定寄存器地址写一个字节-------//

voidsmbus_send(ucharfm_send_len)

{

//fm_send_len=30;//写fm24c256字节数

fm_send_count=0;//写fm24c256字节记数

while(sm_busy);//WaitforSMBustobefree.

sm_busy=1;//OccupySMBus(settobusy)

sm_r_s_flag=1;

fm_send_len=30;//写fm24c256字节数

STO=0;

STA=1;//Starttransfer

while(sm_busy);//Waitfortransfertofinish

}

//-----从给定寄存器地址读一个字节-------//

voidsmbus_receive(ucharfm_receive_len)

{

//fm_receive_len=30;//读fm24c256字节数

fm_receive_count=0;//读fm24c256字节记数

while(sm_busy);//Waitforbustobefree.

sm_busy=1;//OccupySMBus(settobusy)

sm_r_s_flag=0;

fm_receive_len=30;

STO=0;

STA=1;//Starttransfer

while(sm_busy);//Waitfortransfertofinish

}

//-----SMBUS中断服务程序---//

voidsmbus(void)interrupt7

{

ES0=0;

switch(SMB0STA)

//SMBUS状态寄存器SMB0STA

{

//fm_err_flag=1说明SMBus有问题

case0x08:

if(sm_r_s_flag)//判断收发

{

chip_select=0xA0;

}

elsechip_select=0xA1;

//主发送/接收:

起始条件已发出.

STA=0;fm_err_flag=0;AA=1;//清除起始位STA,应答

SMB0DAT=chip_select;//从地址+读/写标志送SMB0DAT,

break;

case0x10:

//主发送/接收:

重复起始条件已发出。

STA=0;AA=1;//人工清除起始位STA,应答

SMB0DAT=chip_select;//从地址+读/写标志送SMB0DAT

break;

case0x18:

//主发送器:

从地址+写标志已发出,收到ACK

SMB0DAT=fm_ram_add;write_num=0;//将要发送的数据装入SMB0DAT.

break;

case0x20:

//主发送器:

从地址+写标志已发出,收到NACK

write_num++;

if(write_num>5)

{

STO=1;sm_busy=0;fm_err_flag=1;

}//如果超过5次不成功则释放总线

else{STO=1;STA=1;}//确认查询重复,置位STO+STA。

break;

case0x28:

//数据字节已发出,收到ACK,将下一字节装入SMB0DAT;

switch(fm_send_len)

{

case0x00:

STO=1;sm_busy=0;//如果数据已经发送结束则释放总线

break;

default:

SMB0DAT=ur0_rxd[fm_send_count++];

fm_send_len--;

break;

}

break;

case0x30:

//主发送器:

数据字节已发出,收到NACK,

write_num++;

if(write_num>5)

{

STO=1;sm_busy=0;fm_err_flag=1;

}//如果超过5次不成功则释放总线

else

{STO=1;STA=1;}//重试传输或置位STO

break;

case0x38:

//主发送器:

竞争失败,保存当前数据

write_num++;

if(write_num>5)

{

STO=1;sm_busy=0;fm_err_flag=1;

}//如果超过5次不成功则释放总线

{STO=1;STA=1;}

break;

case0x40:

receive_num=0;//主接收器:

从地址+读标志已发出,收到ACK,

if(fm_receive_len<30)AA=0;//如果只接收一(30)个字节,清AA位(收到字节后发NACK),等待接收数据

break;

case0x48:

//主接收器:

从地址+读标志已发出,收到NACK,

receive_num++;

if(receive_num>5)

{

STO=1;sm_busy=0;fm_err_flag=1;

}//如果超过5次不成功则释放总线

else

{STO=1;STA=1;}

break;//确认查询重复,置位STO+STA。

case0x50:

//主接收器:

数据字节收到,ACK已发出;读SMB0DAT,等待

fm_read_buf[fm_receive_count++]=SMB0DAT;

fm_receive_len--;

if(fm_receive_len<2)AA=0;//如下一个字节是最后字节,清除AA(nack)。

break;

case0x58:

//主接收器:

数据字节收到,NACK已发出,置位STO。

fm_read_buf[fm_receive_count++]=SMB0DAT;//读操作已经完成,读数据寄存器并且发出STOP.

fm_receive_len--;

STO=1;sm_busy=0;//FreeSMBus

break;

default:

STO=1;sm_busy=0;fm_err_flag=1;//Resetcommunication.

break;

}

SI=0;//clearinterruptflag

ES0=1;

}

//---------判断本设备命令及命令内容执行命令-------

//-----------------------------------------------------------------------------

//SPI0_Init

//-----------------------------------------------------------------------------

//

//ConfigureSPI0for8-bit,200KSCK,Mastermode,data

//sampledonSCK2stedge.

//

voidSPI0_Init(void)

{

SPI0CFG=0x87;//datasampledonSCK2stedge

//8-bitdatawords,MSB1st

SPI0CN=0x02;//Mastermode;SPIenabled;flags

//cleared

SPI0CKR=0x2F;//SPIclock<=200kHz(limitedby

//EEPROMspec.)

EIE1&=0XFE;//spi关

//开漏

}

//-----------------------------------------------------------------------------

//ATT_Read

//-----------------------------------------------------------------------------

//

//ThisroutinereadsandreturnsasingleATT7022bytewhoseaddressis

//givenin.

//

voidATT_Read(ucharx)

{

ucharn=0;

ATT_CS=0;//selectatt7022

SPIF=0;

Delay_us

(1);//waitatleast250ns(CSsetuptime)

SPI0DAT=x;

while(SPIF==0);

Delay_us(3);

SPIF=0;

for(n=0;n<=3;n++)

{

SPI0DAT=0;

while(SPIF==0);

SPIF=0;

ur0_rxd[n]=SPI0DAT;//readdatafromSPI

}//readdatafromSPI

Delay_us

(1);//waitatleast250ns(CSholdtime)

ATT_CS=1;//de-selectEEPROM

Delay_us

(1);//waitatleast500ns(CSdisabletime)

}

//-----------------------------------------------------------------------------

//ATT_Write

//-----------------------------------------------------------------------------

//

voidATT_Write(ucharATT_WADD,ucharatt_wd[])

{

ucharn;

ATT_WADD=ATT_W|ATT_W_ADD;

ATT_CS=0;//selectatt7022

Delay_us

(1);//waitatleast250ns(CSsetuptime)

//transmitWriteopcode

SPIF=0;

SPI0DAT=ATT_W|ATT_W_ADD;

while(SPIF==0);

SPIF=0;

SPI0DAT=att_wd[n];

while(SPIF==0);

n=++n;

SPIF=0;

SPI0DAT=att_wd[n];

while(SPIF==0);

n=++n;

SPIF=0;

SPI0DAT=att_wd[n];

while(SPIF==0);

Delay_us

(1);//waitatleast250ns(CSholdtime)

ATT_CS=1;

}

//-----------------------------------------------------

//串口初始化

//--------------------------------------------------------

voidUART0_Init(void)

{

SCON0=

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2