一个看似简单的程序引出的问题

2019-03-24 19:57发布

啥也不说了,先贴程序吧: //采用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中嵌入了汇编程序,作为延时的精确实现, 问题也从这里出来,开始的时候是提示 问题1.jpg         好了,问题出来了,咱就解决呗,搜索了网上的办法,结果需要在编译器里设置一下, 步骤为:右键单击这个'.C'文件弹出对话框,如下: 问题1解决.jpg         问题就出在右面的两个带有'SRC'的复选框上,将其选中即可解决这个问题,效果为: 问题1解决2.jpg         本以为这样就把问题解决了,可是编译的时候又有新的问题出现,请各位看官接着看,别着急 小弟还等着各位给个说法呢: 问题2.jpg          我的妈呀,竟然有9个警告,还是同一个类型的,看的出来这是由于引用了外部 变量引起的,不过,我又想了想,我没有用外部变量啊,难道是汇编里出了问题? 于是我又向百度求助,可是这次我失望了,里面的答案都无法解决我的问题。这到底 是那里出了问题呢?百思不得其解,请各位,将代码复制到自己的编译器里运行一下 给我一个解决的方案,谢了……   [ 本帖最后由 libin200899 于 2011-5-18 14:08 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
zxcscm
1楼-- · 2019-03-24 22:49
百度到的方法
http://wenku.baidu.com/view/d9d1cb160b4e767f5acfce98.html

还有看看程序有没有不妥的地方
dat=ir_code & 0x01;
ir_code>>=1;//右移一位,发送下一个bit
能对指针这样操作吗?
libin200899
2楼-- · 2019-03-25 00:45
是啊,这点有点小问题,不过这是在贴过来程序时弄错的,本来的程序里是 ir_code[ i ]>>=1; [ 本帖最后由 libin200899 于 2011-5-18 21:27 编辑 ]
linda
3楼-- · 2019-03-25 06:21
上传代码时 可以选择代码功能的 这样就不会和网页的代码重合
javine
4楼-- · 2019-03-25 07:22
用keil 4编译,楼主问题出在那两段汇编延时程序。(注释掉汇编部分可通过编译)
具体是什么问题,在下也没搞出来!
zxcscm
5楼-- · 2019-03-25 10:04
 精彩回答 2  元偷偷看……

一周热门 更多>