打印
[C语言]

如何写好单片机函数?

[复制链接]
828|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
any012|  楼主 | 2016-7-12 11:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
any012|  楼主 | 2016-7-12 11:05 | 只看该作者
本帖最后由 any012 于 2016-7-12 11:10 编辑

//主函数
void main()
{
    Init();                                //初始化
    while(1)
    {
        if(Comu_Busy == 0)                //MODBUS通讯
        {
            GetTemptValue(channelNum);    //获取一路温度值
            if(proceState > 2)            //该路温度读取完成
            {
                proceState = 0;
                channelNum++;            //下一路
                if(channelNum > 3)        //总共4路温度,循环读取
                    channelNum = 0;
            }
        }
    }
}

//读取一路温度值
void GetTemptValue(u8 channelNum)
{
    switch(proceState)                                //判断读取状态
    {
        case 0:                                
            SendConverComand(channelNum+1);            //发送单次转换命令
            proceState = 1;
            break;
        case 1:
            temptValue[channelNum] = CalTempValue(channelNum);    //处理上次读取的数据,转化为温度值
            proceState = 2;
            break;
        case 2:
            adcValue[channelNum+1] = GetAdcDate();    //获取本次adc转化数据
            break;
        default:
            break;
    }
}

//获取adc转化数据
u32 GetAdcdate()
{
    if(SPI_MISO == 0)                //如果SPI_MISO被拉低,说明转换完成,可读取adc数据
    {
        regDate = AD7103_GetRegisterValue(AD7193_REG_DATA,3,0);
        processFlag = 3;
        return regDate;
    }
}

使用特权

评论回复
板凳
any012|  楼主 | 2016-7-12 11:21 | 只看该作者
这是我写的一个单片机程序。
while循环里,调用GetTemptValue(channelNum)函数,参数是通道数。在这个函数外判断一个状态标志processFlag,如果大于3就说明处理完一个通道了,可以进行下一个通道的温度读取了。
GetTemptValue(channelNum)函数里,又根据processFlag做switch语句处理,分别为,0的时候发送转换开始命令,1的时候处理上次读取的数据,2的时候判断adc是否转换完,是的话就读取数据并进入下一个状态。
-----------------------------------------------------------------------------------------------------
这是整理了下思路重新写的,之前写的时候是先写读取adc部分,就是先发送转换命令,然后等待adc转换完成,读取adc值,再进行温度转换。这三部分就在主循环里不断执行。
后来又

使用特权

评论回复
地板
JasonWangSE| | 2016-7-12 12:24 | 只看该作者
推荐参考“Patterns for Time Triggered Embedded Systems”书中的设计理念,中文名叫“时间触发嵌入式系统设计模式”

使用特权

评论回复
5
ningling_21| | 2016-7-12 13:18 | 只看该作者
any012 发表于 2016-7-12 11:21
这是我写的一个单片机程序。
while循环里,调用GetTemptValue(channelNum)函数,参数是通道数。在这个函数 ...

可以参看一下C语言编程规范

使用特权

评论回复
6
any012|  楼主 | 2016-7-12 13:43 | 只看该作者
这是我写的一个单片机程序。
while循环里,调用GetTemptValue(channelNum)函数,参数是通道数。在这个函数外判断一个状态标志processFlag,如果大于3就说明处理完一个通道了,可以进行下一个通道的温度读取了。
GetTemptValue(channelNum)函数里,又根据processFlag做switch语句处理,分别为,0的时候发送转换开始命令,1的时候处理上次读取的数据,2的时候判断adc是否转换完,是的话就读取数据并进入下一个状态。
-----------------------------------------------------------------------------------------------------
这是整理了下思路重新写的,之前写的时候是先写读取adc部分,就是先发送转换命令,然后等待adc转换完成,读取adc值,再进行温度转换。这三部分就在主循环里不断执行。
做完这部分后,又想实现测量四路温度值。于是整理了下,就成上面那种结构了。
但是,觉得写得还是不够清晰。望朋友们帮指点下。

使用特权

评论回复
7
any012|  楼主 | 2016-7-12 14:02 | 只看该作者
感谢两位回复。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

232

帖子

6

粉丝