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