搜索
bottom↓
回复: 4

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

[复制链接]

出0入0汤圆

发表于 2009-8-9 21:50:51 | 显示全部楼层 |阅读模式
ATmega48 PD.0和PD.1做两片单片机Usart通讯,但是剩下的PD口做数码管显示时,输出低电平为什么电压拉不下来,用万用表测量,电压在3.2—4.2V摆动,引脚已经设定为输出

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入296汤圆

发表于 2009-8-10 10:06:11 | 显示全部楼层
发完整工程。

出0入0汤圆

 楼主| 发表于 2009-8-10 15:37:05 | 显示全部楼层
另一单片机接收显示正确

这是发送代码

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

#define uchar unsigned char
#define uint unsigned int

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

uint D[10]={0x24,0xf4,0xac,0xe4,0x74,0x64,0x24,0xf4,0x24,0x64};//显示0-->9
uint B[10]={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[10]中的编码与D[10]一起做数码管段码
                      //因为制版的缘故只能这样编码,编码在单独数码管显示时显示正常
    Delay();          //与接收的单片机显示延时一致
    i++;
   if(i==10)
     i=0;            
   
}

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

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2009-8-10 19:55:04 | 显示全部楼层
虽然不知道具体原因
但已经调试出来
显示时用定时器中断延时即可
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 20:26

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

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