找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1557|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机双字节赋值问题

[复制链接]
跳转到指定楼层
楼主
ID:128176 发表于 2018-6-9 14:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
数据类型
typedef struct
{
        void (*pTask)(void);
        INT16U delay_tick;
        INT16U period_tick;
        INT8U RunMe;
}SCHTask_Typedef;


具体函数
void SCH_Update(void)
{
        INT8U Index;
        
        for (Index = 0; Index < SCH_MAX_TASKS; Index++)
        {
                if (SCH_tasks[Index].pTask)
                {
                        if (SCH_tasks[Index].delay_tick == 0)
                        {
                                SCH_tasks[Index].RunMe += 1;  // Inc. the 'Run Me' flag

                                if (SCH_tasks[Index].period_tick)
                                {
                                        SCH_tasks[Index].delay_tick = SCH_tasks[Index].period_tick;                                        //问题:period_tick = 0x03e8 但赋值后  delay_tick = 0x00e8
                                }
                        }
                        else
                        {
                                SCH_tasks[Index].delay_tick -= 1;
                        }
                }         
        }
}

问题:
上面红色部分出现问题:delay_tick 是led闪烁周期,赋值后led闪烁不是指定的1000ms 而是200ms左右,通过keil模拟仿真发现
delay_tick 赋值后实际是232ms与实际led闪烁周期相符。
实验1:
在SCH_Update函数里建立局部变量 INT16U temp ,作为中间变量,赋值代码改为
temp  = SCH_tasks[Index].period_tick;
SCH_tasks[Index].delay_tick = temp ;
结果:仿真结果delay_tick  = 0x00e8,实际led闪烁也差不多
实验2:
在SCH_Update函数外建立全局变量 INT16U temp ,作为中间变量,赋值代码改为
temp  = SCH_tasks[Index].period_tick;
SCH_tasks[Index].delay_tick = temp ;
结果:仿真结果delay_tick  = 0x03e8,实际led闪烁1s一次

实验3:
直接给delay_tick  赋值 1000
SCH_tasks[Index].delay_tick = 1000;
结果:仿真结果delay_tick  = 0x03e8,实际led闪烁1s一次

请大神指点

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表