搜索
bottom↓
回复: 5

马老师,按照书中385页做实验为什么现象不对呢?

[复制链接]

出0入0汤圆

发表于 2008-3-21 00:02:01 | 显示全部楼层 |阅读模式
马老师,因为我买的实验板不一样,然后按照你书中385页的程序稍做修改,然后做USART自发自收的实验。本来数码管显示的应该是0到9的顺序变化,但我的实验现象为什么是无规则的数字显示顺序呢,有时甚至是一些奇怪的符号。能帮我分析一下是什么原因吗?
以下是我修改过的程序:(我用的是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[10]={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[data];                                //将接受到的数据送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秒
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2008-3-21 21:19:43 | 显示全部楼层
先检查你PC口的8个输出与LED的8段连接方式.
例如:PC0--a PC1--b......PC7--p 与 PC0--p PC1--g......PC7--a 两种接法,7段码也是不同的!

出0入0汤圆

 楼主| 发表于 2008-3-22 10:01:15 | 显示全部楼层
谢谢马老师!
PC口的连接没有问题。因为我如果关闭中断,然后把while(1)改为直接用数码管显示i变量的内容,能正常地显示0到9的循环。
即把while(1)改为:
while(1)
        {
       PORTC=i;
        i++;                                        //i从1加到9
        if (i>=10) i=0;
        for (j=0;j<8;j++)
        _delay_ms(500);                        //延时0.5秒
        }

出0入0汤圆

 楼主| 发表于 2008-3-22 11:17:36 | 显示全部楼层
呵呵,不好意思,马老师,现在问题检查出来了,是我TXD和RXD的接线接错了,程序没问题。

出0入0汤圆

发表于 2008-3-22 21:04:13 | 显示全部楼层
对于新手讲,学习通信接口的应用,不仅仅是软件的掌握,通信的协议规程以及硬件连接也是非常重要的.物理层出了问题,如何调上层软件也是没用的.

这些在我的书中多处,多次明确强调!

出0入0汤圆

 楼主| 发表于 2008-3-22 22:09:48 | 显示全部楼层
是,我会吸取这次的教训!多谢马老师的再次提醒!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 14:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表