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

📄 led_change.c

📁 帮朋友写的一个用MCS-51的IO口模拟PWM使外接LED亮度渐变的程序
💻 C
字号:
/*
	注意: 定时时间由晶振决定,我暂时给你按12MHz晶振计算定时时间,你接上6MHz晶振期效果也差不多,只是变化得慢一倍
	此程序我已用ARM进行硬件模拟了LED的变化(在Keil中也用软件调试通过),应可以直接使用,你在端口上请注意选择合适的上拉电阻
	另外你可根据你的需要及LED的效果来修改其定时时间、周期时间、脉冲宽度常数表与同一脉冲出现次数等
*/

#include <REGx51.h>

typedef unsigned char uint8;
typedef unsigned int uint16;


//宏定义
//*********************************************************
#define LED				P1_2			//LED端口定义

#define _Timer0_Time_	1				//Timer0定时时间
#define _Cycle_Time_	20				//周期时间为20ms
#define _Times_			5				//同一宽度脉冲出现的周期数


//变量定义
//*********************************************************
uint8 Cycle_Time;						//周期时间
uint8 Pulse_Time;						//脉冲时间(宽度)

const uint8 Pulse_Time_Buf[20]=			//脉冲宽度常数表
	{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};


/*********************************************************
  Time0中断函数
**********************************************************/
void Time0(void) interrupt 1 using 1
{
	TH0=0xFC;							//1ms定时
	TL0=0x18;
	
	if(Pulse_Time) Pulse_Time--;
	if(Cycle_Time) Cycle_Time--;
}


//主函数
//*********************************************************
main()
{
	uint8 i,j;
	uint16 count;
	
	P0=0xff;							//P0口初始状态
	TMOD=0x01; 
	TH0=0xFC;							//1ms定时
	TL0=0x18;
	EA=1;								//启动定时器,开定时器中断
	ET0=1;
	TR0=1;
	
	LED=1;
	while(1) {							//进入主循环

		//for(i=20; i; i--){			//脉冲宽度从20~0ms渐变
		for(i=0; i<20; i++){			//脉冲宽度从0~20ms渐变
			for(j=0; j<_Times_; j++) {	//每一个宽度脉冲出现_Times_次
				Cycle_Time=_Cycle_Time_;
				Pulse_Time=Pulse_Time_Buf[i];
				LED=1;
				//LED=0;				//此句代替上句可改变LED电平有效极性
				do {
					if(!Pulse_Time) {
						LED=0;
						//LED=1;		//此句代替上句可改变LED电平有效极性					}
					if(!Cycle_Time) {
						break;					}				}while(1);
			}		}
		for(count=0; count<1000; count++);	//延时,演示用
		
		//for(i=20; i; i--){			//脉冲宽度从20~0ms渐变
		for(i=0; i<20; i++){			//脉冲宽度从0~20ms渐变
			for(j=0; j<_Times_; j++) {	//每一个宽度脉冲出现_Times_次
				Cycle_Time=_Cycle_Time_;
				Pulse_Time=Pulse_Time_Buf[i];
				LED=0;
				//LED=1;				//此句代替上句可改变LED电平有效极性
				do {
					if(!Pulse_Time) {
						LED=1;
						//LED=0;		//此句代替上句可改变LED电平有效极性
					}
					if(!Cycle_Time) {
						break;
					}
				}while(1);
			}
		}
		for(count=0; count<1000; count++);	//延时,演示用
	}}


#if 0
/*************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
uchar  Count,timecount;
bit temp;

/*********************************************************
 延时函数
*********************************************************/
void Delay(uint num)//延时函数
{
  while( --num );
}
/********************************************************
 主函数
*********************************************************/
main()
{
   P0=0xff;
   Count=0x00;
   TMOD=0x01; 
   TH0=0x4c; TL0=0x00;      //50ms定时
   EA=1; ET0=1; TR0=1;
   while(1)  
   if(temp) 
   p1^2=!p1^2;
   delay(200);
}
/*********************************************************
  Time0中断函数
**********************************************************/
void Time0(void) interrupt 1 using 0
{
   TH0=0x4c;               //50ms定时
   TL0=0x00;
   timecount++;
   if(timecount==20)
   {
    temp=!temp;       
   }
}
/*********************************************************/
#endif

⌨️ 快捷键说明

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