当前位置: 首页 > ds >正文

STC定时器频率占空比程序

//==========================================================
//                一、宏定义区
//==========================================================
              #include       <STC15.H>           //头文件
              #include       <intrins.h>         //库函数文件
              #define        FOSC 12000000L      //IRC频率  
              typedef        unsigned int u16;     //对数据类型进行声明定义
              typedef        unsigned char u8;
//==========================================================
//                二、函数声明区
//==========================================================
              void           UartInit(void);        //9600bps@24MHz
              void           Timer0_Init(void);        //25微秒@24MHz
              void           Timer2_Init(void);        //100微秒@24MHz
              void           Init_IO(void);         //IO初始化
              void           key_san(void);           //按键扫描程序
              void           sedusart(u8 x);      //串口发送测试void sedusart(10)
              void           delayms(u16 c);      //1ms误差 0us
//==========================================================
//                 三、IO定义区
//==========================================================
              sbit           S1 = P5^4;           //按键频率加
              sbit           S2 = P1^6;           //按键频率减
              sbit           S3 = P5^5;           //按键占空比加
              sbit           S4 = P1^7;           //按键占空比减
              sbit           PWM1 = P3^6;         //输出1
              sbit           OUT=  P3^2;          //
              sbit           Led = P3^3;          //LED
//===========================================================
//                  四、变量声明区
//===========================================================
              u8             data recive[10];        //声明数组,接收到的数据缓存
              u8             data recive_1[10];      //声明数组,接收到的数据缓存
              u8             data time;              //软件计时,延时读取通讯数据
              u8             data num;               //通讯字节计数专用
              u8             UART_FIG;               //串口接收标志位
              u16            Time_1US,F_Hz,CT,Step;       //F_HZ=100倍(20000对应200HZ)  CT=50(占空比50%)     Step(步进数)
//===========================================================
//                  五、主函数区
//===========================================================
              main()
              {
               Init_IO();                        //IO初始化
               UartInit();                       //串口初始化
               F_Hz = 55;                         //初始值频率
               CT   =    50;                     //初始值占空比10%
               Step =     5;                     //步进数
               Timer2_Init();                     //定时器2初始化
               while(1)
                {
                key_san();
        //静态数码管显示
//         Pout1 = !Pout1;
                }
              }    
//==========================================================
//           六、子函数区
//==========================================================
// 描述:控制函数
              void key_san(void)
              {
               if(S1 == 0)                         //频率加
               {
               if(++Time_1US>20000)                 //
                if(S1 == 0)
                {
                 Time_1US = 0;
                 F_Hz = F_Hz/100;                 //缩小100倍
                 F_Hz = F_Hz + Step;             //
                 if(F_Hz>=200)                     //
                 {
                 F_Hz=0;                         //
                 }     
                 Timer2_Init();
                 Led = 0;
                }          
               }
              if(S2 == 0)                         //频率减
               {
               if(++Time_1US>20000)                 //
               if(S2 == 0)
                {
                Time_1US = 0;
                F_Hz = F_Hz/100;                 //缩小100倍
                F_Hz = F_Hz - Step;                 //
                if(F_Hz==0)
                 {
                 F_Hz=200;
                 }
                Timer2_Init();                     //
                Led = 0;
                }               
               }
               if(S3 == 0)                         //占空比加
               {
               if(++Time_1US>20000)                 //
               if(S3 == 0)                         //
                {
                Time_1US = 0;                     //
                CT = CT + Step;                     //
                if(CT>=100){CT=0;}                 //
//             Timer2_Init();
                Led = 0;
                }               
               }
               if(S4 == 0)                         //占空比减
               {
               if(++Time_1US>20000)                 //频率
                if(S4 == 0)
                {
                Time_1US = 0;                     //F_HZ
                CT = CT - Step;                     //占空比-步进数
                if(CT==0){CT=100;}                 //占空比
//             Timer2_Init();
                Led = 0;
                }               
               }
              }
//=========================================================
//           七、所有初始化函数
//=========================================================
              void UartInit(void)        //9600bps@12.000MHz
              {
              SCON = 0x50;        //8位数据,可变波特率
              AUXR |= 0x40;        //定时器时钟1T模式
              AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
              TMOD &= 0x0F;        //设置定时器模式
              TL1 = 0xC7;            //设置定时初始值
              TH1 = 0xFE;            //设置定时初始值
              ET1 = 0;            //禁止定时器中断
              TR1 = 1;            //定时器1开始计时
              ES  = 1;            //打开串口中断
              EA  = 1;            //打开总中断
              }
//=========================================================
//             定时器2初始化
//=========================================================
              void Timer2_Init(void)        //1000微秒@12.000MHz
              {  
              AUXR |= 0x04;                      //定时器2为1T模式
              F_Hz = F_Hz*100;                   //*100 总分频20000HZ
              T2L = (65536-FOSC/2/F_Hz);         //初始化计时值
              T2H = (65536-FOSC/2/F_Hz) >> 8;            
              AUXR |= 0x10;                      //定时器2开始计时

//    INT_CLKO = 0x04;                 //使能定时器2的时钟输出功能
              IE2 |= 0x04;                       //开定时器2中断
              EA  = 1;                           //打开总中断
              if(F_Hz == 0||F_Hz == 20000)       //当频率值为0或200Hz关闭输出
               {
                  IE2 &= ~0x04;                   //关闭中断
               AUXR &= ~0x10;                  //定时器2停止计时
               PWM1 = 0;
               }
              }
//=========================================================
//             初始化IO口函数
//=========================================================
              void Init_IO(void)        //IO初始化
              {
              P1M0 = 0x00;
              P1M1 = 0x00;
              P3M0 = 0x01;
              P3M1 = 0x00;
              S1 = S2 = S3 = S4 = 1;
              PWM1 = 0;
              Led = 1;
              }    
//=========================================================
//             八、所有中断函数
//=========================================================
// 描述:定时器0中断函数,1毫秒进入一次中断
void time0() interrupt 1     //定时器0中断程序
{

}
//=========================================================
//            定时器2中断程序
//=========================================================
              void t2int() interrupt 12           //定时器2中断程序,
              {      
              u16 CT1,CT2;                         //    CT=占空比
              u8 ss;
              CT2++;                             //
              if(CT2>=2)                         //CT2为占空比计数器0-100
               {
               CT2 = 0;
               CT1++;
               if(CT1>=CT)
                {
                PWM1 = 0;                         //
                }
                 else
                {
                PWM1=1;
                }
                if(CT1>=100)
                {
                CT1 = 0;
                }
                }
               ss++;
               if(ss>50)
               {
                ss=0;
                   OUT=~OUT;
               }
              }
//=========================================================
//            串口中断通信
//=========================================================
              void exter0() interrupt 4       //串口中断通信
              {
               if(RI==1)
               {
               recive[num++]=SBUF;//接收一个字节
               if(num>=2)
                {
                F_Hz = recive[0];
                CT   =    recive[1];
//                 F_Hz = F_Hz*100;
//                 T2L = (65536-FOSC/2/F_Hz);                 //初始化计时值
//                 T2H = (65536-FOSC/2/F_Hz) >> 8;    
                Timer2_Init();
                Led = 0;
                num=0;                                 
                }  //防止缓存数据超限             
                RI=0;
               }
               time=10;             //数据延时读取时间
               if(num>=2)
               {
               num=0;
               }         
              }

http://www.xdnf.cn/news/216.html

相关文章:

  • 深入理解 Transformer:从原理解析到文本生成实践
  • 在Qt中验证LDAP账户(Windows平台)
  • 【MySQL】Ubuntu下C++连接MySQL
  • C# 点击导入,将需要的参数传递到弹窗的页面
  • C#/.NET/.NET Core拾遗补漏合集(25年4月更新)
  • DBeaver连接hive
  • Linux:简单指令(二)
  • Chromium 134 编译指南 macOS篇:编译流程(五)
  • 【20】Strongswan sa ——IKE_SA set_state|process_message|
  • QT常见显示类控件及其属性
  • 使用 Docker 安装 Elastic Stack 并重置本地密码
  • 方案解读:虚拟电厂标杆项目整体建设方案【附全文阅读】
  • [经验总结]Linux双机双网卡Keepalived高可用配置及验证细节
  • IcePlayer音乐播放器项目分析及学习指南
  • 软考高级-系统架构设计师 论文范文参考(二)
  • vscode的一些使用技巧记录
  • Qt中读写结构体字节数据
  • 若依框架修改左侧菜单栏默认选中颜色
  • 【工具】文件传输工具croc
  • WebSocket:实现实时双向通信的技术
  • 密码学中的盐值是什么?
  • 获取视频封面
  • AIGC-几款本地生活服务智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)
  • Pytorch的常规操作
  • C++11新特性
  • 【数据结构】第四弹——LinkedList与链表
  • 【重学Android】1.关于@Composer注解的一点知识笔记
  • ceph weight 和 reweight 的区别
  • MDA测量数据查看器【内含工具和源码地址】
  • Python 创意:AI 图像生成