|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2008-7-14 16:10:04
|
显示全部楼层
#include"iom48v.h"
#include"math.h"
代码如下:
#include"stdio.h"
#include"macros.h"
#define uchar unsigned char
#define uint unsigned int
#pragma interrupt_handler usart_rade:19
uchar s_data[7]={0xeb,0x90,0xfe,0x73,01,01,0x75}; //主机发送地址最高位为0,
//从机发送地址最高位为1
uchar r_data[7];
uchar dis[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7D,0x07,0x7F,0x6F};//0~9
uchar num; //8 times
uchar reok;
void delay(uchar m);
void display(uchar da);
void usart_rade() //中断接收数据
{
while(!(UCSR0A&(1<<RXC0)));
r_data[num]= UDR0;
num++;
if(r_data[0]==0xeb)
{
if(num>1)
{
if(r_data[1]==0x90)
{
if(num>2)
{
if(r_data[2]==0xfe);
else num=0;
}
}
else num=0;
}
}
else num=0;
if(num==8)
{reok=1;}
}
void usart_send(uchar da[])//发送数据
{
uchar i=0;
for(i=0;i<7;i++)
{
while(!(UCSR0A&(1<<UDRE0)));
UDR0=da;
}
}
void main()
{
uchar i,m,sum,r_time;
UCSR0B=0x98; //
UBRR0=191; //设置波特率2400
sum=0;
i=0;
m=0;
num=0;
r_time=0;
DDRC=(1<<DDC3)|(1<<DDC2)|(1<<DDC1)|(1<<DDC0);
PORTC=0xff;
i=PINC;
DDRB=0x27;
PORTB=0xff;
check: if(!(PINB&1<<PB4)) //检测有无发送按键按下,有,责发送数据
{
// DDRB=!(1<<DDB5);
//PORTB=0xff;
PINB=PINB&~BIT(PB5);
PINB=PINB|BIT(PB5);
delay(125);
//DDRC=(1<<DDC3);
PINC=PINC&~BIT(PC3);
display(2);
////////////////////////////////////
while(!(PINB&1<<PB4)); // 去抖动
SREG=0x80; //开中断
m++; //发送次数加一
for(i=0;i<5;i++) //连续发送5次数据
{
usart_send(s_data);
delay(125); //delay a moment
}
PINC=PINC&~BIT(PC3); //显示成功发送次数
display(m/10);
PINC=PINC&~BIT(PC2)|BIT(PC3);
display(m%10);
}
delay(10);
if(reok==1)
{
// SREG=0x00; //close interrupt
num=0;
if(r_data[3]&0x80) //判断是否为从机发送的数据
{
for(i=3;i<6;i++) //计算校验和
{
sum+=r_data;
}
if(sum==r_data[6]) //判断校验和
{
r_time++; //成功计数加一
PINB=PINB&~BIT(PB5);
delay(10);
PINB=PINB|BIT(PB5);
PINC=PINC&~BIT(PC1)|BIT(PC2)|BIT(PC3); //显示成功接收次数
display(r_time/10);
PINC=PINC&~BIT(PC0)|BIT(PC1)|BIT(PC2)|BIT(PC3);
display(r_time%10);
DDRC=(1<<DDC3)|(1<<DDC2)|(1<<DDC1)|(1<<DDC0);
}
goto check;
}
else
{
goto check;
}
}
}
void delay(uchar m)
{
uchar i,n;
n=m;
while(n--)
for(i=0;i<100;i++)
{}
}
void display(uchar da)
{
uchar i;
switch(da)
{
case 0: da=dis[0];break;
case 1: da=dis[1];break;
case 2: da=dis[2];break;
case 3: da=dis[3];break;
case 4: da=dis[4];break;
case 5: da=dis[5];break;
case 6: da=dis[6];break;
case 7: da=dis[7];break;
case 8: da=dis[8];break;
case 9: da=dis[9];break;
}
// PINB&=~BIT(PB2);
for(i=0;i<8;i++)
{
if(da&0x01==1)
PINB=PINB|BIT(PB1);
else
PINB&=~BIT(PB1);
//DDRB=0x27;
PINB&=~BIT(PB2)|(1<<PB0);
PINB&=~BIT(PB0);
da=da>>1;
}
// PINB=PINB|BIT(PB2);
}
还有程序在调试的时候,在执行到display(2);,调用完这个函数后,不是返回执行下边的程序而是返回到程序的最开始,不知道是真没问题。 |
|