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) //[email protected]

{

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;

}

}

相关推荐
Johnson Sheng22 分钟前
正点原子STM32H743单片机实现tcp通信
stm32·单片机·tcp/ip
小白今天也很酷29 分钟前
使用FreeRTOS解决单片机串口异步打印
单片机·嵌入式硬件·freertos·rtos·串口异步打印
努力创造奇迹1 小时前
STM32 HAL库 FreeRTOS 临界区保护的作用以及使用
stm32·单片机·嵌入式硬件
精彩漂亮ing2 小时前
STM32外部中断与外设中断区别
stm32·单片机·嵌入式硬件
憧憬一下3 小时前
搭建stm32工程
stm32·单片机·嵌入式
模拟IC攻城狮4 小时前
(最新)华为 2026 届校招实习-硬件技术工程师-硬件通用/单板开发—机试题—(共14套)(每套四十题)
单片机·嵌入式硬件·华为·硬件架构·电源·模拟芯片
如愿小李4 小时前
基于STM32的室内环境监测系统
stm32·单片机·嵌入式硬件
睡觉然后上课5 小时前
FPGA(现场可编程门阵列)笔记
笔记·嵌入式硬件·fpga开发
XINVRY-FPGA6 小时前
赛灵思 XC7K325T-2FFG900I FPGA Xilinx Kintex‑7
人工智能·嵌入式硬件·ai·fpga开发·fpga·pcb工艺·zynq
双叶8367 小时前
(51单片机)LCD显示温度(DS18B20教程)(LCD1602教程)(延时函数教程)(单总线教程)
c语言·开发语言·单片机·嵌入式硬件·mongodb·51单片机·nosql