little_grass 发表于 2008-4-9 10:34:30

按照马老师书上383页的程序做实验出现的怪现象,请问马老师是为什么呢?

马老师,我按照你书上383页的程序做实验,出现了以下的怪现象:
1、当我把PD0和PD1短接时,数码管正常循环显示0到9的数字;
2、把MAX232的T2OUT、R2IN引脚短接,或短接T2IN、R2OUT,数码管还是正常循环显示0到9的数字;
3、用电脑的串口调试软件接收时,只用把数据位设置为7位才能显示00到09的数值,而设置成8位数据位时,显示的是80到89,为什么呢?程序明明是设置为8位字长的啊?
4、不管电脑的串口调试助手设置7位数据位还是8位数据位,发送00到09的数据时,数码管显示的都是乱码。这又是为什么呢?问题出在哪里呢?

little_grass 发表于 2008-4-9 10:35:41

以下是我修改为WINAVR后的程序:
////本实验功能:利用USART每隔0.5秒自发自收0到9的数字,并用LED显示
////硬件连接:Pc口与LED的段显示相连,PD0/PD1(即RXD/TXD)短接
////系统时钟频率:4.0MHZ

////头文件
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>


////定义波特率
#define baud 9600
#define crystal 4000000
#define baud_setting (unsigned int)((unsigned long)crystal/(16*(unsigned long)baud)-1)
#define BAUD_H (unsigned char)(baud_setting>>8)
#define BAUD_L (unsigned char)(baud_setting)

////数码管7段显示值(共阳LED)
unsigned char led_7={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

/////////////////////////////////////////////接收中断服务程序///////////////////////////////
SIGNAL (SIG_USART_RECV)
{
unsigned char stadus,data;
stadus=UCSRA;                //读接收状态标志位
data=UDR;                        //接收数据
if ((stadus&((1<<4)|(1<<3)|(1<<2)))==0)                //检查UCSRA中的标志位,如果没有帧错误、数据溢出错误、校验错误
        {       
        PORTC=led_7;                                //将接受到的数据送LED显示
        }
}


///////////////////////////////////////////////发送程序////////////////////////////////////
void usart_transmit (unsigned char data)
{
while(!UCSRA&(1<<5))                //UCSRA的第5位为寄存器空标志位
;                                //如发送寄存器没空,即有数据,一直空循环
UDR=data;                                //发送数据       
}

//////////////////////////////////////////////主程序//////////////////////////////////////
int main(void)
{
unsigned char i,j;
PORTA=0XF7;                        //使用PA.3做为LED的使能端
DDRA=0XFF;
PORTC=0X00;                        //LED段码输出
DDRC=0XFF;                        //PC口设置为输出
PORTD=0X02;                        //PD1使能上拉电阻
DDRD=0X02;                        //PD1(TXD)输出,PD0(RXD)输入

////USART初始化

UCSRA=0Xc0;                        //状态寄存器初始化
UCSRB=0X98;                        //接收、发送允许,接收中断
UCSRC=0X86;                        //异步、无奇偶校验、一个停止位、上升沿采样、八位字长
UBRRH=BAUD_H;                //设置传输波特率
UBRRL=BAUD_L;

////开中断
sei();

while(1)
        {
        usart_transmit(i);                //发送字符i
        i++;                                        //i从1加到9
        if (i>=10) i=0;
        for (j=0;j<8;j++)
        _delay_ms(500);                        //延时0.5秒
        }
}

little_grass 发表于 2008-4-9 10:41:07

以下是串口调试软件上的现象:
点击此处打开 ourdev_247130.GIF(文件大小:1.37M,只有300K以内的图片才能直接显示) (原文件名:未命名1.GIF)

machao 发表于 2008-4-9 17:31:30

检查熔丝位的配置,是否系统时钟为4M,另外UCSRA=0Xc0是为什么?

little_grass 发表于 2008-4-9 17:33:47

谢谢马老师!
熔丝位设置的是4MHZ

machao 发表于 2008-4-9 17:38:24

是使用M16吗?

little_grass 发表于 2008-4-9 17:39:29

是的。
改为UCSRA=0X00;后一样的现象

machao 发表于 2008-4-9 17:59:01

软件没有问题,现象是双方的波特率不匹配.还是建议你再检查系统时钟频率的设置,是内部RC4M还是外部晶体?

little_grass 发表于 2008-4-9 18:02:30

我确认了很多遍了,我用的双龙的下载软件,熔丝位选择的是内部时钟4MHZ。(Int. Rc Osc. 4MHZ)

little_grass 发表于 2008-4-9 18:46:12

总是在很偶然的情况下发现问题。我偶然地把实验板的电源开关从5V变到3V,问题就解决了。但是马老师,这是为什么呢?我不明白其中的原因,能解释一下吗?

TonyCai 发表于 2008-4-9 20:20:36

232IC,估计又是个国产232的受害者。

在我的一份详细分析报告release后,这个料在本公司列入“危险品”级别的东西了。

我以前有过帖子,现在找不到了。

machao 发表于 2008-4-9 20:28:31

我也怀疑电平转换部分的电路可能有问题,把232IC相应的引脚和电路及附近的4个电容都检查一下,或将焊点重新加固一边.
页: [1]
查看完整版本: 按照马老师书上383页的程序做实验出现的怪现象,请问马老师是为什么呢?