这是一个灯光控制系统的程序 该系统利用的是人体红外感应模块、光敏电阻、ADC0832、使用按键控制工作状态:自动感应和手动操作,因为程序是别人给我的,在我编译的时候出错了,希望大虾能够改正 ,先谢了
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define NUM_TIMER 60 //超时时间
#include"ADC0832.H" 编译的时候出错了**************************
sbit SENSOR_IN=P1^0;
/*******************按键端口定义******************/
sbit key1=P3^5; // 手动/自动切换
sbit key2=P3^7; // 手动状态下"开"
sbit key3=P3^6; // 手动状态下"关"
/*******************指示灯端口定义*****************/
sbit LED1=P1^1; //环境光强
sbit LED2=P1^2; //环境较弱
sbit LED3=P1^3; //环境弱
sbit LED4=P1^4; // 自动
sbit LED5=P1^5; // 手动
/*******************蜂鸣器端口定义*****************/
sbit beep=P0^0;
/******************标示位定义**********************/
bit HOLD_SET=0; // 自动/手动控制标示位 "0"自动 "1"手动
uchar NO_NUM_FLOG=0; // 亮灯个数标示位 "0" 全灭 "1" 亮两组(即四个) "2" 全亮
uchar num=0,num1=0,num2=0;
bit BEEP_FLOG=0; //蜂鸣器报警标示位
uchar Light_Ray_Flog=0; //光线强弱标示位
bit Light_Flog=1;
/****************** A/D转换模块**********************/
sbit ADC0832_CS=P0^7;
sbit ADC0832_CLK=P0^6;
sbit ADC0832_DIO=P0^5;
unsigned int A_D()
{
unsigned char i,dat;
ADC0832_CS=1; //一个转换周期开始
ADC0832_CLK=0; //为第一个脉冲作准备
ADC0832_CS=0; //CS置0,片选有效
ADC0832_DIO=1; //DIO置1,规定的起始信号
ADC0832_CLK=1; //第一个脉冲
ADC0832_CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
ADC0832_DIO=1; //DIO置1, 通道选择信号
ADC0832_CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
ADC0832_CLK=0; //第二个脉冲下降沿
ADC0832_DIO=0; //DI置0,选择通道0
ADC0832_CLK=1; //第三个脉冲
ADC0832_CLK=0; //第三个脉冲下降沿
ADC0832_DIO=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1
ADC0832_CLK=1; //第四个脉冲
for(i=0;i<8;i++) //高位在前
{
ADC0832_CLK=1; //第四个脉冲
ADC0832_CLK=0;
dat<<=1; //将下面储存的低位数据向右移
dat|=(unsigned char)ADC0832_DIO; //将输出数据DIO通过或运算储存在dat最低位
}
ADC0832_CS=1; //片选无效
return dat; //将读书的数据返回
}
/**********************延时子程序********************/
void Delay_1ms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=122;j>0;j--);
}
#include"KEY.H" 编译的时候出错了 ...................................................
/********************人体红外检测子程序*****************/
void INFRARED_DETE()
{
if(SENSOR_IN==1)
{
Delay_1ms(5);
if(SENSOR_IN==1)
{
num1=0;
Light_Flog=0;
BEEP_FLOG=0;
}
}
}
/********************按键控制程序*****************/
void key()
{
if(key1==0) // 手动/自动切换按键
{
Delay_1ms(5);
if(key1==0)
{
HOLD_SET=~HOLD_SET;
while(!key1);
}
}
if(HOLD_SET==1) // 满足手动设置条件时起作用
{
if(key2==0) // "开" 按键
{
Delay_1ms(5);
if(key2==0)
{
NO_NUM_FLOG++;
num1=0;
if(NO_NUM_FLOG==3)
NO_NUM_FLOG=1;
while(!key2);
}
}
if(key3==0) // "关" 按键
{
Delay_1ms(5);
if(key3==0)
{
NO_NUM_FLOG=0;
while(!key3);
}
}
}
}
/******************指示灯子程序*************/
void LED()
{
if(HOLD_SET) //手动控制
{LED4=1;LED5=0;}
else //自动控制
{LED4=0;LED5=1;}
if(Light_Ray_Flog==0) //强
{
LED1=0;
LED2=1;
LED3=1;
}
if(Light_Ray_Flog==1) //较弱
{
LED1=1;
LED2=0;
LED3=1;
}
if(Light_Ray_Flog==2) //弱
{
LED1=1;
LED2=1;
LED3=0;
}
}
/******************亮灯子程序*************/
void LIGHT()
{
if(HOLD_SET) //手动模式
{
if(NO_NUM_FLOG==1) //亮一半的灯
P2=0x33;
if(NO_NUM_FLOG==2) //全亮
P2=0x00;
if(NO_NUM_FLOG==0) //全灭
P2=0xff;
num2=0;
}
else //自动模式
{
if(!Light_Flog)
{
if(num2==60)
{
if(Light_Ray_Flog==1) //亮一半的灯
P2=0x33;
if(Light_Ray_Flog==2) //全亮
P2=0x00;
if(Light_Ray_Flog==0) //全灭
P2=0xff;
}
}
else
{
P2=0xff;
num2=0;
}
}
}
/*******************报警子程序**************/
void BEEP()
{
if(HOLD_SET&&NO_NUM_FLOG) //手动控制
{
if(BEEP_FLOG)
{
beep=0;
Delay_1ms(500);
beep=1;
Delay_1ms(500);
}
else
beep=1;
}
}
/************************光线检测子程序*************/
void Light_Ray()
{
uint AD_val;
AD_val=A_D();
if(AD_val>230) //弱
{
Light_Ray_Flog=2;
}
else if(AD_val<80) //强
{
Light_Ray_Flog=0;
}
else //较弱
Light_Ray_Flog=1;
}
/*******************主程序****************/
void main()
{
SENSOR_IN=1;
key1=1;
key2=1;
key3=1;
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
beep=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
INFRARED_DETE();
key();
LED();
BEEP();
LIGHT();
Light_Ray();
}
}
void T0_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(SENSOR_IN==1&&num2<60)
num2++;
if(num==20)
{
num=0;
num1++;
if(num1==NUM_TIMER/2)
BEEP_FLOG=1;
if(num1>=NUM_TIMER)
{
num1=0;
NO_NUM_FLOG=0;
BEEP_FLOG=0;
Light_Flog=1;
}
}
} |