ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:20.75KB ,
资源ID:1252520      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-1252520.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C8051F020FM24C16收发测试程序.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

C8051F020FM24C16收发测试程序.docx

1、C8051F020FM24C16收发测试程序/FM24C16收发测试程序(通过)/收发有错误是因为收发数组定义长度问题/ur0第一次收不到30而第二次收的数据又覆盖了部分第一的数据/SMB的收发也有上述问题造成收发有错误/*文件描述: 三相电测量上报功能说明: 测量ATT7022B完成 PCF8563上报定时(需校时) FM24C256转换数据存储 UART0口用于RS232读数据 UART1控制无线模块上报数据创建:2006年12月5日/* *函数:main. *入口:无 *出口:无 *功能说明:接收UART端口命令 执行读ATT7022B的数据 进行处理、存储和回发数据 */*/包含的文件

2、/*#include #include #include /*/函数:init_sysclk(void)/功能:时钟初始化/入口:无/出口: 无/说明:使用外部时钟12M/*void init_sysclk (void) uint i=0; OSCXCN=0x67; /external oscillator with 12MHz crystal for(i=0;i256;i+); / XTLVLD blanking while(!(OSCXCN & 0x80); / Wait for crystal osc. to settle OSCICN=0x88; /时钟丢失检测,选择外部时钟 CKCO

3、N = 0x00; /时钟分频/*函数:void enable_wdog(void) void disable_wdog(void)功能:使能、禁止wdog入口:无出口:无说明:*/void enable_wdog(void) WDTCN=0xA5; /允许看门狗定时器工作void disable_wdog(void) /禁止看门狗定时器工作 WDTCN=0xDE; WDTCN=0xAD;/*函数:void init_ioport()功能:端口配置及端口位定义入口:无出口:无说明:*/void init_ioport() XBR0=0x07; /TXD0-P0.0 RXD0-P0.1,SPI_

4、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; P3M

5、DOUT=0X00; /端口3输出方式寄存器:0-漏极开路 P3=0xff; P74OUT=0x00; /端口7-4输出方式寄存器:0-漏极开路 P4=0xff; P5=0xff; P6=0xff; P7=0xff; /-/函数:void Delay_ms (unsigned ms)/功能:实现延时功能 Timer0_ms/-/* Configure Timer0 to delay */ void Delay_ms (unsigned ms) uchar i; / millisecond counter TCON &= 0x30; / STOP Timer0 and clear overflo

6、w flag TMOD |= 0x01; / configure Timer0 to 16-bit mode CKCON |= 0x08; / Timer0 counts SYSCLKs for (i = 0; i 8; / set Timer0 to overflow in 1ms TL0 = -SYSCLK/1000; TR0 = 1; / START Timer0 while (TF0 = 0); / wait for overflow TF0 = 0; / clear overflow indicator /-/函数:void Delay_us (unsigned us)/功能:实现延

7、时功能 Timer0_us/-/* Configure Timer0 to delay */ void Delay_us (unsigned us) uchar i; / microseconds counter TCON &= 0x30; / STOP Timer0 and clear overflow flag TMOD |= 0x01; / configure Timer0 to 16-bit mode CKCON |= 0x08; / Timer0 counts SYSCLKs for (i = 0; i 8; / set Timer0 to overflow in 1us TL0 =

8、 -SYSCLK/1000000; TR0 = 1; / START Timer0 while (TF0 = 0); / wait for overflow TF0 = 0; / clear overflow indicator /*/函数:unsigned char my_add(uchar my_add)/功能:读开关状态确定子地址/入口:无/出口:子地址/说明:子地址存于myadd中(即设备号)/*void my_add(void) P74OUT |=0XD0; myadd =P5; /*/函数:void jiaob(ATT_JB)/功能:写校表寄存器/说明:UART口接收校表时间并存于

9、FM24C256中/*void jiaob (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_rxd0); / 写fm24c256字

10、节数 / 写fm24c256字节记数fm_ram_add=0; / 写fm24c256起始地址 smbus_send (fm_send_len);fm_ram_add=0;smbus_receive(fm_receive_len); m=&fm_read_buf0; txd_string(m,30); /*void init_smbus(void) SMB0CN=0x44; /IIC总线控制寄存器01000100 SMB0CR=0xA4; /-(SYSCLK/2*SCL);IIC总线速率寄存器SCL=100K /允许IIC总线中断,标志位是SI(SMB0CN.3) EIE1 |=0x02; /

11、SMBUS中断使能 EA = 1; /中断使能 sm_busy=0; /总线空闲中断接收发完成标志 开始置1 ENSMB=1; /SMBUS0使能 /-向给定寄存器地址写一个字节-/void smbus_send (uchar fm_send_len)/fm_send_len=30; / 写fm24c256字节数fm_send_count=0; / 写fm24c256字节记数 while(sm_busy); / Wait for SMBus to be free. sm_busy=1; / Occupy SMBus (set to busy) sm_r_s_flag=1; fm_send_le

12、n=30; / 写fm24c256字节数 STO=0; STA=1; / Start transfer while (sm_busy); / Wait for transfer to finish/-从给定寄存器地址读一个字节-/void smbus_receive (uchar fm_receive_len) /fm_receive_len=30; / 读fm24c256字节数fm_receive_count=0; / 读fm24c256字节记数 while (sm_busy); / Wait for bus to be free. sm_busy=1; / Occupy SMBus (se

13、t to busy) sm_r_s_flag=0; fm_receive_len=30; STO=0; STA=1; / Start transfer while(sm_busy); / Wait for transfer to finish /-SMBUS中断服务程序-/void smbus(void) interrupt 7 ES0=0; switch (SMB0STA) /SMBUS状态寄存器SMB0STA /fm_err_flag=1说明SMBus有问题 case 0x08: if(sm_r_s_flag) /判断收发 chip_select=0xA0; else chip_selec

14、t=0xA1; /主发送/接收:起始条件已发出. STA=0;fm_err_flag=0;AA=1; /清除起始位STA,应答 SMB0DAT=chip_select; /从地址+读/写标志送SMB0DAT, break; case 0x10: /主发送/接收:重复起始条件已发出。 STA=0;AA=1; /人工清除起始位STA,应答 SMB0DAT=chip_select; /从地址+读/写标志送SMB0DAT break; case 0x18: /主发送器:从地址+写标志已发出,收到ACK SMB0DAT=fm_ram_add;write_num=0; /将要发送的数据装入SMB0DAT.

15、 break; case 0x20: /主发送器:从地址+写标志已发出,收到NACK write_num+; if(write_num5) STO=1;sm_busy=0;fm_err_flag=1; /如果超过5次不成功则释放总线 elseSTO=1;STA=1; /确认查询重复,置位STO+STA。 break; case 0x28: /数据字节已发出,收到ACK,将下一字节装入SMB0DAT; switch(fm_send_len) case 0x00: STO=1;sm_busy=0; /如果数据已经发送结束则释放总线 break; default : SMB0DAT=ur0_rxdf

16、m_send_count+; fm_send_len-; break; break; case 0x30: /主发送器:数据字节已发出,收到NACK, write_num+; if(write_num5) STO=1;sm_busy=0;fm_err_flag=1; /如果超过5次不成功则释放总线 else STO=1;STA=1; /重试传输或置位STO break; case 0x38: /主发送器:竞争失败,保存当前数据 write_num+; if(write_num5) STO=1;sm_busy=0;fm_err_flag=1; /如果超过5次不成功则释放总线 STO=1;STA=

17、1; break; case 0x40: receive_num=0; /主接收器:从地址+读标志已发出,收到ACK, if(fm_receive_len5) STO=1;sm_busy=0;fm_err_flag=1; /如果超过5次不成功则释放总线 else STO=1;STA=1; break; /确认查询重复,置位STO+STA。 case 0x50: /主接收器:数据字节收到,ACK已发出;读SMB0DAT,等待 fm_read_buffm_receive_count+=SMB0DAT; fm_receive_len-; if(fm_receive_len2)AA=0; /如下一个字

18、节是最后字节,清除AA(nack)。 break; case 0x58: /主接收器:数据字节收到,NACK已发出,置位STO。 fm_read_buffm_receive_count+=SMB0DAT; /读操作已经完成,读数据寄存器并且发出STOP. fm_receive_len-; STO=1;sm_busy=0; /Free SMBus break; default: STO=1;sm_busy=0;fm_err_flag=1; /Reset communication. break; SI=0; /clear interrupt flagES0=1; /-判断本设备命令及命令内容执行

19、命令/-/ SPI0_Init/-/ Configure SPI0 for 8-bit, 200K SCK, Master mode, data / sampled on SCK 2st edge./void SPI0_Init (void) SPI0CFG = 0x87; / data sampled on SCK 2st edge / 8-bit data words,MSB 1st SPI0CN = 0x02; / Master mode; SPI enabled; flags / cleared SPI0CKR = 0x2F; / SPI clock = 200kHz (limited

20、 by / EEPROM spec.) EIE1 &= 0XFE; / spi关 /开漏/-/ ATT_Read/-/ This routine reads and returns a single ATT7022 byte whose address is/ given in ./void ATT_Read (uchar x) uchar n=0; ATT_CS = 0; / select att7022 SPIF = 0; Delay_us (1); / wait at least 250ns (CS setup time) SPI0DAT = x; while (SPIF=0); Del

21、ay_us (3); SPIF = 0;for(n=0;n=3;n+) SPI0DAT = 0;while (SPIF=0); SPIF = 0; ur0_rxdn= SPI0DAT; / read data from SPI / read data from SPI Delay_us (1); / wait at least 250ns (CS hold time) ATT_CS = 1; / de-select EEPROM Delay_us (1); / wait at least 500ns (CS disable time) /-/ ATT_Write/-/void ATT_Writ

22、e (uchar ATT_WADD, uchar att_wd) uchar n; ATT_WADD = ATT_W|ATT_W_ADD; ATT_CS = 0; / select att7022 Delay_us (1); / wait at least 250ns (CS setup time) / transmit Write opcode SPIF = 0; SPI0DAT = ATT_W|ATT_W_ADD; while (SPIF = 0); SPIF = 0; SPI0DAT = att_wdn; while (SPIF = 0); n = +n; SPIF = 0; SPI0DAT = att_wdn; while (SPIF = 0); n = +n; SPIF = 0; SPI0DAT = att_wdn; while (SPIF = 0); Delay_us (1); / wait at least 250ns (CS hold time) ATT_CS = 1; /-/串口初始化/-void UART0_Init(void) SCON0 =

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

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