啥也不说了,先贴程序吧:
//采用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 编辑 ]
|