[Atmel] 用AtmelStudio6.2跑mega16例程(21)

[复制链接]
1022|0
 楼主| ddllxxrr 发表于 2014-9-25 19:41 | 显示全部楼层 |阅读模式
这个例程是控制伺服电动机角度控制的。通过外部中断0和外部中断1来加减一个变量来实现。



以下是程序

  1. /*
  2. * GccApplication3.c
  3. *
  4. * Created: 2014-9-25 19:12:03
  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. #define c1  0//PORTB.0
  12. #define c2  1//PORTB.1
  13. #define c3  2//PORTB.2
  14. #define c4  3//PORTB.3
  15. uchar tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,  //共阳极LED  0~F的段码
  16. 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,};
  17. uchar a=62;
  18. uchar i,i_temp1,i_temp2,i_temp3;
  19. void delayms(void)       //LED数码管切换时间函数
  20. {
  21.         uint j;
  22.         for(j=0;j<100;j++);
  23. }
  24. //interrupt[EXT_INT0] void int0_isr(void)
  25. ISR(INT0_vect)
  26. {
  27.         a=a+1;
  28.         i=i+3;
  29.         if(a>=160)
  30.         {
  31.                 a=160;
  32.                 i=180;
  33.         }
  34. }
  35. //interrupt[EXT_INT1] void int1_isr(void)
  36. ISR(INT1_vect)
  37. {
  38.         if(a<=32)
  39.         {
  40.                 a=32;
  41.                 i=0;
  42.         }
  43.         else
  44.         {
  45.                 a=a-1;
  46.                 i=i-3;
  47.         }
  48. }
  49. void display(void)
  50. {
  51.         i_temp1=i/100;
  52.         i_temp2=(i-i_temp1*100)/10;
  53.         i_temp3=(i-i_temp1*100)%10;
  54.         //c2=1;
  55.         PORTB |= c2;
  56.         PORTC=tab[i_temp1];
  57.         delayms();
  58.         //c2=0;
  59.         PORTB &= ~c2;
  60.         //c3=1;
  61.         PORTB |= c3;
  62.         PORTC=tab[i_temp2];
  63.         delayms();
  64.         //c3=0;
  65.         PORTB &= ~c3;
  66.         //c4=1;
  67.         PORTB |=c4;
  68.         PORTC=tab[i_temp3];
  69.         delayms();
  70.         //c4=0;
  71.         PORTB &= ~c4;
  72.         //c1=0;
  73.         PORTB &= ~c1;
  74. }


  75. int main(void)
  76. {

  77.         DDRB=0xFF;
  78.         PORTB=0xFF;
  79.         DDRC=0xFF;
  80.         PORTC=0xFF;
  81.         DDRD=0xF3;
  82.         PORTD=0xFF;
  83.         TCCR1A=0x83;                                //10位快速PWM,比较匹配时清零OC1A(输出低电平),64分频
  84.         TCCR1B=0x03;
  85.         MCUCR=0x0A;                                //定义INT0和INT1为下降沿时产生中断
  86.         GICR=0xC0;                                //允许INT0和INT1产生中断
  87.         //#asm("sei")                              //开启总中断
  88.         sei();
  89.         while(1)
  90.         {
  91.                 OCR1AH=0;
  92.                 OCR1AL=a;
  93.                 display();
  94.         }
  95. }


本帖子中包含更多资源

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

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

本版积分规则

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

2404

主题

7002

帖子

68

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