基于51单片机可调PWM发生器

源码:基于51单片机可调PWM发生器
一、设计任务

  1. PWM信号频率范围为20Hz ~ 100kHz
  2. 占空比为5%~95%
  3. 键盘设置PWM频率和占空比
  4. 液晶模块显示输出频率和占空比

二、硬件设计
1、硬件总体框图
原理:采用8位的51单片机做控制器,程序采用C语言编程。利用定时器定时中断控制输出不同频率、占空比的PWM。采用矩阵键盘设置任意的频率和占空比。LCD1602屏幕显示当前的PWM。
基于51单片机可调PWM发生器_第1张图片2.单片机最小系统
最小系统由复位电路、晶振电路组成
基于51单片机可调PWM发生器_第2张图片

3.LCD1602屏幕

基于51单片机可调PWM发生器_第3张图片

4.矩阵键盘

基于51单片机可调PWM发生器_第4张图片

总电路

基于51单片机可调PWM发生器_第5张图片三、软件设计
1、定时器输出PWM
采用定时器定时中断输出PWM。开始时计算一个PWM周期所需的计数值,然后通过占空比计算出高电平计数值和低电平计数值。进入中断服务后,当为输出高电平时装载低电平值并输出低电平,当输出低电平时,装载高电平值并输出高电平。

void InterruptTimer0() interrupt 1
{
    if (PWMOUT == 1)  //当前输出为高电平时,装载低电平值并输出低电平
    {
        TH0 = LowRH;
        TL0 = LowRL;
        PWMOUT = 0;
    }
    else              //当前输出为低电平时,装载高电平值并输出高电平
    {
        TH0 = HighRH;
        TL0 = HighRL;
        PWMOUT = 1;
    }
}

2、矩阵按键检测
使用行列反转扫描法

/*------------------------------------------------
按键值处理函数,返回扫键值
------------------------------------------------*/
unsigned int KeyPro(void)
{
 switch(KeyScan())
 {
  case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值
  case 0x7d:return 1;break;//1
  case 0x7b:return 2;break;//2
  case 0x77:return 3;break;//3
  case 0xbe:return 4;break;//4
  case 0xbd:return 5;break;//5
  case 0xbb:return 6;break;//6
  case 0xb7:return 7;break;//7
  case 0xde:return 8;break;//8
  case 0xdd:return 9;break;//9
  case 0xdb:return 10;break;//a
  case 0xd7:return 11;break;//b
  case 0xee:return 12;break;//c
  case 0xed:return 13;break;//d
  case 0xeb:return 14;break;//e
  case 0xe7:return 15;break;//f
  default:return 16;break;
 }
}

四、实物图
基于51单片机可调PWM发生器_第6张图片

你可能感兴趣的:(项目管理,单片机,51单片机,c语言)