3771|5

186

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

一个看似简单的程序引出的问题 [复制链接]

啥也不说了,先贴程序吧:

//采用12M晶振

#include <reg52.h>
#define uchar unsigned char

sbit led=P3^3;
 
void delay_560us()//延时560us
{
      #pragma asm
  
       MOV R7,#7
 L1: MOV R6,#80           
 L2: DJNZ R6,L2
       DJNZ R7,L1
      RET

    #pragma endasm
}

void delay_4500us()//延时4500us
{
   #pragma asm

       MOV R7,#25
 L3: MOV R6,#44
 L4: DJNZ R6,L4
       DJNZ R7,L3
       RET

   #pragma endasm
}

void send(uchar *ir_code)
{
    uchar i,j,dat;
    led=1; //先发送引导码

    delay_4500us();
    led=0;
    delay_4500us();
   //发送用户码,用户反码,数据码,数据反码
     for(i=0;i<4;i++)
   {
      for(j=0;j<8;j++)
     {
        dat=ir_code & 0x01;
       if(dat)
      {//发送 '1' 的代码
         led=1;
         delay_560us(); 
         led=0;
        delay_560us();
        delay_560us();
        delay_560us();
      }
      else
     {//发送 '0' 的代码
       led=1;
      delay_560us();
      led=0;
      delay_560us();
     }
     ir_code>>=1;//右移一位,发送下一个bit
    }
   ir_code++;
  }

}

void main()
{
   uchar ir_dat[]={0xff,0x00,0x55,0xaa};
   while(1)
   {
     send(ir_dat);
   }
}

 

       这个程序是根据现在市场上普遍使用的红外编码的信号格式写出来的,

发送用户码、用户反码,数据码和数据反码之前先发送引导码,引导

码格式为:4.5ms高电平然后 4.5ms低电平

 

       发送完引导码后,就可以发送用户码、用户反码、数据码和数据反码了

其格式为:

       分别发送四个数据,每个数据都是先发低位后发高位,其中,0的表示为

0.56ms高电平和0.56ms低电平,1的表示为0.56ms高电平和3个0.56ms低

电平。

 

问题描述:

        为了做到精确延时,我在C中嵌入了汇编程序,作为延时的精确实现,

问题也从这里出来,开始的时候是提示

 

      好了,问题出来了,咱就解决呗,搜索了网上的办法,结果需要在编译器里设置一下,

步骤为:右键单击这个'.C'文件弹出对话框,如下:

 

      问题就出在右面的两个带有'SRC'的复选框上,将其选中即可解决这个问题,效果为:

 

      本以为这样就把问题解决了,可是编译的时候又有新的问题出现,请各位看官接着看,别着急

小弟还等着各位给个说法呢:

 

       我的妈呀,竟然有9个警告,还是同一个类型的,看的出来这是由于引用了外部

变量引起的,不过,我又想了想,我没有用外部变量啊,难道是汇编里出了问题?

于是我又向百度求助,可是这次我失望了,里面的答案都无法解决我的问题。这到底

是那里出了问题呢?百思不得其解,请各位,将代码复制到自己的编译器里运行一下

给我一个解决的方案,谢了……

 

[ 本帖最后由 libin200899 于 2011-5-18 14:08 编辑 ]
此帖出自51单片机论坛

最新回复

楼主的程序没有问题的,是keil 的设置问题  详情 回复 发表于 2011-5-19 20:29
点赞 关注
 

回复
举报

140

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
百度到的方法
http://wenku.baidu.com/view/d9d1cb160b4e767f5acfce98.html

还有看看程序有没有不妥的地方
dat=ir_code & 0x01;
ir_code>>=1;//右移一位,发送下一个bit
能对指针这样操作吗?
此帖出自51单片机论坛
 
 
 

回复

186

帖子

0

TA的资源

纯净的硅(中级)

板凳
 

回复 沙发 zxcscm 的帖子

是啊,这点有点小问题,不过这是在贴过来程序时弄错的,本来的程序里是 ir_code[ i ]>>=1; [ 本帖最后由 libin200899 于 2011-5-18 21:27 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

2万

帖子

74

TA的资源

管理员

4
 

回复 板凳 libin200899 的帖子

上传代码时 可以选择代码功能的 这样就不会和网页的代码重合
此帖出自51单片机论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 楼主 libin200899 的帖子

用keil 4编译,楼主问题出在那两段汇编延时程序。(注释掉汇编部分可通过编译)
具体是什么问题,在下也没搞出来!
此帖出自51单片机论坛
 
 
 

回复

140

帖子

0

TA的资源

一粒金砂(高级)

6
 

回复 5楼 javine 的帖子

楼主的程序没有问题的,是keil 的设置问题
此帖出自51单片机论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表