在做一个基于at89c51单片机的声光控制开关,遇到问题了,求解、、、

2019-07-18 09:42发布

之前在做一个基于at89c51单片机的声光控制开关,,发现源代码跟原理图根本不匹配,,希望师兄师姐帮忙改一下源代码,附图一张加不匹配的源代码!!!

#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,bai,shi,ge,tt;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  
// //数码管段定义;
uchar code table1[]={0xfb,0xfd,0xfe}; //数码管位定义;
sbit open=P3^7;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit light=P3^2;
//ADC0832的引脚;
sbit adCS =P3^1;  //ADC0832 片选  ;
sbit adDI =P3^3;  //ADC0832 通道选择和初始化输入 ;
sbit adDO =P3^3;  //ADC0832 的数据输出;
sbit adCLK =P3^0;  //ADC0832 时钟信号;
uchar getdat; //获取ADC转换回来的值;
void display(uchar shi,uchar ge);
void delay(uint z);
void keyscan();
void init();
uchar adc0832(unsigned char channel);
//主程序 ;
void main()
{
  init();//初始化子程序  ;
  keyscan();
while(1)
{   
      light=1; //光线初始化为0;
    if(light==0)
        {   
             getdat=adc0832(1);
                 display(temp/10,temp%10);    //显示数字;
            if (getdat>120) //声音超过2.4V后灯亮;
      {  
            shi=temp/10; //取出十位数字;
       ge=temp%10; //取出个位数字;
            display(shi,ge);    //显示数字;
                 TR0=1;       //启动定时器0;
             if(aa==16)
           {       
             open=0;      //开启照明灯;
               aa=0;
              temp--;         //倒计时;
             if(temp==-1)
             {
                            temp=0;
                                   open=1;    //关闭照明灯;
         }
       }
      }
    }
  }
}
//延时函数;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
//显示数码管内容;
void display(uchar shi,uchar ge)
{
    P2=0xfe;
    P0=table[shi];
    delay(1);
    P2=0xfd;
    P0=table[ge];
    delay(1);
         P2=0xfc;
}
void init()   
{
TMOD=0x01;
TH0=(65536-50000)/256;    //给定时器T0的高8位赋初值;
TL0=(65536-50000)%256;     //给定时器T0的低8位赋初值;
EA=1;             //开cpu总中断;
ET0=1;            //开T0中断;
TR0=0;           //关闭定时器0;
IE0=1;
//外中断0初始化        ;
IT0=1; //下降沿触发;
EX0=1;
light=1; //光线初始化为0;
}
//T0中断函数;
void timer0() interrupt 1
{
TH0=(65536-50000)/256;      //赋初值;
TL0=(65536-50000)%256;
aa++;
}
//外中断0函数 ;
  void int0() interrupt 0
{
     light=0;
}
//键盘扫描函数 ;
void keyscan()
{
        if(key1==0)
        {
                delay(5);   //消抖;
                if(key1==0)  //按下key1灯亮时间为10s;
                {   
                            temp=10;     //10s延时;  
                }
        }
        if(key2==0)
        {
                delay(5);   //消抖;
                if(key2==0)  //按下key2灯亮时间为20s;
                {
                           temp=20;
                  }
        }
        if(key3==0)
        {         
delay(5);   //消抖;
                  if(key3==0)  //按下key3灯亮时间为30s;
                {  
                    temp=30;
                }
        }
}
uchar adc0832(unsigned char ch) //AD转换,返回结果;
{  
    uchar i=0;
    uchar j;
    uint dat1=0;
    uchar dat2=0;
    if(ch==0)ch=2;
    if(ch==1)ch=3;
    adDI=1;
    _nop_();
    _nop_();
    adCS=0;//拉低CS端;
    _nop_();
    _nop_();
    adCLK=1;//拉高CLK端;
    _nop_();
    _nop_();
    adCLK=0;//拉低CLK端,形成下降沿1        ;
    _nop_();
    _nop_();
    adCLK=1;//拉高CLK端;
    adDI=ch&0x1;
    _nop_();
    _nop_();
    adCLK=0;//拉低CLK端,形成下降沿2        ;
    _nop_();
    _nop_();
    adCLK=1;//拉高CLK端;
    adDI=(ch>>1)&0x1;
    _nop_();
    _nop_();
    adCLK=0;//拉低CLK端,形成下降沿3        ;
    adDI=1;//控制命令结束 ;
    _nop_();
    _nop_();
    dat1=0;
    for(i=0;i<8;i++)
    {
        dat1|=adDO;//收数据;
        adCLK=1;
        _nop_();
        _nop_();
        adCLK=0;//形成一次时钟脉冲 ;
        _nop_();
        _nop_();
        dat1<<=1;
        if(i==7)dat1|=adDO;
    }  
    for(i=0;i<8;i++)
    {
        j=0;
        j=j|adDO;//收数据;
        adCLK=1;
        _nop_();
        _nop_();
        adCLK=0;//形成一次时钟脉冲 ;
        _nop_();
        _nop_();
        j=j<<7;
        dat2=dat2|j;
        if(i<7)dat2>>=1;
    }
    adCS=1;//拉低CS端;
    adCLK=0;//拉低CLK端;
    adDO=1;//拉高数据端,回到初始状态 ;
    dat1<<=8;
    dat1|=dat2;
    return(dat1);
}


ll7.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。