程序移植 通不过 睡不着
时间:10-02
整理:3721RD
点击:
STC89C52RC上正常运行 移植到STC12C2052AD上就是不行 求助(电路图就不上了 看了代码应该都明白)
//头文件:
#include "reg51.h"
//IO引脚定义:
sbit hwx=P3^3;//红外接收数据引脚,
sbit jdqa=P2^0;
sbit jdqb=P2^1;//继电器控制引脚(换成led)
sbit jdqc=P2^2;
sbit jdqd=P2^3;
/********数据定义*************************************************************/
unsigned char ly_lhj[4];//保存NEC的四个字节数据
unsigned char ly_ct=0;//计数时间量
bit ly_flag=0;//成功接收标志
//函数声明:
void delay100us(void);
/***********主函数开始********************************************************/
void main(void)
{
EA=1;//首先开启总中断
EX1=1;//开启外部中断1,红外接收数据引脚
IT1=1;//设置成下降沿触发方式
while(1){
if(ly_flag){//接收成功处理按键功能,这里只控制继电器,其它可自行加入
ly_flag=0;
if((ly_lhj[2]==0x10)&&(ly_lhj[3]=0xff))//按键1的控制码
jdqa=~jdqa;//启动或关闭继电器a
if((ly_lhj[2]==0x11)&&(ly_lhj[3]=0xff))//按键2键的控制码
jdqb=~jdqb;//启动或关闭继电器b,
if((ly_lhj[2]==0x12)&&(ly_lhj[3]=0xff))//按键3键的控制码
jdqc=~jdqc;//启动或关闭继电器c,
if((ly_lhj[2]==0x14)&&(ly_lhj[3]=0xff))//按键4键的控制码
jdqd=~jdqd;//启动或关闭继电器d
}
}
}
/***********外中断1入口函数,P13引脚,红外线接收IC数据脚**************************/
void hongwai(void) interrupt 2
{
unsigned char i,ia;
/**************开始判断是否为NEC波形引导码的前9MS和后4.5MS******************************/
ly_ct=0;//计数时间清0
while(!hwx)
delay100us();//调用0.1MS延时计数,ly_ct每调用一次加1
if(ly_ct<80||ly_ct>100)//NEC引导码前9MS,ly_ct约等于90,给个误差值,用80-100之间来判断
return;
ly_ct=0;
while(hwx){
delay100us();
if(ly_ct>50)//NEC引导码引导码的后4。5MS,ly_ct约45
return;
}
if(ly_ct<40)//NEC引导码引导码的后4。5MS,ly_ct约45
return;
/***********开始接收四个字节内容**************************************/
for(i=0;i<4;i++){
for(ia=0;ia<8;ia++){
while(!hwx); //低电平开始,不处理只等待高电平接收
ly_ct=0;
while(hwx){ //高电平开始,
delay100us();
if(ly_ct>20)
return;
}
//高电平结束,判断数据1或0向变量移入
ly_lhj[i]>>=1; //数据由高位移入低位
if(ly_ct>10) //时间量TH1高于10,即高于1MS判断为1
ly_lhj[i]|=0x80;
}
}
ly_flag=1; //接收成功
TF1=0;
}
void delay100us(void)
{
unsigned char i=15;
while(i--);
ly_ct++;
}
//头文件:
#include "reg51.h"
//IO引脚定义:
sbit hwx=P3^3;//红外接收数据引脚,
sbit jdqa=P2^0;
sbit jdqb=P2^1;//继电器控制引脚(换成led)
sbit jdqc=P2^2;
sbit jdqd=P2^3;
/********数据定义*************************************************************/
unsigned char ly_lhj[4];//保存NEC的四个字节数据
unsigned char ly_ct=0;//计数时间量
bit ly_flag=0;//成功接收标志
//函数声明:
void delay100us(void);
/***********主函数开始********************************************************/
void main(void)
{
EA=1;//首先开启总中断
EX1=1;//开启外部中断1,红外接收数据引脚
IT1=1;//设置成下降沿触发方式
while(1){
if(ly_flag){//接收成功处理按键功能,这里只控制继电器,其它可自行加入
ly_flag=0;
if((ly_lhj[2]==0x10)&&(ly_lhj[3]=0xff))//按键1的控制码
jdqa=~jdqa;//启动或关闭继电器a
if((ly_lhj[2]==0x11)&&(ly_lhj[3]=0xff))//按键2键的控制码
jdqb=~jdqb;//启动或关闭继电器b,
if((ly_lhj[2]==0x12)&&(ly_lhj[3]=0xff))//按键3键的控制码
jdqc=~jdqc;//启动或关闭继电器c,
if((ly_lhj[2]==0x14)&&(ly_lhj[3]=0xff))//按键4键的控制码
jdqd=~jdqd;//启动或关闭继电器d
}
}
}
/***********外中断1入口函数,P13引脚,红外线接收IC数据脚**************************/
void hongwai(void) interrupt 2
{
unsigned char i,ia;
/**************开始判断是否为NEC波形引导码的前9MS和后4.5MS******************************/
ly_ct=0;//计数时间清0
while(!hwx)
delay100us();//调用0.1MS延时计数,ly_ct每调用一次加1
if(ly_ct<80||ly_ct>100)//NEC引导码前9MS,ly_ct约等于90,给个误差值,用80-100之间来判断
return;
ly_ct=0;
while(hwx){
delay100us();
if(ly_ct>50)//NEC引导码引导码的后4。5MS,ly_ct约45
return;
}
if(ly_ct<40)//NEC引导码引导码的后4。5MS,ly_ct约45
return;
/***********开始接收四个字节内容**************************************/
for(i=0;i<4;i++){
for(ia=0;ia<8;ia++){
while(!hwx); //低电平开始,不处理只等待高电平接收
ly_ct=0;
while(hwx){ //高电平开始,
delay100us();
if(ly_ct>20)
return;
}
//高电平结束,判断数据1或0向变量移入
ly_lhj[i]>>=1; //数据由高位移入低位
if(ly_ct>10) //时间量TH1高于10,即高于1MS判断为1
ly_lhj[i]|=0x80;
}
}
ly_flag=1; //接收成功
TF1=0;
}
void delay100us(void)
{
unsigned char i=15;
while(i--);
ly_ct++;
}
这两种单片机速度差别很大的
stc12c2052没有P2口,只有八个P1口和七个P3口,io口设置的不对
建议小编还是先了解清楚这两种单片机不同后再移植吧,不要以为STC的单片机真的就那么随便可替换。
有没有谁给点建设性的意见!?那io移过去的改了。
还不明白吗?两种单片机的执行速度不一样,你得重写延时函数