⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jf.c

📁 基于at89s51的锯齿波发生器
💻 C
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define lcdbus P2  
#define dabus P1 
sbit p30=P3^0;
sbit p31=P3^1;
sbit p32=P3^2;
sbit p33=P3^3;
sbit p34=P3^4;
sbit p35=P3^5;
sbit p36=P3^6;
sbit p37=P3^7;
sbit rs=P0^0;
sbit rw=P0^1;
sbit ep=P0^2;
sbit sw=P0^3;            //调零所用的p口
uchar dis[]="0123456789";
uchar disf[]="f=200Hz";
uchar disvpp[]="vpp=1.0v";

uchar dism[]="1:1";
uchar f=100,vpp=6,mh=1,ml=1;     //f频率,vpp峰峰值,mh:ml为上升下降比,1<mh/l<4
uchar vout;          //vout 输出p口值,即电流值
uint mkb;			   //脉宽比
uint dsjs;	          //辅助定时计数
uint vtu,vtd;     //由f,vpp,vpp,m决定的上升下降的时间
uint iuout,idout;
uchar zduh,zdul,zddh,zddl,voutu,voutd; //定时器及输出辅助
uchar dsqjs;          //辅助计数
uchar dsqcon=0;       //控制
bit mkbcon;
//以上值全部为单片机中的值,与实际输出值保持比例关系
uchar n=0;
uchar vppp;
bit updownc;
uint vtuu,vtdd;





void delay()          //延时
{
uchar i;
for(i=0;i<5;i++)
{}
}
/*LCD延时子程序(ms)*/
void delayms(uchar ms)
{
uchar i;
while(ms--)
{
for(i=0; i<250;i++)
{
delay();
}
}
}
/*测试LCD忙碌状态*/
bit lcdbz()
{
bit result;
rs=0;
rw=1;
ep=1;
delay();
result =(bit)(lcdbus&0x80);
ep=0;
return result;
}
/*写指令数据到LCD子程序*/
void lcdwcmd(uchar cmd)
{
while(lcdbz());//判断LCD是否忙碌
rs=0;
rw=0;
ep=0;
delay();
lcdbus=cmd;
delay();
ep=1;
delay();
ep=0;
}
/*设定显示位置子程序*/
void lcdpos(uchar pos)
{
lcdwcmd(pos|0x80);
}
/*写入显示数据到LCD子程序*/
void lcdwdat(uchar dat)
{
while(lcdbz());//判断LCD是否忙碌
rs=1;
rw=0;
ep=0;
lcdbus=dat;
delay();
ep=1;
delay();
ep=0;
}
/*LCD初始化子程序*/
void lcdinit()
{
lcdwcmd(0x38);
delayms(1);
lcdwcmd(0x0c);
delayms(1);
lcdwcmd(0x06);
delayms(1);
lcdwcmd(0x01);
delayms(1);
}
 
 void  szzh()     //数值的显示转换
{uint i,j;
uchar a;
     i=f;         //f     disf[]="f=000Hz";
    for(j=0;j<=2;j++)
        {
		if(i!=0)
		{a=i%10;
        i=i/10;
		disf[4-j]=dis[a];	
		}
		else 
		{
		if(j==0)
		disf[4-j]='0';
		else
		disf[4-j]=' ';			 
		}
		}
    i=vpp*5;		  //vpp      disvpp[]="vpp=0.0v" vpp=6时为3v


	disvpp[4]=dis[vpp];

					   	//   distm[]="mh:ml";
		     	
    dism[0]=dis[mh];
	dism[2]=dis[ml];
		
}
void xssz()				/*数据的显示*/
{
uchar i=0;
szzh();

delayms(10);
lcdpos(0x00);//设置显示位置
i=0;
while(disf[i]!='\0')
{
lcdwdat(disf[i]);//显示字符
i++;
}
lcdpos(0x09);// 设置显示位置
i=0;
while(dism[i]!='\0')
{
lcdwdat(dism[i]);// 显示字符
i++;
}
lcdpos(0x40);// 设置显示位置
i=0;
while(disvpp[i]!='\0')
{
lcdwdat(disvpp[i]);// 显示字符
i++;
}


delayms(50);
}
void test()	//测试
{
uchar i;

uchar test2[]="waiting";

lcdinit();// 初始化LCD
delayms(10);

lcdpos(0x43);// 设置显示位置
i=0;
while(test2[i]!='\0')
{
lcdwdat(test2[i]);// 显示字符
i++;
}
delayms(20);
}
 
 /*清屏*/
void clr()
{
uchar i;

lcdpos(0x00);//设置显示位置
for(i=0;i<16;i++)
lcdwdat(' ');

lcdpos(0x40);// 设置显示位置
for(i=0;i<16;i++)
lcdwdat(' ');
}			

    ////////键盘
 void jianpan()
 { 
if(p35==0)	   //1<mh/l<4
   {
   while(1)
   {
   if(p35==1)
   {						  
   if(ml==1&&mh<4)
   mh=mh+1;			   
   else
  {
   if(mh==1)
   ml=ml-1;
   }
   break;  
   }
   }
   }
if(p32==0)
   {
   while(1)			  
   { 
   if(p32==1)
   {						  
   if(mh==1&&ml<4)
   ml=ml+1;			   
   else
  {
   if(ml==1)
   mh=mh-1;
   }
   break;  
   }
   }
   }
if(p34==0)		 //f频率	  
   {

   while(1)
   {					
   if(p34==1)
   {
   if(50<=f&&f<200)
   f=f+50;
   if(10<=f&&f<50)
   f=f+40;
   if(5<=f&&f<10)
   f=f+5;
   if(f<5)
   f=f+1;
   break;
   }
   }
   }
if(p31==0)
   {
   
   while(1)
   {
   if(p31==1)
   {
   if(1<f&&f<=5)
   f=f-1;
   if(5<f&&f<=10)
   f=f-5;
   if(10<f&&f<=50)
   f=f-40;
   if(100<=f)
   f=f-50;
   break;
   }
   }
	}
if(p33==0)				 //vpp上升最大值	  "vpp=0v" vpp=6时为vh=3v
   {
   while(1)
   {
	if(p33==1)
	{
	if(vpp<6)
   vpp=vpp+1;
   break;
   }
   }
   }
 if(p30==0)
   {

   while(1)
   {
   if(p30==1)
   {
   if(vpp>2)
   vpp=vpp-1;
   break;
   }
   }
  }

}
 

void main()
{
  uint aaa;

  test(); 		   // 测试
  delayms(200);
  clr();			 //清屏


IE=0x82;
TMOD=0x01;
TR0=1;
while(1)
{
jianpan();
  if(f>40)
  {
  	sw=1;
  }
  else
  {
    sw=0;
  }
aaa=vpp*f;
idout=aaa*(mh+ml)/ml;
iuout=aaa*(mh+ml)/mh;
vtu=50000/f/(mh+ml)*mh*20;		//
vtd=50000/f/(mh+ml)*ml*20;
zduh=255-vtu/256;
zdul=255-vtu%256;
zddh=255-vtd/256;
zddl=255-vtd%256;
voutu=128+iuout/50;
voutd=128-idout/50;
vtuu=25000/f/(mh+ml)*mh/vpp;
vtdd=25000/f/(mh+ml)*ml/vpp;

vppp=vpp*20;
xssz();
}
}
void time0 (void) interrupt 1
 {	
  
  
  if(f>20)
   { 
	if(dsqcon)
	{  
 
TH0=zduh;
TL0=zdul;
	dabus=voutu;
   dsqcon=0;
		
	}
	else
	{
TH0=zddh;
TL0=zddl;
	dabus=voutd;
	dsqcon=1;
	}
   } 
else
   {
	 if(vout>=vppp+128)
   {
   updownc=1;
   }
 	else
	{if(vout<=128-vppp)
 	{
    updownc=0;
    }}
	if(updownc==0)
	{
	 vout++;	 
 	TH0=255-vtuu/256;
 	TL0=255-vtuu%256;
	
	}
	 else 
	{
	 vout--;
 	TH0=255-vtdd/256;
 	TL0=255-vtdd%256;
	}
	 dabus=vout; 
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -