📄 timer.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 + -