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;

}

}

相关推荐
whaosoft-14316 分钟前
51c嵌入式~电路~合集27
嵌入式硬件
Camellia031135 分钟前
嵌入式学习--江协51单片机day5
嵌入式硬件·学习·51单片机
7yewh1 小时前
FPGA前瞻篇-计数器设计与实现实例
arm开发·驱动开发·嵌入式硬件·fpga开发·硬件架构·硬件工程·精益工程
小石(努力版)4 小时前
嵌入式STM32学习——外部中断EXTI与NVIC的基础练习⭐
stm32·单片机·学习
檀越剑指大厂5 小时前
T-BOX硬件方案深度解析:STM32与SD NAND Flash存储的完美搭配
stm32·单片机·嵌入式硬件
7yewh5 小时前
MCU程序加密保护(一)闪存读写保护法 加密与解密
单片机·嵌入式硬件
不脱发的程序猿5 小时前
如何优化MCU中断响应时间
单片机·嵌入式硬件·rtos
平凡灵感码头6 小时前
基于智能家居项目 实现DHT11驱动源代码
stm32·单片机·智能家居
搬砖的小码农_Sky6 小时前
FPGA:XILINX FPGA产品线以及器件选型建议
嵌入式硬件·fpga开发·硬件架构·硬件工程
道亦无名6 小时前
STM32H743输出50%的占空比波形
stm32·单片机·嵌入式硬件