本帖最后由 Harvard 于 2017-11-29 21:35 编辑
基于新唐N76E003的加速度传感器ModbusRtu远传(老贴新发,绝对原创)
注新唐的003, 主要功能就是通过003读取加速度传感器的数据,将他 通过串口送出. 串口符合modbus RTU 485协议. 适合长距离输送 .工作在主从模式,接受工控机,触摸屏等主机的查询.
关注新唐的003有段时间了,简洁,功能强大 ,引脚少. 加上1.x的价格 还是适合做很多很多的应用.51内核.比起M0, 可以省去大量的库函数. 官方的BSP 与M051的bsp一比, 有点安然失色.好在是8位机, 自己稍加修改所带的例程,基本可以把芯片玩转. 怎么说? 51 还是大家都熟悉的. 尤其是我们这帮70 after,和80after. 51相对比较熟悉.
用的过程中,也是遇到一些问题,基本都在论坛解决了.
其一:
在mdk中,通过nulink烧写,无法进行config加密, 只能到icp 软件中进行. 在icp中.选择8051 1T单片机即可; 不知道为何在使用003时所用的固件不是最新的而是比最高版本有一个版本号的差距.导致正在使用的M0调试器,与51调试器 需要来回的切换固件版本.
其二:
在MDK5.23中使用时,使用nulink 插件时, debug,无法在c中,单步运行或者设置断点,光标一直在汇编的disassebly窗口中. 而这一功能在mdk4中可以正常运行. 官方FAE建议重装MDK4. MDK5 懒得折腾了.就用mdk4.74进行开发吧;
其三:
在mdk中调试的时候,虽然勾选了periodical update,但是watch窗口中的数据无法在全速运行中进行查看 带来诸多不变, 要查看数据,只有进行暂停, 这点没有在调试M051方便, 是因为8051的内置调试单元与M051中的内置调试单元导致的么? 求解.
目前,遇到的问题就是这么几个; 片子用起来还是不错. 内部的18K,还做了dataflash 模拟eeprom . IO的使用模式与M051相差无几. 输入, opendrain,push-pull, 准双向. 用过新唐M0,再用这些再爽不过了.
言归正传, 主要是设计了一个N76E003通过spi口驱动adxl345加速度传感器, 然后通过uart0串口通过485芯片,远程接收modbus RTU主机的查询;
M@9SOV{{C9QD0)CUU8HG8{V.png (72.25 KB, 下载次数: 2)
下载附件 保存到相册
2017-7-4 22:26 上传
- /*******************************************************************************
- * FUNCTION_PURPOSE: Main function
- ******************************************************************************/
- void main (void)
- {
- /* 系统初始化*/
- SYS_init();
- TMR0_Init();
- TMR1_Init();
- TMR2_Init();
- /* 初始化串口 */
- InitialUART0_Timer3(9600);
- //SPI_Initial();
- /* 看门狗初始化 */
- WDT_Initial();
- /* 开中断 */
- sei();
- /* 测试程序 */
- /* APP程序初始化 */
- LED_operate (_LED1_, ON);///点亮工作指示灯;
- LED_flash (_LED1_, ON);
- /* 初始化adxl345 */
- SYS_adxl_buf[0] = 0x0b;
- WriteToADXL345ViaSpi(XL345_DATA_FORMAT,1,SYS_adxl_buf);
- SYS_adxl_buf[0] = 0x08;
- WriteToADXL345ViaSpi(XL345_POWER_CTL,1,SYS_adxl_buf);
- ReadFromADXL345ViaSpi(XL345_DEVID,1,SYS_adxl_buf);
- SYS_adxl345_deviceid = SYS_adxl_buf[0];
- /****** 主循环 *******/
- while(1)
- {
- if( f20ms)
- {
- f20ms =0;
- /* 读取三轴的数据值, 13bit分辨率, 量程+-16g */
- ReadFromADXL345ViaSpi(XL345_DATAX1,1,SYS_adxl_buf);
- SYS_x_data = SYS_adxl_buf[0];
- SYS_x_data = SYS_x_data<<8;
- ReadFromADXL345ViaSpi(XL345_DATAX0,1,SYS_adxl_buf);
- SYS_x_data = SYS_x_data +SYS_adxl_buf[0];
- ReadFromADXL345ViaSpi(XL345_DATAY1,1,SYS_adxl_buf);
- SYS_y_data = SYS_adxl_buf[0];
- SYS_y_data = SYS_y_data<<8;
- ReadFromADXL345ViaSpi(XL345_DATAY0,1,SYS_adxl_buf);
- SYS_y_data = SYS_y_data +SYS_adxl_buf[0];
- ReadFromADXL345ViaSpi(XL345_DATAZ1,1,SYS_adxl_buf);
- SYS_z_data = SYS_adxl_buf[0];
- SYS_z_data = SYS_z_data<<8;
- ReadFromADXL345ViaSpi(XL345_DATAZ0,1,SYS_adxl_buf);
- SYS_z_data = SYS_z_data +SYS_adxl_buf[0];
- }
- /* 3- MODBUS_RTU通信处理 */
- mod_process();
- /* x-喂狗 */
- WDT_reset();
- }
- /****** 主循环 *******/
- }
复制代码
|
|