/********************
單硅混頻程序
作者:無衣
采用STC11F02E芯片
主頻固定為120HZ
********************/
// #include
#include"STC_NEW_8051.h"
#define uint unsigned int
#define uchar unsigned char
#define YHCS 300//600 //延時重要參數(shù)
#define on 0 //為零則按鍵按下
#define TH0CZ 0xef//0xdf //為T0初值
#define TL0CZ 0xb8//0x72 //T0初值采用120HZ副頻計算得到
#define LMAX 85
#define LMIN 15
#define KEYS 12 //按鍵變化速度
sbit key1=P3^0;
sbit key2=P3^1;
sbit out1=P3^5;
sbit out2=P3^7;
sbit LED1=P3^4;
sbit LED2=P3^3;
sbit LED3=P3^2;
uchar pwmt1; //定義T1占空比
bit onoff;
uchar dg1,dg2,dg3; //定義三個顯示緩沖區(qū),全局變量
uchar code tabel[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83};
union{uint t1;struct{uchar th1;uchar tl1;}word;}t1a,t1b;
/*定義兩個共用體類型變量,其中T1A用來存
放T1導通時間參數(shù),T1B用來存放截止時間參數(shù)*/
void eeprom(uchar cmd)
{
IAP_DATA=pwmt1; //將占空比值傳送到EEPROM數(shù)據(jù)寄存器
IAP_ADDRH=0x00; //送地址高字節(jié)
IAP_ADDRL=0x00; //送地址低字節(jié)
IAP_CMD=cmd; //送操作命令
IAP_CONTR=0x82; //允許IAP操作并設置CPU等待時間
IAP_TRIG=0x5A; //觸發(fā)IAP
IAP_TRIG=0xa5; //觸發(fā)IAP
IAP_CONTR=0; //禁止IAP
IAP_CMD=0; //去除IAP命令,防止誤操作
IAP_TRIG=0; //防止誤觸發(fā)
IAP_ADDRH=0x80; //送地址高字節(jié)為0x80,指向非EEPROM區(qū)
IAP_ADDRL=0x00; //送地址低字節(jié)為0X00,防止誤操作
pwmt1=IAP_DATA; //讀取占空比值
}
void f10dsp() //顯示碼轉(zhuǎn)換函數(shù)
{
dg1=0xc7;
dg2=tabel[pwmt1/10];
dg3=tabel[pwmt1%10];
}
void ftzh() //占空比轉(zhuǎn)T1計數(shù)器初值函數(shù)
{
t1a.t1=65535-(500*pwmt1);
t1b.t1=65535-500*(100-pwmt1);
}
void delaynms(uchar i)
{ uint sum;
for(;i>0;i--)
{
sum=YHCS;
while(sum--);
}
}
void dsp() //顯示函數(shù)
{
P1=dg1;
LED1=1;
delaynms(5);
LED1=0;
P1=dg2;
LED2=1;
delaynms(5);
LED2=0;
P1=dg3;
LED3=1;
delaynms(5);
LED3=0;
}
void stat() //初始化函數(shù)
{
CLK_DIV=0x01;
P3=0xa3;
P3M0=0xa0; //設置P3.5和P3.7為強推挽輸出.
eeprom(1); //讀取EEPROM中的占空比數(shù)據(jù)
if(pwmt1>LMAX||pwmt1
pwmt1=60;
eeprom(3);
eeprom(2);
}
f10dsp(); //占空比數(shù)據(jù)轉(zhuǎn)顯示碼并保存到顯示緩沖區(qū)
ftzh(); //占空比換算成定時器初值
TH0=TH0CZ; //將主頻送到T0中
TL0=TL0CZ; //
TMOD=0x11; //定時器模式1
PT0=1; //定時器0中斷為高優(yōu)先級
ET1=1; //開T1中斷
ET0=1; //開T0中斷
EA=1; //開全局中斷
TR1=1; //啟動T1
}
void main()
{
void key1com();
void key2com();
stat();//初始化
while(1)
{
dsp();
if(key1==on)
key1com();
if(key2==on)
key2com();
}
}
void key1com()
{ uchar i;
dsp();
if(key1==on)
{do
{
if(pwmt1
f10dsp();
ftzh();
for(i=KEYS;i>0;i--)
dsp();
}
while(key1==on);
dsp();
eeprom(3);
eeprom(2);
}
}
void key2com()
{ uchar i;
dsp();
if(key2==on)
{do
{
if(pwmt1>LMIN)
pwmt1--;
f10dsp();
ftzh();
for(i=KEYS;i>0;i--)
dsp();
}
while(key2==on);
dsp();
eeprom(3);
eeprom(2);
}
}
void t0int() interrupt 1 using 1
{uchar i;
ET1=0;
TH0=TH0CZ;
TL0=TL0CZ;
out1=0;
out2=0;
i=75; //觸發(fā)脈沖寬度為50us
while(--i);
out1=1;
out2=1;
ET1=1;
}
void t1int() interrupt 3 using 2
{ onoff=~onoff;
if(onoff==1)
{
TL1=t1a.word.tl1;
TH1=t1a.word.th1;
TR0=1;
}
else
{
TL1=t1b.word.tl1;
TH1=t1b.word.th1;
TR0=0;
}
}