Chinaunix首页 | 论坛 | 博客
  • 博客访问: 610821
  • 博文数量: 262
  • 博客积分: 8433
  • 博客等级: 中将
  • 技术积分: 2141
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-31 09:37
文章分类

全部博文(262)

文章存档

2012年(1)

2011年(168)

2010年(92)

2009年(1)

分类: 嵌入式

2011-01-09 21:51:56

  1. //文件:demo.c

  2. //项目:无级调光灯

  3. //说明:晶振115200



  4. #include <reg52.h>
  5. #include <intrins.h>
  6. #include "delay.h"


  7. typedef unsigned char uchar;
  8. typedef unsigned int uint;

  9. #define LOW 0
  10. #define HIGH 200    //设置200个档次


  11. //分配PWM端口

  12. sbit pwm_port = P2^0;
  13. sbit key_up = P2^6;
  14. sbit key_down = P2^7;

  15. //定义变量

  16. uchar mid;
  17. uchar tmp;
  18. //uint tmp=0xfe;


  19. //函数声明

  20. void Init();
  21. void KeyScan();

  22. void main()
  23. {
  24. /*
  25.     //测试定时器
  26.     //Init();    //设备初始化
  27.         
  28.     //P1 = 0xfe;
  29.     uchar led;
  30.     uint i,j;     //定义变量要在初始化之前
  31.     led = 0xfe;
  32. //    uint m;    

  33.     while(1)
  34.     {
  35.      P1 = led;

  36.         for(i=0;i<1000;i++)
  37.          for(j=0;j<50;j++)
  38.              delay_20us();
  39.     
  40.     //delay_50ms(20);
  41.     led = _crol_(led,0x01);
  42.         

  43.     }
  44.  */

  45.     Init();    //设备初始化

  46.     while(1)
  47.     {
  48.         KeyScan();    
  49.     }


  50. }

  51. void Init()
  52. {
  53.     //定时器初始化

  54.     TMOD=0x02;    //定时器0,工作在模式2(自动重装计数初值)

  55.     TH0=0xa3;    //设定初始值:100us中断一次

  56.     TL0=0xa3;
  57.     TF0=0;         //清溢出标志位,软清零

  58.     TR0=1;        //启动定时器0

  59.     ET0=1;
  60.     EA=1; // CPU所有中断开(IE最高位MSB)


  61.     //变量初始化

  62.     mid = 0;    //起始的占空比位0:200

  63.     tmp = 0;    //临时变量,用于记录时间中间量


  64. }

  65. void timer0() interrupt 1
  66. {
  67.     /*
  68.     //测试中断函数
  69.     TR0 = 0;
  70.     P1=tmp;
  71.     tmp = _crol_(tmp,0x01);
  72.     TR0 = 1;
  73.     */

  74.     TR0 = 0;    //关闭中断,保证原子操作


  75.     tmp++;
  76.     if(tmp>=HIGH)
  77.     {
  78.         tmp = 0;
  79.     }
  80.     if(tmp<mid)
  81.     {
  82.         //pwm_port = 1;

  83.         pwm_port = 0;
  84.     }
  85.     else
  86.     {
  87.         //pwm_port = 0;

  88.         pwm_port = 1;
  89.     }

  90.     TR0 = 1;    //开中断,恢复现场

  91. }

  92. void KeyScan()
  93. {
  94.     //增加pwm占空比

  95.     if(key_up == 0)
  96.     {
  97.         //delay_ms(20);

  98.         delay_ms(50);        //100ms消抖

  99.         if(key_up == 0)        //确定按键按下,进行用户操作

  100.         {
  101.             P1 = ~P1;        //用于测试

  102.             if(mid<=HIGH)
  103.                 mid++;        //提高占空比

  104.             else
  105.                 return;
  106.         }
  107.     }    

  108.     //减少pwm占空比

  109.     if(key_down == 0)
  110.     {
  111.         //delay_ms(20);

  112.         delay_ms(50);
  113.         if(key_down == 0)    //确定按键按下,进行用户操作

  114.         {
  115.             //P1 = 0xff;

  116.             P1 = ~P1;        //用于测试

  117.             if(mid>=LOW)
  118.                 mid--;        //提高占空比

  119.             else
  120.                 return;

  121.         }
  122.     }


  123. }
 mos.rar   
阅读(1000) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~