基于51单片机的信号发生器

 想要在下列代码中进行添加或修改使得方波的占空比通过按键可调可调并在1602显示(关于占空比我改了一部分可能有错)

#include<reg52.h>                       //包含头文件
#include<intrins.h>
#define uchar unsigned char               //宏定义
#define uint unsigned int

sbit s1=P1^0;                            //定义按键的接口
sbit s2=P1^1;
sbit s3=P1^2;
sbit s4=P1^3;
                                       
sbit lcdrs=P1^6;                       //液晶控制位
sbit lcden=P1^7;


char num,boxing,u;                       //定义全局变量
int pinlv=50,bujin=10,bujin1=10,zhanbongbi=9;

uchar geshu=1;                            //两次DA输出数组中的个数
uchar code table[]="0123456789";        //定义显示的数组
uchar code table1[]="pinlv:boxing:";
uchar code table2[]="0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 123456789";
unsigned long int m;
int n=0;
float hc=0;
int a,b,h,num1;
uchar code sin[64]={
135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128
};                      //正弦波取码
uchar code juxing[64]={
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};                      //矩形波取码
uchar code juchi[64]={
0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,
146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255
};                      //锯齿波取码
uchar code sanjiao[64]={
0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,
248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
};                        //三角波取码


void delay(uint xms)     //延时函数
{
    int a,b;
    for(a=xms;a>0;a--)
        for(b=110;b>0;b--);
}
void write_com(uchar com)        //写命令函数
{
    lcdrs=0;
    P0=com;    
    delay(1);
    lcden=1;
    delay(1);                                       
    lcden=0;
}
void write_date(uchar date)        //写数据函数
{
    lcdrs=1;
    P0=date;
    delay(1);
    lcden=1;
    delay(1);
    lcden=0;
}

void init_lcd()                    //初始化函数
{                                  
    lcden=0;                    //默认开始状态为关使能端,见时序图  
    write_com(0x0f);
    write_com(0x38);            //显示模式设置,默认为0x38,不用变。
    write_com(0x01);            //显示清屏,将上次的内容清除,默认为0x01. 
    write_com(0x0c);            //显示功能设置0x0f为开显示,显示光标,光标闪烁;0x0c为开显示,不显光标,光标不闪
    write_com(0x06);            //设置光标状态默认0x06,为读一个字符光标加1. 
    write_com(0x80);            //设置初始化数据指针,是在读指令的操作里进行的
}
void initclock()               //时钟初始化
{
    uint i;
    TMOD=0x01;
    TH0=a;
    TL0=b;
    EA=1;
    ET0=1;
    TR0=1;
    for(i=6;i<13;i++)               //显示初始化
    {
        write_date(table1[i]);
        delay(2);
    }
    write_com(0x80+0x40);
    for(i=0;i<6;i++)
    {
        write_date(table1[i]);
        delay(2);
    }
    write_com(0x80+7);
        write_date('s');
        write_date('i');
        write_date('n');
        write_date(' ');
        write_date(' ');
        write_date(' ');
        write_date(' ');
        write_com(0x80+0x40+0xa);
        write_date(' ');
        write_date('1');
        write_date('0');
        write_date('H');
        delay(2);
        write_date('Z');
        delay(2);
}
void display()                   //显示函数
{
    uchar wan,qian,bai,shi,ge;
    uint a=0;
    a=pinlv;
    wan=a/10000;
    qian=a/1000%10;
    bai=a/100%10;
    shi=a%100/10;
    ge=a%100%10;
    write_com(0x80+0x40+8);
    write_date(table[wan]);
    delay(2);
    write_date(table[qian]);
    delay(2);
    write_date(table[bai]);
    delay(2);
    
    write_date(table[shi]);
    delay(2);
    write_date(table[ge]);
    delay(2);
    write_date('H');
    delay(2);
    write_date('Z');
    delay(2);
    if(boxing==0)
    {
        write_com(0x80+7);
        write_date('s');
        write_date('i');
        write_date('n');
        write_date(' ');
        write_date(' ');
        write_date(' ');
        write_date(' ');
    }
    if(boxing==1)
    {
        write_com(0x80+7);
        write_date('j');
        write_date('u');
        write_date('x');
        write_date('i');
        write_date('n');
        write_date('g');
    }

    if(boxing==2)
    {
        write_com(0x80+7);
        write_date('s');
        write_date('a');
        write_date('n');
        write_date('j');
        write_date('i');
        write_date('a');
        write_date('o');
    }
    if(boxing==3)
    {
        write_com(0x80+7);
        write_date('j');
        write_date('u');
        write_date('c');
        write_date('h');
        write_date('i');
        write_date(' ');
        write_date(' ');
    }
}
uchar keyscan()                    //键盘检测函数
{
//    if(P1&0x0F==0x0F) return 0;
    if(s1==0)
    {     
        EA=0;
        delay(1);
        if(s1==0)
        {
            while(!s1);
            pinlv+=bujin;
            if(pinlv>30000)
            {
                pinlv=30000;
            }
            geshu=pinlv/120+1;
            if(pinlv>960)
            {
                geshu=8;
                bujin=100;
                bujin1=100;
            }
            if(pinlv>1080) geshu=10;
            if(pinlv>2000) geshu=11;

            hc=15625/pinlv;
            m=hc*geshu;
            m-=54;
            m/=15;
            
            EA=1;
            display();            
        }
    }
    if(s2==0)
    {     
        
        delay(1);
        if(s2==0)
        {
            EA=0;    
            while(!s2);
            pinlv-=bujin;
            if(pinlv<0)
            {
                pinlv=0;
            }
            geshu=pinlv/120+1;
            if(pinlv>960)
            {
                geshu=8;
                bujin=100;
                bujin1=100;
            }
            if(pinlv>1080) geshu=10;
            if(pinlv>2000) geshu=11;
            if(pinlv<=3100)
                {hc=15625/pinlv;
                m=hc*geshu;
                m-=54;
                m/=15;}    
            else
            {
                m=65276+(pinlv-480);
            }
            display();    
            EA=1;
        }
    }
    if(s3==0)
    {     
        delay(1);
        if(s3==0)
        {
            EA=0;
            while(!s3);
            boxing++;
            if(boxing==4)
            {
                boxing=0;
            }
            display();
            EA=1;
        }
    }
    return 1;    
}
void bujindisplay()
{
    uint bai,shi,ge;
    bai=bujin1/100;
    shi=bujin1%100/10;
    ge=bujin1%100%10;
    write_com(0x80+6);
    write_date(table[bai]);
    delay(1);
    write_date(table[shi]);
    delay(1);
    write_date(table[ge]);
    delay(1);
}
void bujinjiance()
{
    if(s4==0)
    {
        delay(3);
        if(s4==0)
        {
             while(!s4);
             h++;
             if(h==1)
             {
                  write_com(0x01);
                 write_com(0x80);
                 write_date('b');delay(1);
                 write_date('u');delay(1);
                 write_date('j');delay(1);
                 write_date('i');delay(1);
                 write_date('n');delay(1);
                 write_date(':');delay(1);
                 bujin1=bujin;
                 
                 bujindisplay();
             }
             if(h==2)
             {
                 h=0;
                bujin=bujin1;                
                init_lcd();
                initclock();
                display();
             }
        }
    }
    if(h==1)
    {
        if(s1==0)
        {
            delay(5);
            if(s1==0)
            {
                while(!s1);
                bujin1++;
                if(bujin1==101)
                {
                    bujin1=100;
                }
                bujindisplay();
            }
        }
        if(s2==0)
        {
            delay(5);
            if(s2==0)
            {
                while(!s2);
                bujin1--;
                if(bujin1==0)
                {
                    bujin1=100;
                }
                bujindisplay();
            }
        }
    }
}
  void zhankongbidisplay()
{
    write_com(0x80+0x40+0x0d);
    write_date(table2[zhankongbi]);
    delay(1);
}
void zhankongbice()
{
    if(s4==0)
    {
        delay(3);
        if(s4==0)
        {
             while(!s4);
             h++;
             if(h==1)
             {
                  write_com(0x01);
                 write_com(0x80+0x40);
                 write_date('z');delay(1);
                 write_date('h');delay(1);
                 write_date('a');delay(1);
                 write_date('n');delay(1);
                 write_date('k');delay(1);
                 write_date('o');delay(1);
                 write_date('n');delay(1);
                 write_date('g');delay(1);
                 write_date('b');delay(1);
                 write_date('i');delay(1);
                 write_date(':');delay(1);

                write_com(0x80+0x40+0x0f);
                 write_date(':');delay(1);
                 write_date('1');delay(1);
                 
                 zhankongbidisplay();
             }
             if(h==2)
             {
                 h=0;                
                init_lcd();
                initclock();
                display();
             }
        }
    }
    if(h==1)
    {
       if(boxing==1)
      {
        if(s5==0)
        {
            delay(5);
            if(s5==0)
            {
                while(!s5);
                zhankongbi++;
                if(zhankongbi==18)
                {
                    zhankongbi=17;
                }
                zhankongbiplay();
            }
        }
        if(s6==0)
        {
            delay(5);
            if(s6==0)
            {
                while(!s6);
                zhankongbi--;
                zhankongbidisplay();
            }
        }
      }
    }
}
void main()                     //主函数
{    
    
    init_lcd();
    hc=15625/pinlv;
    m=hc*geshu;
    m-=54;
    m/=15;

    initclock();
    display();
//    csda=0;
//    wr=0;
    while(1)
    {
         
         switch(boxing)
         {
             case 0:    P2=sin[u];
                break;
            case 1:     P2=juxing[u];
                break;
            case 2:         P2=sanjiao[u];
                break;
            case 3:         P2=juchi[u];
                break;
         }
        u+=geshu;
        n=m;
        if(u>=64)
        {
            u=0;
        } 
        while(n-->0);
    }
}
void T0_time()interrupt 1           //定时器
{
    
//        TH0=a;
//        TL0=b;
        TH0=0;
        TL0=0;
        if(h==0)
         {
              keyscan();
         }
         bujinjiance();
}

只看到你占空比数据zhankongbi加减和显示,没有看到你去发送,你是固定波形的,好像不好改占空比吧?