本帖最后由 qq2941070113 于 2013-7-5 09:07 编辑
/*********************************Copyright (c)*****************************/
//
// 倍工电子
//
// http://2941070113.qzone.qq.com
//
//项目名称: PWM模拟
//编译环境: keil
//转载请注名出处
//作者QQ: 2941070113
// 本文件是只是讲PWM的基本原理. 不能用于项目.
/***************************************************************************/
//==================================================================
//模拟PWM输出控制灯的10个亮度级别
//==================================================================
#include "reg52.h" //包括一个52标准内核的头文件
//------------------------------------------------------------------
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int //同上
sbit P10=P1^0; //要控制的LED灯
sbit K1=P1^7; //按键K1
//------------------------------------------------------------------
uchar scale; //用于保存占空比的输出0的时间份额,总共10份
//==================================================================
//模拟PWM输出控制灯的10个亮度级别
//==================================================================
void main(void) //主程序
{
uint n;
TMOD=0X10; //定时器1工作方式1
TH1=0xf3; TL1=0x98;
TR1=1;ET1=1;EA=1; //启动定时器,打开定时器0中断,打开总中断
while(1) //程序循环
{; //主程序在这里就不断自循环,实际应用中,这里是做主要工作
for(n=0;n<50000;n++); //每过一会儿就自动加一个档次的亮度
scale++; if(scale==10)scale=0;
}
}
//====================================================================
//1/1200秒定时器2中断
//====================================================================
void timer1() interrupt 3
{
static uchar tt; //tt用来保存当前时间在一秒中的比例位置
TH1=0xf3; TL1=0x98;
tt++;
if(tt==10) //每1/120秒开始输出低电平
{ tt=0;
if(scale!=0) //这里加是一句为了消除灭灯状态产生的鬼影
P10=0;
}
if(scale==tt) P10=1; //按照当前占空比切换输出高电平
}
|