各位走过的,路过的,打酱油的大哥大姐,都进来看看我的代码哪里错了,实验不出结果呀
大姐,大哥们帮帮忙吧
#include<iom16v.h> //头文件
#include<macros.h> //引脚定义头文件
typedef unsigned int uint; //替代定义
typedef unsigned char uchar; //替代定义
uchar Bz=0,Dt=0; //定义两个变量,一个是接收到数据标志,一个是保存数据变量
#define CS_485_0 PORTC&=~(1<<PC6)
#define CS_485_1 PORTC|=(1<<PC6) //使用485时用到的引脚定义
#define CS_485_O DDRC|=(1<<PC6)
#define CS_485_I DDRC&=~(1<<PC6)
void main(void)
{
CS_485_O; //设置485引脚为输出
CS_485_0; //设置485引脚输出低电平(准备接收)
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//接收中断使能,发送使能,
//接收使能,并且打开串口
UBRRL=47;//设置波特率为9600,晶振频率为8MHz
UBRRH=0;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//访问UCSRC,设置8位数据
UBRRH=0;
SREG|=(1<<7);//打开全局中断开关 //打开全局中断
//CS_485_0; //用485发送和接收时,开始先处于接收状态
while(1) //死循环
{
if(Bz==1) //判断是否接收到数据标志
{ //接收到了
//CS_485_1; //使用485时准备发送,CS_485置1
UCSRB&=~(1<<RXCIE); //先禁止串口中断
Bz=0; //接收到数据标志清零
UDR=Dt; //送数据给发送寄存器
while(!(UCSRA&(BIT(TXC)))); //判断是否发送完成
//UCSRA|=(1<<TXC); //发送完成标志清零
UCSRB|=(1<<RXCIE); //打开串口中断准备接收
//CS_485_0; //使用485时准备接收,CS_485清零
}
}
}
#pragma interrupt_handler uart_rx:12
void uart_rx(void) //串口中断服务函数
{
UCSRA&=~(1<<RXC); //接收中断标志位清零
Dt=UDR; //接收数据保存在Dt变量中
Bz=1; //接收到数据标志置1
} |