导航:首页 > 操作系统 > 单片机远程遥控增氧泵

单片机远程遥控增氧泵

发布时间:2022-05-19 22:40:41

Ⅰ 求51单片机红外遥控程序

sbitIR_OUT=P3^2;
unsignedcharSigInfo[4];//存储红外按键编码,SigInfo[2]为按键值

voidCmd_Require(void);

voidINT_Ext0()interrupt1//外部中断0
{
u8i,j;
u16time=8000;

EA=0;

for(i=0;i<10;i++){
delay0_7ms();
if(IR_OUT){
EA=1;
return;
}
}

while(!IR_OUT);

delay2_5ms();
if(!IR_OUT){
EA=1;
return;
}

while(IR_OUT&&time){
time--;
}
time=8000;

for(i=0;i<4;i++){
for(j=0;j<8;j++){
SigInfo[i]>>=1;
while(!IR_OUT);

delay0_7ms();

if(IR_OUT){
SigInfo[i]|=0x80;
while(IR_OUT&&time){
time--;
}
time=8000;
}
}
}

Cmd_Require();
EA=1;
}

voidCmd_Require(void)
{
switch(SigInfo[2]){
case0x0c:
//此处代码随意
break;
case0x18:
//...
break;
//...
default:
break;
}
}

延时没写,因单片机而异的,要精确点才能解码。

Ⅱ 手机APP远程控制增氧机、水泵

我一个单片机的同学可以做到,他演示给我看过,不过需要准备相应的单片机模块,再进行测试

Ⅲ 单片机和无线遥控

书真的不知道怎么推荐,但是你可以买上那种无线模块串口通信的那种,一个接收一个发送,发送端发一组数据,接收端接收到数据以后再解析出来,就是遥控了,想发送的远点,就加大发送功率了,不过一般网上那些芯片发送距离都在100到1000米左右

Ⅳ 求一个单片机红外遥控器控制设计的源程序

程序太长,须仔细研究。

#definemain_GLOBALS

#include<reg51.h>
#include"main.h"
#include"SAA3010.h"

unsignedcharcounter;
unsignedchartemp;

sbitP2_0=0xA0;
sbitP2_1=0xA1;
sbitP2_2=0xA2;
sbitP2_3=0xA3;

voiddecode_init(void)
{
load_code_detected=0;
repeat_code_detected=0;
decode_error=0;
temp1=0;
temp2=0;
temp3=0;
temp4=0;
TH1=0;
TL1=0;
TR1=0;
}

voidmain(void)
{
EX0=1;
IT0=1;
TMOD=0x11;
ET0=1;
TH0=128;
TL0=0;
TR0=1;
P0=0;


TH1=0;
TL1=0;
decode_init();
EA=1;
counter=0;
data_available=0;
while(1)
{
if(data_available==1)
{

if(key_code==01)//display"1"
{
P2_0=0;//选中四个数码管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0xf9;
}

if(key_code==0x02)//display"2"
{
P2_0=0;//选中四个数码管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0xa4;
}

if(key_code==0x03)//display"3"
{
P2_0=0;//选中四个数码管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0xb0;
}

if(key_code==0x04)//display"4"
{
P2_0=0;//选中四个数码管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0x99;
}

if(key_code==0x05)//display"5"
{
P2_0=0;//选中四个数码管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0x92;
}

if(key_code==0x06)//display"6"
{
P2_0=0;//选中四个数码管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0x82;
}

if(key_code==0x07)//display"7"
{
P2_0=0;//选中四个数码管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0xf8;
}

if(key_code==0x08)//display"8"
{
P2_0=0;//选中四个数码管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0x80;
}

if(key_code==0x09)//display"9"
{
P2_0=0;//选中四个数码管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0x90;
}

if(key_code==0x00)//display"0"
{
P2_0=0;//选中四个数码管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0xc0;
}
data_available=0;
}
}
}
//**********************************************************************************************************************
voidkey_isr(void)interrupt0
{
EX0=0;//立即关闭外部中断,转为查询方式解码
led=0;//开LED表示收到红外信号

temp=SAA3010_decode();//解码
if(temp==1)gotokey_isr_exit;
counter=0;
key_isr_exit:
decode_init();
led=1;
EX0=1;
}

voidTimer0_isr(void)interrupt1
{
counter++;
if(counter>3)
{
if(led==0)led=1;
counter=0;
}
ET0=1;
}

#defineSAA3010_GLOBALS
#include<reg51.h>
#include"SAA3010.h"
#include"main.h"


//===========================================================================================================
//该函数的作用是每调用一次就在temp1-4组成的32bit长度的最低位上移入
//一个0或者1,数据由bitdata确定
voidSAA3010_cycle_data(unsignedcharbitdata)
{
temp4=temp4<<1;
if((temp3&0x80)==1)temp4=temp4|0x01;
elsetemp4=temp4&0xfe;

temp3=temp3<<1;
if((temp2&0x80)==1)temp3=temp3|0x01;
elsetemp3=temp3&0xfe;

temp2=temp2<<1;
if((temp1&0x80)==1)temp2=temp2|0x01;
elsetemp2=temp2&0xfe;

temp1=temp1<<1;
if(bitdata==1)temp1=temp1|0x01;
elsetemp1=temp1&0xfe;
}

//===========================================================================================================
//解码出错返回1,对则返回0
unsignedcharSAA3010_decode(void)
{
//-----------------------------------------------------------------------------------------------------------
unsignedcharcount=0;

TR1=1;//启动计时
while(1)
{
while(ir_receive==0);//等待电平变高,不需要超时监测
TR1=0;//高电平(对发射电路而言)测试结束
high_level_time=TH1*256+TL1;//记录高电平的数据
//-----------------------------------------------------------------------------------------------------------
TH1=0; TL1=0;TR1=1;//启动对低电平的测试
//-----------------------------------------------------------------------------------------------------------
//处理低电平
if((high_level_time<750)||(high_level_time>1800))return1;//不是合格的电平
if((high_level_time>750)&&(high_level_time<1000)){SAA3010_cycle_data(0);count+=1;}//移入一个0
if((high_level_time>1500)&&(high_level_time<1800)){SAA3010_cycle_data(0);SAA3010_cycle_data(0);count+=2;}//移入两个0

while(ir_receive==1)//等待电平变低
{
if(TH1>0x08)break;//高电平超时,正常情况下是测试结束,异常时则是出错
}

TR1=0;//低电平(对发射电路而言)测试结束
if(TH1>0x08){break;}
low_level_time=TH1*256+TL1;//保存低电平的数据

TH1=0; TL1=0; TR1=1; //为增加计时的准确性,数据的处理都是在计时过程里
//-----------------------------------------------------------------------------------------------------------
//处理高电平
if((low_level_time<750)||(low_level_time>1800))return1;//不是合格的电平
if((low_level_time>750)&&(low_level_time<1000)){SAA3010_cycle_data(1);count+=1;}//移入一个0
if((low_level_time>1500)&&(low_level_time<1800)){SAA3010_cycle_data(1);SAA3010_cycle_data(1);count+=2;}//移入两个0
}

if(count==26){SAA3010_cycle_data(1);count++;}
if(count!=27)return1;
led=0;

//提取按健信息
key_code=0;
if((temp1>>1)&0x01)key_code=key_code|0x01;
elsekey_code=key_code&0xfe;
if((temp1>>3)&0x01)key_code=key_code|0x02;
elsekey_code=key_code&0xfd;
if((temp1>>5)&0x01)key_code=key_code|0x04;
elsekey_code=key_code&0xfb;
if((temp1>>7)&0x01)key_code=key_code|0x08;
elsekey_code=key_code&0xf7;
if((temp2>>1)&0x01)key_code=key_code|0x10;
elsekey_code=key_code&0xef;
if((temp2>>3)&0x01)key_code=key_code|0x20;
elsekey_code=key_code&0xdf;

//提取系统信息
sys_code=0;
if((temp2>>5)&0x01)sys_code=sys_code|0x01;
elsesys_code=sys_code&0xfe;
if((temp2>>7)&0x01)sys_code=sys_code|0x02;
elsesys_code=sys_code&0xfd;

if((temp3>>1)&0x01)sys_code=sys_code|0x04;
elsesys_code=sys_code&0xfb;
if((temp3>>3)&0x01)sys_code=sys_code|0x08;
elsesys_code=sys_code&0xf7;
if((temp3>>5)&0x01)sys_code=sys_code|0x10;
elsesys_code=sys_code&0xef;
if((temp3>>7)&0x01)sys_code=sys_code|0x20;
elsesys_code=sys_code&0xdf;

data_available=1;
return0;
}
//===========================================================================================================

Ⅳ 51单片机如何实现远程无线通信

简单的就是使用315/433MHz发射模块和RX3310A接收模块的遥控系统,使用很方便的,或者使用NRF2401模块也可以。

Ⅵ 利用AT89C51单片机如何同时控制温度,ph值和溶解氧。求 原理图,文字叙述也行

控制温度,ph值和溶解氧其实都是通过传感器采集数据。然后利用单片机进行处理。这些值对于单片机来说就是一堆0和1.所以温控,液位,ph值神马的原理都是差不多的。区别就在于用的传感器不同而已。所以在设计过程中只要设计出一个功能其他的以此类推。你可以参考下多路温控系统设计。就相当于3路温控系统,采集三个数据。

Ⅶ 求最简单的51单片机红外遥控发送和接收的C源码各一篇

已发送 注意查收

Ⅷ 单片机如何实现红外遥控

以下文件是51单片机实现遥控解码,通过数码管显示键码的程序,P0口驱动数码管段选,p2.6和p2.7为数码管位选,接收头连到P3.2口。此程序以通过验证,可以直接编译使用,另外还有一个继电器和蜂鸣器的控制,不用可以屏蔽掉。

;********************************************************************************
;* 描述: *
;* 遥控键值读取器 *
;* 数码管显示, P0口为数码管的数据口 *
;* *
;********************************************************************************
;遥控键值解码-数码管显示 *
;********************************************************************************/

#include <reg51.h>
#include <intrins.h>

void IR_SHOW();
void delay(unsigned char x);//x*0.14MS
void delay1(unsigned char ms);
void beep();

sbit IRIN = P3^2;
sbit BEEP = P3^7;
sbit RELAY= P1^3;
sbit GEWEI= P2^7;
sbit SHIWEI= P2^6;

unsigned char IRCOM[8];
unsigned char code table[16] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
main()
{
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
TCON = 0x1; //触发方式为脉冲负边沿触发
delay(1);

IRIN=1;
BEEP=1;
RELAY=1;
for(;;)
{
IR_SHOW();
}

} //end main

void IR_IN() interrupt 0 using 0
{
unsigned char i,j,k,N=0;
EA = 0;
I1:
for (i=0;i<4;i++)
{
if (IRIN==0) break;
if (i==3) {EA =1;return;}
}
delay(20);
if (IRIN==1) goto I1; //确认IR信号出现
while (!IRIN) //等 IR 变为高电平
{delay(1);}

for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (IRIN) //等 IR 变为低电平
{delay(1);}
while (!IRIN) //等 IR 变为高电平
{delay(1);}
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N>=30) {EA=1;return;}
}
IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
N=0;
}//end for k
}//end for j

if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
IRCOM[5]=IRCOM[2] & 0x0F;
IRCOM[6]=IRCOM[2] & 0xF0;
IRCOM[6]=IRCOM[6] >> 4;
beep();
EA = 1;

}

void IR_SHOW()
{
P0 = table[IRCOM[5]];
GEWEI = 0;
SHIWEI = 1;
delay1(4);
P0 = table[IRCOM[6]];
SHIWEI = 0;
GEWEI = 1;
delay1(4);
}

void beep()
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(5);
BEEP=!BEEP;
}
BEEP=1;
}

void delay(unsigned char x)//x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}

void delay1(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i<120; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

Ⅸ 51单片机红外遥控程序

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden = P2^7;
sbit lcdrs = P2^6;
sbit lcdwr = P2^5;
sbit IR = P3^2;
uchar IRCOM[6];//数组,用于存储红外编码
uchar code table1[] = "remote control";
uchar code table2[] = "CODE:";
void delayms(uchar x)// 延时x*0.14ms
{
uchar i;
while(x--)
for(i=0;i<13;i++){}
}
void delay(uchar x) //延时xms
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/****************************LCD部分***********************************************/
void write_com(uchar com)
{
lcden = 0;
lcdrs = 0;
lcdwr = 0;
P0 = com;
delay(5);
lcden = 1;
delay(5);
lcden = 0; //别忘了lcden拉低
}
void write_date(uchar date)
{
lcden = 0;
lcdrs = 1;
lcdwr = 0;
P0 = date;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void lcd_init(void)
{
lcden = 0;
lcdrs = 0;
lcdwr = 0;
delay(5);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
/*****************main()************************/
void main(void)
{
uchar count=0;
IR = 1;
lcd_init();
write_com(0x80);
while(table1[count]!='\0')
{
write_date(table1[count]);
count++;
delay(5);
}
count = 0;
write_com(0x80+0x40);
while(table2[count]!='\0')
{
write_date(table2[count]);
count++;
delay(5);
}

IE = 0x81; //开中断
TCON = 0x01;//脉冲负边沿触发
while(1);

}
/*********************红外中断**************************/
void IR_time() interrupt 0
{
uchar i,j,TimeNum=0;//TimeNum用来计IR高电平次数 从而判断是0还是1
EX0 = 0; //关闭中断
delayms(5);
if(1 == IR)
{
EX0 = 1;
return;
}
while(!IR) //跳过9ms前导低电平
delayms(1);
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR) //跳过4.5ms的前导高电平
delayms(1);
while(!IR) //跳过0.56ms的低电平
delayms(1);

while(IR)
{
TimeNum++; //计时高电平时间从而判断读取的是0还是1
delayms(1);
}
if(TimeNum>=30)//按键按下时间过长 跳过
{
EX0 = 1;
return;
}
IRCOM[i] = IRCOM[i]>>1;
if(TimeNum >= 8) //8*0.14ms 这时读取的是1;
{
IRCOM[i] = IRCOM[i]|0x80;
}
TimeNum = 0;
}
}
if(IRCOM[2]!=~IRCOM[3])//判断八位数据和八位数据反码是否相等
{
EX0 = 1;
return;
}
IRCOM[4] = IRCOM[2]&0x0f;//取低四位
IRCOM[5] = IRCOM[2]>>4; //IRCOM[5]取IRCOM[2]高四位
if(IRCOM[4] > 9) //转换成字符
{
IRCOM[4] = IRCOM[4] + 0x37;
}
else
IRCOM[4] = IRCOM[4] + 0x30;
if(IRCOM[5] > 9)
{
IRCOM[5] = IRCOM[5] + 0x37;
}
else
IRCOM[5] = IRCOM[5] + 0x30;
delay(5);
write_com(0x80 + 0x40 + 5);
write_date(IRCOM[5]);
write_date(IRCOM[4]);
EX0 = 1; //重新开启外部中断
}

阅读全文

与单片机远程遥控增氧泵相关的资料

热点内容
android内存溢出的原因 浏览:15
标志307的压缩比是多少 浏览:633
服务器启动为什么叫三声 浏览:995
追风筝的人英文pdf 浏览:936
解压小熊手机壳 浏览:346
成都市区建成面积算法 浏览:660
智能家居单片机 浏览:97
买男装用什么app好 浏览:855
文件夹合并了怎么拆开 浏览:260
波段副图源码无未来函数 浏览:89
livecn服务器地址 浏览:259
程序员这个工作真的很吃香吗 浏览:847
程序员和数学分析师待遇 浏览:681
压缩气弹簧怎么拆 浏览:324
华为公有云服务器添加虚拟ip 浏览:211
程序员和运营哪个累 浏览:27
抖音安卓信息提示音怎么设置 浏览:456
光速虚拟机的共享文件夹 浏览:251
程序员培训机构发的朋友圈真实性 浏览:744
天干地支简单算法 浏览:299