有没有人闲的没事干帮我看看程序和电路图哪里出问题了啊。一个红外光控自动窗帘
时间:10-02
整理:3721RD
点击:
主程序
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define ad0_7 P1
sbit wr=P3^6;
sbit rd=P3^7;
sbit IN1=P2^0;
sbit IN2=P2^1;
sbit IN3=P2^2;
sbit IN4=P2^3;
sbit ENA=P2^4;
sbit ENB=P2^5;
sbit IR=P3^2;
uint n,y,z,m;
uchar N[4];
void guangkong(void); 光控制窗帘
void hongwai(void); 红外控制窗帘
void dakai(void); 窗帘打开子程序
void guanbi(void);窗帘关闭子程序
void YS(uchar time); 延时
void main()
{
IT0 = 1;
EX0 = 1;
EA = 1;
guangkong();
}
/***************************************************************
电机打开
***************************************************************/
void dakai()
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
for(n=0;n<10;n++)
{
for(y=0;y<1000;y++);
{ENA=1;
ENB=1;
YS(2);
ENA=0;
ENB=0;
YS(1);
}
}
}
/***************************************************************
电机关闭
***************************************************************/
void guanbi()
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
for(z=0;z<10;z++)
for(m=0;m<1000;m++)
{ENA=1;
ENB=1;
YS(2);
ENA=0;
ENB=0;
YS(1);
}
}
/***************************************************************
光控
***************************************************************/
void guangkong()
{
uchar ad_data;
while(1)
{wr=0;
_nop_();
wr=1;//WR由低电平到高电平时,即上升沿时,AD开始采样转换
YS(1);//延时1ms,等待采样转换结束
ad0_7=0xff;//这条语句不能少,我也还不知道为什么
rd=0;//读取转换数据结果数据结果
_nop_();
ad_data=ad0_7;//把数据存到ad_data中
if(ad_data<150)
{
dakai();
}
if(ad_data>400)
{
guanbi();
}
}
}
/***************************************************************
红外执行
***************************************************************/
void hongwaiint0() interrupt 0
{
uchar j,k,r;
uint err,Time;
Time=0;
YS(7); //7ms
if(IR==0) //确认是否真的接收到正确的信号
{
err=1000; //1000*10us=10ms,超过说明接收到错误的信号
/*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
侯,程序死在这里*/
while((IR==0)&&(err>0)) //等待前面9ms的低电平过去
{
YS(1);
err--;
}
if(IR==1) //如果正确等到9ms低电平
{
err=500;
while((IR==1)&&(err>0)) //等待4.5ms的起始高电平过去
{
YS(1);
err--;
}
}
}
for(k=0;k<4;k++) //共有4组数据
{
for(j=0;j<8;j++) //接收一组数据
{
err=60;
while((IR==0)&&(err>0))//等待信号前面的560us低电平过去
{
YS(1);
err--;
}
err=500;
while((IR==1)&&(err>0)) //计算高电平的时间长度。
{
YS(10); //0.1ms
Time++;
err--;
if(Time>30)
{
return;
}
}
N[k]>>=1; //k表示第几组数据
if(Time>=8) //如果高电平出现大于565us,那么是1
{
N[k]|=0x80;
}
Time=0; //用完时间要重新赋值
}
}
if(N[0] == ~N[1] && N[2] == ~N[3]) //校验识别码,操作码
{
r=N[2];
}
EX0 = 1;
if(r==0x01)
{
dakai();
}
if(r==0x02)
{
guanbi();}
}
/***************************************************************
延时程序
***************************************************************/
void YS(uchar time)
{
uchar i,j;
for(i=0; i<time; i++)
for(j=0; j<247; j++)_nop_();
}
红外发射
#include <REG52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define SBM 0x80 //识别码
#define m9 (65536-9000) //约9mS
#define m4_5 (65536-4500) //约4.5mS
#define m1_6 (65536-1630) //约1.65mS
#define m_65 (65536-580) //约0.65mS
#define m_56 (65536-560) //约0.56mS
#define m40 (65536-40000) //约40mS
#define m56 (65536-56000) //56mS
#define m2_25 (65536-2250) //约2.25mS
sbit IR = P3^6; //定义发射引脚(接PNP三极管基极)
void KEY(void);
void ZZ(uchar x);
void Z0(uchar temp);
void TT0(bit BT,uint q);
void YS(uchar time);
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:主函数
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{
TMOD = 0x01; //T0 16位工作方式
IR=1; //发射端口常态为高电平
while(1)
{
KEY();
}
}
void KEY(void)
{ uchar v;
P1=0xff; //将键盘端口未按下按键时,按键1,2输入端口为0
if(P1!=0xff) //检测是否有按键按下,如果有则hangval必不为0xf8
{
YS(10); //按键去抖动,延时10毫秒
if(P1!=0xff) //确实有按键按下
{
v=P1;
switch(v)
{
case 0xfe:ZZ(0x01);v=0;break;
case 0xfc:ZZ(0x02);v=0;break;
default:v=0;
}
}
}
}
void ZZ(uchar x)
{
TT0(1,m9); //高电平9mS
TT0(0,m4_5); //低电平4.5mS
/*┈ 发送4帧数据 ┈*/
Z0(SBM);
Z0(~SBM);
Z0(x);
Z0(~x);
/*┈┈ 结束码 ┈┈*/
TT0(1,m_65);
TT0(0,m40);
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:单帧发送程序
入口参数:1帧数据
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Z0(uchar temp)
{
uchar l;
for (l=0;l<8;l++) //循环8次移位
{
TT0(1,m_65); //高电平0.65mS
if(temp&0x01)
TT0(0,m1_6); //发送最低位
else
TT0(0,m_56);
temp >>= 1; //右移一位
}
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:38KHz脉冲发射 + 延时程序
入口参数:(是否发射脉冲,延时约 q (uS))
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void TT0(bit BT,uint q)
{
TH0 = q/256; //输入T0初始值
TL0 = q%256;
TF0=0; //清0
TR0=1; //启动定时器0
if(BT == 0) while(!TF0); //BT=0时不发射38KHz脉冲只延时;BT=1发射38KHz脉冲且延时;
else while(1) //38KHz脉冲,占空比1:5
{
IR = 0;
if(TF0)break;
if(TF0)break;
IR = 1;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
}
TR0=0; //关闭定时器0
TF0=0; //标志位溢出则清0
IR =1; //脉冲停止后,发射端口常态为高电平
}
/***************************************************************
函数功能:按键消抖 延时程序
入口参数:1ms×time (晶振=12MHz)
***************************************************************/
void YS(uchar time)
{
uchar i,j;
for(i=0; i<time; i++)
for(j=0; j<247; j++)_nop_();
}
L298控制直流电机
闲的没事干宁愿睡觉啊