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

📄 timer.c

📁 51单片机实现渐变灯
💻 C
字号:
/***************************************************************************
标题:	PWM
效果:	数码管做精确的秒计数00-99
技术支持QQ群:73535837
说明:	板使用12M晶振
******************************************************************************/

//头文件:
#include "reg51.h"

//变量定义:
unsigned char table[]=
			{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
					//表:共阳数码管 0-9 
extern unsigned char timer0=0;	//作为计数时间量
unsigned int pwm_index=10;//PWM占空比西系数
unsigned char lold=1;		//作为按键放开的凭证,1为放开,0为按下
unsigned char led=0;

//引脚定义:	
sbit SMG_q = P1^0;	//定义数码管阳级控制脚(千位)
sbit SMG_b = P1^1;	//定义数码管阳级控制脚(百位)	
sbit SMG_s = P1^2;	//定义数码管阳级控制脚(十位)
sbit SMG_g = P1^3;	//定义数码管阳级控制脚(个位)

sbit led0 = P2^0;	//定义第一个LED灯
sbit led1 = P2^1;
sbit led2 = P2^2;
sbit led3 = P2^3;
sbit led4 = P2^4;
sbit led5 = P2^5;
sbit led6 = P2^6;
sbit led7 = P2^7;
sbit key1 = P3^7;	//定义按键1
sbit key2 = P3^6;	//定义按键1
sbit key3 = P3^5;	//定义按键1

//函数声明:
void displaylow(unsigned char da);
void displayhigh(unsigned char da);
void delay(void); 
void init();					//初如化函数
void light(unsigned int level,unsigned char led);

//主函数,C语言的入口函数:	
void main()
{

	init();					//初始化中断控制寄存器
	while(1)
	{	if(key1==0)	//按键1按下,LED1灯亮
		{	if(lold)
			{
				pwm_index++;
				lold=0;
			
			}
		}
	
		
		else if(key2==0)	//按键1按下,LED1灯亮
		{	if(lold)
			{	if(pwm_index==0)
				pwm_index=0;
				else  pwm_index--;
			}
				lold=0;
			
		}
		else if(key3==0)	//按键1按下,LED1灯亮
		{	if(lold)led++;
			lold=0;
		}
		else lold=1;
		light(0,0);
		light(1,1);
		light(4,2);
		light(15,3);
		light(15,4);
		light(1,5);
		light(4,6);
		light(0,7);
		displayhigh(led);
		displaylow(pwm_index);
		
	}
}

//初始化函数
void init()
{
	
	timer0=0;
	TMOD=0X01;		//设置定时器1为模式一,即16位计算模式
	TH0=(65536-2003)/256;	//给计数寄存器赋值,1毫秒时间
	TL0=(65536-2003)%256;
	EA=1;		//开启总中断
	ET0=1;		//开启定时器0中断
	TR0=1;		//启定定时器0
}

//中断函数,关键字"interrupt" , 这是C语言的中断函数表示法,1表时定地器0
void timer() interrupt 1
{
	TH0=(65536-503)/256;	//重新赋值
	TL0=(65536-503)%256;
	timer0++;					//0.5毫秒加1
//	if(timer0==pwm_index)
//	{	led0=0;	}
	if(timer0==20)
	{	timer0=0;
	}	
	
}

//显示函数,参数为显示内容,只显示两位数
void displaylow(unsigned char da)
{
	SMG_s=0;			//选择十位数码管
	P0=table[da/10];	//获取十位值,查表输出定义好的数码管段值与P0口,显示相应的0-9
	delay();			//延时
	P0=0XFF;			//清除数码管显示,因是共阳型,所以不是0
	SMG_s=1;			//关闭十位数码管

	SMG_g=0;			//选择个位数码管
	P0=table[da%10];	//获取个位值,查表输出定义好的数码管段值与P0口,显示相应的0-9
	delay();			//延时
	P0=0XFF;			//清除数码管显示,因是共阳型,所以不是0
	SMG_g=1;			//关闭个位数码管
}

void displayhigh(unsigned char da)
{
	SMG_q=0;			//选择十位数码管
	P0=table[da/10];	//获取十位值,查表输出定义好的数码管段值与P0口,显示相应的0-9
	delay();			//延时
	P0=0XFF;			//清除数码管显示,因是共阳型,所以不是0
	SMG_q=1;			//关闭十位数码管

	SMG_b=0;			//选择个位数码管
	P0=table[da%10];	//获取个位值,查表输出定义好的数码管段值与P0口,显示相应的0-9
	delay();			//延时
	P0=0XFF;			//清除数码管显示,因是共阳型,所以不是0
	SMG_b=1;			//关闭个位数码管
}

void light(unsigned int level,unsigned char led) //level为5级,5最亮,1最暗
{	
	//led=led&&0x03;
	switch(led)
	{	case 0: if(timer0<level)	led0=0;
			else led0=1;
			break;
		case 1: if(timer0<level)	led1=0;
			else led1=1;
			break;
		case 2: if(timer0<level)	led2=0;
			else led2=1;
			break;
		case 3: if(timer0<level)	led3=0;
			else led3=1;
			break;	
		case 4: if(timer0<level)	led4=0;
			else led4=1;
			break;
		case 5: if(timer0<level)	led5=0;
			else led5=1;
			break;
		case 6: if(timer0<level)	led6=0;
			else led6=1;
			break;
		case 7: if(timer0<level)	led7=0;
			else led7=1;
			break;
	}

}


//延时子函数,短暂延时
void delay(void){		
	unsigned char i=10;
	while(i--);
}

⌨️ 快捷键说明

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