/**************************************************************************
***1、项目:
***2、芯片型号:AT89C51
***3、功能描述:通过按键控制输出脉冲的宽度,得利脉宽去控制灯的亮度。
***4、李文伟
**************************************************************************/
#include <reg52.h>
调宽按钮
sbit add=P1^0;
sbit jian=P1^1;
sbit star=P1^2; //总控按键
unsigned char pwm_set,key_value;
unsigned char count;
unsigned char count1=0x00;
sbit PWM=P3^6;
unsigned char code BCD[]={0x3f,0x06,0x5b,0x4f, //此处是将0-F转换成相应的BCD码
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay1(unsigned char t)
{
while(t--);
}
void pwm(void) interrupt 5//定时器2产生PWM波形
{
TF2=0; //定时器2的溢出标志要软件清除,
//但当RCLK或TCLK为1时由硬件清除
if((count>=pwm_set)&&(count<10))
PWM=1;
else PWM=0;
count++;
if(count==10)
count=0x00;
}
void key_pwm(unsigned char x)//把键值转化为PWM设置值
{
bit up=0,down=0,set_flag=0;
switch(x)
{
case 1:up=1;break;
case 2:down=1;break;
case 3:set_flag=~set_flag;break;
set_flag=1;break;
default:break;
}
if(up&&set_flag) //设置PWM参数:pwm_set
{
pwm_set++;
up=0;
if(pwm_set>=10)
pwm_set=0x00;
}
if(down&&set_flag)
{
pwm_set--;
down=0;
if(pwm_set==0xff)
pwm_set=9;
}
}
/************键盘扫描程序*************************//
void key_scan(void)
{
if(star==0){
count1=0x03;
while(star==0);
}
if(add==0){
count1=0x01;
while(add==0);
}
if(jian==0){
count1=0x02;
while(jian==0);
}
}
//
void main(void)
{
TH2=0xb1; //定时20MS
TL2=0xe0;
RCAP2H=0xb1;//定时器2溢出时会把这个单元的内容送到TH2和TL2中
RCAP2L=0xe0;
EA=1;
ET2=1;
TR2=1;
while(1)
{ key_scan();
key_value=count1;//键值送key_value暂存
count1=0x00; /*************************/ //清除键值,以免一次按下,多次响应
key_pwm(key_value); //调用键值转PWM设置参数函数
// key_value=0x00; //清除键值,以免一次按下,多次响应
P0=~BCD[pwm_set]; /***此三句是将pwm_set值显示出来*/
delay1(200); /****************************/
}
}