PWM输出脉宽控制

 

/**************************************************************************
***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);   /****************************/
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值