返回列表 回复 发帖 点我体验网上斗地主的乐趣

[林夕依然] 实验8:7种LED亮灭模式+INT0中断+蜂鸣器(ICC)

相关搜索: 例程
一、程序结构
程序结构ICC.jpg
2009-8-31 15:59


二、仿真效果
仿真效果ICC.jpg
2009-8-31 15:59


三、程序源码
1、main.c
  1. /*******************************************************************************
  2. Platform : AVR mega16学习板(www.iccavr.com)
  3. Project : 实验八:7种LED亮灭模式+INT0中断+蜂鸣器
  4. Clock F : 3.6864M
  5. Software: ICCAVR7.14C
  6. Author : 林夕依然
  7. Version : 08.12.07
  8. Updata : 09.02.26 模块化
  9. 09.05.03 增加proteus仿真模型,仿真通过。
  10. comments:
  11. 1、以学习板LED灯和蜂鸣器为硬件电路,实现7种LED亮灭功能,INT0中断时产生蜂鸣器鸣叫模式
  12. 2、INT0中断的练习
  13. 3、T/C1的CTC工作模式下,频率发生器程序的编写
  14. 4、PD5用作频率发生器时,需配置为输出,否则不能发生频率
  15. *******************************************************************************/
  16. #include <iom16v.h>
  17. #include <macros.h>
  18. #define uchar unsigned char
  19. #define uint unsigned int

  20. void main()
  21. {
  22. int l,m,n,o,p,r,s,i,j;
  23. DDRA =0X00; //端口上拉输入
  24. PORTA=0XFF;
  25. DDRB =0xFF; //端口输出
  26. PORTB=0xFF; //输出高电平,LED熄灭
  27. DDRC =0X00;
  28. PORTC=0XFF;
  29. DDRD =0XFF; //PD口输出高电平
  30. PORTD=0XFF;

  31. GICR |= (1 << INT0); //使能外部中断请求0
  32. SEI(); //全局中断使能

  33. for (r=0;r<1;r++)
  34. {
  35. for(l=0;l<5;l++) //模式1:顺序点亮
  36. {
  37. for (i = 0; i < 8; i++) //顺序单个点亮LED
  38. LED_01(i);
  39. for (i = 6; i > 0; i--) //逆序单个点亮LED
  40. LED_01(i);
  41. }
  42. LED_off();

  43. for(m=0;m<5;m++) //模式2:顺序单个间隔点亮
  44. {
  45. for (i = 0; i < 8; i += 2) //顺序间隔点亮LED
  46. LED_01(i);
  47. for (i = 7; i > 0; i -= 2) //逆序间隔点亮LED
  48. LED_01(i);
  49. }
  50. LED_off();

  51. for(n=0;n<5;n++) //模式3:间隔点亮
  52. {
  53. for (i = 2; i < 8; i++) //间隔顺序同时点亮
  54. LED_02(i);
  55. for (i = 6; i > 2; i--) //间隔逆序同时点亮
  56. LED_02(i);
  57. }
  58. LED_off();

  59. for(o=0;o<5;o++) //模式4:相临点亮
  60. {
  61. for (i = 1; i < 8; i++) //相临顺序同时点亮
  62. LED_03(i);
  63. for (i = 6; i > 1; i--) //相临逆序同时点亮
  64. LED_03(i);
  65. }
  66. LED_off();

  67. for(p=0;p<5;p++) //模式5:发散聚集点亮
  68. {
  69. for(i=0;i<4;i++) //发散点亮
  70. LED_04(i);
  71. for(i=2;i>0;i--) //聚集点亮
  72. LED_04(i);
  73. }
  74. LED_off();

  75. for(s=0;s<5;s++) //模式6:四四点亮
  76. {
  77. for(i=0;i<2;i++) //四四顺序点亮
  78. LED_05(i);
  79. }
  80. LED_off();

  81. for(j=0;j<10;j++) //模式7:全部点亮熄灭
  82. {
  83. LED_on();
  84. LED_off();
  85. }
  86. }
  87. //MCUCR=0x40; //空闲模式,CPU占用100%
  88. //MCUCR=0x50; //ADC噪声抑制模式,CPU占用100%
  89. //MCUCR=0x60; //掉电模式,CPU占用80%
  90. //MCUCR=0x70; //省电模式,CPU占用4%
  91. //MCUCR=0xE0; //Standby模式,CPU占用80%
  92. MCUCR=0xF0; //扩展Standby模式,CPU占用4%
  93. asm("sleep"); //CPU休眠指令
  94. }
复制代码
2、buzzer.c
  1. #include <iom16v.h>
  2. #include <macros.h>

  3. //7种声音,由低到高
  4. void buzzer01()
  5. {
  6. for(OCR1A= 1000;OCR1A<1700;OCR1A+=100)
  7. {
  8. TCCR1A = 0x40;
  9. TCCR1B = 0x09;
  10. DelayMs(30); //蜂鸣器鸣叫30mS钟,定时器一开始工作蜂鸣器即开始鸣叫
  11. TCCR1A = 0x00; //定时器停止工作,无频率产生,蜂鸣器停止鸣叫
  12. }
  13. }

  14. //7种声音,由高到低
  15. void buzzer02()
  16. {
  17. for(OCR1A= 1600;OCR1A>900;OCR1A-=100)
  18. {
  19. TCCR1A = 0x40;
  20. TCCR1B = 0x09;
  21. DelayMs(30); //蜂鸣器鸣叫30mS钟,定时器一开始工作蜂鸣器即开始鸣叫
  22. TCCR1A = 0x00; //定时器停止工作,无频率产生,蜂鸣器停止鸣叫
  23. }
  24. }
复制代码
3、led.c
  1. #include <iom16v.h>
  2. #include <macros.h>

  3. void LED_on() //打开所有LED
  4. {
  5. PORTB =0X00;
  6. Delay();
  7. }

  8. void LED_off() //关闭所有LED
  9. {
  10. PORTB = 0xFF;
  11. Delay();
  12. }

  13. void LED_01(int i) //LED亮灭控制
  14. {
  15. PORTB = ~BIT(i); //输出低电平
  16. DelayMs(100); //调用延时程序
  17. }

  18. void LED_02(int i) //间隔点亮
  19. {
  20. PORTB=~(BIT(i)|BIT(i-2));
  21. DelayMs(100);
  22. }

  23. void LED_03(int i) //相临点亮
  24. {
  25. PORTB=~(BIT(i)|BIT(i-1)); //~后内容需用括号括起来
  26. DelayMs(100);
  27. }

  28. void LED_04(int i) //发散聚集点亮
  29. {
  30. switch(i)
  31. {
  32. case 0:PORTB=0xE7;DelayMs(100);break; //延时100ms
  33. case 1:PORTB=0xDB;DelayMs(100);break;
  34. case 2:PORTB=0xBD;DelayMs(100);break;
  35. case 3:PORTB=0x7E;DelayMs(100);break;
  36. default:break;
  37. }
  38. }

  39. void LED_05(int i)
  40. {
  41. switch(i)
  42. {
  43. case 0:PORTB=0XAA;DelayMs(100);break;
  44. case 1:PORTB=0X55;DelayMs(100);break;
  45. }
  46. }
复制代码
4、int0_inerrupt.c
  1. #include <iom16v.h>
  2. #include <macros.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. #pragma interrupt_handler Int0:2 //外部中断INT0

  6. void Int0(void)
  7. {
  8. uint i,z;
  9. for (z=0;z<5;z++)
  10. {
  11. buzzer01(); //7种声音,由低到高
  12. for (i = 0; i < 8; i ++)
  13. {
  14. PORTB = ~(1 << i);
  15. DelayMs(100);
  16. }
  17. PORTB=0XFF; //关闭所有LED


  18. buzzer02();//7种声音,由高到低
  19. for (i = 0; i < 8; i ++)
  20. {
  21. PORTB = ~(1 << i);
  22. DelayMs(200);
  23. }
  24. PORTB=0XFF; //关闭所有LED
  25. }
  26. }
复制代码
5、delay.c
  1. /*******************************
  2. Platform : AVR mega16学习板(www.iccavr.com)
  3. function :延时函数
  4. Clock F : 3.6864M
  5. Software : ICCAVR7.14C
  6. Author : 林夕依然
  7. Version : 09.02.25
  8. comments :
  9. 1、两种方式实现延时
  10. ********************************/
  11. /*---------------------------------------------------------------------------------
  12. 延时程序计算方法
  13. 计数个数j = 延时时间/6*晶振频率 - 1
  14. ---------------------------------------------------------------------------------*/

  15. #define uchar unsigned char
  16. #define uint unsigned int

  17. //方式一:
  18. void Delay()
  19. {
  20. uchar a, b, c;
  21. for (a = 1; a; a++)
  22. for (b = 1; b; b++)
  23. for (c = 0; c<10; c++) //循环次数=255*255*10
  24. ;
  25. }

  26. //方式二:1ms延时,准确性较Delay();高
  27. void DelayMs(uint i)
  28. {
  29. while(i--)
  30. {
  31. uint j;
  32. for(j=1;j<=613;j++)
  33. ;
  34. }
  35. }
复制代码
四、完整项目文件下载
实验8:7种LED亮灭模式+INT0中断+蜂鸣器(ICC).rar (83.07 KB)
面对人生,既要有当机立断的决心,更要有永不后悔的气魄!
****************************************************************
期待你和论坛一起成长、进步!

面对人生,既要有当机立断的决心,更要有永不后悔的气魄!

面对人生,既要有当机立断的决心,更要有永不后悔的气魄!
看看 正在学这个呢 哈哈
谢谢楼主!
     下载前回帖!
谢谢!!!!!!!!!!!
提示: 作者被禁止或删除 内容自动屏蔽
谢谢楼主!谢谢楼主!
3q!!xieixie
好资料,谢谢楼主分享
Forge ahead! Never retreat!
楼主太好了
好资料,谢谢楼主分享
正在到处找现成的例子呢!谢啦!
看看 正在学这个呢 哈哈
学习了,真不错。以后会长来啊
14# lu122
谢谢楼主 啊
谢谢楼主!!!!!!!!!
谢谢楼主分享!
不错,谢谢分享!!
回帖是一种美德!
返回列表
Datasheet