|
马老师,因为我买的实验板不一样,然后按照你书中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周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|