📄 061221.c
字号:
/*****************************************************************************
* Productor name:Auto Dispenser
* Write by:kenny_zhou
* Mail address:zhou_vip_1980@163.com
* Write date:2006.12.19
* Version:V0.0
* MCU:EM78P156EL
* Crystal:32.768KHz 4 cycle Mode
* Prescalar be set to TCC 1:64 ,Tcc = 1.2 seconds ,TCC initial value is "64"
*****************************************************************************
* (1)S1 MCU reset
* (2)S2 Power ON/OFF
* (3)P5_0 low power detect
* (4)P5_1 Moto Drive
* (5)P6_0=0 Mode1,dispense every 7 minutes
* (6)P6_1=0 Mode2,dispense every 14 minutes
* (7)P6_2=0 Mode3,dispense every 28 minutes
* (8)P6_6 Yellow LED
* (9)P6_7 Red LED
****************************************************************************/
#include "EM78x156xx.h"
#define DISI() _asm{DISI}
#define ENI() _asm{ENI}
#define NOP() _asm{NOP}
#define WDTC() _asm{WDTC}
#define uchar unsigned char
#define ushort unsigned short
#define ulong unsigned long
static uchar flag@0x20;
static bit timer_28minute@0x20@0;
static bit timer_14minute@0x20@1;
static bit timer_7minute@0x20@2;
static bit replace_bottle@0x20@3;
static bit low_volt@0x20@4;
static bit mode_1@0x20@5;
static bit mode_2@0x20@6;
static bit mode_3@0x20@7;
static uchar flag1@0x28;
static bit test_pump@0x28@0;
static uchar dispense_counter_1@0x21;//counter the times of dispense low byte
static uchar dispense_counter_2@0x22;//counter the times of dispense high byte
static uchar timer_1min@0x23;//1 minutes Timer register
static uchar timer_7min@0x24;//7 minutes Timer register
static uchar temp1@0x25;
static uchar temp2@0x26;
static uchar temp3@0x27;
static uchar temp4@0x2A;
static uchar flash@0x29;
void delay_300ms(void);
void delay_280ms(void);
void delay_300ms_1(void);
void main()
{
P5CR=0x01;//set P5.1~P5.3 are output,P5.0 is input
P6CR=0x3F;//set P6.0~p6.5 are input ; the P6.6~P6.7 are output
PHCR=0xF0;//set the P6.0~P6.3,P6.6~P6.7 are pull-high enable ,the P6.4~P6.5 are push-high disable
P5=0xFF;//initial P5
P6=0xFF;//ititial P6
flag=flag1=flash=temp1=temp2=temp3=temp4=0;//initial register
timer_1min=timer_7min=0;//initial register
dispense_counter_1=dispense_counter_2=0;//initial register
P6_6=0;
P6_7=0;
delay_280ms();
P6_6=1;
P6_7=1;//indicate the reset is OK
delay_280ms();
P6_6=0;
P6_7=0;
delay_280ms();
P6_6=1;
P6_7=1;//indicate the reset is OK
/////////////////////////////////////////////////////////
_asm
{//set the TCC
MOV A,@0x05
CONTW //set prescalar to TCC 1:64,
MOV A,@0x66
MOV %TCC,A //set initial value of TCC,T=1.2s
MOV A,@0x01
IOW %IMR //enable the TCCINT
ENI
}
/////////////////////////////////////////////////////////
while(1)
{
if((P6_0==0)&&(P6_1==0)&&(P6_2==0))
{//set "test_pump" falg
_asm
{BS %flag1,0}
}
else
{
if(P6_0==0)
{//Mode1,dispense every 7 minutes,set "mode_1" flag
_asm
{BS %flag,5}
}
else
{//clear "mode_1" flag
_asm
{BC %flag,5}
}
if(P6_1==0)
{//Mode2,dispense every 14 minutes,set "mode_2" flag
_asm
{BS %flag,6}
}
else
{//clear "mode_2" flag
_asm
{BC %flag,6}
}
if(P6_2==0)
{//Mode3,dispense every 28 minutes,set "mode_3" flag
_asm
{BS %flag,7}
}
else
{//clear "mode_3" flag
_asm
{BC %flag,7}
}
if(dispense_counter_2==11)
{//11*256+209=3025
if(dispense_counter_1>215)
{//set "replace_bottle" flag
_asm
{BS %flag,3}
dispense_counter_2=0;
dispense_counter_1=0;
}
}
if(P5_0==1)
{//clear the "low_volt" flag
_asm
{BC %flag,4}
}
}
}
}
/* delay 200ms */
void delay_280ms(void)
{//delay 200ms
for(temp2=190;temp2>0;temp2--)
{
WDTC();
WDTC();
WDTC();
WDTC();
}
}
/* delay 300ms */
void delay_300ms(void)
{//delay 300ms
for(temp3=200;temp3>0;temp3--)
{
WDTC();
WDTC();
WDTC();
WDTC();
}
}
void delay_300ms_1(void)
{//delay 300ms
for(temp4=200;temp4>0;temp4--)
{
WDTC();
WDTC();
WDTC();
WDTC();
}
}
void _intcall interrupt_l(void) @ 0x08:low_int 0
{
_asm
{//save A --> 0x2D ; R3 --> 0x2E (ram bank 0); R4 --> 0x2F (ram bank 0)
MOV 0x2D,A //backup A to 0x2D
SWAPA 0x04 //backup R4 to 0x2F at bank 0
MOV 0x2F,A //backup R4 to 0x2F at bank 0
SWAPA 0x03
MOV 0x2E,A //backup R3 to 0x2E at bank 0
}
}
//interrupt server
void _intcall interrupt(void) @ int 0
{//T=1.2s
// Write your code (inline assembly or C) here
DISI();//disable the intrrupt
timer_1min++;
if(timer_1min==40)
//if(timer_1min==10)
{//1 minutes is finish
timer_1min=0;//then initial register
timer_7min++;
if(timer_7min==7)
{//7 minutes is finish
_asm //set 7 minutes arrive flag
{BS %flag,2}
}
else if(timer_7min==14)
{//14 minutes is finish
_asm //set 14 minutes arrive flag
{BS %flag,1}
}
else if(timer_7min==28)
{//28 minutes is finish
_asm //set 28 minutes arrive flag
{BS %flag,0}
}
}
//if "low_volt" or "replace_bottle" flag is setted
if((low_volt==1)||(replace_bottle==1))
{
if(low_volt==1)
{//flash 3 second interval
flash++;
if(flash==2)
{//both LED flash
P6_6=0;//green LED
P6_7=0;//red LED
delay_300ms();
P6_7=1;
P6_6=1;
flash=0;//intial the register
}
else
{//just greed LED flash
P6_6=0;
delay_300ms();
P6_6=1;
}
}
else
{//flash 1.5 second interval
P6_6=0;
P6_7=0;
delay_300ms();
P6_7=1;
P6_6=1;
}
}
//else if no "low_volt" or "replace_bottle",normal runing
else
{//judge low battery
P6_6=0;//green LED flash ,indicate the system is runing
delay_300ms_1();
P6_6=1;
if(P5_0==0)
{//the battery is low voltage
delay_300ms();//detect 3s,filtrate the abmormal wave
if(P5_0==0)
{
temp1++;
if(temp1==10)
{//set "low_voltage" flag
_asm
{BS %flag,4}
temp1=0;//initial register
}
}
}
else
{//clear "low_volt" flag
temp1=0;//initial register
_asm
{BC %flag,4}
}
//judge "test_pump" mode
if(test_pump==1)
{//test pump mode
P5_1=0;
//dispense 1.2s
P6_6=1;//green LED
delay_300ms();
P6_6=0;
delay_300ms();
P6_6=1;
delay_300ms();
P6_6=0;
delay_300ms();
P6_6=1;
P5_1=1;
timer_7min=0;//initial the register
_asm
{
BC %flag1,0 //clear the "test_pump" flag
INC %dispense_counter_1 //increament the dispense_counter
JBC %STATUS,2
INC %dispense_counter_2
}
}
else
{
if((mode_1==1)&&(timer_7minute==1))
{//mode 1,despense every 7 minutes
P5_1=0;//moto working
//dispense 1.2s
P6_6=1;
delay_300ms();
P6_6=0;
delay_300ms();
P6_6=1;
delay_300ms();
P6_6=0;
delay_300ms();
P6_6=1;
P5_1=1;//moto stop
timer_7min=0;//initial the register
_asm
{
BC %flag,2 //clear the 7_minute falg
INC %dispense_counter_1 //increament the dispense_counter
JBC %STATUS,2
INC %dispense_counter_2
}
}
else if((mode_2==1)&&(timer_14minute==1))
{//mode 2,depense every 14 minutes
P5_1=0;
//dispense 1.2s
P6_6=1;
delay_300ms();
P6_6=0;
delay_300ms();
P6_6=1;
delay_300ms();
P6_6=0;
delay_300ms();
P6_6=1;
P5_1=1;
timer_7min=0;//initial the register
_asm
{
BC %flag,1 //clear the 14_minute falg
INC %dispense_counter_1 //increament the dispense_counter
JBC %STATUS,2
INC %dispense_counter_2
}
}
else if((mode_3==1)&&(timer_28minute==1))
{//mode 3,depense every 28 minutes
P5_1=0;
//dispense 1.2s
P6_6=1;
delay_300ms();
P6_6=0;
delay_300ms();
P6_6=1;
delay_300ms();
P6_6=0;
delay_300ms();
P6_6=1;
P5_1=1;
timer_7min=0;//initial the register
_asm
{
BC %flag,0 //clear the 28_minute flag
INC %dispense_counter_1 //increament the dispense_counter
JBC %STATUS,2
INC %dispense_counter_2
}
}
}
}
//restore ACC,R3,R4
_asm
{
BC 0x0F,0 //clear the TCCINT flag
MOV A,@0x66
MOV %TCC,A //reset the initial value of TCC(0x01)
ENI
SWAPA 0x2E //restore R3
MOV 0x03,A
SWAPA 0X2F //restore R4
MOV 0x04,A
SWAP 0x2D //restore A
SWAPA 0x2D
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -