单片机设计占空比和频率控制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar s, j ;
uint Pl,Plh,Pll,num1,num2;
uint bitx;
bit h0,l0,x0;
sbit scl=P2^1;
sbit sda=P2^0;
sbit we=P2^7;
sbit su=P2^6;
uchar code sutable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code wetable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar chtable[5];
void delay(uchar i)
{
uchar x,y;
for(x=i;x>0;x--)
for(y=125;y>0;y--);
}
void nop()
{
_nop_();
_nop_();
}
void display1(num1)
{
uchar i;
chtable[1]=sutable[num1/10%10];
chtable[2]=sutable[num1%10];
for(i=1;i<3;i++)
{
P0=chtable[i];
su=1;
su=0;
P0=wetable[i];
we=1;
we=0;
delay(1);
P0=0xff;
we=1;
we=0;
}
}
void display2(num2)
{
uchar i;
chtable[4]=sutable[num2/10%10];
chtable[5]=sutable[num2%10];
for(i=4;i<6;i++)
{
P0=chtable[i];
su=1;
su=0;
P0=wetable[i];
we=1;
we=0;
delay(1);
P0=0xff;
we=1;
we=0;
}
}
void iicrst()
{
scl=1;
nop();
sda=1;
nop();
}
void iicstart()
{
scl=1;
nop();
sda=1;
nop();
sda=0;
nop();
scl=0;
nop();
}
void iicstop()
{
sda=0;
nop();
scl=1;
nop();
sda=1;
nop();
}
void clock()
{
uchar i;
scl=1;
nop();
while((sda==1)&&(i<255))i++;
scl=0;
nop();
}
void writebyte(uchar date)
{
uchar i,temp;
temp=date;
for(i=8;i>0;i--)
{
temp=temp<<1;
scl=0;
nop();
sda=CY;
nop();
scl=1;
nop();
}
scl=0;
nop();
sda=1;
nop();
}
uchar readbyte()
{
uchar i,date;
scl=0;
nop();
sda=1;
nop();
for(i=8;i>0;i--)
{
scl=1;
nop();
if(sda==1)
date=(date<<1)|0x01;
if(sda==0)
date=(date<<1)|0x00;
nop();
scl=0;
nop();
}return(date);
}
uchar readda(uchar w)
{ uchar date;
iicrst();
iicstart();
writebyte(0x90);
clock();
writebyte(0x00|w);
clock();
iicstart();
writebyte(0x91);
clock();
date=readbyte();
iicstop();
delay(10);
return(date);
}
void math()
{ uchar num_1,num_2;
num_1=readda(0x01);
num_2=readda(0x00);
num1=10+0.314*num_1;
num2=1+0.386*num_2;
Pl=1000/num2;
Plh=(10*num1)/num2;
Pll=Pl-Plh;
}
void time0() interrupt 1
{
TH0= 0xfc ;
TL0=0x20;
bitx++ ;
if(!h0)
{
if(bitx>=Plh ) {bitx=0,h0=1,P1=~P1 ;} }
else {if(bitx>=Pll) {bitx=0,h0=0,P1=~P1;}}
}
void main()
{
TMOD=0x11;
TH0=0xfc;
TL0=0x20;
EA=1;
ET0=1;
TR0=1;
while(1)
{ math();
display1(num1);
display2(num2);
}
}