📄 test017.lst
字号:
C51 COMPILER V7.50 TEST017 12/28/2006 19:32:37 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE TEST017
OBJECT MODULE PLACED IN test017.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE test017.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************************************************
2 * 文 件 名:test017.c
3 * 功 能:模拟PWM输出控制LED灯的10个亮度级别。
4 * 硬件条件:1.CPU型号:AT89S52
5 * 2.晶振:12.000MHz
6 * 3.用跳线帽短接LED11__P1.7
7 * 用跳线帽短接LED10__P1.6
8 * 用跳线帽短接LED9__P1.5
9 * 说 明:要改变LED灯的显示亮度,可以使用PWM输出控制。在一定频率的方波中,调整高电平和低电平
10 * 的占空比,即可实现。例如用低电平点亮一个LED灯,假设把一个周期分为10个时间等份,如果
11 * 方波中的高低电平占空比是9:1,这时就是一个比较暗的亮度,如果占空比是5:5,就是一个中间
12 * 亮度,如果高低电平占空比是1:9,这时就是一个比较亮的亮度,高低电平占空比为10:0时,灯
13 * 是灭的,高低电平占空比为0:10时,灯最亮。
14 * 在本实验中,我们将定时器2的溢出定为1/2000秒,每10次脉冲输出一个200Hz频率。这每10次
15 * 脉冲再用来控制高低电平的10个比值。这样,在每个1/200秒的方波周期中,我们都可以改变
16 * 方波的输出占空比,从而控制LED灯的10个亮度级别。
17 * 注意:为什么输出方波的频率我们选择200Hz这么高呢?因为如果频率太低,人眼就会看到闪烁
18 * 感觉。一般起码要在60Hz以上感觉才好点,120Hz基本上看不到闪烁,因此我们选择200Hz,
19 * 人眼将看不到闪烁,只能看到亮度变化。
20 * 作 者:POWER
21 * 日 期:2006年12月12号
22 * 斯凯科技主页:www.armsky.net
23 * 斯凯科技论坛:www.armsky.net/bbs
24 *********************************************************************************************/
25 #include "reg52.h" // 包含头文件
26
27 /* 与编译器无关的数据类型定义 */
28 /********************************************************************************************/
29 typedef unsigned char uint8; // 无符号8位整型变量
30 typedef signed char int8; // 有符号8位整型变量
31 typedef unsigned short uint16; // 无符号16位整型变量
32 typedef signed short int16; // 有符号16位整型变量
33 typedef unsigned int uint32; // 无符号32位整型变量
34 typedef signed int int32; // 有符号32位整型变量
35 typedef float fp32; // 单精度浮点数(32位长度)
36 typedef double fp64; // 双精度浮点数(64位长度)
37 /********************************************************************************************/
38
39 /* 定义位变量 */
40 sbit P1_7 = P1 ^ 7; // 控制LED11
41 sbit P1_6 = P1 ^ 6; // 控制LED10
42 sbit P1_5 = P1 ^ 5; // 控制LED9
43 sbit P1_2 = P1 ^ 2; // PWMDAC输出,用户可以在PWM测试点上用万用表测量
44
45 uint8 scale_0; // 用于保存占空比中输出0的时间份额,总共10份
46
47 /********************************************************************************************
48 * 函数名称:Timer2_Server()
49 * 功 能:定时器2溢出中断服务程序。1/2000 秒中断1次。
50 * 入口参数:无
51 * 出口参数:无
52 *********************************************************************************************/
53 void Timer2_Server(void) interrupt 5
54 {
55 1 static uint8 tt; // tt用来保存当前时间在1秒中的比例位置
C51 COMPILER V7.50 TEST017 12/28/2006 19:32:37 PAGE 2
56 1
57 1 TF2=0;
58 1
59 1 tt++;
60 1 if(tt==10) // 每1/200秒整开始输出低电平
61 1 {
62 2 tt=0;
63 2
64 2 if(scale_0!=0) // 加入该句的目的是避免灭灯时发生闪烁
65 2 {
66 3 P1_7=0;
67 3 P1_6=0;
68 3 P1_5=0;
69 3 P1_2=0;
70 3 }
71 2 }
72 1 if(scale_0==tt) // 按照当前占空比切换输出高电平
73 1 {
74 2 P1_7=1;
75 2 P1_6=1;
76 2 P1_5=1;
77 2 P1_2=1;
78 2 }
79 1 }
80
81 /********************************************************************************************
82 * 函数名称:main()
83 * 功 能:模拟PWM输出控制LED灯的10个亮度级别。LED9~LED11将同时依次产生10个级别的亮度。与此
84 * 同时,用户可以用万用表在ARMSKY-51Easy教学实验开发板上的PWM测试点进行测量观察。
85 *********************************************************************************************/
86 void main (void)
87 {
88 1 uint16 n;
89 1
90 1 RCAP2H =0xFE; // 赋T2的预置值,溢出1次是1/2000秒钟
91 1 RCAP2L =0x0C;
92 1 TR2=1; // 启动定时器2
93 1 ET2=1; // 打开定时器2中断
94 1 EA=1; // 打开总中断
95 1
96 1 while(1) // 死循环
97 1 {
98 2 for(n=0;n<50000;n++); // 每过一会儿就自动加一个档次的亮度
99 2 scale_0++;
100 2 if(scale_0==10) scale_0=0; // 当档次达到10后,归0
101 2 }
102 1 }
103
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 95 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -