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

📄 061223-ok.c

📁 单片机类程序
💻 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 + -