找回密码
 立即注册
查看: 825|回复: 2

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-17 16:39:04

43

主题

7

回帖

253

积分

中级会员

积分
253
发表于 2023-8-30 22:21:18 | 显示全部楼层 |阅读模式
应用举例2.JPG
GYJ-0024 淘宝描述_02.jpg


【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!   
*********************************************************************
#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[0] = (saomiaozhi[0]<<1) | in1;
saomiaozhi[1] = (saomiaozhi[1]<<1) | in2;
saomiaozhi[2] = (saomiaozhi[2]<<1) | in3;


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

}

/* 配置并启动PWM,fr-频率,dc-占空比 */
void ConfigPWM(unsigned int fr, unsigned char dc)
{
unsigned int  high, 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();
}
}

占空比频率可调程序 带掉电存储.rar

71.87 KB, 下载次数: 75

回复

使用道具 举报 送花

已绑定手机

0

主题

1

回帖

6

积分

新手上路

积分
6
发表于 2024-12-4 01:22:02 | 显示全部楼层
为什么我用你这个程序没有PWM输出啊
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:504
  • 最近打卡:2025-05-01 07:50:30

9

主题

193

回帖

552

积分

高级会员

积分
552
发表于 2024-12-4 08:54:08 | 显示全部楼层
可能坛主也是从网上搬运过来的,没有验证
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 09:02 , Processed in 0.167160 second(s), 66 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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