一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 5630|回复: 21
收起左侧

[51单片机] 玩玩STC15F104E单片机 搜遍全国论坛找的资料跟大家分享了,同时经验交流

[复制链接]
发表于 2013-7-3 08:22 | 显示全部楼层 |阅读模式
       首先说一下,我学单片机起点不高,能够改别的程序为自己所用就可以了,网上例子不少,这个不行,换个例子继续改,数码之家有位牛人,他电路图就不认识,可是他精修各种电脑主板,我也想这样,不会写程序,只要能改各种程序为自己用就满足了。
呵呵,是不是太没有远大理想了啊?
     有问题还想弄清楚的:请问单片机里面的占空比咋么计算的?
(这个手电筒程序可能是一位香港或者台湾兄弟写的,被我挖出来了,那个论坛是繁体字的,嘿嘿。)
手电筒.GIF

下面是我搜集的资料,
资料.GIF
资料1.GIF
资料2.GIF
资料3.GIF

先发些我实验、验证通过的,其他的以后再分享,因为有些论坛是复制网页上的程序代码,因为下载需要注册,需要积分什么的

STC15F104E实验程序.rar

535.6 KB, 下载次数: 1193

 楼主| 发表于 2013-7-3 08:48 | 显示全部楼层
/*STC15F104E 只有 2 個普通時鐘可用,所以要寫個模擬 PWM 的軟件。
先定下 PWM 的頻率為 2kHz,選系統頻率為 10MHz,由此計算到每周期分為 5000 格。低光度用 25% 脈寬,中光度用 50% 脈寬,高光度是全亮,程序如下:

此程序非常簡單, 只使用兩個中斷: PWM用計時器0, 磁控管接外部中斷1*/
/**************************************************************
PROGRAM NAME    :Torch.c
DESCRIPTION          :A program to control a torch with
                                 :4 levels of brightness -- off-low-mid-high
MCU                         :STC15F104E
FREQUENCY           :Internal RC osc 10MHz
MODIFTY DATE     :2012/05/24
**************************************************************/
   #include <REGX51.H>
   #include <intrins.h>

   #define LightOff PWMOut=0        //low to turn off the light
   #define LightOn PWMOut=1        //high to turn on the light

   sfr P3M0 = 0xb2;
   sfr AUXR = 0x8e;
   sbit PWMOut = P3^2;
  sbit KeyIn = P3^3;

  //PWM frequency = 2KHz, so total count of a cycle is 5000
  code int Brightness[2][2] = {{3750, 1250}, {2500, 2500}};
  char BrightnessL[4];
  char BrightnessH[4];
  char LightLevel;                        //0=off 1=low 2=mid 3=high

  void Delay(unsigned int Times);

  void main(void)
  {
           BrightnessL[0] = (65536 - Brightness[0][0]) % 256;
           BrightnessH[0] = (65536 - Brightness[0][0]) / 256;
           BrightnessL[1] = (65536 - Brightness[0][1]) % 256;
           BrightnessH[1] = (65536 - Brightness[0][1]) / 256;
           BrightnessL[2] = (65536 - Brightness[1][0]) % 256;
           BrightnessH[2] = (65536 - Brightness[1][0]) / 256;
           BrightnessL[3] = (65536 - Brightness[1][1]) % 256;
           BrightnessH[3] = (65536 - Brightness[1][1]) / 256;

           KeyIn = 1;
           LightLevel = 0;                //light off when power on
           PWMOut = 0;
           AUXR = 0x80;                //set Timer0 to 1T
           P3M0 = 0x04;                //set P3.2 to PP for output

           //Timer0 init
           TMOD = 0x01;                //set timer0 to 16-bit counter
           IT1 = 1;                        //set int1 falling only
           IE = 0xc6;                          //set bit EA, ELVD, EX1, ET0
           PT0 = 1;

           PCON = 0x02;
           _nop_();
           _nop_();
           _nop_();
           while(1);
  }

  void Timer0Int(void) interrupt 1
  {
           switch (LightLevel)
           {
                   case 1:
                   if (PWMOut)
                   {
                           PWMOut = 0;
                           TL0 = BrightnessL[0];
                           TH0 = BrightnessH[0];
                   }
                   else
                   {
                           PWMOut = 1;
                           TL0 = BrightnessL[1];
                           TH0 = BrightnessH[1];
                   }
                   break;

                   case 2:
                   if (PWMOut)
                   {
                           PWMOut = 0;
                           TL0 = BrightnessL[2];
                           TH0 = BrightnessH[2];
                   }
                   else
                   {
                           PWMOut = 1;
                           TL0 = BrightnessL[3];
                           TH0 = BrightnessH[3];
                   }
                   break;

                   case 3:
                   LightOn;
                   TR0 = 0;
           }
  }

  void Ex1Int(void) interrupt 2
  {
           EX1 = 0;
           Delay(7000);                //debounce about 100mS
           if (!KeyIn)
           {
                   LightLevel++;
                   if (LightLevel > 3)
                   {
                           LightLevel = 0;
                          TR0 = 0;
                          EX1 = 1;
                          LightOff;

                          PCON = 0x02;
                          _nop_();
                          _nop_();
                          _nop_();
                          _nop_();
                  }
                  TR0 = 1;

                  while (!KeyIn);        //wait switch release
                  Delay(7000);
          }
          IE0 = 0;
          EX1 = 1;
  }

  void Delay(unsigned int Times)
  {
          unsigned int i;
          for (i = 0; i < Times; i++);
  }

/*
程序說明:
13行        宣告PWM的兩組控制光度的參數,第1組是25%寬度,第2組是50%寬度
22~29行  因懶惰將PWM的數據交編譯器計算成計時器使用的數據
43行        電源接通後先進入電源下降模式
47行        初始工作完成後,進入無限迴圈
50行        時鐘0中斷程式,視變數LightLevel的數值,作控制PWM寬度用
90行        磁控管輸入中斷程式,可看到LightLevel = 0時,電筒進入電源下降模式 */

 楼主| 发表于 2013-7-3 08:51 | 显示全部楼层
本帖最后由 社建电子 于 2013-7-3 08:54 编辑

【这是带序号的,编译通不过。】
/*STC15F104E 只有 2 個普通時鐘可用,所以要寫個模擬 PWM 的軟件。
先定下 PWM 的頻率為 2kHz,選系統頻率為 10MHz,由此計算到每周期分為 5000 格。低光度用 25% 脈寬,中光度用 50% 脈寬,高光度是全亮,程序如下:

此程序非常簡單, 只使用兩個中斷: PWM用計時器0, 磁控管接外部中斷1*/
/**************************************************************
PROGRAM NAME    :Torch.c
DESCRIPTION          :A program to control a torch with
                                 :4 levels of brightness -- off-low-mid-high
MCU                         :STC15F104E
FREQUENCY           :Internal RC osc 10MHz
MODIFTY DATE     :2012/05/24
**************************************************************/
1   #include <reg51.h>
2   #include <intrins.h>
3
4   #define LightOff PWMOut=0        //low to turn off the light
5   #define LightOn PWMOut=1        //high to turn on the light
6
7   sfr P3M0 = 0xb2;
8   sfr AUXR = 0x8e;
9   sbit PWMOut = P3^2;
10  sbit KeyIn = P3^3;
11
12  //PWM frequency = 2KHz, so total count of a cycle is 5000
13  code int Brightness[2][2] = {{3750, 1250}, {2500, 2500}};
14  char BrightnessL[4];
15  char BrightnessH[4];
16  char LightLevel;                        //0=off 1=low 2=mid 3=high
17
18  void Delay(unsigned int Times);
19
20  void main(void)
21  {
22           BrightnessL[0] = (65536 - Brightness[0][0]) % 256;
23           BrightnessH[0] = (65536 - Brightness[0][0]) / 256;
24           BrightnessL[1] = (65536 - Brightness[0][1]) % 256;
25           BrightnessH[1] = (65536 - Brightness[0][1]) / 256;
26           BrightnessL[2] = (65536 - Brightness[1][0]) % 256;
27           BrightnessH[2] = (65536 - Brightness[1][0]) / 256;
28           BrightnessL[3] = (65536 - Brightness[1][1]) % 256;
29           BrightnessH[3] = (65536 - Brightness[1][1]) / 256;
30
31           KeyIn = 1;
32           LightLevel = 0;                //light off when power on
33           PWMOut = 0;
34           AUXR = 0x80;                //set Timer0 to 1T
35           P3M0 = 0x04;                //set P3.2 to PP for output
36
37           //Timer0 init
38           TMOD = 0x01;                //set timer0 to 16-bit counter
39           IT1 = 1;                        //set int1 falling only
40           IE = 0xc6;                          //set bit EA, ELVD, EX1, ET0
41           PT0 = 1;
42
43           PCON = 0x02;
44           _nop_();
45           _nop_();
46           _nop_();
47           while(1);
48  }
49
50  void Timer0Int(void) interrupt 1
51  {
52           switch (LightLevel)
53           {
54                   case 1:
55                   if (PWMOut)
56                   {
57                           PWMOut = 0;
58                           TL0 = BrightnessL[0];
59                           TH0 = BrightnessH[0];
60                   }
61                   else
62                   {
63                           PWMOut = 1;
64                           TL0 = BrightnessL[1];
65                           TH0 = BrightnessH[1];
66                   }
67                   break;
68               
69                   case 2:
70                   if (PWMOut)
71                   {
72                           PWMOut = 0;
73                           TL0 = BrightnessL[2];
74                           TH0 = BrightnessH[2];
75                   }
76                   else
77                   {
78                           PWMOut = 1;
79                           TL0 = BrightnessL[3];
80                           TH0 = BrightnessH[3];
81                   }
82                   break;
83               
84                   case 3:
85                   LightOn;
86                   TR0 = 0;
87           }
88  }
89
90  void Ex1Int(void) interrupt 2
91  {
92           EX1 = 0;
93           Delay(7000);                //debounce about 100mS
94           if (!KeyIn)
95           {
96                   LightLevel++;
97                   if (LightLevel > 3)
98                   {
99                           LightLevel = 0;
100                          TR0 = 0;
101                          EX1 = 1;
102                          LightOff;
103                        
104                          PCON = 0x02;
104                          _nop_();
105                          _nop_();
106                          _nop_();
107                          _nop_();
108                  }
109                  TR0 = 1;
110
111                  while (!KeyIn);        //wait switch release
112                  Delay(7000);
113          }
114          IE0 = 0;
115          EX1 = 1;
116  }
117
118  void Delay(unsigned int Times)
119  {
120          unsigned int i;
121          for (i = 0; i < Times; i++);
122  }

/*
程序說明:
13行        宣告PWM的兩組控制光度的參數,第1組是25%寬度,第2組是50%寬度
22~29行  因懶惰將PWM的數據交編譯器計算成計時器使用的數據
43行        電源接通後先進入電源下降模式
47行        初始工作完成後,進入無限迴圈
50行        時鐘0中斷程式,視變數LightLevel的數值,作控制PWM寬度用
90行        磁控管輸入中斷程式,可看到LightLevel = 0時,電筒進入電源下降模式 */

发表于 2013-7-3 09:00 | 显示全部楼层
带序号是为了讲解方便,C语言语法中不能带行号,编译时要把前面的序号删除
发表于 2013-7-3 09:06 | 显示全部楼层
本帖最后由 hysy 于 2013-7-3 09:08 编辑

社电想问啥?程序能不能用,看了那么长代码,没看到想说什么...
这是一普通程序,任何cpu都可以实现,不定非要stc那啥...

点评

1楼红字那里是问题。  发表于 2013-7-3 10:00
发表于 2013-7-3 09:13 | 显示全部楼层
我们复制不了这里的代码呀.
发表于 2013-7-3 09:14 | 显示全部楼层
可以参考stc下载工具中的范例程序,加上进入掉电模式实现外部中断软关机,功耗很低,uA级
 楼主| 发表于 2013-7-3 09:58 | 显示全部楼层
hysy 发表于 2013-7-3 09:06
社电想问啥?程序能不能用,看了那么长代码,没看到想说什么...
这是一普通程序,任何cpu都可以实现 ...

能用,实物实验通过的,我就是想问问,22-29行,那占空比咋理解?
想改改,如何做?
发表于 2013-7-3 10:18 | 显示全部楼层
社建电子 发表于 2013-7-3 09:58
能用,实物实验通过的,我就是想问问,22-29行,那占空比咋理解?
想改改,如何做?

总值5000,想调就调两个比例不就行了,
code int Brightness[2][2] = {{3750, 1250}, {2500, 2500}};
二维数组,。增加一个75%的
code int Brightness[3][2] = {{3750, 1250}, {2500, 2500}, {1250, 3750}};

评分

参与人数 1一乐金币 +8 收起 理由
社建电子 + 8 赞一个!

查看全部评分

发表于 2013-7-3 10:41 | 显示全部楼层
正纳闷社建兄最近一直在忙啥呢?
现在知道了……

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-6-6 06:44 , Processed in 0.074823 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表