关于ATmega48之间使用USART通讯与数码管显示
ATmega48 PD.0和PD.1做两片单片机Usart通讯,但是剩下的PD口做数码管显示时,输出低电平为什么电压拉不下来,用万用表测量,电压在3.2—4.2V摆动,引脚已经设定为输出 发完整工程。 另一单片机接收显示正确这是发送代码
#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)
{ ;
}
} M48手册中:
置位UCSRnB 寄存器的发送允许位TXEN 将使能USART 的数据发送。使能后TxDn 引脚的通用I/O 功能即被USART 功能所取代,成为发送器的串行输出引脚。
但我在数据寄存器空中断程序 『void uart0_udre_isr(void)』中清零UCSRn寄存器的发送允许位,然后显示,再置位UCSRnB 寄存器的发送允许位进行下一数据的发送,虽然数据仍能够发送出去,但是仍然无法显示。 虽然不知道具体原因
但已经调试出来
显示时用定时器中断延时即可
页:
[1]