atmega48的异步串行通信

2019-07-15 21:48发布

  1. #include <iom48v.h>
  2. #include <macros.h>
  3. #define  uchar unsigned char
  4. #define  uint  unsigned int
  5. #pragma interrupt_handler tx_int:21
  6. uchar duanxuan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
  7.                      0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
  8. uchar weixuan[]={0X01,0X02,0X04,0X08};
  9. uchar a[]={1,2,3,4,5,6,7,8,9};
  10. void io_init()
  11. {
  12. DDRC|=0X0F;
  13. PORTC&=0XF0;
  14. DDRB=0XFF;
  15. PORTB=0XFF;
  16. }
  17. int uart_init()
  18. {
  19. UCSRnA=0X00;
  20. UCSRnB=0X00;
  21. UCSRnC=0X20;//异步,偶校验,1位停止位,上升沿发
  22. UBBRL=12;
  23. UBBRH=(12>>8);
  24. UCSRnB=0x48;//发送,5位数据位,发送结束中断使能
  25. SREG=0X80;//开启总中断
  26. DDRD|=BIT(2);//设置TX为输出
  27. }
  28. void delay(uint ms)
  29. {
  30. uint i,j;
  31. for(i=0;i<ms;i++)
  32. {
  33.   for(j=0;j<140;j++);
  34. }
  35. }
  36. void tx_int()
  37. {
  38. uchar i=0;
  39. PORTC|=weixuan[a[i]];
  40. PORTB=duanxuan[i];
  41. delay(1);
  42. i++;
  43. if(i==8)
  44.     i=0;
  45. }
  46. void main()
  47. {
  48. uchar i;
  49. io_init();
  50. uart_init();
  51. while(1)
  52. {
  53.   for(i=0;i<9;i++)
  54.   {
  55.    while(!(UCSRnA&(1<<UDREn)));//等待数据寄存器为空
  56.    UDRn=a[i];
  57.    while(!(UCSRnA&(1<<TXCn)));//等待发送结束
  58.   }
  59. }
复制代码
QQ截图20131106190235.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。