M16 11.0592M UART 9600bps 电路连接正确,为何通信不成功,手头只有万用表一块。请高手
如题,程序如下:void UART_Init(void)
{
UBRRL= UBRR%256;//波特率设置
UBRRH= UBRR/256;
UCSRA=0x00;
UCSRB=0x98;// (1<<RXCIE)&(1<<RXEN)&(1<<TXEN); //使能接受中断、接收器与发送器使能
UCSRC=0x86;// (1<<URSEL)&(1<<UCSZ1)&(1<<UCSZ0); //设置帧格式:8个数据位,1个停止位。
DDRD|=0x01;
}
void UART_Send(unsigned char data)//发送8位的帧数据
{
while(!(UCSRA&0x20));// while(!(UCSRA&(1<<UDRE)));//等待发送缓冲器为空
UDR=data;//将数据放入缓冲器,发送数据
}
int main(void)
{
UART_Init();
asm("sei");//使能全局中断
while(1)
{
UART_Send(1);//UART异步串行通信
}
}
我初衷只想简单的发一个数字1 , 上位机软件已经设置好。 com1;9600;8个数据位;1个停止位;串口已经打开。
可惜无数据,调了1天半了,请各位朋友帮忙指点一二。不胜感激。 我用JTAG仿真为何UCSRC会变成0x00呢?
不解。
而且程序执行一次while(1)之后,UCSRA就一直为0x60;
似乎是执行不了发送程序一样。我看UDR里面的数据一直是没有的。 在JTAG仿真中改UCSRC的数值,为何UBRRH随之也变化呢?
我先把UCSRC的最高位置位,可是后面的还是随之变化,哎,请高手指点一二。 顶贴!
我不大会用JTAG,我的程序,用WATCH窗口观察 UDR 和 data 怎么看到的是 Not in scope 怎么就不在范围内了呢?
不解。请高手指点。 顶贴,求助。 JTAG时候有些寄存器是不能访问的 DDRD|=0x01;
PORTD = 0x03; //TXD(PD1)Êä³ö
DDRD= 0x02;//RXD(PD0)ÊäÈ룬ÉÏÀ­ÓÐЧ
我也在调 顶贴,求助! //这个是我以前写的测试程序,用的是ICC6.31A编译的 晶振7.3728M的
#include <iom16v.h>
#include <macros.h>
#define uint8_t unsigned char
#define uint16_t unsigned int
void USART_init(void);
uint8_t USART_Getchar(void);
void USART_Putchar(uint8_t send_char);
void USART_Send_string(uint8_t *str);
void main(void)
{
uint8_t temp_data = 0;
DDRB = 0X0F;
PORTB = 0XFF;
USART_init();
CLI();
while(1)
{
USART_Send_string("I love AVR!\n");
temp_data = USART_Getchar();
switch (temp_data)
{
case '1':PORTB &= ~0X01;break;
case '2':PORTB |= 0X01;break;
case '3':PORTB &= ~0X02;break;
case '4':PORTB |= 0X02;break;
case '5':PORTB &= ~0X04;break;
case '6':PORTB |= 0X04;break;
case '7':PORTB &= ~0X08;break;
case '8':PORTB |= 0X08;break;
}
}
}
/********************************************/
void USART_init(void)
{
/****波特率初始化*****/
UBRRH = 0X00;
UBRRL = 0x2f; //9600@7.3728Mhz
/*****帧结构设定*****/
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//异步,无校验,一位停止位,8位数据
/*****使能收发器*****/
UCSRB = (1<<TXEN)|(1<<RXEN);
}
/********************************************/
uint8_t USART_Getchar(void)
{
while(!(UCSRA & (1<<RXC)));
return UDR;
}
/********************************************/
void USART_Putchar(uint8_t send_char)
{
while(!(UCSRA & (1<<UDRE)));
UDR = send_char;
}
/********************************************/
void USART_Send_string(uint8_t *str)
{
while((*str) != '\0')
{
USART_Putchar(*str++);
}
}
/********************************************/ 谢谢各位朋友的参与。吃饭回来,继续调试。 错在哪了呀!!疯了。
哎测测测。。 发送程序写的有问题,顺序应该颠倒一下. void UART_Send(unsigned char data)//发送8位的帧数据
{
UDR=data;//将数据放入缓冲器,发送数据
while(!(UCSRA&0x20));// while(!(UCSRA&(1<<UDRE)));//等待发送缓冲器为空
}
如上?
去看看其他人怎么编写的。 你确定硬件正确?这样,你把M16拔了,短接板上TX/RX两脚,用PC串口程序发,看接收区是否接收一样的字符;
以上没问题,抄书上现成的代码,看正常否,正常,再自己写。 嗯,我就这么干的,书上的好使,自己的不行,我今天非找到毛病不可。我一个字母一个字母看! 现在上来的兄弟越来越少了,晚上也许会多起来吧,都进来帮忙看看。为啥我的程序就是不行呢。
编译也通过。。。。 顶贴,谁有好使的程序,我参考一下。 UBRRL= UBRR%256;//波特率设置
UBRRH= UBRR/256;
UBRR是什么?改成:
UBRRH=0;
UBRRL=71; 楼上说的是,我那么写也是这个意思,感谢指点。
不过错误还真不在那。在我自己的头文件里有这样的定义:#define UBRR (F_CPU/BAUDRATE/16-1)
我认真修改了自己编写的程序,也按照【8楼】 lanshuitianxia 编写的程序尝试了一下,都是一个毛病了! 能收不能发,我操的。愁死! 在单片机tx和rx环上,去掉232,单片机自发自收看看什么现象 确定溶丝烧了吗,呵呵可能这个问题哦,我们也遇到过的,郁闷表半天 熔丝位?
烧哪个?
估计是没烧,我就不知道用串口还烧什么熔丝位呵呵。 胡大哥,快来回复我啊。。。
我怎么就没发现哪个熔丝位是跟串口有关的呢? 请各位高手继续跟帖。 顶贴,请各位指点小弟一下。
串口只能收不能发什么原因? 呵呵,楼主在北京工作,昨天我是在北京的清河回你的(好像离你那不远哦),昨天出差发了一个就没南京了,你的熔丝好了吗,就是和你是用的晶振对应呀! 这个问题我已经解决,硬件电路问题,不好意思。示波器一搭,原来的2、3、5弄错了,板子画错了。不好意思。问题已经解决,上面的程序是正确的。
页:
[1]