/********************
单硅混频程序
作者:无衣
采用STC11F02E芯片
主频固定为120HZ
********************/
// #include
#include"STC_NEW_8051.h"
#define uint unsigned int
#define uchar unsigned char
#define YHCS 300//600 //延时重要参数
#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; //定义三个显示缓冲区,全局变量
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导通时间参数,T1B用来存放截止时间参数*/
void eeprom(uchar cmd)
{
IAP_DATA=pwmt1; //将占空比值传送到EEPROM数据寄存器
IAP_ADDRH=0x00; //送地址高字节
IAP_ADDRL=0x00; //送地址低字节
IAP_CMD=cmd; //送操作命令
IAP_CONTR=0x82; //允许IAP操作并设置CPU等待时间
IAP_TRIG=0x5A; //触发IAP
IAP_TRIG=0xa5; //触发IAP
IAP_CONTR=0; //禁止IAP
IAP_CMD=0; //去除IAP命令,防止误操作
IAP_TRIG=0; //防止误触发
IAP_ADDRH=0x80; //送地址高字节为0x80,指向非EEPROM区
IAP_ADDRL=0x00; //送地址低字节为0X00,防止误操作
pwmt1=IAP_DATA; //读取占空比值
}
void f10dsp() //显示码转换函数
{
dg1=0xc7;
dg2=tabel[pwmt1/10];
dg3=tabel[pwmt1%10];
}
void ftzh() //占空比转T1计数器初值函数
{
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() //显示函数
{
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() //初始化函数
{
CLK_DIV=0x01;
P3=0xa3;
P3M0=0xa0; //设置P3.5和P3.7为强推挽输出.
eeprom(1); //读取EEPROM中的占空比数据
if(pwmt1>LMAX||pwmt1
pwmt1=60;
eeprom(3);
eeprom(2);
}
f10dsp(); //占空比数据转显示码并保存到显示缓冲区
ftzh(); //占空比换算成定时器初值
TH0=TH0CZ; //将主频送到T0中
TL0=TL0CZ; //
TMOD=0x11; //定时器模式1
PT0=1; //定时器0中断为高优先级
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; //触发脉冲宽度为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;
}
}