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

📄 061219.c

📁 单片机类程序
💻 C
字号:
/*****************************************************************************
 *	Productor name:
 *	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.5 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 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 ushort dispense_counter@0x28;
static uchar flash@0x2A;

void delay_200ms(void);

void main()
{
P5CR=0x00;//set port5 are output
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=timer_1min=timer_7min=temp1=temp2=temp3=dispense_counter_1=dispense_counter_2=flash=0;//initial register
dispense_counter=0;
/////////////////////////////////////////////////////////		
_asm
	{//set the TCC
	MOV A,@0x05	
	CONTW		//set prescalar to TCC 1:64,
	MOV A,@0x40	
	MOV %TCC,A	//set initial value of TCC,T=1.5s 
	MOV A,@0x01
	IOW %IMR	//enable the TCCINT 
	ENI
	} 
/////////////////////////////////////////////////////////	
while(1)
	{
	if(P6_0==0)
		{//Mode1,dispense every 7 minutes
		_asm
			{//set "mode_1" flag
			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(P5_0==0)
		{//the battery is low voltage
		delay_200ms();//delay 0.5s,filtrate the abmormal wave
		if(P5_0==0)
			{
			temp1++;
			if(temp1==50)
				{//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}
		}
	if(dispense_counter_2==11)
		{//11*256+209=3025
		if(dispense_counter_1>220)
			{//set "replace_bottle" flag
			_asm
				{BS %flag,3}
			dispense_counter_2=0;
			dispense_counter_1=0;			
			}
		}
	}
}

/*	dalay 200ms	 */
void delay_200ms(void)
{//dalay_200ms
for(temp2=200;temp2>0;temp2--)
	{
	WDTC();
	WDTC();
	WDTC();
	WDTC();
	}
}

/*	delay 250ms */
void delay_250ms(void)
{//delay 250ms
for(temp3=250;temp3>0;temp3--)
	{
	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
{
// 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}
//		timer_7min=0;//initial the register	
		}
	}

if((low_volt==1)||(replace_bottle==1))
	{
	if(low_volt==1)
		{//flash 3 second interval
		flash++;
		if(flash==2)
			{
			if(P6_7==0)
				{P6_7=1;}
			else
				{P6_7=0;}
			flash=0;//intial the register
			}
		}
	else
		{//flash 1.5 second interval
		if(P6_7==0)
			{P6_7=1;}
		else
			{P6_7=0;}
		} 
	}
	
else 
	{
	if((mode_1==1)&&(timer_7minute==1))
		{//mode 1,despense every 7 minutes
		P5_1=0;//moto working
	
		P6_6=1;
		delay_250ms();
		P6_6=0;
		delay_250ms();
		P6_6=1;
		delay_250ms();
		P6_6=0;
		delay_250ms();
		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;
	
		P6_6=1;
		delay_250ms();
		P6_6=0;
		delay_250ms();
		P6_6=1;
		delay_250ms();
		P6_6=0;
		delay_250ms();
		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;
	
		P6_6=1;
		delay_250ms();
		P6_6=0;
		delay_250ms();
		P6_6=1;
		delay_250ms();
		P6_6=0;
		delay_250ms();
		P6_6=1;
	
		P5_1=1;
		timer_7min=0;//initial the register	
		_asm
			{
			BC %flag,0	//clear the 28_minute falg
			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,@0x40
	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 + -