|
楼主 |
发表于 2013-2-20 11:13:22
|
显示全部楼层
本帖最后由 双飞燕泡茶 于 2013-2-20 11:17 编辑
faw 发表于 2013-2-20 11:02
什么型号的单片机,用的什么编译器,程序代码等等,什么都没有,怎么解答? ...
AVR mega8 用的是ICC,
程序代码我给个简化的:
#include "iom8v.h"
#include<macros.h>
#define fosc 8000000 //晶振8MHZ
#define baud 9600 //波特率定义
#define uchar unsigned char
#define uint unsigned int
unsigned char i=0,counter=0;
unsigned char flag=0;
unsigned char receive_cnt=0;
unsigned char my[7]={0,0,0,0,0,0,0};
unsigned char my0[7]={0xc0,0xa8,0xff,0xf3,0xf4,0xf5,0xf6};//0xf3,0xf4,
//1us延时函数
void delay_1us(void)
{
asm("nop");
}
//N us延时函数
void delay_nus(unsigned int n)
{
unsigned int j=0;
for (j=0;j<n;j++)
delay_1us();
}
void uart0_init(void)
{
UCSRB = 0x00;
UCSRA = 0x00;
UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); //异步,数据格式8,N,1
UBRRL=(fosc/16/(baud+1))%256; //设置波特率寄存器
UBRRH=(fosc/16/(baud+1))/256;
UCSRB |= (1 << RXCIE)|(1 << TXEN)|(1 << RXEN); //接收中断使能,发送接收使能
}
void uart0_send(unsigned char i)
{
while(!(UCSRA&(1<<UDRE))); //只有数据寄存器为空时才能发送数据
UDR=i;
}
/*************发送数组函数*************/
void usart_shuzu_send(unsigned char arry[])
{
//unsigned char i=0;
for(i=0;i<7;i++)
{
while(!(UCSRA&BIT(UDRE)));
UDR=arry;
}
}
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x3D; //set count 25ms
TCCR0 = 0x05; //start timer
}
void init_devices(void)
{
CLI();
DDRB=0X00;
PORTB=0X00;
PORTC=0XFF;
DDRC=0XFF ;
PORTD=0X00; //USART的发送接收端口分别为PD0和PD1 //0x04
DDRD|=(1<<PD1)|(1 << PD4);
timer0_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x01;
SREG=0x80;
}
void main(void)
{
init_devices();
uart0_init();
while(1){
;
}
}
#pragma interrupt_handler USART_RXC_vect:12
void USART_RXC_vect(void)
{
uchar udr;
udr=UDR;//读取接收到的数值
PORTD|=(1<<PD4);
switch(receive_cnt)//判断是第几次中断
{
case 0: //第一次
my[receive_cnt++]=udr;//记录接收值
if(my[0]!=0x08) receive_cnt=0;break;
case 1://第二次,能执行到此处说明第一次接收到的为0X08
my[receive_cnt++]=udr;//记录接收值
if(my[1]!=0x11) receive_cnt=0;break;
case 2: //第三次,能执行到此处说明第二次接收到的为0X11
my[receive_cnt++]=udr;//记录接收值
if(my[2]!=0x01) receive_cnt=0;
else if(my[2]==0x01){flag=1;} break;
default://>=3次,说明前三次依次为0x08 0x11 ,0x01,以后正常接收
{
my[receive_cnt++]=udr;//记录当前接收值
if(receive_cnt==7) receive_cnt=0;//清零接收中断计数
}
}
}
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
SREG=0x80;
TCNT0 = 0x3D;
if(++counter>=10)
{
counter=0;
if(flag==1)
{
usart_shuzu_send(my0);
flag=0;//清零被呼叫标志
}
}
} |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|