📄 luminometer.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 + -