//这里使用第二个通道,测出光敏的值,控制、led或者蜂鸣器
#include<reg52.h> //包含相应的头文件
#include<stdio.h>
#include<intrins.h>
sbit CS=P1^6; //定义数模转换器硬件对应引脚
sbit CLK=P1^3;
sbit DO=P1^4;
sbit DI=P1^5;
sbit LED=P1^2;
sbit SPK=P3^0;
bit ADFlag;
unsigned char code DIS[]={0xf7,0xfb,0xfd}; //定义数码管位码
unsigned char code Datatab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//7段数码管段码表
data unsigned char Display[3]; //定义临时存放数码管数值
void Init_Timer1(void)
{
TMOD |= 0x10;
TH1=0xff; /* Init value */
TL1=0x00;
//PT1=1; /* 优先级 */
EA=1; /* interupt enable */
ET1=1; /* enable timer1 interrupt */
TR1=1;
}
unsigned char ReadADC(unsigned char channel)
{
unsigned char i,j;
unsigned char Temp=0;
channel <<=3;
channel |=3;
CS =0; //按照资料进行时序操作
for(i=0;i<3;i++) //输入指令,包含通道选择
{
CLK=0;
_nop_();
DI=channel;
channel>>=1;
_nop_();
CLK=1;
}
CLK=0;
_nop_();
CLK=1;
for(j=0;j<8;j++) //处理读入8位数据
{
CLK=0;
_nop_();
Temp=(Temp<<1)|DO;
_nop_();
CLK=1;
}
CS=1;
return(Temp); //返回转换值
}
void Timer1_isr(void) interrupt 3 using 1//定时器1执行数码管动态扫描
{
static unsigned char count,j;
TH1=0xfb; /* Init value */
TL1=0x00;
j++;
if(j==200) {j=0;ADFlag=1;}
P0=Display[count];
P2=DIS[count];
count++;
if(count==3)
count=0;
}
void delay(unsigned int cnt)
{
while(--cnt);
}
void Speaker(void)//蜂鸣器程序
{
unsigned char i;
for(i=0;i<255;i++)
{
delay(100);
SPK=!SPK;
LED=!LED;
}
SPK=0;
}
main()
{
unsigned char ADtemp;//定义中间变量
// unsigned char temp;
Init_Timer1();
while(1)
{
if(ADFlag) //定时采集输入模拟量
{
ADFlag=0;
ADtemp=ReadADC(0);
Display[0]=Datatab[((ADtemp-5)/50)]&0x7f;//处理电压显示
Display[1]=Datatab[((ADtemp-5)%50)/10];
Display[2]=Datatab[((ADtemp-5)%50)%10];
}
if(ADtemp>200)
{
Speaker();
}
}
}