找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1134|回复: 0
打印 上一主题 下一主题
收起左侧

求大神教一下单片机信号发生器程序的问题 数组相关

[复制链接]
跳转到指定楼层
楼主
3黑币
我想在目前程序中加一下幅值可调的功能,s2、s3分别用来增加和减小。如果用查表法改变幅值的话是要乘一个系数,我写了一个系数数组不知道对不对,如果可以的话,具体乘上去的程序应该是什么,就是数组应该用什么表示,此外有关s2、s3键应该加在主程序的哪里。

下面是我的程序;

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrw=P3^3;
sbit lcdrs=P3^2;
sbit lcde=P3^4;
sbit s1=P2^0; //波形
sbit s2=P2^1; //幅值+
sbit s3=P2^2; //幅值-
sbit s4=P2^3; //频率+
sbit s5=P2^4; //频率-
sbit cs=P3^5;
sbit wr=P3^6;
uchar xdata amplitude[9]={51,77,102,128,154,179,205,230,255};
uchar data index_amp=0;
uchar slnum,a,ys,j,z,i,slnun;
uint fre;
uint amp;
uchar code tosin[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,
                       0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,
                                           0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,
                                           0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,
                                           0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,
                                           0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,
                                           0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,
                                           0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,
                                           0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,
                                           0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,
                                           0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,
                                           0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,
                                           0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,
                                           0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,
                                           0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,
                                           0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
                                           0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,
                                           0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,
                                           0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,
                                           0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,
                                           0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,
                                           0x76,0x79,0x7c,0x80};

void delay(uint_z)                                //延时
{
   uchar i,j;
   for(i=z;i>0;i--)
     for(j=110;j>0;j--);
}
void delay1(uint_y)
{
   uchar i,y;
   for(i=y;i>0;i--)          ;
}
void write_com(uchar com)                          //1602指令
{
  lcdrs=0;
  P1=com;
  delay(5);
  lcde=1;
  delay(5);
  lcde=0;
}
void write_data(uchar date)                                //1602数据
{
    lcdrs=1;
        P1=date;
        delay(5);
        lcde=1;
        delay(5);
        lcde=0;
}
void init()                                                         //lcd初始化
{
  lcdrw=0;
  lcde=0;
  wr=0;
  cs=0;
  write_com(0x38);
  write_com(0x0c);
  write_com(0x06);
  write_com(0x01);
  write_com(0x80+0x00);                //wave
  write_data(0x77);
  write_data(0x61);
  write_data(0x76);
  write_data(0x65);
  write_data(0x3a);
  write_com(0x80+0x40);                 //f
  write_data(0x66);
  write_data(0x3a);
  write_com(0x80+0x00);                //wave
  write_data(0x77);
  write_data(0x61);
}
void write_f(uchar date)                //频率
{
   uchar qian,bai,shi,ge;
   qian=date/1000;
   bai=date/100%10;
   shi=date/10&10;
   ge=date%10;
   write_com(0x80+0x42);
   write_data(0x30+qian);
   write_data(0x30+bai);
   write_data(0x30+shi);
   write_data(0x30+ge);
   write_data(0x48);
   write_data(0x5a);
}
void xsf()                                         //显示频率
{   
   if(slnum==1)
   {
     fre=(1000/(9+3*ys)) ;
         write_f(fre);
   }
   if(slnum==2)
   {
     fre=(100000/(3*ys));
         write_f(fre);
   }
   if(slnum==3)
   {
     fre=(1000/(15+3*ys));
         write_f(fre);
        }
}
void keyscanf()                                        //键
{

   if(s1==0)
   {
      delay(5);
          if(s1==0)
   {
      slnum++;
          while(!s1);         
          if(slnum==1)
          {
      ys=0;
          write_com(0x80+0x05);
          write_data(0x73);
          write_data(0x69);
          write_data(0x6e);
          write_data(0x65);
          write_data(0x20);
          write_data(0x20);
   }
          if(slnum==2)
          {
             ys=10;
                 write_com(0x80+0x05);
                 write_data(0x73);
                 write_data(0x71);
                 write_data(0x75);
                 write_data(0x61);
                 write_data(0x72);
                 write_data(0x65);
          }
          if(slnum==3)
          {
             ys=0;
                 write_com(0x80+0x05);
                 write_data(0x74);
                 write_data(0x72);
                 write_data(0x61);
                 write_data(0x69);
                 write_data(0x6e);
                 write_data(0x20);
           }
           if(slnum==4)
           {
             slnum=0;
                 P1=0;
                 write_com(0x80+0x05);
                 write_data(0x20);
                 write_data(0x20);
                 write_data(0x20);
                 write_data(0x20);
                 write_data(0x20);
                 write_data(0x20);
                 write_com(0x80+0x42);
                 write_data(0x20);
                 write_data(0x20);
                 write_data(0x20);
                 write_data(0x20);
                 write_data(0x20);
                 write_data(0x20);
                }
         }
  }

if(s4==0)
  {
     delay(5);
         if(s4==0)
         {
             ys++;
                 while(!s4);
                 
         }
   }
   if(s5==0)
   {
      delay(5);
          if(s5==0)
           {
            
                   ys--;
                 while(!s5);
               
           }
        }
}

void main()
{
   init();
   while(1)
   {
      keyscanf();
          if(slnum==1)
          {
            for(j=0;j<255;j++)
                {
                   P0=am*tosin[j];
                   delay1(ys);
                }
          }
          if(slnum==2)
          {
            P0=0xff;
                delay1(ys);
                P0=0;
                delay1(ys);
          }
          if(slnum==3)
          {
            if(a<128)
                  {                  
                    P0=a;
                        delay1(ys);
                  }
                  else
                   {
                     P0=(255-a);
                         delay1(ys);
                   }
                   a++;
           }

if(s1&s2&s3&s4&s5)
           {
           xsf();
           }
        }
}

QQ图片20190527131418.png (147.82 KB, 下载次数: 71)

QQ图片20190527131418.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表