STC单片机将收到的数据通过RS485通信方式传给上位机,发现每过4天多就会有一个位会在一秒钟之内突变,从0变为1再变为0,一直找不到此问题的原因
..............#define RF P00unsigned char RF_Code[3]; //遥控码值bit RF_SyncFlag; //同步信号标志,为1表示已接受到同步信号//unsigned char RF; unsigned char Decode_ok; //解码成功unsigned char High_WidthLow_Width; //高低电平宽度unsigned char RF_BitCount; //接收到第几位编码unsigned char bma1bma2bma3bma4; //接收编码unsigned char mma1mma2mma3mma4; //用于接收过程存放遥控编码,编码比较两次,这是第一次unsigned char mmb1mmb2mmb3mmb4; //用于接收过程存放遥控编码,这是第二次unsigned char rf_ok1rf_ok2rf_ok; //解码过程中的临时接收成功编码标志,接收到一个完整的遥控命令后置1,通知解码程序可以解码了unsigned char Last_state; //保存上一个查询到的电平状态unsigned char temp_htemp_l;#define LED1 P03#define LED2 P01bit bt_auto;unsigned ss1;void RF_MainLoop(void){ TMOD=0x10; TH1=0xff; TL1=0x88; ET1=1; TR1=1; EA=1; if(Decode_ok==1) { if(RF_Code[0]==0xc8) { LED1=0; Delay_ms(50); } if(RF_Code[1]==0xc4) { LED1=1; Delay_ms(50); } if(RF_Code[2]==0xc2) { LED2=0; Delay_ms(50); } if(RF_Code[3]==0xc1) { LED2=1; Delay_ms(50); } } }void Timer1 (void) interrupt 3{ if(!bt_auto) { TL1=0x70; TH1=0xfb; } else { TL1=temp_l; TH1=temp_h; } TF1=0; // 清除T1中断标志 if(!RF) { Low_Width++; Last_state=0; // 检测到低电平 低电平时间加1记录本次电平状态 } else // 检测到高电平 { High_Width++; if(!Last_state) // 检测到从低到高的跳变已检测到一个完整(高-低)电平周期 { if(((High_Width>=2)&&(High_Width<=8))&&((Low_Width>=50)&&(Low_Width<=190))) //判同步码 2/5 110/140 { if((Low_Width>=110)&&(Low_Width<=140)) //根据不同 同步码 宽度,T0加载不同初值 { RF_BitCount=0; RF_SyncFlag=1; bma1=0; bma2=0; bma3=0; bt_auto=0; } else { if((Low_Width>=140)&&(Low_Width<=160)) { RF_BitCount=0; RF_SyncFlag=1; bma1=0; bma2=0; bma3=0; bt_auto=0; temp_h=0xfe; temp_l=0x6b; } else { if((Low_Width>=160)&&(Low_Width<=190)) { RF_BitCount=0; RF_SyncFlag=1; bma1=0; bma2=0; bma3=0; bt_auto=0; temp_h=0xfd; temp_l=0xdc; } else { if((Low_Width>=70)&&(Low_Width<=90)) { RF_BitCount=0; RF_SyncFlag=1; bma1=0; bma2=0; bma3=0; bt_auto=0; temp_h=0xff; temp_l=0x30; } else { if((Low_Width>=90)&&(Low_Width<=110)) { RF_BitCount=0; RF_SyncFlag=1; bma1=0; bma2=0; bma3=0; bt_auto=0; temp_h=0xff; temp_l=0x00; } else { if((Low_Width>=50)&&(Low_Width<=70)) { RF_BitCount=0; RF_SyncFlag=1; bma1=0; bma2=0; bma3=0; bt_auto=0; temp_h=0xff; temp_l=0x7a; } } } } } } } else if ((RF_SyncFlag)&&((Low_Width>=10)&&(Low_Width<=14))) // 10/14 { RF_BitCount++; //已经接收到同步码判0 if(RF_BitCount==24) { if(!rf_ok1) { mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4; //将接收到的编码复制到解码寄存器中 rf_ok1=1; // 通知解码子程序可以解码了 RF_SyncFlag=0; bt_auto=0; s=1500; } else { if(!rf_ok2) mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4; //将接收到的编码复制到解码寄存器中 rf_ok2=1; // 通知解码子程序可以解码了 RF_SyncFlag=0; bt_auto=0; } } } else if((RF_SyncFlag)&&((Low_Width>=2)&&(Low_Width<=8))) // 3/5 { switch(RF_BitCount) { case 0 : { bma1=bma1 | 0x80; break; }//遥控编码第1位 case 1 : { bma1=bma1 | 0x40; break; } case 2 : { bma1=bma1 | 0x20; break; } case 3 : { bma1=bma1 | 0x10; break; } case 4 : { bma1=bma1 | 0x08; break; } case 5 : { bma1=bma1 | 0x04; break; } case 6 : { bma1=bma1 | 0x02; break; } case 7 : { bma1=bma1 | 0x01; break; } case 8 : { bma2=bma2 | 0x80; break; } case 9 : { bma2=bma2 | 0x40; break; } case 10: { bma2=bma2 | 0x20; break; } case 11: { bma2=bma2 | 0x10; break; } case 12: { bma2=bma2 | 0x08; break; } case 13: { bma2=bma2 | 0x04; break; } case 14: { bma2=bma2 | 0x02; break; } case 15: { bma2=bma2 | 0x01; break; } case 16: { bma3=bma3 | 0x80; break; } case 17: { bma3=bma3 | 0x40; break; } case 18: { bma3=bma3 | 0x20; break; } case 19: { bma3=bma3 | 0x10; break; } case 20: { bma4=bma4 | 0x80; break; }//按键状态第1位 case 21: { bma4=bma4 | 0x40; break; } case 22: { bma4=bma4 | 0x20; break; } case 23: { bma4=bma4 | 0x10; if(!rf_ok1) { mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的编码复制到解码寄存器中 rf_ok1=1; // 通知解码子程序可以解码了 RF_SyncFlag=0; bt_auto=0; s=1500; break; } else { mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4;//将再次接收到的编码复制到解码寄存器中, rf_ok2=1; // 通知解码子程序可以解码了 RF_SyncFlag=0; bt_auto=0; break; } } } RF_BitCount++; } else { RF_BitCount=0; RF_SyncFlag=0; bt_auto=0;bma1=0; bma2=0; bma3=0; bma4=0; High_Width=1; Low_Width=0; } //接收到不符合的高-低电平序列 Low_Width=0;High_Width=1; } Last_state=1; // 记录本次电平状态 } if(rf_ok1) //规定时间内接受到2帧相同的编码数据才有效 { s--; if(!s) rf_ok1=0; if(rf_ok2) { if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3)&&(mma4==mmb4)) { rf_ok=1; rf_ok1=0; rf_ok2=0; } else { rf_ok=0; rf_ok1=0; rf_ok2=0; } } } if((rf_ok)) //判断是否接收成功 { EA=0; rf_ok=0; RF_Code[0]=mma4&0x80; //取按键码 RF_Code[1]=mma4&0x40; RF_Code[2]=mma4&0x20; RF_Code[3]=mma4&0x10; Decode_ok=1; EA=1; } }
怎么知道一个子程序有没有函数参数,有几个函数参数,函数参数的数据类型是什么,还有是否有返回值,返回值的数据类型是什么,这些个怎么判断。。
在进行单片机开发时,由于测量数据有精度要求,不知道如何进行ADC的选型和精度控制,还有成本考虑,哪位大佬可以给我讲讲如何进行ADC选型吗?还有现在主流的ADC芯片型号是那些,非常感谢!
51单片机pwm怎么设置用按键 进行调节占空比定时器的的pwm我看啦一下还行;但是在进行按键调节我就搞蒙啦有没有大佬解答一下,小白:谢谢
8051单片机控制8*8点阵时,不用译码器可以吗?8*8总共灯的数量大于51单片机接口数量,但是又不会用译码器,有没有不用译码器实现控制的方法啊,比如显示特定两位数字之类的。
我做的超声波测距,需要数码管显示的同时还要把数据通过蓝牙芯片传到电脑上,现在遇到的问题就是 两个程序不能结合在一起,求大神帮忙
本人是个新手刚刚接触51单片机,怎么编程去计算51单片机某个io口的输入高低电平时间,比如我从P1.0口输入了一个方波信号,那么怎么通过单片机编程去检测我这个方波高电平的时间(或者说长度),还有低电平的时间(或者说长度),这个检测时间要精确到ms。
迪文配套提供的《迪文 DGUS 屏用户开发指南Ver4.3》里面的C51例程实在是看不懂,厂家表示也不反馈给技术部门,实在没办反了,跪求各位大神给详细标注一下,尤其是打问号的地方,跪谢!!!#include <REG52.h>sbit JDQ1=P1^0; //温度控制继电器 //串口变量 unsigned char RCVOKRCVDATARX5ARXA5RXLENRXCMDRXADRHRXADRLRXDLENTXTIME; unsigned char TX_PRX_P; //收发缓冲区的指针位置//配置参数区(DGUS 0x83 指令)32B对应 DGUS 0x1000-0x100F 地址 ???unsigned char CFGBUF[32]; ???//发送给 DGUS 屏的数据读取指令和写指令缓冲区//TXBUF[12]:TXBUF[13]用于显示曲线 CH1 接口 ???//TXBUF[20]-TXBUF[84]0x82 写 DGUS 屏的 64B 变量数据,对应 DGUS 0x0000-0x001F 地址 ???unsigned char TXBUF[84]={0x5A0xA50x40x830x100x00x10 0x5A0xA50x40x840x10x00x00x5A0xA50x430x820x000x00}; ???void main(void){ int ij; /@@*开始设置串口*/ PCON=PCON|0x80; //配置串口波特率为 115200bps,22.1184MHz 晶体 SCON=0x50; TMOD=0x21; TH1=255; TL1=255; TR1=1; TH0=0xb8; //10ms 定时器中断 TL0=0x00; TR0=1; JDQ1=0; JDQ1=0; //关闭加热继电器 RCVOK=0; //清除数据接收 OK 标记 ??? RCVDATA=0; ??? TXTIME=100; //上电 1 秒后开始数据读写 ES=1; ET0=1; EA=1; /@@*串口设置完毕*/ while(RCVOK==0x00); //delate ??? //用户测量和控制温度,显示温度值和实时温度曲线 while(1) ???整个while??? { i=Readtemp(); //测量当前温度 j=CFGBUF[0]*256+CFGBUF[1]; //设定温度,DGUS 0x1000 地址,整形变量 if(i<j) { JDQ1=1; } else { JDQ1=0; } TXBUF[20]=i/256; //显示当前温度值,DGUS 0x0000 地址,整形变量 TXBUF[21]=i%256; TXBUF[12]=i/256; //显示当前温度曲线,CH1 曲线通道 TXBUF[13]=i%256; }}//温度测量函数int Readtemp( ) ???{ return(500); }//定时器 2 中断函数10mS 定时器中断,用于定时 200mS 发送指令给 DGUS 屏void Timer0_interrupt(void) interrupt 2 { TF0=0; TH0=0xb8; TL0=0x00; TXTIME--; if(TXTIME==0x00) { TXTIME=20; TX_P=0; ??? TI=0; SBUF=TXBUF[0]; ??? }}//串口中断方式处理和 DGUS 屏的数据交换//定时从 DGUS 屏的 1000-100F 存储区读取 32Byte 数据保存到单片机的 CFGBUF//定时把单片机的 DSPBUF 的 64B 内容写到 DGUS 屏的 0000-001FH 存储区void Uart_interrupt(void) interrupt 4 ???此处直到结束???{ unsigned char i; if(RI) //接收中断 { i=SBUF; RI=0; if(RCVDATA==0) { RX5A=RXA5; RXA5=RXLEN; RXLEN=RXCMD; RXCMD=RXADRH; RXADRH=RXADRL; RXADRL=RXDLEN; RXDLEN=i;//检查帧同步数据 5A A5 24 83 10 00 10 +32B DATA if((RX5A==0x5A)&&(RXA5==0xA5)&&(RXLEN==0x24)&&(RXCMD==0x83)&&(RXADRH=0x10)&& (RXADRL=0x00)&&(RXDLEN=0x10)) { RCVDATA=0xff; RX_P=0; } } else { CFGBUF[RX_P]=i; RX_P++; if(RX_P==32) { RCVDATA=0; RCVOK=0xff; } } } if(TI) //发送中断 { TI=0; TX_P++; if(TX_P<84) { SBUF=TXBUF[TX_P]; } }}
3功率因数检测系统设计(1)能实时显示功率因素值。(2)显示电路用数码管显示,亮度适中,显示稳定。(3)通过动态投切电容,使电路工作时,功率因素值始终保持在0.85~0.95期间。(4)主控芯片采用AT89系列。(5)电路额定电压交流220V,额定电流40A,频率50Hz。
我用的proteus7.5和keil3,按照书上说的在debug上边应该有proteus VSM Simultor。我找不到