之前在做一个基于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);
}
-
一周热门 更多>