小弟要做一个老人跌倒报警器,目前买到一个可以串口输出的模块,还有一个mega16的模块,以及一套51开发工具箱,遇到一个问题,mega16串口读不出模块的信号,电脑做上位机时模块正常,mega16的晶振我选择8m(模块的比特率9600),熔丝位配置好了,在图片里。程序附在下边#include<iom16v.h>
#include<macros.h>
unsigned char Re_buf[11],counter=0;
unsigned char sign;
#define fosc 8000000
#define baud 9600
#pragma interrupt_handler uart_rx_isr:12//iv_USART_RXC
void uart_rx_isr(void)
{ PORTB=0XFF;//此处是为了验证能进入中断
Re_buf[counter]=UDR;//不同单片机略有差异
if(counter==0&&Re_buf[0]!=0x55) return; //第 0 号数据不是帧头,跳过
counter++;
if(counter==11) //接收到 11 个数据
{
counter=0; //重新赋值,准备下一帧数据的接收
sign=1;
}
}
//****************************************************************************************
void uart_init(void) //初始化COM0
{
DDRD|=0x02;
DDRD&=0xfe; //IO端口设置
PORTD|=0x01;
UCSRA=0x00;
UCSRB=0x90; //使能接收、接受中断,发送使能
UCSRC=0x86; //异步、无奇偶校验、8字符、1停止位
UBRRL=25;
UBRRH=0;
}
//********************************************************************************************
void main()
{
float angle[3],T;
uart_init();
DDRB=0XFF;
PORTB=0X00;
SEI();
while(1)
{
if(sign)
{
sign=0;
if(Re_buf[0]==0x55)
{
if(Re_buf[1]==0x53)
{
angle[0]=(Re_buf[3]<<8|Re_buf[2])/32768.0*180;
angle[1]=(Re_buf[5]<<8|Re_buf[4])/32768.0*180;
angle[2]=(Re_buf[7]<<8|Re_buf[6])/32768.0*180;
}
}
if(angle[0]<=0)
{
}
}
}
}
|