使用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();
}
}
为什么我用你这个程序没有PWM输出啊 可能坛主也是从网上搬运过来的,没有验证
页:
[1]