全局sql 变量赋值不能给TH0赋值

51单片机输出PWM波形频率为什么不能超过350Hz?确切的说,给定时器赋值1000以下,显示就出现很大的误差?_百度知道
51单片机输出PWM波形频率为什么不能超过350Hz?确切的说,给定时器赋值1000以下,显示就出现很大的误差?
&reg51.h&sbit
output=P1^1;sbit
s1=P2^0;sbit s2=P2^1;sbit s3=P2^2;sbit s4=P2^3;sbit s5=P2^4;sbit s6=P2^5;sbit s7=P2^6;sbit
s8=P2^7;unsigned int count=0;#define TH_M1 (65536-count)/256;#define TL_M1 (65536-count)%256;main(){ IE=0x82;
TMOD=0x01;
if(s1==0) count=5;
else if(s2==0) count=10;
//频率为:50K Hz
else if(s3==0) count=50; //频率为:10K
else if(s4==0) count=100; //频率为:5K
else if(s5==0) count=500; //频率为:1K
else if(s6==0) count=1000; //频率为:500
else if(s7==0) count=5000; //频率为:100
else if(s8==0) count=10000; //频率为:50
TH0=TH_M1;TL0=TL_M1;
while(TF0==0);
我有更好的答案
你的程序通过循环得以执行,循环本身就需要时间。准确的PWM最好通过计数器自动装载。 要不,你就通过单步调试测出每一条语句的执行时间,加(或减)到定时器里去。汇编语言较易实现,C必须耐心测试,还不能有中断。
使用T2,16位自动装载模式,或T0,T1的8位自动装载模式
其他类似问题
pwm波形的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁新手求指点!!!!!!!!!!!!程序|我爱单片机 - 数码之家
查看完整版本: [--
赞助商链接
&& 想做个多路红外控制继电器。这是遥控器[attachment=2442363]下面这个程序为什么不能用呢?&&还有这么把它改成多路的。下面这个程序只控制一个P2^0 口&&求大侠指点&& 谢谢了/**********************************************************************************************************************************************************************************/#include &reg51.h&//IO引脚定义:sbit JDQ=P2^0;&&&&&&&&//继电器控制引脚sbit hwx=P3^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]==0x00)&&(ly_lhj[3]=0xff))&&&&//电源键的控制码&&&&&&&&&&&&&&&&JDQ=~JDQ;&&&&&&&&//启动或关闭继电器,可控制其它设备&&&&&&&&}&&&&}&&&&&&&&}/***********外中断1入口函数,P33引脚,红外线接收IC数据脚**************************/void hongwai(void)&& interrupt 2{&&&&unsigned char i,&&&&/**************开始判断是否为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之间来判断&&&&&&&&&&&&ly_ct=0;&&&&while(hwx){&&&&&&&&&&&&delay100us();&&&&&&&&if(ly_ct&50)&&&&&&&&//NEC引导码引导码的后4。5MS,ly_ct约45&&&&&&&&&&&&&&&&&&&&&&&&}&&&&if(ly_ct&40)&&&&&&&&&&&&//NEC引导码引导码的后4。5MS,ly_ct约45&&&&&&&&&&&&/***********开始接收四个字节内容**************************************/&&&&&&&&for(i=0;i&4;i++){&&&&&&&&for(ia=0;ia&8;ia++){&&&&&&&&&&&&while(!hwx);&&&&&&&&//低电平开始,不处理只等待高电平接收&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ly_ct=0;&&&&&&&&&&&&while(hwx){&&&&&&&&&&&&//高电平开始,&&&&&&&&&&&&&&&&delay100us();&&&&&&&&&&&&&&&&if(ly_ct&20)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&//高电平结束,判断数据1或0向变量移入&&&&&&&&&&&&ly_lhj&&=1;&&&&&&&&&&&&//数据由高位移入低位&&&&&&&&&&&&if(ly_ct&10)&&&&&&&&&&&&&&&&//时间量TH1高于10,即高于1MS判断为1&&&&&&&&&&&&&&&&ly_lhj|=0x80;&&&&&&&&}&&&&}&&&&ly_flag=1;&&&&//接收成功&&&&TF1=0;}void delay100us(void){&&&&unsigned char i=15;&&&&while(i--);&&&&ly_ct++;}
赞助商链接
进入中断后,把外部中断关掉试一下再者注意一下中断号用的对不对一般接受程序用外部中断唤醒,然后用定时中断做。你这样做,可能比较难做
控制多路的话,就是解析接受的命令,不同的命令码控制不同的脚就好了
把外部中断关了 还是不行。遥控器是好的。另一个控制数码管 都可以显示21个键码。&&这个程序就是不能用。&&下面这个控制数码管显示。&& 我是新手。&&&&哪位大哥有这种遥控的 控制多路继电器C程序&&发个给我吧。&& 或是详细一点的 这么改成多路控制&&教教我#include &reg51.h&//IO引脚定义:sbit hwx=P3^3;&&&&&&&&//红外接收数据引脚,sbit SMG_q = P1^0;&&&&//定义数码管阳级控制脚(千位)sbit SMG_b = P1^1;&&&&//定义数码管阳级控制脚(百位)sbit SMG_s = P1^2;&&&&//定义数码管阳级控制脚(十位)sbit SMG_g = P1^3;&&&&//定义数码管阳级控制脚(个位)/********数据定义*************************************************************/code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x88,0x8c,0xc6,0xa1,0x86,0x8e};&&&&//共阳数码管段值表 0-9 a-funsigned char l_posit=0;&&&&//显示位置unsigned char ly_disdate[4]={0,0,0,0};&&&&&&&&//显示缓冲unsigned char ly_lhj[4];&&&&&&&&&&&&&&&&&&&&//保存NEC的四个字节数据bit ly_flag=1;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//成功接收标志//函数声明:void display();//定义显示函数,直接显示缓冲区数值void delay(); /***********主函数开始********************************************************/&&&&void main(void){&&&&EA=1;&&&&&&&&&&&&&&&&&&&&//首先开启总中断&&&&EX1=1;&&&&&&&&&&&&&&&&&&//开启外部中断1,红外接收数据引脚&&&&IT1=1;&&&&&&&&&&&&&&&&&&&&//设置成下降沿触发方式&&&&TMOD=0X10;&&&&&&&&&&&&&&&&//定时器1的方式1,16位计数器,用来计数时间&&&&while(1){&&&&&&&&&&&&if(ly_flag){&&&&&&&&&&&&//接收成功处理显示缓冲,以16进制显示&&&&&&&&&&&&ly_flag=0;&&&&&&&&&&&&ly_disdate[0]=ly_lhj[0]/16;&&&&&&&&&&&&ly_disdate[1]=ly_lhj[0]%16;&&&&&&&&&&&&ly_disdate[2]=ly_lhj[2]/16;&&&&&&&&&&&&ly_disdate[3]=ly_lhj[2]%16;&&&&&&&&}&&&&&&&&display();//显示缓冲内容&&&&&&&&delay();&&&&&&&&&&&&}&&&&&&&&}/***********外中断1入口函数,P33引脚,红外线接收IC数据脚**************************/void hongwai(void)&& interrupt 2{&&&&unsigned char i,&&&&/**************开始判断是否为NEC波形引导码的前9MS和后4.5MS******************************/&&&&TL1=0;&&&&TH1=0;&&&&&&&&&&&&&&&&//定时/计数器1初始值&&&&TR1=1;&&&&&&&&&&&&&&&&//定时器以12M晶振12分频计数,即1us计数&&&&while(!hwx);&&&&TR1=0;&&&&&&&&&&&&&&&&//信号翻转停止计数&&&&if(TH1&30||TH1&40)&&&&//NEC引导码前9MS,计数约9000,TH1约等于35,给个误差值,用30-40之间来判断&&&&&&&&&&&&TH1=0;&&&&&&&&&&&&&&&&//定时/计数器1初始值&&&&TR1=1;&&&&while(hwx){&&&&&&&&delay();&&&&&&&&if(TH1&22)&&&&&&&&//NEC引导码引导码的后4。5MS,计数约4500,TH1约等于17&&&&&&&&&&&&&&&&&&&&&&&&}&&&&TR1=0;&&&&if(TH1&12)&&&&&&&&&&&&//NEC引导码引导码的后4。5MS,计数约4500,TH1约等于17&&&&&&&&&&&&/***********开始接收四个字节内容**************************************/&&&&&&&&for(i=0;i&4;i++){&&&&&&&&for(ia=0;ia&8;ia++){&&&&&&&&&&&&&&&&&&&&&&&&&&&&while(!hwx);&&&&//低电平开始,不处理只等待高电平&&&&&&&&&&&&&&&&&&&&&&&&TH1=0;&&&&&&&&&&&&TR1=1;&&&&&&&&&&&&//高电平开始,启动计数&&&&&&&&&&&&while(hwx){&&&&&&&&&&&&&&&&delay();&&&&&&&&&&&&&&&&if(TH1&15)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&TR1=0;&&&&&&&&&&&&//高电平结束,判断数据1或0向变量移入&&&&&&&&&&&&ly_lhj&&=1;&&&&&&&&&&&&//数据由高位移入低位&&&&&&&&&&&&if(TH1&4)&&&&&&&&&&&&&&&&//时间量TH1高于4,即高于1MS判断为1&&&&&&&&&&&&&&&&ly_lhj|=0x80;&&&&&&&&}&&&&}&&&&ly_flag=1;&&&&//接收成功&&&&TF1=0;}//显示函数,参数为显示内容void display(){&&&&P0=0XFF;&&&&&&&&&&&&//&&&&&&&&switch(l_posit){&&&&case 0:&&&&&&&&//选择千位数码管,关闭其它位&&&&&&&&SMG_q=0;&&&&&&&&SMG_b=1;&&&&&&&&&&&&SMG_s=1;&&&&&&&&&&&&&&&&SMG_g=1;&&&&&&&&P0=table[ly_disdate[0]];&&&&//输出显示内容&&&&&&&&&&&&case 1:&&&&&&&&//选择百位数码管,关闭其它位&&&&&&&&SMG_q=1;&&&&&&&&SMG_b=0;&&&&&&&&&&&&SMG_s=1;&&&&&&&&&&&&&&&&SMG_g=1;&&&&&&&&P0=table[ly_disdate[1]]&0x7f;&&&&//加上小数点&&&&&&&&&&&&case 2:&&&&&&&&//选择十位数码管,关闭其它位&&&&&&&&SMG_q=1;&&&&&&&&SMG_b=1;&&&&&&&&&&&&SMG_s=0;&&&&&&&&&&&&&&&&SMG_g=1;&&&&&&&&P0=table[ly_disdate[2]];&&&&&&&&&&&&case 3:&&&&&&&&//选择个位数码管,关闭其它位&&&&&&&&SMG_q=1;&&&&&&&&SMG_b=1;&&&&&&&&&&&&SMG_s=1;&&&&&&&&&&&&&&&&SMG_g=0;&&&&&&&&P0=table[ly_disdate[3]];&&&&&&&&&&&&}&&&&l_posit++;&&&&&&&&//每调用一次将轮流显示一位&&&&if(l_posit&3)&&&&&&&&l_posit=0;&&&&}//延时子函数,短暂延时void delay(void){&&&&&&&&&&&&unsigned char i=10;&&&&while(i--);}
这个继电器控制C程序。编译出来0警告0错误。&& 就是控制不了P2^0口输出低电平。。哎。&&&&C语言&&好难学哦。。。
#include &reg51.h&//IO引脚定义:sbit hwx=P3^3;&&&&&&&&//红外接收数据引脚,sbit SMG_q = P1^0;&&&&//定义数码管阳级控制脚(千位)sbit SMG_b = P1^1;&&&&//定义数码管阳级控制脚(百位)sbit SMG_s = P1^2;&&&&//定义数码管阳级控制脚(十位)sbit SMG_g = P1^3;&&&&//定义数码管阳级控制脚(个位)sbit JDQ=P2^0;&&&&&&&&//继电器控制引脚/********数据定义*************************************************************/code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x88,0x8c,0xc6,0xa1,0x86,0x8e};&&&&//共阳数码管段值表 0-9 a-funsigned char l_posit=0;&&&&//显示位置unsigned char ly_disdate[4]={0,0,0,0};&&&&&&&&//显示缓冲unsigned char ly_lhj[4];&&&&&&&&&&&&&&&&&&&&//保存NEC的四个字节数据bit ly_flag=1;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//成功接收标志//函数声明:void display();//定义显示函数,直接显示缓冲区数值void delay(); /***********主函数开始********************************************************/&&&&void main(void){&&&&EA=1;&&&&&&&&&&&&&&&&&&&&//首先开启总中断&&&&EX1=1;&&&&&&&&&&&&&&&&&&//开启外部中断1,红外接收数据引脚&&&&IT1=1;&&&&&&&&&&&&&&&&&&&&//设置成下降沿触发方式&&&&TMOD=0X10;&&&&&&&&&&&&&&&&//定时器1的方式1,16位计数器,用来计数时间&&&&while(1){&&&&&&&&&&&&if(ly_flag){&&&&&&&&&&&&//接收成功处理显示缓冲,以16进制显示&&&&&&&&&&&&ly_flag=0;&&&&&&&&&&&&ly_disdate[0]=ly_lhj[0]/16;&&&&&&&&&&&&ly_disdate[1]=ly_lhj[0]%16;&&&&&&&&&&&&ly_disdate[2]=ly_lhj[2]/16;&&&&&&&&&&&&ly_disdate[3]=ly_lhj[2]%16;&&&&&&&&&& //add&&&&&&&&&&&&if(ly_lhj[0]==0 && ly_lhj[2]==0)&&&&&&&&&&&&&&&&JDQ = !JDQ;&&&&&&&&&& //add end&&&&&&&&}&&&&&&&&display();//显示缓冲内容&&&&&&&&delay();&&&&&&&&&&&&}&&&&&&&&}/***********外中断1入口函数,P33引脚,红外线接收IC数据脚**************************/void hongwai(void)&& interrupt 2{&&&&unsigned char i,&&&&/**************开始判断是否为NEC波形引导码的前9MS和后4.5MS******************************/&&&&TL1=0;&&&&TH1=0;&&&&&&&&&&&&&&&&//定时/计数器1初始值&&&&TR1=1;&&&&&&&&&&&&&&&&//定时器以12M晶振12分频计数,即1us计数&&&&while(!hwx);&&&&TR1=0;&&&&&&&&&&&&&&&&//信号翻转停止计数&&&&if(TH1&30||TH1&40)&&&&//NEC引导码前9MS,计数约9000,TH1约等于35,给个误差值,用30-40之间来判断&&&&&&&&&&&&TH1=0;&&&&&&&&&&&&&&&&//定时/计数器1初始值&&&&TR1=1;&&&&while(hwx){&&&&&&&&delay();&&&&&&&&if(TH1&22)&&&&&&&&//NEC引导码引导码的后4。5MS,计数约4500,TH1约等于17&&&&&&&&&&&&&&&&&&&&&&&&}&&&&TR1=0;&&&&if(TH1&12)&&&&&&&&&&&&//NEC引导码引导码的后4。5MS,计数约4500,TH1约等于17&&&&&&&&&&&&/***********开始接收四个字节内容**************************************/&&&&&&&&for(i=0;i&4;i++){&&&&&&&&for(ia=0;ia&8;ia++){&&&&&&&&&&&&&&&&&&&&&&&&&&&&while(!hwx);&&&&//低电平开始,不处理只等待高电平&&&&&&&&&&&&&&&&&&&&&&&&TH1=0;&&&&&&&&&&&&TR1=1;&&&&&&&&&&&&//高电平开始,启动计数&&&&&&&&&&&&while(hwx){&&&&&&&&&&&&&&&&delay();&&&&&&&&&&&&&&&&if(TH1&15)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&TR1=0;&&&&&&&&&&&&//高电平结束,判断数据1或0向变量移入&&&&&&&&&&&&ly_lhj&&=1;&&&&&&&&&&&&//数据由高位移入低位&&&&&&&&&&&&if(TH1&4)&&&&&&&&&&&&&&&&//时间量TH1高于4,即高于1MS判断为1&&&&&&&&&&&&&&&&ly_lhj|=0x80;&&&&&&&&}&&&&}&&&&ly_flag=1;&&&&//接收成功&&&&TF1=0;}//显示函数,参数为显示内容void display(){&&&&P0=0XFF;&&&&&&&&&&&&//&&&&&&&&switch(l_posit){&&&&case 0:&&&&&&&&//选择千位数码管,关闭其它位&&&&&&&&SMG_q=0;&&&&&&&&SMG_b=1;&&&&&&&&&&&&SMG_s=1;&&&&&&&&&&&&&&&&SMG_g=1;&&&&&&&&P0=table[ly_disdate[0]];&&&&//输出显示内容&&&&&&&&&&&&case 1:&&&&&&&&//选择百位数码管,关闭其它位&&&&&&&&SMG_q=1;&&&&&&&&SMG_b=0;&&&&&&&&&&&&SMG_s=1;&&&&&&&&&&&&&&&&SMG_g=1;&&&&&&&&P0=table[ly_disdate[1]]&0x7f;&&&&//加上小数点&&&&&&&&&&&&case 2:&&&&&&&&//选择十位数码管,关闭其它位&&&&&&&&SMG_q=1;&&&&&&&&SMG_b=1;&&&&&&&&&&&&SMG_s=0;&&&&&&&&&&&&&&&&SMG_g=1;&&&&&&&&P0=table[ly_disdate[2]];&&&&&&&&&&&&case 3:&&&&&&&&//选择个位数码管,关闭其它位&&&&&&&&SMG_q=1;&&&&&&&&SMG_b=1;&&&&&&&&&&&&SMG_s=1;&&&&&&&&&&&&&&&&SMG_g=0;&&&&&&&&P0=table[ly_disdate[3]];&&&&&&&&&&&&}&&&&l_posit++;&&&&&&&&//每调用一次将轮流显示一位&&&&if(l_posit&3)&&&&&&&&l_posit=0;&&&&}//延时子函数,短暂延时void delay(void){&&&&&&&&&&&&unsigned char i=10;&&&&while(i--);}
试一下看看&&&&试一下看看
按“00”对应的按键开关继电器
提供一段红外解码 NEC的,外中断加定时器,12M晶振的都通用的uchar RED_32=32;//红外解码32位数据uchar Code[3];//地址1,地址2,码,反码5bit IR//成功void Init()//初始化{&&&&TMOD=0x11;&&&&TCON=0x54;&&&&IE=0x86;}//**************************************************void Ir_key() interrupt 2&&//(外中断1){&&&&&&&&EA=0;//关中断&&&&if(TH1&0x20||TH1&3)&&&&&&&&for (h=0; h&3; h++)&&&&{&&&&&&&&Code[h]&&=1;&&if(Code[h+1]&1)&&Code[h]|=0x80;&&&&}&&&&Code[3]&&=1; if(TH1&6)&&Code[3]|=0x80;&&&&if (--RED_32)&&&&IRok=1;//解码 成功标志 err:&&&&RED_32=32; irok:&&&&TH1=0; TL1=0; EA=1;//开中断}
编好可以了,还有你原来的按键码并没有00的 改成45试看看
#include &reg51.h&
#define uchar unsigned char#define uint&&unsigned int//IO引脚定义sbit JDQ=P2^0;&&&&&&&&//继电器控制引脚//sbit hwx=P3^3;&&&&&&&&//红外接收数据引脚,
uchar RED_32=32;//红外解码32位数据uchar Code[3];//地址1,地址2,码,反码5bit IR//成功
void Init()//初始化{&&&&TMOD=0x11;&&&&TCON=0x54;&&&&IE=0x86;}//**************************************************void Ir_key() interrupt 2&&//(外中断1){&&&&&&&&EA=0;//关中断&&&&if(TH1&0x20||TH1&3)&&&&&&&&for (h=0; h&3; h++)&&&&{&&&&&&&&Code[h]&&=1;&&if(Code[h+1]&1)&&Code[h]|=0x80;&&&&}&&&&Code[3]&&=1; if(TH1&6)&&Code[3]|=0x80;
&&&&if (--RED_32)&&&&IRok=1;//解码 成功标志 err:&&&&RED_32=32; irok:&&&&TH1=0; TL1=0; EA=1;//开中断}
/***********主函数开始********************************************************/&&&&void main(void){&& // EA=1;&&&&&&&&&&&&&&&&&&&&//首先开启总中断&&//&&EX1=1;&&&&&&&&&&&&&&&&&&//开启外部中断1,红外接收数据引脚&& // IT1=1;&&&&&&&&&&&&&&&&&&&&//设置成下降沿触发方式&&Init(); &&&&while(1){&&&&&&&&&&&&if( IRok ){&&&&&&&&&&&&//接收成功处理按键功能,这里只控制继电器,其它可自行加入&&&&&&&&&&&& IRok =0;&&&&&&&&&&&&if(( Code [2]==0x45)&&( Code [1]=0xff))&&&&//电源键的控制码&&&&&&&&&&&&&&&&JDQ=~JDQ;&&&&&&&&//启动或关闭继电器,可控制其它设备&&&&&&&&}&&&&&&&&}}&&&&&&[attachment=2443102]
&&//高电平结束,判断数据1或0向变量移入&&&&&&&&&&&&ly_lhj&&=1;&&&&&&&&&&&&//数据由高位移入低位&&&&&&&&&&&&if(TH1&4)&&&&&&&&&&&&&&&&//时间量TH1高于4,即高于1MS判断为1&&&&&&&&&&&&&&&&ly_lhj|=0x80;&&&&&&&&&&&&&&&&&&&&&&&&&& 提示2个错误&&&&是不是符号错了?
你改的这程序刚开始可以遥控。&&不过要按7。8次45键码对应的按钮。 才一次JDQ吸合 。 过一会后&&就没有作用了。&&JDQ一直吸合怎么按都关不了。
看完楼主程序我乐了 用户码是干啥的?&&那是区分遥控器用的你要控制多个继电器 需要判断按键码&&就是 45 46 47 这些个码
嗯&& 我吧00改过了别的21个按键码。&&&&都没有用。
我是新手嘛。&&&& if((ly_lhj[2]==0x00)&&(ly_lhj[3]=0xff))&&&&//电源键的控制码&& 你说的这个是吗?&&&&0X--&&后面&&我都换过了&& 帮帮忙嘛。&& 楼上级个好心人改的&&我都试过了。&&还是不行。
你们的程序要是能用才怪了。 LZ的程序按键值就没存,9楼的程序Code[3]直接越界。论坛有人发过,任意IO作为红外的,用那个。
好好的 怎么不可用呢?Code[3]怎么样越界?请指点!
uchar Code[3];定义为3个字节Code[3]&&=1;&&下标怎么能到3?
这位大哥 。你修改的这个程序。提示2个错误。是不是哪里忘了写。出现问题的地方在这。//高电平结束,判断数据1或0向变量移入&&&&&&&&&&&&ly_lhj&&=1;&&&&&&&&&&&&//数据由高位移入低位&&&&&&&&&&&&if(TH1&4)&&&&&&&&&&&&&&&&//时间量TH1高于4,即高于1MS判断为1&&&&&&&&&&&&&&&&ly_lhj|=0x80;&&
这位大哥。&&&&你的程序是有用。&&&&只是要按7.8次&& JDQ才吸合。&& 要断开的话 又要按很多次。&&有时候按了很久也不动了。&&&& 会不会跟中断有关系呀?&&&&
论坛有吗?&& 我都找到2010年的去了。 就是找不到。才郁闷得&&拿我原来买板子配套的不能用的程序让各位大哥修改看看。&&&& 你能帮我用着两个程序 修改下吗?让它可以多路控制继电器。&& 谢谢了
我是新手嘛。别取笑我了。&& 键码我懂一点。&& if((ly_lhj[2]==0x00)&&(ly_lhj[3]=0xff))&&&&//电源键的控制码&&&&&&&& 还没有发帖前&&&& 我就把这个电源键码&&用我那遥控器的键码改过了。 都是不行。&&
给你加了两个继电器,其它也按这种格式加//*********************【 NEC解码头文件 】*******************////     简介:本程序适用于NCE解码:(9ms+4.5ms)引导码+32位编码。//           兼容STC所有型号(包括 1T 和 12T 系列),可以定义任意I/O作红外接收脚,//                         自适应解码主频:6MHz ~ 40MHz。//// 使用条件:占用系统定时器0,开启定时器0中断(如使用其它定时器请自改IR_Init();初始化函数)//// 使用说明:填相关宏定义:USER_H、USER_L、Check_EN、CPU_Fosc、IR,//           上电初始化函数IR_Init(),//           在定时器0中断中调用IR_NEC()解码函数,//           解码有效时,IR_BT=2即短按,IR_BT=3即长按,由用户清0,//           解码存放:用户码高8位NEC[0],用户码低8位NEC[1],操作码NEC[2],操作码反码NEC[3]。////【供用户调用的函数】//    IR_Init();                         //接收初始化,开启定时器0中断400us//    IR_NEC();                             //红外线解码(解NEC编码)//          //***************************************************************/#include &AT89X51.H&#define  USER_H     0x80         //用户码高8位#define  USER_L     0x7F         //用户码低8位#define  Check_EN   0            //是否要校验16位用户码:不校验填0,校验则填1       #define  CPU_Fosc   L    //输入主频,自适应解码(单位:Hz,范围:6MHz ~ 40MHz)#define  CA_S       8            //长按时间设置,单位:108mS(即 108mS整数倍,10倍以上为宜)sbit IR = P3^3;                  //红外线接口(任意引脚)sbit JDQ0 = P2^0;                 //继电器控制引脚sbit JDQ1 = P2^1;                 //继电器控制引脚#define  Step       400          //红外采样步长:400us#define  TH_H      ((65536-Step*(CPU_Fosc/300)/4)  //定时器高8位基准赋值#define  TH_L      ((65536-Step*(CPU_Fosc/300)/4)  //定时器低8位基准赋值unsigned char IR_BT;     //解码效果返回:0无效,1有效,2短按,3长按unsigned char NEC[4];    //解码存放:16位用户码、操作码正反码unsigned char cntCA;     //长按计数unsigned int  cntStep;   //步数计bit              IRa,IRb;   //接收脚电位状态保存bit              IRsync;    //同步标志unsigned char BitN;      //位码装载数/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:红外线解码初始化┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void IR_Init(){   TMOD &= 0xF0;           //清定时器0   TMOD |= 0x01;           //定时器0:16位定时器   TL0 = TH_L;           //每步时间   TH0 = TH_H;   ET0 = 1;   EA  = 1;   TR0 = 1;}/*┈┈┈┈┈┈┈┈┈┈ 基准 ┈┈┈┈┈┈┈┈┈┈┈*/#define    Boot_Limit    (( +1000)/Step)   //引导码周期上限   #define    Boot_Lower    (( -1000)/Step)   //引导码周期下限   #define    Bit1_Limit    (()/Step)         //“1”周期上限#define    Bit0_Limit    (()/Step)         //“0”周期上限/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:红外线NEC周期采样解码法(定时中断,下降沿查询周期时间)全局变量:IR_BT = 0无效                  1有效,待继续判断长、短按(如不需要判断长、短按,则直接使用)                  2短按                  3长按┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void IR_NEC(){             TL0 = TH_L;   //重赋值   TH0 = TH_H;      
  cntStep++;    //步数累加   if(IR_BT==1)if(cntStep&300)IR_BT=2; //解码有效后,如果无长按,120ms(400us×300)后默认短按   IRb = IRa;    //保存上次电位状态   IRa = IR;     //保存当前电位状态      
  if(IRb && !IRa)    //是否下降沿(上次高,当前低)   {      if(cntStep & Boot_Limit)   //超过同步时间?      {      
         if(IR_BT==1)if(++cntCA&CA_S)IR_BT=3; //解码有效后,继续按住遥控&CA_S即长按          IRsync=0;                            //同步位清0      }      else if(cntStep & Boot_Lower){ IRsync=1; BitN=32; }   //同步位置1,装载位码数32                                else if(IRsync)            //如果已同步      {         if(cntStep & Bit1_Limit)IRsync=0;                  
        else         {      
           NEC[3] &&= 1;                              
           if(cntStep & Bit0_Limit)NEC[3] |= 0x80;    //“0”与“1”            if(--BitN == 0)                              
           {               IRsync = 0;    //同步位清0               #if (Check_EN == 1)                                      
              if((NEC[0]==USER_H)&&(NEC[1]==USER_L)&&(NEC[2]==~NEC[3]))    //校验16位用户码、操作码正反码               {  IR_BT=1; cntCA=0;  }     //解码有效,接下来判断:短按?长按?               #else               if(NEC[2]==~NEC[3]){ IR_BT=1; cntCA=0; }  //只校验操作码正反码               #endif                                      
           }            else if((BitN & 0x07)== 0)    //NEC[3]每装满8位,移动保存一次(即 BitN%8 == 0)            {   NEC[0]=NEC[1]; NEC[1]=NEC[2]; NEC[2]=NEC[3];   }         }      }      cntStep = 0;   //步数计清0   }}void Delayms(unsigned int dT){    unsigned int dA,dB;    for(dA=0; dA&dT; dA++)        for(dB=0; dB&113; dB++)            ;}void main(void){    IR_Init();                                                    //红外接收初始化    IR = 1;&&&&while (1)    {        if (IR_BT & 1)                                 //正确解码        {            if (0x00 == NEC[2])            {                JDQ0 = ~JDQ0;            } else if (0x01 == NEC[2]) {                JDQ1 = ~JDQ1;            }            IR_BT = 0;        }    }}/********************** 定时器0中断函数************************/void time0(void) interrupt 1{   IR_NEC();      }
出现一个警告[attachment=2444515]
哦,再看一下,uchar Code[3];定义为3个字节 确实是越界了,这个是按数量计的,而不是从0开始
但是程序是可以用的&& ,可能有些程序的问题是它?
函数未调用,该警告可以忽略。
不能用。&&&& 这程序不需要键码吗?&&主函数的 if (0x00 == NEC[2])&&&& 跟 else if (0x01 == NEC[2])&&&&是什么意思呢?&&
0x00 0x01是你遥控的键值,改成你自己想要的就行了。如果还需要增加按键,那就继续else if()
嗯&&我本来也是想着把它&& 改了0x45&&&&0x46&&2个去控制&&&& 结果还是不行呢。&& 现在怎么办呢?
对了&&这程序我下到单片机后&& 变成是P2^7&&&&一直出现低电平。&&好像没有设置这个1/0口。 这么会出现低电平呢?(单片机复位下就没有了,现在P2^7口没问题了) 但是&&就是遥控有反应。&&&&不过就是21个遥控按键随便哪个按键 按下去&&P2^ 4口的灯 会闪闪闪&& 收松开就灭了(感觉像是红外线测试仪)。&& 这是怎么回事呢?
呵呵&& 我快郁闷了。&& 怎么两次下载编译后 结果不同?&& 这次是遥控怎么按都没有反应。&&&&
查看完整版本: [--
Powered by
Time 0.082112 second(s),query:5 Gzip enabled

我要回帖

更多关于 mysql给变量赋值 的文章

 

随机推荐