*********************************************************************************************/ #include "reg52.h" // 包含头文件
/* 与编译器无关的数据类型定义 */ /********************************************************************************************/ typedef unsigned char uint8; // 无符号8位整型变量 typedef signed char int8; // 有符号8位整型变量 typedef unsigned short uint16; // 无符号16位整型变量 typedef signed short int16; // 有符号16位整型变量 typedef unsigned int uint32; // 无符号32位整型变量 typedef signed int int32; // 有符号32位整型变量 typedef float fp32; // 单精度浮点数(32位长度) typedef double fp64; // 双精度浮点数(64位长度) /********************************************************************************************/
/* 定义位变量 */ sbit P1_7 = P1 ^ 7; // 控制LED11 sbit P1_6 = P1 ^ 6; // 控制LED10 sbit P1_5 = P1 ^ 5; // 控制LED9 sbit P1_2 = P1 ^ 2; // PWMDAC输出,用户可以在PWM测试点上用万用表测量
uint8 scale_0; // 用于保存占空比中输出0的时间份额,总共10份 /******************************************************************************************** * 函数名称:Timer2_Server() * 功 能:定时器2溢出中断服务程序。1/2000 秒中断1次。 * 入口参数:无 * 出口参数:无 *********************************************************************************************/ void Timer2_Server(void) interrupt 5 { static uint8 tt; // tt用来保存当前时间在1秒中的比例位置 TF2=0; tt++; if(tt==10) // 每1/200秒整开始输出低电平 { tt=0;
if(scale_0!=0) // 加入该句的目的是避免灭灯时发生闪烁 { P1_7=0; P1_6=0; P1_5=0; P1_2=0; } } if(scale_0==tt) // 按照当前占空比切换输出高电平 { P1_7=1; P1_6=1; P1_5=1; P1_2=1; } }
/******************************************************************************************** * 函数名称:main() * 功 能:模拟PWM输出控制LED灯的10个亮度级别。LED9~LED11将同时依次产生10个级别的亮度。与此 * 同时,用户可以用万用表在ARMSKY-51Easy教学实验开发板上的PWM测试点进行测量观察。 *********************************************************************************************/ void main (void) { uint16 n; RCAP2H =0xFE; // 赋T2的预置值,溢出1次是1/2000秒钟 RCAP2L =0x0C; TR2=1; // 启动定时器2 ET2=1; // 打开定时器2中断 EA=1; // 打开总中断
while(1) // 死循环 { for(n=0;n<50000;n++); // 每过一会儿就自动加一个档次的亮度 scale_0++; if(scale_0==10) scale_0=0; // 当档次达到10后,归0 } } 占空比怎么算 |