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

📄 interrupt.c

📁 是电表处理芯片CS5460A的单片机程序,已经经过产品的验证.
💻 C
字号:
			 

#include <reg51.h>
#include <main.h>
#include <interrupt.h>


bit code table_odd_even_bit[16]={0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0};

extern uchar rs485_timeout,pointer_buf485;
extern uchar rs485_buf[MAX_485_LEN];
extern uchar idata spi_buf[MAX_SPI_LEN];
extern uchar pointer_send,send_len; 
extern uchar count_1s;
//extern uint count_2min;
extern uint count_10s;
extern uchar oper_len,send_offset,chk_sum,send_i;
extern bit flag_send_data,flag_level,flag_drdy,flag_data_ok;
uchar count_level;
 	/*
	   timer0:
	*/


/*

	void timer0() interrupt 1 using 1
	{
		if(rs485_timeout)
		{
			rs485_timeout--;
			if(rs485_timeout==0)
			{
				pointer_buf485=0;
				REN_TEN=LOW;
			}				
		}
											
		SPI_DRDY=1;											
      if(flag_level)   				//the flag is set when drdy is detected highly
      {		
         if(SPI_DRDY)        
         {
            count_level++;
            if(count_level>5)
            {	
               flag_level=0;
               count_level=0;
            }
         }	
         else
            count_level=0;
      }
      else  	
      {					                           
         if(!SPI_DRDY)          //p1.5=0
         {		
            count_level++;
            if(count_level>5)
            {	
					flag_level=1;
					flag_drdy=1;
					
               count_level=0;   	
//               count_1s=20;		//clr flag_drdy when there isn't drdy signal waiting for 2s 
            }
         }	
         else
            count_level=0;
      }
      
		if(count_1s)
		{
			count_1s--;			
			if(count_1s==0)
				flag_data_ok=0;
		}					
			
		if(count_10s)
			count_10s--;			
		
		TH0=TH0_C;
		TL0=TL0_C;		//T0=10ms
	}

*/	
	
				
	void Rs485_Routine() interrupt 4 using 1
	{	
		if(TI)
		{	
			TI=0;
			send_len--;
			if(send_len!=0)
			{
				if(pointer_send<9)				
				{
					send_i=rs485_buf[pointer_send];
					TB8=Get_Odd_Even_Bit(send_i);
					chk_sum+=send_i;									
					SBUF=send_i;					
				}
				else if(pointer_send==9)
				{
					TB8=Get_Odd_Even_Bit(oper_len);
					chk_sum+=oper_len;
					SBUF=oper_len;
				}
				else if(pointer_send<oper_len+10)		//send:chk_sum
				{	
				 	if(pointer_send<12)
				 	{ 	
				 		send_i=rs485_buf[pointer_send]+0x33;
						TB8=Get_Odd_Even_Bit(send_i);
						chk_sum+=send_i;
						SBUF=send_i;
				 	}	
				 	else
				 	{
				 		send_i=spi_buf[send_offset+pointer_send-12]+0x33;
				 		TB8=Get_Odd_Even_Bit(send_i);
						chk_sum+=send_i;
						SBUF=send_i;
				 	}
				}
				else if(pointer_send==oper_len+10)		//send:chk_sum
				{
					TB8=Get_Odd_Even_Bit(chk_sum);
					SBUF=chk_sum;
				}
				else if(pointer_send==oper_len+11)		//send: 0x16
				{
					TB8=1;
					SBUF=0x16;
				}
				pointer_send++;
			}
			else
			{
				flag_send_data=0;
				REN_TEN=LOW;
			}
		}
		
		else if(RI)
		{
			rs485_buf[pointer_buf485]=SBUF;
			RI=0;
			if(RB8!=Get_Odd_Even_Bit(rs485_buf[pointer_buf485]))
				return;

			if((rs485_buf[pointer_buf485]!=0x68) && (rs485_timeout==0))
				return;
			pointer_buf485++;
			if(pointer_buf485>=MAX_485_LEN)
				pointer_buf485=0;
		}
		rs485_timeout=80;
	}


/*
	void Rs485_Routine() interrupt 4 using 2
	{
		if(TI)
		{
			TI=0;
			send_len--;
			if(send_len!=0)
			{
				if(pointer_send<9)				
				{
					TB8=Get_Odd_Even_Bit(rs485_buf[pointer_send]);
					chk_sum+=rs485_buf[pointer_send];									
					SBUF=rs485_buf[pointer_send];					
				}
				else if(pointer_send==9)
				{
					TB8=Get_Odd_Even_Bit(oper_len);
					chk_sum+=oper_len;
					SBUF=oper_len;
				}
				else if(pointer_send<oper_len+10)		//send:chk_sum
				{
				 	if(pointer_send<12)
				 	{ 	
						TB8=Get_Odd_Even_Bit(rs485_buf[pointer_send]);
						chk_sum+=rs485_buf[pointer_send];									
						SBUF=rs485_buf[pointer_send];					
				 	}	
				 	else
				 	{
				 		TB8=Get_Odd_Even_Bit(spi_buf[send_offset+pointer_send-12]);
						chk_sum+=spi_buf[send_offset+pointer_send-12];
						SBUF=spi_buf[send_offset+pointer_send-12];
				 	}
				}
				else if(pointer_send==oper_len+10)		//send:chk_sum
				{
					TB8=Get_Odd_Even_Bit(chk_sum);
					SBUF=chk_sum;
				}
				else if(pointer_send==oper_len+11)		//send: 0x16
				{
					TB8=1;
					SBUF=0x16;
				}
				pointer_send++;
			}
			else
			{
				REN_TEN=LOW;
				ES=1;
			}
		}
		if(RI)		
		{
			rs485_buf[pointer_buf485]=SBUF;
			RI=0;
			if(RB8!=Get_Odd_Even_Bit(rs485_buf[pointer_buf485]))
				return;
				
			if((rs485_buf[pointer_buf485]!=0x68) && (rs485_timeout==0))
				return;			
			pointer_buf485++;
			if(pointer_buf485==MAX_485_LEN)
				pointer_buf485=0;
		}				
		rs485_timeout=8;				
	}
*/
	
    	
	bit Get_Odd_Even_Bit(uchar para)
	{
   		uchar i;
   		bit j;
   	
		i=para & 0x0f;
		j=table_odd_even_bit[i];		  	
		i=para & 0xf0;
		i>>=4;
		if(j)
		{
			if(table_odd_even_bit[i])
				return 0;
			else
				return 1;								
		}
		else
		{
			if(table_odd_even_bit[i])
				return 1;
			else
				return 0;	

		}		
	}
	


































































































































⌨️ 快捷键说明

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