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

📄 interrupt.c

📁 AVR下的WG26中断接收函数及相关资料说明
💻 C
字号:
/*************************Copyright (c)*****************************************
**                                 科大七星工作室
**                                  QQ:285277300
**							   shirenwei2003@163.com
**--------------文件信息--------------------------------------------------------
**文   件   名: interrupt.c
**最后修改日期: 2008年4月1日
**最后的版本号: V1.0
**硬件电路说明: AVR Mega64单片机中断服务程序代码
**描        述: 外部中断6,7.定时器0,1中断服务子程序
**
**--------------历史版本信息----------------------------------------------------
** 创建人: 
** 版  本: V1.0
** 日 期: 
** 描 述: 原始版本
**
**------------------------------------------------------------------------------
**--------------当前版本修订----------------------------------------------------
** 修改人: 
** 日 期: 
** 描 述: 
** 备  注: 
**
**----------------------------------------------------------------------------*/
#define INTERRUPT
#include "include.h"

signed int CurTime=0,OldTime=0,NewTime=0;
signed int CurTime100Ms=0;//100ms定时决数器

unsigned long Wg26bit=0,Wg26bitTemp=0;
unsigned char WgCount=0;

unsigned char NewCarFlag=0;
unsigned char buf[3];//韦根数据(中间24位)
unsigned char wgeven=0;//韦根偶校验
unsigned char wgodd=0;//韦根奇校验
unsigned char flag200ms=0;
unsigned char flag500ms=0;


/*******************************************************************************
** 函数名称: void int6_isr(void)
** 输   入: 无
** 输   出: 无
** 全局变量: buf[3]
** 功能描述: 外部中断6服务函数,和中断7共同实现韦根26的数据接收.
** 作   者: 侍任伟 
** 日   期: 2008年4月1日
**------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------
*******************************************************************************/
#pragma interrupt_handler int6_isr:iv_INT6
void int6_isr(void)
{
 	 if(WgCount==0)
 	 {
  	      //OldTime = CurTime;
  		  Wg26bit = Wg26bit | 0x01;
		  Wg26bit = Wg26bit<<1;
  		  WgCount++;
 	 }
 	 else if(WgCount>0 && WgCount<26)
 	 {
  	  	  Wg26bit = Wg26bit | 0x01;
		  
  	 	  WgCount++;
  	  	  if(WgCount==26)
  	  	  {
              Wg26bitTemp = Wg26bit;
	  	  	  Wg26bit = 0;
	  	  	  WgCount = 0;
			  
			  	wgeven = (Wg26bitTemp>>25) & 0xff;//韦根偶校验	  
			    buf[0] = (Wg26bitTemp>>17) & 0xff;
                buf[1] = (Wg26bitTemp>>9) & 0xff;
                buf[2] = (Wg26bitTemp>>1) & 0xff;
				wgodd = (Wg26bitTemp) & 0xff;//韦根奇校验
				
				NewCarFlag = 1;//有新刷卡记录
  	      }
		  else
		     Wg26bit = Wg26bit<<1;
 	 }
 	 else
 	 {
  	     WgCount=0;
  	     Wg26bit=0;
     }
}

/*******************************************************************************
** 函数名称: void int7_isr(void)
** 输   入: 无
** 输   出: 无
** 全局变量: 无
** 功能描述: 外部中断7服务函数,和中断6共同实现韦根26的数据接收.
** 作   者: 侍任伟 
** 日   期: 2008年4月1日
**------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------
*******************************************************************************/
#pragma interrupt_handler int7_isr:iv_INT7
void int7_isr(void)
{ 
 	 if(WgCount==0)
 	 {
  		  Wg26bit = Wg26bit & 0xfe;
		  Wg26bit = Wg26bit<<1;
  		  WgCount++;
 	 }
 	 else if(WgCount>0 && WgCount<26)
 	 {
  	  	  Wg26bit = Wg26bit & 0x3fffffe;
		  
  	 	  WgCount++;
  	  	  if(WgCount==26)
  	  	  {
              Wg26bitTemp = Wg26bit;
	  	  	  Wg26bit = 0;
	  	  	  WgCount = 0;
			  
			    wgeven = (Wg26bitTemp>>25) & 0xff;//韦根偶校验	
			    buf[0] = (Wg26bitTemp>>17) & 0xff;
                buf[1] = (Wg26bitTemp>>9) & 0xff;
                buf[2] = (Wg26bitTemp>>1) & 0xff;
				wgodd = (Wg26bitTemp) & 0xff;//韦根奇校验
				
				NewCarFlag = 1;//有新刷卡记录
  	      }
		  else
		      Wg26bit = Wg26bit<<1;
 	 }
 	 else
 	 {
  	     WgCount=0;
  	     Wg26bit=0;
     }
}

/*******************************************************************************
** 函数名称: void timer0_init(void)
** 输   入: 无
** 输   出: 无
** 全局变量: 无
** 功能描述: 定时器0初始化,11.059晶体,定时100(99.8)uS.
** 作   者: 侍任伟 
** 日   期: 2008年4月1日
**------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------
*******************************************************************************/
void timer0_init(void)
{
 TCCR0 = 0x00; //stop
 ASSR  = 0x00; //set async mode
 TCNT0 = 0x76; //set count
 OCR0  = 0x8A;
 TCCR0 = 0x02; //start timer
}

/*******************************************************************************
** 函数名称: void timer0_init(void)
** 输   入: 无
** 输   出: 无
** 全局变量: 无
** 功能描述: 定时器1初始化,11.059晶体,定时100(99.9)mS.
** 作   者: 侍任伟 
** 日   期: 2008年4月1日
**------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------
*******************************************************************************/
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xBC; //setup
 TCNT1L = 0x81;
 OCR1AH = 0x43;
 OCR1AL = 0x7F;
 OCR1BH = 0x43;
 OCR1BL = 0x7F;
 OCR1CH = 0x43;
 OCR1CL = 0x7F;
 ICR1H  = 0x43;
 ICR1L  = 0x7F;
 TCCR1A = 0x00;
 TCCR1B = 0x03; //start Timer
}

/*******************************************************************************
** 函数名称: void timer0_ovf_isr(void)
** 输   入: 无
** 输   出: 无
** 全局变量: 无
** 功能描述: 定时器0中断服务,11.059晶体,定时100(99.8)uS.
** 作   者: 侍任伟 
** 日   期: 2008年4月1日
**------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------
*******************************************************************************/
#pragma interrupt_handler timer0_ovf_isr:17//iv_TIM0_OVF
void timer0_ovf_isr(void)
{
    TCNT0 = 0x76; //reload counter value
 
    CurTime++;
    //putStr(1, "\r\n000\r\n", 100);
}

/*******************************************************************************
** 函数名称: void timer1_ovf_isr(void)
** 输   入: 无
** 输   出: 无
** 全局变量: 无
** 功能描述: 定时器1服务函数,11.059晶体,定时100(99.9)mS.
** 作   者: 侍任伟 
** 日   期: 2008年4月1日
**------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------
*******************************************************************************/
unsigned char CntTem200ms=0;
unsigned char CntTem500ms=0;
#pragma interrupt_handler timer1_ovf_isr:15//iv_TIM1_OVF
void timer1_ovf_isr(void)
{
    TCNT1H = 0xBC; //reload counter high value
    TCNT1L = 0x81; //reload counter low value
 
 	CntTem200ms++;
	CntTem500ms++;
	CurTime100Ms++;
	if(CntTem200ms==1)
	{
	    flag200ms = 1;
	}
	if(CntTem500ms==4)
	{
	    flag500ms = 1;
	}
}

/*******************************************************************************
** 函数名称: void GetTime(void)
** 输   入: 无
** 输   出: 无
** 全局变量: CurTime-当前时间计数值
** 功能描述: 得到系统当前时间计数器值.
** 作   者: 侍任伟 
** 日   期: 2008年4月1日
**------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------
*******************************************************************************/
signed int GetTime(void)
{
    return CurTime;
}
/*******************************************************************************
** 函数名称: void GetTime(void)
** 输   入: 无
** 输   出: 无
** 全局变量: CurTime100ms-当前时间计数值单位:100ms
** 功能描述: 得到系统当前时间计数器值.
** 作   者: 侍任伟 
** 日   期: 2008年4月1日
**------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------
*******************************************************************************/
signed int GetTimeN100ms(void)
{
    return CurTime100Ms;
}

⌨️ 快捷键说明

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