iar for 8051 编译问题 我写了一个程序,编译没错也没警告,可下载到单片机中就是运行不了!

#include <io80C52.h>
#include <intrinsics.h>
#include <stdio.h>

#define Uint8 unsigned char
#define Uint16 unsigned int

#define CS P3_bit.INT0 //P3^2
#define SDA P3_bit.T1 //P3^5
#define SCK P3_bit.T0 //P3^4

void Send_byte(Uint8 a,Uint8 b);

void main(void)
{
P3 = 0xff;
while(1)
{
Send_byte(0x03,0x03);
}
}

void Send_byte(Uint8 a,Uint8 b)
{
Uint8 i;
CS = 0;
for(i=8;i>0;i--)
{
SDA = a&0x80;
SCK = 0;
a <<= 1;
SCK = 1;
}
CS = 1;

__no_operation();
__no_operation();
__no_operation();
__no_operation();
__no_operation();
__no_operation();
__no_operation();
__no_operation();
__no_operation();
__no_operation();

CS = 0;
for(i=8;i>0;i--)
{
SDA = b&0x80;
SCK = 0;
b <<= 1;
SCK = 1;
}
CS = 1;
}

生成的hex文件反汇编如下:
0000: 00 NOP
0001: 00 NOP
0002: 00 NOP
0003: 17 DEC @R1
0004: 00 NOP
0005: 00 NOP
0006: 80 FB SJMP 0003H
0008: 12 00 23 LCALL 0023H
000B: B9 00 03 CJNE R1,#00H,0011H
000E: 02 00 11 LJMP 0011H
0011: 12 00 29 LCALL 0029H
0014: 12 00 03 LCALL 0003H
0017: 75 D0 00 MOV PSW,#00H
001A: 75 81 AF MOV SP,#0AFH
001D: 53 A2 FE ANL 0A2H,#0FEH
0020: 02 00 08 LJMP 0008H
0023: 79 01 MOV R1,#01H
0025: 53 A2 FE ANL 0A2H,#0FEH
0028: 22 RET
0029: 75 B0 FF MOV P3,#0FFH
002C: 7A 03 MOV R2,#03H
002E: 79 03 MOV R1,#03H
0030: 12 00 35 LCALL 0035H
0033: 80 F7 SJMP 002CH
0035: C2 B2 CLR P3.2
0037: 7B 08 MOV R3,#08H
0039: 80 07 SJMP 0042H
003B: C2 B5 CLR P3.5
003D: C2 B4 CLR P3.4
003F: D2 B4 SETB P3.4
0041: 1B DEC R3
0042: EB MOV A,R3
0043: C3 CLR C
0044: 94 01 SUBB A,#01H
0046: 50 F3 JNC 003BH
0048: D2 B2 SETB P3.2
004A: 00 NOP
004B: 00 NOP
004C: 00 NOP
004D: 00 NOP
004E: 00 NOP
004F: 00 NOP
0050: 00 NOP
0051: 00 NOP
0052: 00 NOP
0053: 00 NOP
0054: C2 B2 CLR P3.2
0056: 7B 08 MOV R3,#08H
0058: 80 07 SJMP 0061H
005A: C2 B5 CLR P3.5
005C: C2 B4 CLR P3.4
005E: D2 B4 SETB P3.4
0060: 1B DEC R3
0061: EB MOV A,R3
0062: C3 CLR C
0063: 94 01 SUBB A,#01H
0065: 50 F3 JNC 005AH
0067: D2 B2 SETB P3.2
0069: 53 A2 FE ANL 0A2H,#0FEH
006C: 22 RET

我发现SDA = a&0x80;a <<= 1;SDA = b&0x80;b <<= 1;这些根本就没意义,这是什么原因呢,哪位大虾帮我看看啊,多谢了!!!
我的接收端是硬件的SPI,时序是没问题的。我发现的问题是在反汇编里找不到“左移”的指令,也找不到“与”指令。难到SDA = a&0x80;a <<= 1;在汇编里不用“与”和“左移”就能实现???
Send_byte(0x03,0x03);// "0x03"两个参数
002C: 7A 03 MOV R2,#03H
002E: 79 03 MOV R1,#03H

CS = 0;//P3.2=0;
0035: C2 B2 CLR P3.2

for(i=8;i>0;i--)
{
SDA = a&0x80;
SCK = 0;
a <<= 1;
SCK = 1;
}
对应汇编如下:
0037: 7B 08 MOV R3,#08H
0039: 80 07 SJMP 0042H
003B: C2 B5 CLR P3.5 ;这是数据
003D: C2 B4 CLR P3.4 ;这是时钟
003F: D2 B4 SETB P3.4
0041: 1B DEC R3
0042: EB MOV A,R3
0043: C3 CLR C
0044: 94 01 SUBB A,#01H
0046: 50 F3 JNC 003BH
从以上根没看到对“a”(0x03)进行过操作。P3.5 一直是0。
我用的上IAR FOR 8051 是不是我没设置好。
这c程序移殖到keil上是没错的可以运行出正确结果。

你的程序是要实现串行发送数据吧,SDA=a&0x80;a<<=1;它是用来把并行数据a转成串行数据一位一位放到数据总线上,然后通过SCK控制发送。你应该看下所使用的时钟,然后看下串行发送的时序波形,保证时间能确保发送数据的格式正确。
温馨提示:答案为网友推荐,仅供参考