- 打卡等级:初来乍到
- 打卡总天数:1
- 最近打卡:2025-03-17 16:39:04
中级会员
- 积分
- 253
|
【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
*********************************************************************
#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();
}
}
|
|