[Atmel] 用AtmelStudio6.2跑mega16例程(9):串口自发自收

[复制链接]
 楼主| ddllxxrr 发表于 2014-9-5 22:10 | 显示全部楼层 |阅读模式
本帖最后由 ddllxxrr 于 2014-9-8 08:37 编辑

自发自收,就是用一个按键每键一个加1把这个数发出,自己中断收,再在显示屏上显示数字。
以下是编译通过的截图:


以下是程序:
  1. /*
  2. * GccApplication14.c
  3. *
  4. * Created: 2014-9-5 19:14:17
  5. *  Author: Administrator
  6. */


  7. #include <avr/io.h>
  8. #include <avr/interrupt.h>
  9. #define uchar unsigned char
  10. #define uint unsigned int
  11. //定义LED与端口的连接
  12. #define  c1       4//PORTD.4
  13. #define  c2       5//PORTD.5
  14. #define  button   2//PORTD.2
  15. #define  UDRE     5
  16. #define  FE       4
  17. #define  PE       2
  18. #define  DOR      3
  19. uchar count;
  20. uchar cnt,cnt1;
  21. uchar counth,countl;
  22. uchar tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,  //共阳极LED  0~F的段码
  23. 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
  24. void delay(void)       //LED数码管切换时间函数
  25. {
  26.         uint i;
  27.         for(i=0;i<10;i++);
  28. }
  29. void display(void)      //LED数码管显示函数
  30. {
  31.         counth=count/10;    //十位分离
  32.         countl=count%10;    //个位分离
  33.         PORTC=tab[counth];  //送十位的段码值到PORTC
  34.         PORTD |= _BV(c1);               //显示LED数码管的十位
  35.         delay();            //保持一定时间
  36.         PORTD &=~_BV(c1);               //不显示LED数码管的十位
  37.         PORTC=tab[countl];  //送个位的段码值到PORTC
  38.         PORTD |= _BV(c2);               //显示LED数码管的个位
  39.         delay();            //保持一定时间
  40.         PORTD &=~_BV(c2);               //不显示LED数码管的个位
  41. }
  42. //interrupt [EXT_INT0] void int0_isr(void)//按键次数统计
  43. ISR(INT0_vect)
  44. {
  45.         if (cnt==20)
  46.         {
  47.                 cnt=0;
  48.         }
  49.         else
  50.         {
  51.                 cnt++;
  52.         }
  53. }
  54. //interrupt [USART_RXC] void usart_rx_isr(void)//USART串行接收中断
  55. ISR(USART_RXC_vect)
  56. {
  57.         uchar status,data;
  58.         status=UCSRA;
  59.         data=UDR;
  60.         if((status&((1<<FE)|(1<<PE)|(1<<DOR)))==0)
  61.         {
  62.                 count=data;
  63.         }
  64.         display();
  65. }
  66. void USART_Transmit(char dat)
  67. {
  68.         while( !(UCSRA & (1 << UDRE)) );  //只有数据寄存器为空时才能发送数据
  69.         UDR = dat;
  70. }
  71. int main(void)
  72. {
  73.         DDRC=0xFF;
  74.         PORTC=0xFF;
  75.         DDRD=0xFA;
  76.         PORTD=0xFF;
  77.         UCSRA=0x00;
  78.         UCSRB=0x98;
  79.         UCSRC=0x86;
  80.         UBRRH=0;
  81.         UBRRL=25;            //系统时钟8MHz,波特率为9600bps
  82.         MCUCR=0x02;          //INT0为下降沿时产生中断请求
  83.         GICR=0x40;          //允许INT0产生中断
  84.         //#asm("sei")
  85.         sei();
  86.         while(1)
  87.         {
  88.                 USART_Transmit(cnt1);
  89.                 cnt1=cnt;
  90.         }
  91. }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2403

主题

6994

帖子

68

粉丝
个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2403

主题

6994

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部