找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7512|回复: 6
打印 上一主题 下一主题
收起左侧

Pwm波形,频率,占空比,可调,且LCD1602显示占空比

  [复制链接]
跳转到指定楼层
楼主
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int //float fosc=12000000;  //系统时钟频率
sbit key1=P1^1;       //控制周期的增加
sbit key2=P1^2;        //控制周期的减少
sbit key3=P1^3;       //控制占空比的增加
sbit key4=P1^4;        //控制占空比的减少
sbit clk=P1^0;                         //pwm输出
sbit wei=P2^7;
sbit duan=P2^6;
sbit RS = P3^5;
sbit RW = P3^6;
sbit EN = P3^4;
uint zkb=50;     //占空比初值,取值范围为1到99
uint shi,ge;
uint period=35;       //周期初值,取值范围为5ms到60ms
uint time0_H,time0_L,time1_H,time1_L;  //延时程序         
  void delayms(uint z)
   {   uint i,j;  
     for(i=z;i--;i>0)   
            for(j=110;j--;j>0);
   }
  //系统初始化
/*uint code leddata[]={

                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄灭
                0x00  //自定义

                         };        */
//void display(uint i)
/*{
uint shi,ge;
shi=i/10;
ge=i%10;

P0=0xff;
wei=1;
P0=0xfe;//1111 1110
wei=0;

duan=1;
P0=leddata[shi];
duan=0;
delayms(10);

P0=0xff;
wei=1;
P0=0xfd;//1111 1101
wei=0;

duan=1;
P0=leddata[ge];
duan=0;
delayms(10);

}*/
  void init()
  {  TMOD=0x11;     //定时器0和1都工作在方式1
     time0_H=(65536-35000)/256;   
     time0_L=(65536-35000)%256; //35ms定时
         time1_H=(65536-17500)/256;  
     time1_L=(65536-17500)%256; //17.5ms定时,50%占空比
     TH0=time0_H;
   //定时器0装入初值,计数器计数35000次,35ms
     TL0=time0_L;   
         TH1=time1_H; //定时器1装入初值,计数器计数17500次,17.5ms
         TL1=time1_L;
          IT0=1;      //外部中断0为下降沿触发
          EX0=1;      //开外部中断0允许位
          ET0=1;      //定时器T0中断允许
      ET1=1;      //定时器T1中断允许
      EA=1;       //开启总中断
      TR0=1;      //开启定时器0
  }
//判断液晶忙,如果忙则等待           第一步:读状态
void Read_Busy()
{
        uchar busy;
        P0 = 0xff; //给P0送1111 1111  
        RS = 0;
        RW = 1;
        do
        {
                EN = 1;
                busy = P0;
                EN = 0;
        }while(busy & 0x80);//读写检测,判断STA7为是否位1,为1,则忙,循环等待。
}
//写LCD1602一个字节命令
void Write_Cmd(uchar cmd)         //第二步:写指令
{
        Read_Busy();//判断忙
        RS = 0;
        RW = 0;
        P0 = cmd;
        EN = 1;
        EN = 0;
}
//写一个字节数据
void Write_Dat(uint dat)                 //第三步:写数据
{
        Read_Busy();
        RS = 1;
        RW = 0;
        P0 = dat;
        EN = 1;
        EN = 0;
}
void LCD_init()
{
        Write_Cmd(0x38);//设置16*2显示
        Write_Cmd(0x0c);//开显示 显示光标,光标闪烁         
        Write_Cmd(0x01);//清屏

        Write_Cmd(0x06);//地址指针移位命令
}
  //主程序
  void main()
  {
        uint num[2];
        init( );

                shi=zkb/10;
                ge=zkb%10;

            num[0]=shi;
        num[1]=ge;

            LCD_init();

        //Write_Cmd(0x80 | 0x00);//显示地址
   while(1)
   {
            shi=zkb/10;
                ge=zkb%10;
            num[0]=shi;
        num[1]=ge;
           Write_Cmd(0x80 | 0x00);//显示地址
        Write_Dat(25 + 'A');  //z
        Write_Dat(10 + 'A');  //k
        Write_Dat(1 + 'A');          //b
        Write_Dat(0x3A);          //:
        Write_Dat(num[0]+'0');        //十位
        Write_Dat(num[1]+'0');        //个位
        delayms(10);
   }
   }
  //TO中断程序

  void T0_time() interrupt 1    //控制PWM波的周期
   {  
      TR1=1;            //开定时器1  
      TH0=time0_H;  
      TL0=time0_L;  
          clk=1;
         } //T1中断程序
  void T1_time() interrupt 3                 //控制PWM波的占空比
   {   TR1=0;             //关定时器1  
       TH1=time1_H;  
           TL1=time1_L;  
           clk=0;
           } //键盘扫描程序
  void  keyscan()  interrupt 0 //外部中断0,用来查询是否有按键按下
         {   float TX,TZ; //定义浮点型变量,4字节长度
          EX0=0;             //关中断  
          delayms(10);       //延时消抖
          if(P1!=0x1e)       //延时消抖完毕,判断的确有按键按下
                   if(key1==0)        //判断是哪个按键按下
                      {   
                           period=period+5;           
                           if(period>60)            
                             period=5;   
                                  }      
                                   if(key2==0)         
                                    {     period=period-5;      
                                                  if(period<5)        
                                       period=60;  
                                  }   
                                if(key3==0)         
                                 {   
                                        
                                        zkb=zkb+1;
                                  
                                               
                                         if(zkb>99)         
                             zkb=1;        
                             }      
                             if(key4==0)         
                  {
                                  
                                  zkb=zkb-1;
                                          
                                 if(zkb<1)            
                                 zkb=99;     
                                  }  
                      TX=(65536-(period)*1000);//周期计算 !!!!
                      TZ=(65536-(period/2)*1000+(50-zkb)*period*10);//占空比计算???   
                      time0_H=(uint)TX/256;
              time0_L=(uint)TX%256;   
              time1_H=(uint)TZ/256;   
                  time1_L=(uint)TZ%256;   
                      P1=0x1e;  //P1口重新赋值,以便下次按键判断
                  EX0=1;   //开外部中断
                      TR0=1;  //开定时器0
                      TR1=1; //开定时器1
                 }


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:297159 发表于 2018-6-27 20:07 | 只看该作者


回复

使用道具 举报

板凳
ID:360843 发表于 2018-7-11 16:55 | 只看该作者
不错   正在学习PWM   谢谢
回复

使用道具 举报

地板
ID:375055 发表于 2018-7-19 19:48 | 只看该作者
这个可以有
回复

使用道具 举报

5#
ID:243748 发表于 2018-7-21 22:56 来自手机 | 只看该作者
怎么下载?
回复

使用道具 举报

6#
ID:386237 发表于 2018-8-18 21:56 来自手机 | 只看该作者
楼主能不能把完整的电路图发出来?
回复

使用道具 举报

7#
ID:450227 发表于 2018-12-24 13:36 | 只看该作者
烧录进去怎么没有显示啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表