|
注意 單片機必須是52rc不能用60s2
*/
#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 >= 200)
{
cb = 200;
}
}
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 == 1) //當前輸出為高電平時,裝載低電平值并輸出低電平
{
TH0 = LowRH;
TL0 = LowRL;
PWMOUT = 0;
}
else //當前輸出為低電平時,裝載高電平值并輸出高電平
{
TH0 = HighRH;
TL0 = HighRL;
PWMOUT = 1;
}
}
/* T0中斷服務函數,完成數碼管、按鍵掃描與秒表計數 */
void t1() interrupt 3
{
TH1 = T1RH; //重新加載重載值
TL1 = T1RL;
ci++;
ssmg(); //數碼管掃描
if(ci>=2)
{
ci = 0;
key();
}
}
|
|