原创 ATmega16_App_V1.0开发板范例1:8种LED点亮模式

2009-11-9 13:55 2793 7 7 分类: MCU/ 嵌入式
一、程序结构
510f4228-721f-4466-9a32-3eb071aae351.jpg 

二、仿真效果
点击看大图 

三、程序源码
1、main.c



  1. /*******************************************************************************

  2. Platform : ATmega16_App_V1.0开发板(http://bbs.armavr.com)

  3. Project : 范例一:8种LED点亮模式

  4. Clock F : 3.6864M

  5. Software : ICCAVR7.14C

  6. Author : 林夕依然

  7. Version : 09.11.03

  8. Updata :

  9. comments :

  10. 1、以学习板4路32只LED灯为硬件电路,装上PORTA,PORTB,PORTC,PORTD所有短接帽。

  11. 2、S1四位拨码开关均需拨动到ON端。

  12. 3、烧录程序时,禁止JTAG,用作普通IO端口

  13. 4、练习AVR单片机端口寄存器的使用及理解。

  14. 5、练习程序模块化,结构化的书写。

  15. 6、单片机休眠模式练习。

  16. 7、8种LED点亮模式。

  17. *******************************************************************************/

  18. #include <iom16v.h>

  19. #include <macros.h>

  20. #include "led.h"



  21. void main(void)

  22. {

  23. int l,m,n,o,p,q,r,s,i,j;

  24. DDRA =0XFF;

  25. PORTA=0X00;

  26. DDRB =0xFF; //端口输出

  27. PORTB=0x00; //输出低电平,LED熄灭

  28. DDRC =0XFF;

  29. PORTC=0X00;

  30. DDRD =0XFF;

  31. PORTD=0X00;



  32. for (r=0;r<5;r++) //8种点亮模式循环5遍,之后进入休眠模式

  33. {

  34. for(l=0;l<5;l++) //模式1:顺序点亮

  35. {

  36. for (i = 0; i < 8; i++) //顺序单个点亮LED

  37. LED_01(i);

  38. for (i = 6; i > 0; i--) //逆序单个点亮LED

  39. LED_01(i);

  40. }

  41. LED_off();



  42. for(m=0;m<5;m++) //模式2:顺序单个间隔点亮

  43. {

  44. for (i = 0; i < 8; i += 2) //顺序间隔点亮LED

  45. LED_01(i);

  46. for (i = 7; i > 0; i -= 2) //逆序间隔点亮LED

  47. LED_01(i);

  48. }

  49. LED_off();



  50. for(n=0;n<5;n++) //模式3:间隔点亮

  51. {

  52. for (i = 2; i < 8; i++) //间隔顺序同时点亮

  53. LED_02(i);

  54. for (i = 6; i > 2; i--) //间隔逆序同时点亮

  55. LED_02(i);

  56. }

  57. LED_off();



  58. for(o=0;o<5;o++) //模式4:相临点亮

  59. {

  60. for (i = 1; i < 8; i++) //相临顺序同时点亮

  61. LED_03(i);

  62. for (i = 6; i > 1; i--) //相临逆序同时点亮

  63. LED_03(i);

  64. }

  65. LED_off();



  66. for(p=0;p<5;p++) //模式5:发散聚集点亮

  67. {

  68. for(i=0;i<4;i++) //发散点亮

  69. LED_04(i);

  70. for(i=2;i>0;i--) //聚集点亮

  71. LED_04(i);

  72. }

  73. LED_off();



  74. for(q=0;q<5;q++) //模式6:四四点亮

  75. {

  76. for(i=0;i<4;i++) //四四顺序点亮

  77. LED_05(i);

  78. for(i=2;i>0;i--) //四四逆序点亮

  79. LED_05(i);

  80. }

  81. LED_off();



  82. for(s=0;s<5;s++) //模式7:四四点亮

  83. {

  84. for(i=0;i<2;i++) //四四顺序点亮

  85. LED_06(i);

  86. }

  87. LED_off();



  88. for(j=0;j<10;j++) //模式8:全部点亮熄灭

  89. {

  90. LED_on();

  91. LED_off();

  92. }

  93. }

  94. //MCUCR=0x40; //空闲模式,CPU占用100%

  95. //MCUCR=0x50; //ADC噪声抑制模式,CPU占用100%

  96. //MCUCR=0x60; //掉电模式,CPU占用80%

  97. //MCUCR=0x70; //省电模式,CPU占用4%

  98. //MCUCR=0xE0; //Standby模式,CPU占用80%

  99. MCUCR=0xF0; //扩展Standby模式,CPU占用4%

  100. asm("sleep"); //CPU休眠指令

  101. }
2、delay.c



  1. /*******************************

  2. Platform : ATmega16_App_V1.0开发板(http://bbs.armavr.com)

  3. function :延时函数

  4. Clock F : 3.6864M

  5. Software : ICCAVR7.14C

  6. Author : 林夕依然

  7. Version : 09.11.03

  8. comments :

  9. 1、两种方式实现延时

  10. ********************************/



  11. /*---------------------------------------------------------------------------------

  12. 延时程序计算方法

  13. 计数个数j = 延时时间/6*晶振频率 - 1

  14. ---------------------------------------------------------------------------------*/



  15. //方式一:

  16. void Delay(void)

  17. {

  18. unsigned char a, b, c;

  19. for (a = 1; a; a++)

  20. for (b = 1; b; b++)

  21. for (c = 0; c<10; c++) //循环次数=255*255*10

  22. ;

  23. }



  24. //方式二:1ms延时,准确性较Delay();高

  25. void DelayMs(unsigned int i)

  26. {

  27. while(i--)

  28. {

  29. unsigned int j;

  30. for(j=1;j<=613;j++)

  31. ;

  32. }

  33. }
3、led.c



  1. /*******************************

  2. Platform : ATmega16_App_V1.0开发板(http://bbs.armavr.com)

  3. function :功能函数集

  4. Clock F : 3.6864M

  5. Software : ICCAVR7.14C

  6. Author : 林夕依然

  7. Version : 09.11.03

  8. comments :

  9. ********************************/

  10. #include <iom16v.h>

  11. #include <macros.h>

  12. #include "delay.h"



  13. void LED_on(void) //打开所有LED

  14. {

  15. PORTA =0XFF;

  16. PORTB =0XFF;

  17. PORTC =0XFF;

  18. PORTD =0XFF;

  19. Delay();

  20. }



  21. void LED_off(void) //关闭所有LED

  22. {

  23. PORTA = 0x00;

  24. PORTB = 0x00;

  25. PORTC = 0x00;

  26. PORTD = 0x00;

  27. Delay();

  28. }



  29. void LED_01(int i) //LED亮灭控制

  30. {

  31. PORTA = BIT(i);

  32. PORTB = BIT(i); //输出高电平

  33. PORTC = BIT(i);

  34. PORTD = BIT(i);

  35. DelayMs(100); //调用延时程序

  36. }



  37. void LED_02(int i) //间隔点亮

  38. {

  39. PORTA=(BIT(i)|BIT(i-2));

  40. PORTB=(BIT(i)|BIT(i-2));

  41. PORTC=(BIT(i)|BIT(i-2));

  42. PORTD=(BIT(i)|BIT(i-2));

  43. DelayMs(100);

  44. }



  45. void LED_03(int i) //相临点亮

  46. {

  47. PORTA=(BIT(i)|BIT(i-1));

  48. PORTB=(BIT(i)|BIT(i-1)); //~后内容需用括号括起来

  49. PORTC=(BIT(i)|BIT(i-1));

  50. PORTD=(BIT(i)|BIT(i-1));

  51. DelayMs(100);

  52. }



  53. void LED_04(int i) //发散聚集点亮

  54. {

  55. switch(i)

  56. {

  57. case 0ORTA=0x18ORTB=0x18ORTC=0x18ORTD=0x18;DelayMs(100);break; //延时100ms

  58. case 1ORTA=0x24ORTB=0x24ORTC=0x24ORTD=0x24;DelayMs(100);break;

  59. case 2ORTA=0x42ORTB=0x42ORTC=0x42ORTD=0x42;DelayMs(100);break;

  60. case 3ORTA=0x81ORTB=0x81ORTC=0x81ORTD=0x81;DelayMs(100);break;

  61. default:break;

  62. }

  63. }



  64. void LED_05(int i) //00,0F,F0,FF方式显示

  65. {

  66. switch(i)

  67. {

  68. case 0ORTA=0xFFORTB=0xFFORTC=0xFFORTD=0xFF;DelayMs(100);break; //延时100ms

  69. case 1ORTA=0xF0ORTB=0xF0ORTC=0xF0ORTD=0xF0;DelayMs(100);break;

  70. case 2ORTA=0x0FORTB=0x0FORTC=0x0FORTD=0x0F;DelayMs(100);break;

  71. case 3ORTA=0x00ORTB=0x00ORTC=0x00ORTD=0x00;DelayMs(100);break;

  72. default:break;

  73. }

  74. }



  75. void LED_06(int i)

  76. {

  77. switch(i)

  78. {

  79. case 0ORTA=0X55ORTB=0X55ORTC=0X55ORTD=0X55;DelayMs(100);break;

  80. case 1ORTA=0XAAORTB=0XAAORTC=0XAAORTD=0XAA;DelayMs(100);break;

  81. }

  82. }
4、led.h



  1. void LED_on(void);

  2. void LED_off(void);

  3. void LED_01(int i);

  4. void LED_02(int i);

  5. void LED_03(int i);

  6. void LED_04(int i);

  7. void LED_05(int i);

  8. void LED_06(int i);
5、delay.h



  1. void Delay(void);

  2. void DelayMs(unsigned int i);

四、完整项目文件


https://static.assets-stash.eet-china.com/album/old-resources/2009/11/5/e096076c-6ae7-446b-9ccd-50a4a292aff3.rar

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条