sixi 发表于 2009-8-9 21:50:51

关于ATmega48之间使用USART通讯与数码管显示

ATmega48 PD.0和PD.1做两片单片机Usart通讯,但是剩下的PD口做数码管显示时,输出低电平为什么电压拉不下来,用万用表测量,电压在3.2—4.2V摆动,引脚已经设定为输出

Gorgon_Meducer 发表于 2009-8-10 10:06:11

发完整工程。

sixi 发表于 2009-8-10 15:37:05

另一单片机接收显示正确

这是发送代码

#include<iom48v.h>
#include<macros.h>

#define uchar unsigned char
#define uint unsigned int

uint send_data={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0--->9

uint D={0x24,0xf4,0xac,0xe4,0x74,0x64,0x24,0xf4,0x24,0x64};//显示0-->9
uint B={0x30,0x70,0x10,0x10,0x50,0x90,0x90,0x30,0x10,0x10};//

uint i;

void port_init(void)
{
DDRB=0xff;
PORTB=0xff;
PORTC = 0xff; //m103 output only
DDRC= 0xff;
   DDRD=0xff;
PORTD=0xff;
}

void uart0_init(void)
{
    UCSR0B = 0x00;   //disable while setting baud rate
    UCSR0A = 0x00;   //U2X = 0,不加倍数率
    UCSR0C = 0x06;   //8位
    UBRR0L = 0x33;   //set baud rate lo,波特率为9.6K
    UBRR0H = 0x00;   //set baud rate hi
    UCSR0B = 0x28;   //发送使能,数据寄存器空中断使能
}

void init_devices(void)
{
    CLI();
    port_init;
    uart0_init();
    MCUCR = 0x00;
    TIMSK0= 0x00;   //timer interrupt sources
    TIMSK1= 0x00;
    TIMSK2= 0x00;
    SEI();          //re-enable interrupts
}

void Delay()
{ uint m,n;
for(m=500;m!=0;m--)
for(n=5000;n!=0;n--)
;
}

#pragma interrupt_handler uart0_udre_isr:20
void uart0_udre_isr(void)
{
//character transferred to shift register so UDR is now empty
   UDR0=send_data;
    PORTB=(B|0x0f);//PORTB的低四位控制数码管显示,高电平有效,现要求四位数码管都同时分别从0显示到9
    PORTD=D;       //PORTB高四位即B中的编码与D一起做数码管段码
                      //因为制版的缘故只能这样编码,编码在单独数码管显示时显示正常
    Delay();          //与接收的单片机显示延时一致
    i++;
   if(i==10)
   i=0;            
   
}

void main()
{
i=0;
init_devices();
//UDR0=send_data;
   while(1)
   { ;
   }
}

sixi 发表于 2009-8-10 15:49:09

M48手册中:
   置位UCSRnB 寄存器的发送允许位TXEN 将使能USART 的数据发送。使能后TxDn 引脚的通用I/O 功能即被USART 功能所取代,成为发送器的串行输出引脚。
   但我在数据寄存器空中断程序 『void uart0_udre_isr(void)』中清零UCSRn寄存器的发送允许位,然后显示,再置位UCSRnB 寄存器的发送允许位进行下一数据的发送,虽然数据仍能够发送出去,但是仍然无法显示。

sixi 发表于 2009-8-10 19:55:04

虽然不知道具体原因
但已经调试出来
显示时用定时器中断延时即可
页: [1]
查看完整版本: 关于ATmega48之间使用USART通讯与数码管显示