钰平电子 发表于 2023-8-30 22:21:18

使用STC12C5A60S2单片机写的一个频率及占空比均可调带数码管程序





【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!   
*********************************************************************
#include"main.h"
#include"peizhi.h"
#include"smg.h"
#include"eeprom.h"
sfr WDT_CONTR=0XE1;
unsigned char HighRH = 0;//高电平重载值的高字节
unsigned char HighRL = 0;//高电平重载值的低字节
unsigned char LowRH= 0;//低电平重载值的高字节
unsigned char LowRL= 0;//低电平重载值的低字节
/***********************按键定义**********************************/
bit d1 = 1;
bit d2 = 1;
bit d3 = 1;

uint8 ci;
uint8 ca = 0;
uint8 ca1 = 0;
uint16 cb = 0;

void key();               //按键函数声明
void ConfigPWM(unsigned int fr, unsigned char dc);//频率和占空比调节函数

void main()
{
bit q1 = 1;
bit q2 = 1;
bit q3 = 1;
ca = EEPROMReadByte(0);
cb = EEPROMReadByte(1)*255+EEPROMReadByte(2);

EA = 1;       //开总中断
peizhit1(1);//配置T0定时2ms

while(1)
{       
ConfigPWM(cb, ca);    //频率100Hz,占空比10%

if(d1 != q1)
{
q1 = d1;
if(d1 == 0)
{

ca1++;
if(ca1 >= 2)
{
ca1 = 0;
}

}
}

if(ca1 == 1)
{
if(d2 != q2)
{
q2 = d2;
if(d2 == 0)
{

ca++;
EEPROMSectorErase(0);
EEPROMWriteByte(0,ca);
EEPROMWriteByte(2,cb);
EEPROMWriteByte(1,cb>>8);
if(ca >= 99)
{
ca = 99;

}

}
}

if(d3 != q3)
{
q3 = d3;
if(d3 == 0)
{
if(ca>0)
{
ca--;
EEPROMSectorErase(0);
EEPROMWriteByte(0,ca);
EEPROMWriteByte(2,cb);
EEPROMWriteByte(1,cb>>8);
}
}
}
}

if(ca1 == 0)
{   
if(d2 == 0)
{

cb++;
EEPROMSectorErase(0);
EEPROMWriteByte(0,ca);
EEPROMWriteByte(2,cb);
EEPROMWriteByte(1,cb>>8);
if(cb >= 9999)
{
cb = 9999;

}

}

if(d3 == 0)
{

if(cb>0)
{
cb--;
EEPROMSectorErase(0);
EEPROMWriteByte(0,ca);
EEPROMWriteByte(2,cb);                       
EEPROMWriteByte(1,cb>>8);               
}                       
}

}
xianshi1(cb);
xianshi2(ca);

}
}

void key()
{
static uint8 saomiaozhi[] = {1,1,1,1};
saomiaozhi = (saomiaozhi<<1) | in1;
saomiaozhi = (saomiaozhi<<1) | in2;
saomiaozhi = (saomiaozhi<<1) | in3;


if(saomiaozhi == 0x00)
{
d1 = 0;
}
if(saomiaozhi == 0xff)
{
d1 = 1;
}
if(saomiaozhi == 0x00)
{
d2 = 0;
}
if(saomiaozhi == 0xff)
{
d2 = 1;
}
if(saomiaozhi == 0x00)
{
d3 = 0;
}
if(saomiaozhi == 0xff)
{
d3 = 1;
}

}

/* 配置并启动PWM,fr-频率,dc-占空比 */
void ConfigPWM(unsigned int fr, unsigned char dc)
{
unsigned inthigh, low;
unsigned long tmp;

tmp= (11059200/12) / fr;//计算一个周期所需的计数值
high = (tmp*dc) / 100;      //计算高电平所需的计数值
low= tmp - high;          //计算低电平所需的计数值
high = 65536 - high + 12;   //计算高电平的重载值并补偿中断延时
low= 65536 - low+ 12;   //计算低电平的重载值并补偿中断延时
HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节
HighRL = (unsigned char)high;
LowRH= (unsigned char)(low>>8);//低电平重载值拆分为高低字节
LowRL= (unsigned char)low;
TMOD &= 0xF0;   //清零T0的控制位
TMOD |= 0x01;   //配置T0为模式1
TH0 = HighRH;   //加载T0重载值
TL0 = HighRL;
ET0 = 1;      //使能T0中断
TR0 = 1;      //启动T0
PWMOUT = 1;   //输出高电平
}

/* T0中断服务函数,产生PWM输出 */
void InterruptTimer0() interrupt 1
{
if (PWMOUT == 0)//当前输出为高电平时,装载低电平值并输出低电平
{
TH0 = LowRH;
TL0 = LowRL;
PWMOUT = 1;
}
else            //当前输出为低电平时,装载高电平值并输出高电平
{
TH0 = HighRH;
TL0 = HighRL;
PWMOUT = 0;
}
}

/* T0中断服务函数,完成数码管、按键扫描与秒表计数 */
void t1() interrupt 3
{

TH1 = T1RH;//重新加载重载值
TL1 = T1RL;
ci++;
ssmg();               //数码管扫描


if(ci>=2)
{
ci = 0;
key();
}
}

X132811 发表于 2024-12-4 01:22:02

为什么我用你这个程序没有PWM输出啊

stb988 发表于 2024-12-4 08:54:08

可能坛主也是从网上搬运过来的,没有验证
页: [1]
查看完整版本: 使用STC12C5A60S2单片机写的一个频率及占空比均可调带数码管程序