標題: 聲光控制代碼單片機 [打印本頁]
作者: 北極熊啊 時間: 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);
}
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |