这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 坤创E-Geek/天科大新电社 » 【忆往昔征文】之全国智能互联大赛比赛总结二——写程序篇

共2条 1/1 1 跳转至

【忆往昔征文】之全国智能互联大赛比赛总结二——写程序篇

菜鸟
2018-08-15 19:56:01     打赏

本次参加比赛大概用了一个月的时间

IMG_2537.JPG

    我感触最深的是:比赛拿奖不是重点(当然能拿奖函数一定要拿的),重要的是你通过比赛学到了什么,学会了什么,以后该怎么做。我认为比赛只是我们的起点,而不是终点。他激发了我们更大的学习兴趣。可以为我们指导未来学习的方向。以及确定自己发展的方向。

                            

    下面我以写程序举例:

我的指导老师和我们说过这样的话:写程序一般要经过这样的几个阶段
第一阶段模仿别人写的驱动,
第二阶段去网上搜别人写好的程序使用
第三阶段感觉别人写的程序不适合自己的程序使用,开始对着芯片手册写适合自己用的驱动

          

就比如说简单的HX711模块



            这是一个24位高精度A/D转换器芯片,是一款专为高精度电子称而设计的,具有两路模拟通道输入,内部集成128倍增益可编程放大器。本人在开始用的时候手里有一份51改成32         的程序,在别人的模块(亲测)可以完美使用。但是到了我买的模块上就不好用了图片:纠结  (可能是买模块的时候贪便宜吧,个人经费有限)之后又在网上百度了一下驱动,

     但是用起来都和自己的要求有点差距,最后只好自己写驱动。由于这个驱动也

     是十分简单,于是就写了一下。其实在参加比赛尤其是时间短功能多的程序。

     还是移植别人的程序比较好,这样可以留出大量时间去调试自己的作品。一个

     完善的作品最难最耗时间的也是调试和找bug。下面是我写的程序(新手希望不要嘲笑)。

 

/*HX711-是24位AD 芯片。*/

#include "stm32f10x.h"

#include "HX711.h"

 

//#include "usart.h"

unsigned long HX711_init_Read=0;        //局变量

 

void HX711_Init(void){//初始化

        u8 a =0;

        unsigned long c=0;

        GPIO_InitTypeDef  GPIO_InitStructure;

                //HX711_DT 为输入初始化

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);      

        GPIO_InitStructure.GPIO_Pin = HX711_DT; //选择端口号(0~15或all)                       

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //选择IO接口工作方式         

        GPIO_Init(HX711_PORT, &GPIO_InitStructure);

          //HX711_SK 为输出初始化   

        GPIO_InitStructure.GPIO_Pin = HX711_SK; //选择端口号(0~15或all)                       

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式      

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)   

        GPIO_Init(HX711_PORT, &GPIO_InitStructure);       

        SysTick_Delay_Ms(10);

        for(a=0;a<2;a++)

        {

                c += HX711_Read();

                SysTick_Delay_Ms(3);

        }

        HX711_init_Read =HX711_Read();        //作为初始的值

        SysTick_Delay_Ms(50);

}

 

unsigned long HX711_Read(void)   //读取HX711的数值

{

        unsigned long Count=0;

        u8 a=0;

        GPIO_ResetBits(HX711_PORT,HX711_SK);        //将SK 拉低 等待数据到来

        SysTick_Delay_Us(1);

        while(GPIO_ReadInputDataBit(HX711_PORT,HX711_DT));        //等待DT变低 说明开始传输数据

        SysTick_Delay_Us(1);        //最小值 0.1us

        for(a=0;a<24;a++)

        {//前24个数据

                GPIO_SetBits(HX711_PORT,HX711_SK);//拉高 SK

                Count = Count<<1;

                SysTick_Delay_Us(1);//最大值50us 最小值0.2us

                GPIO_ResetBits(HX711_PORT,HX711_SK);        //拉低 SK

                if(GPIO_ReadInputDataBit(HX711_PORT,HX711_DT))//收到 1

                        Count++;       

                SysTick_Delay_Us(1);//最小值0.2us

        };

        GPIO_SetBits(HX711_PORT,HX711_DT);//拉高 SK

        Count = Count^0x800000;

        GPIO_ResetBits(HX711_PORT,HX711_DT);        //拉低 SK

        SysTick_Delay_Us(1);

        return Count;

}

  

float HX711_Weight(void)

{//读取当前数值 并转化为g 返回

//        unsigned long b=0;

        unsigned long count = 0;        //取数值

        float weight=0.0;

//        b = HX711_Read();

//        delay_ms(5);

        count = HX711_Read();

        SysTick_Delay_Us(2);

        weight = (long)(count>>7)-(long)(HX711_init_Read>>7);        //(long)(HX711_init_Read>>5);//差值为当前数值

        weight = weight/16.84;

        SysTick_Delay_Us(2);

        return weight;

}

 

u8 HX711_WaitData(float weight){//讲重量换算成数值 然后一直等待数值

        int MachineData =0;

        int count=0;

        MachineData = (int)((weight*16.84)+(HX711_init_Read>>7));

//        printf("MachineData = %d \r\n" ,MachineData);

        count = (int)(HX711_Read()>>7);        //读取

        if(MachineData>=count)

        {//设定值大于当前值

                while(MachineData - count > 10)

                {//循环对比

                        SysTick_Delay_Ms(100);

                        count = (int)(HX711_Read()>>7)+20;        //读取

        //                printf("count = %d \r\n",count);

                };

                return 1;

       

        }

        else

        {        //设定值小于当前值

                while(count- MachineData > 10)

                {//循环对比

                        SysTick_Delay_Ms(100);

                        count = (int)(HX711_Read()>>7);        //读取

  //                      printf("count = %d \r\n",count);

                };

                return 1;

        }

}

 

    这样自己写驱动,虽然驱动比较简单但是却能锻炼我们的逻辑能力。这样

写一遍收获还是很大的!

    在设计的方案的实时切记不要想得很飘,脱离了实际。导致最后完不成作品只能弃赛!








管理员
2018-08-16 09:25:50     打赏
2楼

谢谢楼主分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]