📄 pwm.c
字号:
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
#include <reg52.h> //包括一个 52 标准内核的头文件
sbit P10 = P1^0; //要控制的 LED灯
sbit P11 = P1^1;
sbit zhi=P0^0; //用作指示灯,按键一次闪一次
uchar scale;//用于保存占空比的输出 0 的时间份额,总共 10 份
uchar code dis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共阳极数码管
char code dx516[3] _at_ 0x003b;//这是为了仿真设置的
//模拟 PWM 输出控制灯的 10 个亮度级别
/************************************************/
void delay(void)
{
uchar i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++);
}
/***********************************************/
void main(void)
{
//仅作为调试时的输出标志,检验数码管显示情况
uchar m;
for(m=0;m<10;m++)
{
P2=dis[m];
delay();
}
P2=dis[5];
RCAP2H =0xF3; //赋 T2 的预置值,溢出 1 次是 1/1200 秒钟
RCAP2L =0x98;
TR2=1; //启动定时器
ET2=1; //打开定时器 2 中断
EA=1; //打开总中断
EX1=1; //打开外部中断1
EX0=1; //打开外部中断0
scale=5; //给定初值,从中间开始,方便调节
while(1) //程序循环
{ //主程序在这里就不断自循环,实际应用中,这里是做主要工作
;
}
}
/***********************************************/
/*****************1/1200 秒定时器 2 中断 ********/
timer2() interrupt 5
{
static uchar tt; //tt 用来保存当前时间在一秒中的比例位置
TF2=0;
tt++;
if(tt==10) //每 1/120 秒整开始输出低电平
{
tt=0;
if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影
P10=0;
P11=0;
}
if(scale==tt) //按照当前占空比切换输出高电平
P10=1;
P11=1;
}
/*********两个中断自己写的****************/
int1() interrupt 0 //0表示EA的第0位,对应外部中断0
{ zhi=~zhi;
if(scale<9)
scale++;
else
scale=9;
P2=dis[9-scale]; //不用9减就会出现亮度和数值相反的情况
delay();
zhi=~zhi; //延时程序使中断完成,否则按键一次会中断很多次
}
/*************************/
int0() interrupt 2 //2表示EA的第2位,对应外部中断1
{ zhi=~zhi;
if(scale>0)
scale--;
else
scale=0;
P2=dis[9-scale];
delay();
zhi=~zhi;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -