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

📄 764test.c

📁 LPC760单片机功能测试程序 本测试板是专门针对Philips公司的低功耗单片机P87LPC762而设计,用于测试P87LPC762多种功能
💻 C
📖 第 1 页 / 共 2 页
字号:
/*==============================================================================*/
/*		LPC764	单片机功能测试程序(764test.c)(第二版)   		*/	
/*                                                周立功单片机有限公司		*/
/*							2000-8-23		*/
/*  版本说明:在第一版本中,当按动LPD进入掉电模式后,由于并没有采取任何措施降低764 */
/*           的功耗,因此用户实际测试到的功耗要比数据手册上说明的要高,大约在200微*/
/*           安以下.在这个版本中当进入掉电模式后,关闭了比较器,掉电检测电路,看门 */
/*           狗定时器,实际测试到的功耗电流在1微安以下                           */
/*                                                                              */
/*  本测试板是专门针对Philips公司的低功耗单片机P87LPC764而设计,用于测试		*/
/*  P87LPC764以下功能:								*/
/*										*/
/*  ■标准80C51的外部中断,串行中断和定时器中断.					*/	
/*  ■比较器功能.								*/
/*  ■掉电功能.									*/
/*  ■键盘功能.									*/
/*  ■看门狗定时器功能.								*/
/*  ■I/O口线驱动能力.								*/
/*  ■正常/空闲/掉电(低功耗)模式. 						*/
/* 										*/
/*  此文件764test.c为汇编程序,另外还有						*/	
/*  764test.sch 电路原理图文件							*/
/*  764test.asm 汇编程序文件							*/
/*  764test.c   C程序文件							*/	
/*  注意:由于87LPC764内部有两个EEROM的配置字节,因此用户在进行芯片编程时		*/
/*	除了写入编译好的Hex或Bin文件外,还必须对这些EEROM进行单独编程,		*/
/*	如果不加注意,87LPC764将不能正常工作.在此程序中,UCFG2可以不用		*/
/*	处理,但是UCFG1要如下确定:						*/
/*		UCFG1.7(WDTE)=0 关闭看门狗	.				*/
/*		UCFG1.6(RPD) =1 关闭复位引脚.					*/
/*		UCFG1.5(PRHI)=1 口复位为高电平.					*/
/*		UCFG1.4(BOV) =0或1,用户可以自己选择:1(掉电电压为2.5V)或0(为3.8V)*/
/*		UCFG1.3(CLKR)=0(标准8051时钟),用户也可以选1(8051的2倍时钟).	*/
/*		UCFG[2..0](FOSC[2..0])=000,4MHz-20MHz晶振. 			*/
/*==============================================================================*/
#include <Reg764.h>				/*87LPC764的头文件*/

#define LED_RUN		T1			/*运行指示灯.点亮时为0,熄灭时为1*/
#define LED_CMP1	_CMP1			/*比较器1指示灯.*/
#define LED_CMP2	_CMP2			/*比较器2指示灯.*/
#define LED_SCI		P1_6			/*通讯指示灯*/
#define LED_LBT		P1_7			/*低电源电压指示灯.*/
#define KEY_IDL		_CIN2B			/*空闲键.按此键MCU进入"空闲"模式*/
#define KEY_LPD		_CIN1B			/*低功耗键.按此键进入"低功耗"模式*/
#define KEY_SCI		INT1			/*通讯键. 在"通讯"/"停"之间切换*/
#define KEY_WDT		RST			/*看门狗使能键.模拟死循环*/

bit MCU_STATUS;
bit SCI_STATUS;					/*通讯状态. 1表示正在通讯*/
bit KEY_STATUS;

data unsigned char SOFT_TMR1;			/*软件定时器1*/
data unsigned char SOFT_TMR2;			/*软件定时器2*/
data unsigned char SOFT_TMR3;			/*软件定时器3*/
data unsigned char TXD_LAST;			/*最后一次通讯的数据*/
data unsigned char BUF_PTR;			/*通讯缓冲区指针*/
data unsigned char REC_BUF[8];			/*通讯缓冲区指针*/
data unsigned char KEY_CODE;			/*键盘代码缓冲*/

#define TH0_VAL		0XDC			/*定时器0的重载值*/
#define TL0_VAL		0X00
#define TH1_VAL		0XFA			/*定时器1的重载值*/
#define TL1_VAL		0XFA
#define STACK_POINTER   0X50			/*堆栈指针*/
#define RUN_SPAN	50			/*运行灯闪烁的间隔*/
#define SCI_SPAN	5			/*通讯灯闪烁的间隔*/

void INT_T0(void) interrupt 1
  {TR0=0;
   TH0=TH0_VAL;					/*定时10mS@11.0592MHz*/
   TL0=TL0_VAL;
   TR0=1;
   if(SOFT_TMR1==0)				/*如果定时器1数值为0则设定时间到*/
     {SOFT_TMR1=RUN_SPAN;			/*重新调入定时器1的予置数据.*/
      LED_RUN=~LED_RUN;				/*变换LED_RUN显示*/
     }
   else{SOFT_TMR1=SOFT_TMR1-1;}			/*如果定时器1数值不为0则继续记时.*/

   if(SOFT_TMR2==0)				/*如果定时器2数值1则设定时间到*/
     {SOFT_TMR2=SCI_SPAN;			/*重新调入定时器2的予置数据*/
      if(SCI_STATUS)
	{RI=0;
	 TI=0;	
	 LED_SCI=1;				/*关闭串口显示*/
	}  
      else
	{if(!ES)
	   {ES=1;				/*如果串口处于关闭状态,首先打开串口中断.*/
	    SBUF=0X55;				/*发送第一个数据*/
    	   }	
	 LED_SCI=~LED_SCI;			/*变换串口显示*/
	}
     }
   else{SOFT_TMR2=SOFT_TMR2-1;}			/*如果定时器2数值不为0则继续记时.*/

   if(SOFT_TMR3==0){}
   else{SOFT_TMR3=SOFT_TMR3-1;}			/*如果定时器3数值不为0则继续记时.*/
  }

void INT_EXT1(void) interrupt 2
  {IE1=0;					/*INT1中断服务程序*/
   ET0=1;
  }

void INT_SERIAL(void) interrupt 4		/*串行口中断服务程序*/ 
  {if(TI)
     {TI=0;
      TXD_LAST=TXD_LAST + 8;			/*发送的数据以08H的步长递增*/
      SBUF=TXD_LAST;
     }
   if(RI)
     {RI=0;
      if(BUF_PTR>=8){BUF_PTR=0;}
      REC_BUF[BUF_PTR]=SBUF;			/*接收一个数据*/
      BUF_PTR=BUF_PTR+1;			/*数据缓冲指针加一*/
      }
  }
  
void INT_LOWVOLT(void) interrupt 5		/*掉电中断服务程序*/ 
  {LED_LBT=0;					/*点亮 LED_LBT*/
   PCON=PCON&0XDF;				/*清除 BOF 标志*/
  }

void INT_KBI(void) interrupt 7			/*掉电中断服务程序*/ 
  {AUXR1=AUXR1&0X7F;				/*清除 KBI 溢出标志*/
   EKB=0;					/*禁止 KBI 中断*/
  }

void INT_CMP2(void) interrupt 8			/*比较器2中断服务程序*/ 
  {CMP2=CMP2&0XFE;}				/*清除 CMP2 溢出标志*/

void INT_WDT(void) interrupt 10			/*看门狗定时器中断服务程序*/ 
  {EWD=0;					/*禁止 WDT 中断*/
   AUXR1=AUXR1|8;				/*软件复位*/
  }
void INT_CMP1(void) interrupt 12		/*比较器2中断服务程序*/ 
  {CMP1=CMP1&0XFE;}				/*清除 CMP2 溢出标志*/
/************************************************************************/
/*名称:	DLAY_10US							*/
/*用途: 短延时程序							*/
/*说明:	用户可以根据情况调整						*/
/************************************************************************/
void DELAY_10US()
  {data unsigned char temp1;
   for(temp1=0;temp1<4;temp1++){}
  }  
/************************************************************************/
/*名称:	INIT_CMP							*/
/*说明:	比较器初始化子程序 						*/
/************************************************************************/
void INIT_CMP()
  {PT0AD=PT0AD|0X34;				/*设置P0.2数字功能禁止*/
   P0M2=P0M2&0XCB;				/*仅作为输入口*/
   P0M1=P0M1|0X34;
   CMP1=0X24;					/*CIN1A与CMPREF比较,结果输出至CMP1脚*/
   CMP2=0X2C;					/*CIN2A与REF比较,结果输出至CMP2脚*/
   DELAY_10US();				/*延时10uS*/
   CMP1=CMP1&0X0FE;				/*清除比较器中断标志*/
   CMP2=CMP2&0XFE;
   EC1=1;					/*使能比较器中断*/
   EC2=1;					
   }
/************************************************************************/
/*名称:	INIT_SCI							*/
/*说明:	串行口初始化	 						*/
/************************************************************************/
void INIT_SCI()
  {SCON=0X50;					/*置为模式1*/
   ES=1;					/*开放串口中断.*/
  }
/************************************************************************/
/*名称:	INIT_TMR							*/
/*说明:	定时器初始化	 						*/
/************************************************************************/
void INIT_TMR()
  {TMOD=0X21;					/*定时器0置为模式1*/
		                        	/*定时器1置为模式2*/
   TH0=TH0_VAL;			 		/*定时10mS@11.0592MHz*/
   TL0=TL0_VAL;
   TH1=TH1_VAL;					/*串行口波特率9600*/
   TL1=TL1_VAL;
   ET0=1;					/*开放T0中断使能.*/
   TCON=TCON|0X50;				/*启动 T0/T1*/
  }
		
/************************************************************************/
/*名称:	INIT_EXT							*/
/*说明:	外部中断初始化子程序						*/
/************************************************************************/
void INIT_EXT()
  {TCON=TCON|0X40;				/*外部中断1低电平方式触发.*/
   IE1=1;					/*开放外部中断1使能.*/
  } 
/************************************************************************/
/*名称:	INIT_KBI							*/
/*说明:	键盘初始化子程序						*/
/************************************************************************/
void INIT_KBI()
  {KBI=0X0A;					/*允许P0.1,P0.3键盘中断*/
   P0M2=P0M2&0XF5;				/*P0.1,P0.3仅为输入*/
   P0M1=P0M1|0X0A;
   P1M2=P1M2&0XCF;				/*P1.4,P1.5仅为输入*/
   P1M1=P1M1|0X30;
   EKB=0;
  }
/************************************************************************/
/*名称:	KEY_SCAN							*/
/*用途: 键盘扫描子程序							*/
/*返回: 检测到的键值							*/
/*说明:	此程序依次检查KEY_IDL KEY_LPD KEY_SCI KEY_WDT端口是否为0(有键按 */
/*	下),对应的代码分别为01H 02H 03H 04H(无按键为00H),放入R7中返回.	*/
/************************************************************************/
unsigned char KEY_SCAN()
  {if(!KEY_IDL){return 1;}
   if(!KEY_LPD){return 2;}
   if(!KEY_SCI){return 3;}
   if(!KEY_WDT){return 4;}
   return 0;
  }
/************************************************************************/
/*名称:	KEY_RELS							*/
/*用途: 判断当前按键是否处于全部释放的状态				*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -