📄 2272_34ok.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 + -