?? at89c51+pcf8591.c
字號:
#include <intrins.h>
#include <reg51.h> /* special function register declarations */
#include <I2C.h>
sbit OnAlarm = P3^1;
sbit Sensor = P1^0;
unsigned int Volt[4],buf[3],Alarm;
unsigned int BUFF[4],BUF1;
unsigned char sec,sec100,min,flag1,flag2,temp,temp1,opto;
unsigned char i,digit,buffer[4];
char cputick,key,delay,count1;
/* Code for Differrent 7 Segment */
char code convert[10]={0xfc,0xc0,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
void pause(int);
void time();
void ShowOnce();
void Delayms(unsigned int count);
void DelayShow();
void SensorOn();
void HexToDec();
void timer0int (void) interrupt 1 using 1
{
TH0 |= 0xdc; // reload timer 0 with 0DC00H
cputick++;
time(); // update realtime clock
}
void time()
{
sec100++;
if(sec100 >= 100) /* 100 * 10 ms = 1 s */
{
sec100 = 0;
flag1 |= 0x05; /* set bit 0, bit 2 */
temp = 50;
sec = 100;
HexToDec();
}
}
void HexToDec()
{
BUFF[0] = (BUF1*19.53)/100; /* Convert Hex To DEC */
BUFF[1] = BUF1*19.53;
BUFF[2] = BUFF[1]%100;
}
void ScanLED() /* scan 4-digit LED */
{
int i;
digit = 0x08;
for( i = 0; i < 4; i++) /* 4-DIGIT scanning */
{
P2 = ~digit & opto ; /* send complement[digit] */
P0 = ~buffer[i]; /* send complement[segment] */
pause(5); /* delay a while */
P0 = 0xff; /* off LED */
digit>>=1; /* next DIGIT */
}
}
void VoltToBuffer()
{
buffer[3] = convert[BUFF[2]%10];
buffer[2] = convert[BUFF[2]/10];
buffer[1] = convert[BUFF[0]%10];
buffer[0] = convert[BUFF[0]/10];
}
void Blink() /* Set Dot (DP) */
{
if((flag1 & 0x04) != 0) /* check bit 2 if set decrement temp until zero */
{
temp--;
if (temp != 0)
{
buffer[1] |= 0x01;
}
else( flag1 &= ~0x04);
}
}
void SensorOn() // check Sensor Cyclinder
{
if(Sensor == 0)
{
OnAlarm = 1;
DelayShow();
OnAlarm = 0;
}
}
void ShowOnce() /* Show DATA */
{
int i;
for(i=0;i<2500;i++)
ScanLED();
}
void DelayShow() /* Delay for wait IO Nizer Working */
{
unsigned long i;
for(i=0;i<141500;i++) /* Delay 120 s */
ScanLED();
}
void Offmsd()
{
if (buffer[0] == 0xfc) /* if msd = '0' then put blank unstead */
buffer[0] = 0x00;
}
void pause(j) /* Delay for scan 7 Segment */
int j;
{
int i;
for (i = 0; i < j; i++)
;
}
void CompareVolt() /* Compare Voltage Bat. */
{
if(Alarm > BUFF[0]) /* Check Bat. for Alarm */
{
OnAlarm = 1; /* set bit P3.7 turning Alarm on */
}
else
OnAlarm = 0; /* clear P3.7 turning Alarm off */
}
void main()
{
EA = 1;
ET0 = 1; // or IE |= 0x82; /* set bit EA and Timer0 enable */
TMOD |= 0x01; /* timer 0 run 16 bit counter */
TR0 = 1; //or TCON |= 0x10; /* run timer 0 */
cputick = 0;
flag1 = 0x00;
flag2 = 0x00;
P3 = 0xff;
P1 = 0xff;
opto = 0xff;
Sensor = 1;
//sec = 100;
Alarm = 19; /* Set Alarm Battery at 19.00 V */
buffer[0] = 0x1e; /* Show Tor */
buffer[1] = 0x3a;
buffer[2] = 0x0a;
buffer[3] = 0x00;
ScanLED();
ShowOnce();
buffer[0] = 0x1c; /* Show Load */
buffer[1] = 0x3a;
buffer[2] = 0x7a;
buffer[3] = 0x00;
ScanLED();
ShowOnce();
buffer[0] = 0x0a; /* Show Run */
buffer[1] = 0x38;
buffer[2] = 0x2a;
buffer[3] = 0x00;
ScanLED();
ShowOnce();
P3 = 0x00;
P1 = 0xff;
while(1)
{
while(cputick < 10)
ScanLED();
cputick = 0;
/*------------- the following tasks execute every 100ms ------*/
I2Cstart(); // Start I2C
I2Cwrbyte(0x90); // PCF8591 address 0 (000)
I2Cwrbyte(0x40|0x40); // Write Channel for read
I2Cstop(); // Stop I2C
for(i=0;i<2;i++) // 2 Read DATA
{
I2Cstart(); // Restart I2C
I2Cwrbyte(0x91); // Write Data Control for READ Data
temp1 = I2Crdbyte(); // temp1 buffer for keep data(HEX)
I2Cstop(); // Stop I2C
}
BUF1 = temp1; // ADC(CH0);
VoltToBuffer();
Blink();
Offmsd();
SensorOn();
CompareVolt();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -