查看: 1102|回复: 6
打印 上一主题 下一主题

基于USART接口的通信技术

[复制链接]
跳转到指定楼层
沙发
发表于 2014-8-4 16:33:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /*******************************************************
  2. *   程序功能:USART的数据发送和接收
  3. *   接线说明:核心板PD0和PD1短接,PA0~PA7接到静态数码管显示电路
  4. *   实验现象:数码管从0加到9如此循环
  5. *        日    期 : 2014/07/31
  6. *        作    者 : 翟志刚
  7. *******************************************************/

  8. #include <iom16v.h>
  9. #include <macros.h>


  10. #define  uchar unsigned char
  11. #define  uint  unsigned int


  12. #define BAUD    9600            //波特率采用9600bps
  13. #define CRYSTAL 1000000                        //系统时钟1MHz

  14. //计算和定义波特率设置参数
  15. #define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
  16. #define BAUD_H (unsigned char)(BAUD_SETTING>>8)
  17. #define BAUD_L (unsigned char)(BAUD_SETTING)

  18. // USART控制和状态寄存器的标志位定义
  19. #define RXC  7          // UCSRA位定义
  20. #define TXC  6
  21. #define UDRE 5
  22. #define FE   4
  23. #define DOR  3
  24. #define PE   2
  25. #define U2X  1
  26. #define MPCM 0
  27. #define RXCIE 7         // UCSRB位定义
  28. #define TXCIE 6
  29. #define UDRIE 5
  30. #define RXEN  4
  31. #define TXEN  3
  32. #define UCSZ2 2
  33. #define RXB8  1
  34. #define TXB8  0
  35. #define URSEL 7         // UCSRC位定义
  36. #define UMSEL 6
  37. #define UPM1  5
  38. #define UPM0  4
  39. #define USBS  3
  40. #define UCSZ1 2
  41. #define UCSZ0 1
  42. #define UCPOL 0

  43. #define FRAMING_ERROR (1<<FE)
  44. #define PARITY_ERROR (1<<PE)
  45. #define DATA_OVERRUN (1<<DOR)
  46. #define DATA_REGISTER_EMPTY (1<<UDRE)

  47. uchar led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

  48. uchar i = 0;
  49. uchar counter = 0;

  50. // USART接收结束中断服务程序
  51. #pragma interrupt_handler USART_RXC:12
  52. void USART_RXC(void)   // USART接收中断服务
  53. {
  54.     uchar status,data;

  55.     status = UCSRA;
  56.     data = UDR;
  57.     if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
  58.         PORTA = led_7[data];
  59. }

  60. void USART_Transmit(unsigned char data)
  61. {
  62.         while (!(UCSRA & DATA_REGISTER_EMPTY));     // 等待发送寄存器空
  63.         UDR = data;                                 // 发送数据
  64. }


  65. /*定时器0溢出中断服务程序*/
  66. #pragma interrupt_handler timer0_ovf:10
  67. void timer0_ovf(void)
  68. {
  69.         counter++;
  70.         if(counter == 4)
  71.         {
  72.         USART_Transmit(i);
  73.         PORTB=~PORTB;

  74.         if (++i >= 10) i = 0;
  75.         counter = 0;
  76.         }

  77. }


  78. void main( void )
  79. {

  80.         DDRA = 0xff;        // LED段码输出
  81.     PORTA = 0x00;

  82.         DDRB = 0xff;
  83.         PORTB = 0xFF;       // LED灯输出

  84.     PORTD = 0x03;       // TXD(PD1)输出
  85.     DDRD = 0x02;        // RXD(PD0)输入,上拉有效

  86.     UCSRA = 0x00;       // USART初始化
  87.     UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);     // 允许RXC中断,接收允许,发送允许

  88.     UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);   // 8 Data, 1 Stop, No Parity

  89.     UBRRH = BAUD_H;     // 设置波特率
  90.     UBRRL = BAUD_L;


  91.         TIMSK |= (1<<TOIE0);   //使能T0溢出中断
  92.         TCCR0 = 0x05;         //配置定时器工作普通模式
  93.         TCNT0 = 0xff;         //给定时器赋初值

  94.         SREG=0x80;          // 开全局中断


  95.         while(1)
  96.         {

  97.         };
  98. }

复制代码


回复

使用道具 举报

板凳
发表于 2014-8-4 16:42:21 | 只看该作者
给力啊。。。哈哈
回复 支持 反对

使用道具 举报

地板
发表于 2014-8-4 16:46:54 | 只看该作者
AVR技术专家发的东西就是牛
回复 支持 反对

使用道具 举报

4#
 楼主| 发表于 2014-8-4 17:14:15 | 只看该作者
lucky80204 发表于 2014-8-4 16:42
给力啊。。。哈哈

战友们更给力
回复 支持 反对

使用道具 举报

5#
 楼主| 发表于 2014-8-4 17:15:05 | 只看该作者
还你一世界 发表于 2014-8-4 16:46
AVR技术专家发的东西就是牛

大家牛才是真的牛,上海好牛
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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