当前位置: 首页 > news >正文

下载网站appwordpress 百度地图api插件

下载网站app,wordpress 百度地图api插件,自做衣服网站,百度seo怎么做网站内容优化一.目标 PC 端的串口调试软件通过 RS-485 与单片机通信#xff0c;控制单片机利用软件模拟 I2C 总线对 EEPROM#xff08;24C02#xff09; 进行任意读写。 二.硬件简述 2.1 24C02硬件参数 24C02器件地址为0x50#xff0c;存储容量为256字节#xff0c;存储单元地址位数…一.目标 PC 端的串口调试软件通过 RS-485 与单片机通信控制单片机利用软件模拟 I2C 总线对 EEPROM24C02 进行任意读写。  二.硬件简述 2.1 24C02硬件参数 24C02器件地址为0x50存储容量为256字节存储单元地址位数为8。地址发送方法如下图所示。 2.2 RS-485简述 在工业控制领域传输距离越长要求抗干扰能力也越强。由于 RS-232 无法消除共模干扰且传输距离只有 15m 左右无法满足要求。         工业标准组织提出了 RS-485 接口标准。 RS-485 标准采用差分信号传输方式因此具有很强的抗共模干扰能力。 RS-485 接口芯片 SP485E 的封装及引脚说明如下图 1。 RS-485 的逻辑电平为 ①当 A 的电位比 B 高 200mV 以上时 为逻辑 1 ②当 B 的电位比 A 电位高200mA 以上时为逻辑 0传输距离可达 1200m。由于是差分传输因此无需公共地在 RS-485 总线上仅需连接两根线 A 和 B。        单片机与 RS-485 接口芯片的电路连接图如下图 2。 三.控制命令定义 定义如下命令 ①c——串口接收数据函数初始化 ②s——单片机将接收到的数据发送到串口调试终端显示以确认单片机是否已正确接收数据 ③w——将接收缓冲区 wbuf 中的数据写入 EEPROM 中 ④r——将刚才写入 EEPROM 中的数据读出到缓冲区 rbuf 中并发送到串口调试终端显示 四.C代码 本代码注重功能实现以期达到理解I2C协议和24C02读写方法的目的。实际项目还须考虑代码质量如可读性、可维护性等。 4.1 I2C基础时序模拟 4.1.1 引脚初始化 void i2cinit(void) {sdaout;/*引脚输出模式*/sclout;sda 1; /*释放总线*/scl 1; } 4.1.2 延时函数 1.SCL 时序控制延时函数 78K0指令的最短时钟周期为2个一条NOP指令即为2个时钟周期若使用内部8MHz时钟则执行一条NOP指令需0.25us。 void delay(void) {UCHAR i;for(i 0;i NOP_num;i)NOP(); } 2.长延时函数 void delay_long(UINT a) {UINT i,j;for(i 0;i a;i)for(j 0;j 100;j); } 4.1.3 起始信号模拟 SCL 线为高电平期间 SDA 线由高电平向低电平的变化表示起始信号。 void i2cstart(void) {sdaout; sclout;/*1.初始化SDA为高电平在SCL低电平期间拉高SDA*/scl 0;delay();sda 1;delay();/*2.模拟一个起始信号*/scl 1;delay();sda 0;delay(); } 4.1.4 停止信号模拟 SCL 线为高电平期间 SDA 线由低电平向高电平的变化表示终止信号。 void i2cstop(void) {sdaout;sclout;/*1.初始化SDA为低电平在SCL低电平期间拉低SDA*/scl0;delay();sda0; delay();/*2.模拟一个停止信号*/scl1;delay();sda1;delay(); } 4.1.5 应答信号模拟 每一个字节必须保证是 8 位长度。数据传送时先传送最高位MSB每一个被传送的 字节后面都必须跟随一位应答位即一帧共有 9 位。 在第 9 个时钟信号的高电平期间若 SDA为 0则为应答若 SDA 为 1则为非应答。 1.主机发送应答信号 void i2c_ack_write(UCHAR ack) {sdaout;sclout;/*1.初始化SDA为应答信号/非应答电平在SLC低电平期间改变SDA*/scl0; /*sda 变化前先将 scl 置 0,一个时钟周期的开始*/delay();if(ack 1)sda 1;/*1不应答从机通知从机释放 sda*/else sda 0;/*0应答从机*/delay();/*2.scl 置高通知从机读取SDA*/scl 1;delay(); } 2.读取从机的应答信号 UCHAR i2c_ack_read(void) {UCHAR sack;sdaout;sclout;/*1.释放SDA让从机控制在SLC低电平期间拉高SDA*/scl0;delay();sda1;delay();sdain; /*sda 设置为输入模式以检测从机的应答信号*//*2.scl 置高读取从机的应答信号*/scl1delay();if(sda1)sack1;/*从机无应答*/else sack0;/*从机应答*/return sack; } 4.1.6 写一个字节数据 只是数据段传送的操作即开始与应答之间的操作但不包括开始和应答。 void writebyte(UCHAR dat) {UCHAR temp0;UCHAR i;sdaout;sclout;for(i 0;i 8;i){/*1.在SCL低电平时准备好SDA*/temp dat0x80;scl 0; delay();if(temp 0)sda 0;else sda 1; delay();/*2.拉高SCL通知从机读SDA*/scl 1;delay();dat dat 1;}/*3.释放SDA总线*/scl 0;delay();sda 1;delay(); } 4.1.7 读一个字节数据 只是数据段传送的操作即开始与应答之间的操作但不包括开始和应答。 UCHAR readbyte(void) {UCHAR i;UCHAR temp 0;sdaout;sclout;/*1.主机释放SDA并将SDA设为输入模式*/scl 0;delay();sda 1;delay();sdain; for(i 0;i 8;i){/*1.拉低SCL通知从机发送数据*/scl0;delay();/*2.拉高SCL读取SDA*/scl1;delay();if(sda 1)temp (temp 1) | 0x01;elsetemp (temp 1) | 0x00;}return temp; } 4.2 I2C读写数据 4.2.1 向任意地址写单字节数据 包括数据传送、应答信号从机但不包括开始和停止信号。 UCHAR writebyte_to_anyaddr(UCHAR dev_addr,UCHAR mem_addr,UCHAR dat) {UCHAR sack;/*1.写器件地址*/writebyte((dev_addr 1) | 0); sack i2c_ack_read(); if(sack 1)return 1;/*2.写存储单元地址*/writebyte(mem_addr);sack i2c_ack_read(); if(sack 1)return 1;/*3.发送数据*/writebyte(dat); sack i2c_ack_read();if(sack 1)return 1;elsereturn 0; } 4.2.2 从任意地址读单字节数据 包括数据传送、应答信号但不包括开始和停止信号。 UCHAR readbyte_from_anyaddr(UCHAR dev_addr,UCHAR mem_addr,UCHAR *data) {UCHAR temp 0;UCHAR sack 0;/*1.写器件地址*/writebyte((dev_addr 1) | 0);sack i2c_ack_read();if(sack 1)return 1;/*2.写存储单元地址*/writebyte(mem_addr);sack i2c_ack_read();if(sack 1)return 1;/*3.重置开始改为读方向*/i2cstart(); writebyte((dev_addr 1) | 1);sack i2c_ack_read();if(sack1)return 1;/*4.读数据*/readbyte(temp);/*5.读完后主机不应答通知从机释放 sda*/i2c_ack_write(M_NACK); *data temp;return 0; } 4.2.3 写n字节数据到任意地址 UCHAR writenbytes_to_anyaddr(UCHAR dev_addr,UCHAR mem_addr,UCHAR* buf,UCHAR buflen) {UCHAR i 0;UCHAR sack 0;i2cstart();writebyte_to_anyaddr(dev_addr,mem_addr,buf[i]);/*向指定地址写一个数据*/for(i 1;i buflen;i){/*页边界处理*/if((mem_addr 0x07) 0x07)/*地址的低 3 位为“111”时主机须送下一页的起始地址*/{i2cstop(); /*到页边界时主机须发停止信号通知从机结束当前页的传送*/delay_long(1);/*结束信号与开始信号之间须延时*/i2cstart();/*开始*/writebyte((dev_addr 1) | 0); /*送器件地址写*/sack i2c_ack_read(); /*检测从机应答*/if(sack1)return 1;/*无应答返回 1*/writebyte(mem_addr 1);/*写数据地址地址值加 1*/sacki2c_ack_read();/*检测从机应答*/if(sack 1)return 1;/*无应答返回 1*/}/*页内写字节地址自动加 1*/writebyte(buf[i]);sacki2c_ack_read();if(sack1)return 1;mem_addr;/*mem_addr 始终等于当前写入数据的地址以便进行页边界判断*/}return 0; /*返回 0写成功*/ } 4.2.4 从任意地址读n字节数据 UCHAR readnbytes_from_anyaddr(UCHAR dev_addr,UCHAR mem_addr,UCHAR* buf,UCHAR buflen) {UCHAR i0;UCHAR sack;i2cstart();/*开始*/writebyte((dev_addr 1) | 0);/*送器件地址写*/sacki2c_ack_read();/*检测从机应答*/if(sack1)return 1;writebyte(mem_addr);/*送数据地址*/sacki2c_ack_read();/*检测从机应答*/if(sack1)return 1;i2cstart();/*开始*/writebyte((dev_addr 1) | 1);/*送器件地址读*/sacki2c_ack_read();/*检测从机应答*/if(sack1)return 1;for(i0;ibuflen;i){buf[i]readbyte(); /*读一字节数据到指定的缓冲区中*/if(i(buflen-1))i2c_ack_write(M_NACK); /*读完后主机不应答通知从机释放 sda*/elsei2c_ack_write(M_ACK); /*若未读完主机应答继续读*/}return 0;/*返回 0读成功*/ } 4.3 串口中断服务函数 4.3.1 接收中断处理函数 __interrupt void MD_INTSR0(void) {UCHAR err_type;UCHAR rx_data;err_type ASIS0;rx_data RXB0;P7rx_data;if( err_type 0x07 ){CALL_UART0_Error( err_type );return;}if(rx_datac) /*接收到 c 命令 flag 置 1*/{flag1;return;}if(rx_datas) /*接收到 s 命令 flag 置 2*/{flag2;return;}if(rx_dataw) /*接收到 w 命令 flag 置 4*/{flag4;return;}if(rx_datar)/*接收到 r 命令 flag 置 5*/{flag5;return;}if(gUart0RxLen gUart0RxCnt)/*正常接收数据非命令*/{*gpUart0RxAddress rx_data;gpUart0RxAddress;gUart0RxCnt;}elseflag3;/*接收缓冲区满 flag 置 3*/ } 4.3.2 发送中断处理函数 __interrupt void MD_INTST0(void)/*发送中断处理函数*/ {if( gUart0TxCnt 0 ){TXS0 *gpUart0TxAddress;gpUart0TxAddress;gUart0TxCnt--;}else /*发送完毕*/{P1.20;/*将 485 设置为接收模式*/SRMK00;/*开接收中断*/} } 4.4 宏定义和声明 extern volatile USHORT gUart0RxCnt; /*接收数据统计*/ extern UCHAR flag;/*串口调试软件终端发送的命令标识*/#define NOP_num 60/*延时函数中 NOP()指令的执行次数*/ #define scl P6.0 /*开漏输出引脚 P6.0 作为时钟引脚*/ #define sda P6.1 /*开漏输出引脚 P6.1 作为数据引脚*/ #define sclout PM6.00 /*时钟引脚输出模式*/ #define sdaout PM6.10 /*数据引脚输出模式*/ #define sclin PM6.01 /*时钟引脚输入模式*/ #define sdain PM6.11 /*数据引脚输入模式*/#define DEV_ADDR 0x50 /*器件地址宏定义输出*/#define M_NACK 1 /*主机无应答常量定义*/ #define M_ACK 0 /*主机应答常量定义*/void delay(void); /*SCL 时序控制延时函数*/ void delay_long(UINT a);/*长延时函数*/void i2cinit(void);/*IIC 引脚初始化函数*/void i2cstart(void);/*启动函数*/ void i2cstop(void);/*停止函数*/ void i2c_ack_write(UCHAR);/*主机应答处理函数*/ UCHAR i2c_ack_read(void);/*从机应答处理函数*/void writebyte(UCHAR dat);/*写一个字节函数只是数据段传送的操作即开始与应答之间的操作但不包括开始和应答*/ UCHAR readbyte(void);/*读一个字节函数只是数据段传送的操作即开始与应答之间的操作但不包括开始和应答*/UCHAR writebyte_to_anyaddr(UCHAR dev_addr,UCHAR mem_addr,UCHAR dat);/*向任意地址写一个数包括开始信号、数据传送、应答信号从机但不包括停止信号*/ UCHAR readbyte_from_anyaddr(UCHAR dev_addr,UCHAR mem_addr);/*从任意地址中读一个数包括开始信号和数据传送但不包括应答信号主机和停止信号*/UCHAR writenbytes_to_anyaddr(UCHAR dev_addr,UCHAR mem_addr,UCHAR* buf,UCHAR buflen);/*向任一地址开始的连续多个储存单元写一串数据*/ UCHAR readnbytes_from_anyaddr(UCHAR dev_addr,UCHAR mem_addr,UCHAR* buf,UCHAR buflen);/*从任一地址开始的连续多个储存单元读出一串数据*/ 4.5 主处理函数main void main( void ) {UCHAR wbuf[256]{0};/*待写到 EEPROM 中的数据缓冲区*/UCHAR rbuf[256]{0};/*从 EEPROM 中读出的数据缓冲区*/UCHAR wend[] write end!;/*写完成提示*/UCHAR temp0;UCHAR i;UCHAR wnum0;i2cinit();/*IIC 引脚初始化*/UART0_ReceiveData( wbuf,256);/*串口接收数据函数初始化*/P1.20;/*RS-485 使能引脚设置为数据接收模式*/UART0_Start(); /*启动串口*/P7.00; /*程序运行 LED 指示*/while (1){if(flag 1)/*c 命令串口接收数据函数初始化*/{UART0_ReceiveData( wbuf,256);flag0;}if(flag 2)/*s 命令,单片机将接收到的数据发送到串口调试终端显示*/{SRMK01;/*屏蔽接收中断*/P1.21; /*单片机设置为数据发送模式*/delay_long(1);flag0;temp(UCHAR)gUart0RxCnt;/*强制类型转换*/UART0_SendData(wbuf,temp);/*将接收的数据发送到串口调试终端*/}if(flag3)/*接收缓冲区满初始化串口接收函数覆盖原来的数据*/{flag0;UART0_ReceiveData( wbuf,256);}if(flag4)/*w 命令将 wbuf 中的数据写入 EEPROM 中*/{flag0;DI();/*写过程禁止中断*/temp(UCHAR)gUart0RxCnt;writenbytes_to_anyaddr(DEV_ADDR,0,wbuf,temp);i2cstop();delay_long(2);i2cstart();writebyte_to_anyaddr(DEV_ADDR,250, temp);i2cstop();EI();/*开中断*/SRMK01;/*屏蔽接收中断*/P1.21; /*设置为发送模式*/UART0_SendData( wend,sizeof(wend));/*发送写结束字符串到串口调试终端显示*/}if(flag5)/*r 命令将刚才写入到 EEPROM 中的数据读出到 rbuf 中并发送到串口调试终端显示*/{flag0;DI();/*读过程中禁止中断*/i2cstart();readbyte_from_anyaddr(DEV_ADDR,250,wnum);i2cstop();delay_long(1);readnbytes_from_anyaddr(DEV_ADDR,0,rbuf,wnum); /*读数据*/i2cstop();EI();/*开中断*/SRMK01;P1.21;delay_long(1);UART0_SendData(rbuf,wnum);}} } 五.测试结果 发送 “1,2,3....18” 共 18 个数给单片机让单片机以页写的方式写入 24C04 中。 结果如下 1 若不进行页边界处理则 17 和 18 两个数覆盖 01 和 02即为页上卷且说明页内字节数为 16字节。如下图 2进行页边界处理后结果如下图
http://www.zqtcl.cn/news/958042/

相关文章:

  • 首页网站模板网站外链分析怎么做
  • so域名的网站有哪些结合公众号小店做网站
  • 阜宁专业做网站做信息网站能挣钱吗
  • wordpress 怎么手动更新宝安网站 建设seo信科
  • 腾讯的网站建设用了多少钱找人合伙做网站平台
  • 企业网站功能模块介绍服务器免费体验
  • 小程序制作收款网站结构优化的优化包括
  • 北京市建设工程质监站网站poi player wordpress
  • php网站开发工程师招聘网自己做小程序要钱吗
  • 两学一做考试网站空间网
  • 齐诺网站建设东莞网站建设做网站集团网站群
  • 网站运营策略如何做软件网站开发培训
  • 数据库型网站wordpress上传工具
  • 太原建站公司模板宁波seo公司哪家好
  • 电商网站都是用什么做的承接电商网站建设
  • c2c网站代表有哪些怎样制作个人网站
  • wordpress linux 建站安丘市建设局官方网站
  • 谁给个好网站硬件开发是什么
  • 海外网站加速器免费长春做网站优化哪家好
  • 建立网站需要多长钱电脑网页设计培训
  • 给网站划分栏目邢台做网站优化费用
  • 网群企业网站管理系统红塔区住房和城乡建设局网站
  • 濮阳网站建设在哪做沈阳百度网站的优点
  • 网站上如何做问卷调查温州建设局官方网站
  • 做一件代发哪个网站好具有品牌的福州网站建设
  • 邢台移动端网站建设犀牛建模教程
  • 华池网站建设广西柳州市
  • 泰安网站建设推荐软件商店电脑版官方下载
  • 站长平台网站报价单模板表格
  • 织梦做的网站老是被黑杭州网站设计询问蓝韵网络