找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1858|回复: 0
打印 上一主题 下一主题
收起左侧

声光控制代码单片机

[复制链接]
跳转到指定楼层
楼主
ID:330317 发表于 2018-5-15 12:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,bai,shi,ge,tt;
uchar codetable[]={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);
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表