⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 luminometer.c

📁 KEIL C开发的光照度计
💻 C
字号:
#include <sst89x5x4.h>
#include <intrins.h>

sbit clk=P1^0;	   //AD时钟
sbit dout=P1^1;	   //AD数据
sbit csAd=P1^2;   //AD片选
sbit csSeg=P1^3;  //段码锁存
sbit csDig=P1^4;  //位码锁存
sbit beep=P2^1;   //蜂鸣器
sbit P22=P2^2;	  //测量
sbit P23=P2^3;	  //循环查看

#define STOP 0;
#define one() (lex[measureTime+lookUpTime]%10) ;
#define ten() ((lex[measureTime+lookUpTime]%100)/10) ;
#define hundred()  ((lex[measureTime+lookUpTime]%1000)/100)	;
#define thousand() (lex[measureTime+lookUpTime]/1000) ;

//段码表
unsigned char code segCode[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,// 0--9
							     0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,//带小数点0--9
								 0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};	// A, b, C, d, E, F, 消隐
//位码表
unsigned char code csCode[] = {0x70,0xb0,0xd0,0xe0};	 


static unsigned char voltageTemp[5];
static unsigned char measureTime;
static char lookUpTime;
static unsigned char number[4];
static unsigned char digit;
static unsigned int lex[5];

static bit start; 		// 开始测量
static bit keyCurrent;  //当前按键判断,为1表示邮件按下
static bit keyBefore;   //前一次是否有键按下

void initSystem();
void display(unsigned char seg,unsigned char cs);
void adConvert();


void main()
{
	initSystem();

	TR0=1;      //开启定时器,系统开始工作
	TR1=1;

	while(1)
	{
	  do{}while(!start); //开始键按下
	  start=STOP;  
	  TR0=0;			 //关中断以便开始AD采样
	  TR1=0;
	  adConvert();
	  number[3]=one();
	  number[2]=ten();
	  number[1]=hundred();
	  number[0]=thousand();
	  TR0=1;
	  TR1=1;
	}	
}

/**************************系统初始化***********************/

void initSystem()
{
	start=1;
	beep=0;
	measureTime=0;
	lookUpTime=0;
	keyCurrent=0;
	keyBefore=0;
	digit=0;
	TMOD=0X11;	  //T0工作在定时模式
	TH0=0Xf5;	  //TO定时3ms做数码管扫描
	TL0=0X33;
	TH1=0XB7;     //T1定时20ms做键盘扫描
	TL1=0XFF;
	IP=0X08;      //T1优先级高
	EA=1;
	ET0=1;
	ET1=1;
}

/*****************定时器T0做数码管扫描***********************/

void processT0()interrupt 1 using 0
{
	if(digit==4) digit=0;  
	display(number[digit],digit); 
	digit++;
	TH0=0Xf5;	  //TO定时3ms,扫描频率为12ms
	TL0=0X33; 
    return;
}

/*******************定时器T1做键盘扫描*************************/

void processT1()interrupt 3 using 1
{
	keyBefore=keyCurrent;
	if(P22==0||P23==0)			//防止多次响应一个按键
		keyCurrent=1;
	else
	    keyCurrent=0;
    if(keyCurrent==1&&keyBefore==0)
	 {     
	   if(!P22)
	   { 
	     start =1;
		 measureTime++;
		 if(measureTime>4) measureTime=0;
	   }
	   if(!P23)
	   {
	     lookUpTime--;
		 if((measureTime+lookUpTime)<0) lookUpTime=0;
	   }
	 }
	 /*
     number[3]=one();
	 number[2]=ten();
	 number[1]=hundred();
	 number[0]=thousand();			*/
	 TH1=0XB7;     //T1定时20ms做键盘扫描
	 TL1=0XFF;
	 return;
} 

/************************************************************
函数名:数码管显示
入口参数:seg 欲显示的数,如段码表所示,1~26
          cs  欲显示的位,0~3

************************************************************/

void display(unsigned char seg,unsigned char cs)
{
	if(seg>26) seg=26;
	P0=segCode[seg];  //将数据放在P0口
	_nop_();
	_nop_();
	csSeg=1;		
	_nop_();
	_nop_();
	csSeg=0;		//锁存数据
	P2&=0x0f;	    //屏蔽P2口低四位
	P2|=csCode[cs];	//将地址放在P2口高四位
	_nop_();
	_nop_();
	csDig=1;
	_nop_();
	_nop_();
	csDig=0;
}

/*****************AD转换**********************************/

void adConvert()
{
    char i;
	csAd=0;
	clk=0;
	for(i=7;i>=0;i--)		  //8个时钟读一个数据,从高位读起
	{
	  clk=1;
	  if(dout)	voltageTemp[measureTime]|=(1<<i);
	  clk=0;
	}
	csAd=1;
	lex[measureTime]=voltageTemp[measureTime] * 5.0/256;  //求光照度
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -