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

📄 2272_34ok.c

📁 //ICC-AVR application builder : 2006-2-20 14:58:34 // Target : M8 // Crystal: 1.0000Mhz //模拟PT226
💻 C
字号:
//ICC-AVR application builder : 2006-2-20 14:58:34
// Target : M8
// Crystal: 1.0000Mhz
/*a暂时定为145us  
0:  580us和1740us    对应计数器: 72.5(48h)  217.5(d9)
一个位宽=32a=4.64ms
55.680ms(编码)+18.560ms(同步)     同步:2320
编码=4位地址码(暂定全0)+8位数据码(由低到高)
*/
//PD2作为输入.
//解码有效确认  D1  PD5   PD6 disp_seg PD7 clk 数码管
//*******************************
// TCCR1B = 0x00; //stop
// TCNT1H = 0x00; //setup
// TCNT1L = 0x00;
// TCCR1B = 0x02; //start Timer  8分频计数器 1=8us
//*************************************



///改正移动2倍错误
//提高串口误码率
#include <iom8v.h>
#include <macros.h>
#define D0 PORTD &=~ (1<<5)  
#define D1 PORTD |= (1<<5)
#define uchar unsigned char

const uchar seg_table[11]={0x11,0xd7,0x32,0x92,0xd4,0x98,0x18,0xd3,0x10,0x90,0xff};//共阳
unsigned char t_disp[4]={0,0,0,0};   //存放格式为  F/o,0,3,4
unsigned char temp;		

unsigned int hpulse,lpulse,data;//高低电平宽度'
uchar head=0,data_cout=0,recieved=0,data_in;//输入数据,同步头标志位,数据个数,数据完毕标志,
uchar data_out=0;data_out1=0;data_out2=0;data_out3=0,data_end;//输出的8位数,第一二三次输出,最后输出
void port_init(void)
{
// PORTB = 0x00;
// DDRB  = 0xFF;
// PORTB = 0x00;//输出小灯全灭.
 PORTD = 0x00;
 DDRD  = 0xE0;
 PORTD = 0x00;
}

void uart0_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x02;
 UCSRC = BIT(URSEL) | 0x06;
 UBRRL = 0x0C; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi
 UCSRB = 0x08;
}

void put_c(unsigned char c) //发送采用查询方式
{
	while( !(UCSRA & (1<<UDRE)) );
	UDR=c;
}

void delay_us(unsigned char dt)
    {
	while(dt)
	   dt--;
	asm("nop");
	}

void delay_ms(unsigned char n)
	 {
	 unsigned char i;
	 for(i=n;i>0;i--)
	     {
		 delay_us(246);  //1ms
		 }
	 }

unsigned char data_read(void)
{
  if(hpulse>lpulse)
   {
    if((lpulse>30)&&(lpulse<100))////改动检测1的数据
     {
      if(hpulse<(lpulse*6))
	  return 1;//数据为1
     }
    return 2;//无效的数据
   }
  else //if(hpulse<lpulse)
   {
    if((hpulse>30)&&(hpulse<100))
     {
      if(lpulse<(hpulse<<2))
	  return 0;//数据为0
     }
    return 2;//无效的数据
   }
}

void clr_head(void)//清除寄存器
{
  data_cout=0;
  head=0;  
}

void check_data(void)//检测数据是否正确
{
  uchar i;
  if(head)
 {
    switch(data_read())
     {
      case 0: data <<=1 ;
	          data_cout++;
			 break;
      case 1: data <<=1 ;
	         data++;
	         data_cout++;
			 break;
      default:clr_head();break;
     }
   
	//put_c(hpulse);
	put_c(lpulse);
	put_c(data_cout);
	 
	 
    if(data_cout<=8)//暂时不考虑前四个数据(地址)
	   data=0;
	   
	else  if(data_cout==24)//把24位接受码的后16位还原位原始数据(没有处理误码,需要改进)
     {
      for(i=0;i<8;i++)
	  {
	    switch(data&0x0003)
	    { case 0: data_out<<=1;break;
		  case 3: data_out<<=1;data_out++;break;
		 default:break;
	     }
		 data>>=2;
	  }
	 
	  recieved++;
      clr_head();//
   
	  switch(recieved)//检测4次数据,以正确输出
	    { 
		  case 1:data_out1=data_out;break;
		  case 2:data_out2=data_out;break;
		  case 3:data_out3=data_out;break;
		  default: recieved=0;break; 
		}
    if((recieved>1)&&(data_out1==data_out2))
	   data_end=data_out1;
	else if ((recieved>2)&&(data_out1==data_out3))
	   data_end=data_out1;
	else if ((recieved>2)&&(data_out2==data_out3))
	    data_end=data_out2;
    else 
	    data_end=data_out1;
   }
  }	  	  
}



void check_head(void)
{
  if((!head))////////////去掉receive
   {
    if((hpulse>50)&&(hpulse<100))
     {
      if((lpulse>hpulse*27)&&(lpulse<hpulse*35))
       {
        head=1;
       }
     }
   
   }
}

///////////////////////////////
void disp(void)
{
  uchar i,n,m;
  t_disp[0]=seg_table[temp%10];
  t_disp[1]=seg_table[(temp/10)%10];
  t_disp[2]=seg_table[(temp/100)%10];
  t_disp[3]=seg_table[0]; 	
 for(i=0;i<4;i++)
  {
    m=0x01;
	for(n=0;n<8;n++)
	{
	  PORTD&=~0x80;	 
	  if((t_disp[i]&m))
	 	  {PORTD|=0x40;}
	  else
	 	  {PORTD&=~0x40;}
	  m<<=1;
	  PORTD|=0x80;
	  }
  }
  PORTD&=~0x80;
}
//////////////////////////////
void dataout(void)//输出数据处理,点亮小灯,需要改进条件.
{
   if(recieved>=1)///////////////////////////需要改进
  { CLI();
   temp=data_end;
    disp();
   
   D1;
   delay_ms(200);
   delay_ms(200);
   delay_ms(200);
   delay_ms(200);
   delay_ms(200);
   D0;
   recieved=0;
   SEI();
   }
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
  data_in=PIND;
  if (data_in&0x04)
    {
	 TCCR1B = 0x00; //stop
	 lpulse=TCNT1;
	 TCNT1H = 0x00; //setup
     TCNT1L = 0x00;
     TCCR1B = 0x02; 
	 check_data();
	 check_head();
	 dataout();		 
    }
  else 
      {
	 TCCR1B = 0x00; //stop
	 hpulse=TCNT1;
	 TCNT1H = 0x00; //setup
     TCNT1L = 0x00;
     TCCR1B = 0x02;   
	   }
     
	   
	   
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
  uart0_init();
 
 MCUCR = 0x01;
 GICR  = 0x40;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

void main(void)
{
  
 init_devices();
 for(;;);
}

⌨️ 快捷键说明

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