#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); }
|