⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 8051中利用时钟控制实现PWM输出的简单模拟程序,用LED灯的亮度来模拟显示脉宽
💻 C
字号:
#include <reg52.h>
#include <stdio.h>

#define UCHAR unsigned char
#define UINT unsinged int

sbit IN0 = P3^2;
sbit IN1 = P3^3;
sbit PWM = P3^4;

UCHAR PWMRegH, PWMRegL;

void Delay(UCHAR i);
UCHAR keyscan(void);

UCHAR key, i = 1;

void ld_int0 (void) interrupt 0 using 1		//外部中断0响应函数
{
	EX0 = 0;
	Delay(10);

	PWM = 0;				//使能PWM
	TR1 = 1;
	printf("enable");

	i = 1;
	PWMRegH = (800 - 25 * 8 )/256;
	PWMRegL = (800 - 25 * 8 )%256;
	P1 = ~0x01;

	while(IN0 == 0)Delay(10);
	EX0 = 1;
}

void Tim0_int(void) interrupt 1 using 1		//定时器0响应函数
{
	PWM = 0;				//输出低电平
	TR0 = 0;				//定时器停止计数
}

void ld_int1 (void) interrupt 2 using 1		//外部中断1响应函数
{
	EX1 = 0;				
	Delay(10);

	PWM = 1;				//关闭PWM
	TR1 = 0;
	printf("disable");

	while(IN1 == 0)Delay(10);
	EX1 = 1;
}

void Tim1_int(void) interrupt 3 using 1
{
	PWM = 1;				//PWM输出高电平

	TH0 -= PWMRegH;				//设定占空比
	TL0 -= PWMRegL;
	TR0 = 1;

	TH1 -= 800/256;
	TL1 -= 800%256;

}

main()
{	
	SCON  = 0x50;				//初始化寄存器		        
    TMOD |= 0x11;               
    TH1   -= 800/256;
	TL1   -= 800%256;               
	TH0   -= PWMRegH;
	TL0   -= PWMRegL;
    TR1   = 0;                  
	TR0   = 0;
	TI    = 1;                           
	IE    = 0x8F;

	RCAP2H = 0xFF;				//设置串口波特率
	RCAP2L = 0xDB;				//9600 @ 11.0592
	T2CON = 0x34; 

	PWMRegH = (800 - 25 * 8)/256;
	PWMRegL = (800 - 25 * 8)%256;

	printf("start");

	for(;;)
	{
		key = keyscan();		//键扫描

		if(key == 0x11)			//根据键值调整占空比
		{
			if(i <= 8)
			{
				i++;
				PWMRegH = (800 - 25 * (8 - i))/256;
				PWMRegL = (800 - 25 * (8 - i))%256;
				P1 = ~(0x01 << (i-1));
			} 
			key = 0;
		}

		if(key == 0x21)
		{
			if(i > 0)
			{
				i--;
				PWMRegH = (800 - 25 * (8 - i))/256;
				PWMRegL = (800 - 25 * (8 - i))%256; 
				P1 = ~(0x01 << (i-1));
			}
			key = 0;
		}
	}	
}

void Delay(UCHAR i)
{
	UCHAR j;
	for(i; i > 0; i--)
		for(j = 200; j > 0; j--);
}

UCHAR keyscan(void)				//键扫描程序
{
	UCHAR sccode,recode;
	P2 = 0xF0;
	if((P2 & 0xF0) != 0xF0)
	{
		Delay(3);
		if((P2 & 0xF0) != 0xF0)
		{
			sccode = 0xFE;
			while((sccode & 0x10) != 0)
			{
				P2 = sccode;
				if((P2 & 0xF0) != 0xF0)
				{
					recode = (P2 & 0xF0) | 0x0F;
					while((P2 & 0xF0) != 0xF0)Delay(3);
					return((~sccode) + (~recode));
				}
				else
					sccode = (sccode << 1) | 0x01;
			}
		}
	}

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -