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

📄 dds.lst

📁 通过按键产生不同的波形
💻 LST
字号:
C51 COMPILER V7.50   DDS                                                                   11/15/2008 18:48:38 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE DDS
OBJECT MODULE PLACED IN DDS.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE DDS.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1           #include "reg52.h" 
   2          #define uchar unsigned char
   3          #define uint unsigned int
   4          
   5          unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7
             -1,0x00}; //共阴极0~9对应16进制数
   6          //=============正弦波数据==================== 
   7          uchar code sin_tab[256]= 
   8          { 
   9          0x80, 0x83, 0x86, 0x89, 0x8c, 0x8f, 0x92, 0x95, 0x98, 0x9c, 0x9f, 0xa2, 0xa5, 0xa8, 0xab, 0xae, 
  10          0xb0, 0xb3, 0xb6, 0xb9, 0xbc, 0xbf, 0xc1, 0xc4, 0xc7, 0xc9, 0xcc, 0xce, 0xd1, 0xd3, 0xd5, 0xd8, 
  11          0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xed, 0xef, 0xf0, 0xf2, 0xf3, 0xf4, 
  12          0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 
  13          0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xfc, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 
  14          0xf6, 0xf5, 0xf3, 0xf2, 0xf0, 0xef, 0xed, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe3, 0xe1, 0xde, 0xdc, 
  15          0xda, 0xd8, 0xd6, 0xd3, 0xd1, 0xce, 0xcc, 0xc9, 0xc7, 0xc4, 0xc1, 0xbf, 0xbc, 0xb9, 0xb6, 0xb4, 
  16          0xb1, 0xae, 0xab, 0xa8, 0xa5, 0xa2, 0x9f, 0x9c, 0x99, 0x96, 0x92, 0x8f, 0x8c, 0x89, 0x86, 0x83, 
  17          0x80, 0x7d, 0x79, 0x76, 0x73, 0x70, 0x6d, 0x6a, 0x67, 0x64, 0x61, 0x5e, 0x5b, 0x58, 0x55, 0x52, 
  18          0x4f, 0x4c, 0x49, 0x46, 0x43, 0x41, 0x3e, 0x3b, 0x39, 0x36, 0x33, 0x31, 0x2e, 0x2c, 0x2a, 0x27, 
  19          0x25, 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17, 0x15, 0x14, 0x12, 0x10, 0xf,  0xd,  0xc,  0xb , 
  20          0x9,  0x8,  0x7,  0x6,  0x5,  0x4,  0x3,  0x3,  0x2,  0x1,  0x1,  0x0,  0x0,  0x0,  0x0,  0x0 , 
  21          0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1,  0x1,  0x2,  0x3,  0x3,  0x4,  0x5,  0x6,  0x7,  0x8 , 
  22          0x9,  0xa,  0xc,  0xd,  0xe,  0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x23, 
  23          0x25, 0x27, 0x29, 0x2c, 0x2e, 0x30, 0x33, 0x35, 0x38, 0x3b, 0x3d, 0x40, 0x43, 0x46, 0x48, 0x4b, 
  24          0x4e, 0x51, 0x54, 0x57, 0x5a, 0x5d, 0x60, 0x63, 0x66, 0x69, 0x6c, 0x6f, 0x73, 0x76, 0x79, 0x7c, 
  25          }; 
  26          //三角波信号数据表
  27          uchar code thr_tab[32]=
  28          {
  29           0x00,0x0f,0x1f,0x2f,0x3f,0x4f,0x5f,0x6f,0x7f,0x8f,0x9f,0xaf,0xbf,0xcf,0xdf,0xef,
  30           0xff,0xef,0xdf,0xcf,0xbf,0xaf,0x9f,0x8f,0x7f,0x6f,0x5f,0x4f,0x3f,0x2f,0x1f,0x0f
  31          };
  32          //-------------------------------------------------------------------------------------------------------
  33          //锯齿波信号数据表
  34          uchar code jc_tab[33]=
  35          {
  36           0x00,0x08,0x0f,0x18,0x1f,0x28,0x2f,0x38,0x3f,0x48,0x4f,0x58,0x5f,0x68,0x6f,0x78,
  37           0x7f,0x88,0x8f,0x98,0x9f,0xa8,0xaf,0xb8,0xbf,0xc8,0xcf,0xd8,0xdf,0xe8,0xef,0xf8,0xff
  38          };
  39          //数码管位选控制口定义
  40          sbit LED4=P2^7;
  41          sbit LED3=P2^6;
  42          sbit LED2=P2^5;
  43          sbit LED1=P2^4;
  44          //按键口申明
  45          sbit S1=P2^3;
  46          sbit S2=P2^2;
  47          sbit S3=P2^1;
  48          unsigned char tabArry[4];       //保存显示数据
  49          char flag=1;    //按键标志,当flag=1时表示没有按下,当flag=0时表示有按键按下
  50          int keycount=0; //按键计数
  51          unsigned char waveth,wavetl;    //用于对定时器付值
  52          unsigned int frecount=100;      //频率计数
  53          unsigned int mbjs;      //码表计数,共采32个点
  54          //毫秒延时程序
C51 COMPILER V7.50   DDS                                                                   11/15/2008 18:48:38 PAGE 2   

  55          void delayms(int ms)
  56          {
  57   1              uchar i;
  58   1          while(ms--)
  59   1               {
  60   2                      for(i=250;i>0;i--);
  61   2               }
  62   1      }
  63          
  64          //键盘扫描
  65          void keyscan()
  66          {
  67   1              if(flag==1)
  68   1              {
  69   2                      if(S3==0)               //用S3切换波形
  70   2                      {       
  71   3                              delayms(2);     //延时去抖
  72   3                              if(S3==0)       //按键计数,便于切换波形
  73   3                              {
  74   4                                      flag=0;
  75   4                                      keycount++;
  76   4                                      if(keycount>=4) keycount=0;        //四种波形计数4次
  77   4                              }
  78   3                      }               
  79   2              
  80   2                      if(S2==0)       //频率加1 处理
  81   2                      {       
  82   3                              delayms(2);
  83   3                              if(S2==0)
  84   3                              {
  85   4                                      flag=0;
  86   4                                      switch(keycount)
  87   4                                      {
  88   5                                              case 0:         //正弦波频率加1
  89   5                                                      frecount++;
  90   5                                                      if(frecount>1000) frecount=0;
  91   5                                                      break;
  92   5                                              case 1:         //三角波频率加1
  93   5                                                      frecount++;
  94   5                                                      if(frecount>1000) frecount=0;
  95   5                                                      break;
  96   5                                              case 2:         //锯齿波频率加1
  97   5                                                      frecount++;
  98   5                                                      if(frecount>1000) frecount=0;
  99   5                                                      break;
 100   5                                              case 3:         //方波频率加1
 101   5                                                      frecount++;
 102   5                                                      if(frecount>1000) frecount=0;
 103   5                                                      break;
 104   5                                      }
 105   4                                      waveth=(65536-57603/frecount)/256; //重新计算初值
 106   4                                      wavetl=(65536-57603/frecount)%256;              
 107   4                              }
 108   3                      }
 109   2                      if(S1==0)       //频率减1 处理
 110   2                      {       
 111   3                              delayms(2);
 112   3                              if(S1==0)
 113   3                              {
 114   4                                      flag=0;
 115   4                                      switch(keycount)
 116   4                                      {
C51 COMPILER V7.50   DDS                                                                   11/15/2008 18:48:38 PAGE 3   

 117   5                                              case 0:         //正弦波频率减1
 118   5                                                      frecount--;
 119   5                                                      if(frecount<0) frecount=999;
 120   5                                                      break;
 121   5                                              case 1:         //三角波频率减1
 122   5                                                      frecount--;
 123   5                                                      if(frecount<0) frecount=999;
 124   5                                                      break;
 125   5                                              case 2:         //锯齿波频率减1
 126   5                                                      frecount--;
 127   5                                                      if(frecount<0) frecount=999;
 128   5                                                      break;
 129   5                                              case 3:         //方波频率减1
 130   5                                                      frecount--;
 131   5                                                      if(frecount<0) frecount=999;
 132   5                                                      break;
 133   5                                      }
 134   4                                      waveth=(65536-57603/frecount)/256;      //重新计算初值
 135   4                                      wavetl=(65536-57603/frecount)%256;                                      
 136   4                              }
 137   3                      }
 138   2      
 139   2              }       
 140   1              if(S1!=0 && S2!=0 && S3!=0) flag=1;       //判断按键是否弹起
 141   1              
 142   1      }
 143          //数据分位
 144          void change(char wavetype,unsigned int frequency)
 145          {
 146   1              tabArry[0]=wavetype;            //显示字母,表示波形类型
 147   1              tabArry[1]=frequency%1000/100; //百位
 148   1              tabArry[2]=frequency%100/10;    //十位
 149   1              tabArry[3]=frequency%10;                //个位
 150   1      }
 151          //显示函数
 152          void display()
 153          {
 154   1      
 155   1              switch(keycount)
 156   1              {
 157   2                      case 0:                         //显示A和正弦波的频率
 158   2                              change(0x0a,frecount);
 159   2                              break;
 160   2                      case 1:                         //显示b和三角波的频率
 161   2                              change(0x0b,frecount);
 162   2                              break;
 163   2                      case 2:                         //显示C和锯齿波的频率
 164   2                              change(0x0c,frecount);
 165   2                              break;
 166   2                      case 3:                         //显示d和方波的频率
 167   2                              change(0x0d,frecount);
 168   2                              break;
 169   2              }
 170   1              
 171   1              P0 = table[tabArry[0]];         //送最高位段码
 172   1              LED1=0;                                         //打开对应的位选控制口
 173   1              delayms(2);                                     //显示延时
 174   1              LED1=1;                                         //关闭对应的位选控制后显示下一位
 175   1      
 176   1              P0 = table[tabArry[1]];
 177   1              LED2=0;
 178   1              delayms(2);
C51 COMPILER V7.50   DDS                                                                   11/15/2008 18:48:38 PAGE 4   

 179   1              LED2=1;
 180   1      
 181   1              P0 = table[tabArry[2]];
 182   1              LED3=0;
 183   1              delayms(2);
 184   1              LED3=1;
 185   1      
 186   1              P0 = table[tabArry[3]];
 187   1              LED4=0;
 188   1              delayms(2);
 189   1              LED4=1; 
 190   1      }
 191          void Timerinit()
 192          {
 193   1              TMOD=0x01;      //定时器0方式1
 194   1      
 195   1              //定时器初值计算公式:X=65536-(T/T0)=65536-(f0/f/32)
 196   1              TH0=waveth=(65536-57603/frecount)/256;   //定时器初值  22.1184MHz
 197   1              TL0=wavetl=(65536-57603/frecount)%256;
 198   1              EA=1;           //开总中断
 199   1              ET0=1;          //开定时器0中断
 200   1              TR0=1;          //定时器0开始计数
 201   1      }
 202          //主函数 
 203          void main()
 204          {
 205   1              Timerinit();    //定时器初始化
 206   1              while(1)
 207   1              {
 208   2                      keyscan();      //扫描按键
 209   2                      display();      //显示程序
 210   2              }       
 211   1      }
 212          
 213          void Timer0() interrupt 1
 214          {
 215   1              TH0=waveth;       //重新赋初值
 216   1              TL0=wavetl;
 217   1              if (keycount==0)  //输出正弦波
 218   1              {
 219   2                      P1 = sin_tab[mbjs];
 220   2                      mbjs+=8;                //256点,每隔8点输出一个数据
 221   2                      if(mbjs>=256)
 222   2                      {
 223   3                              mbjs=0;
 224   3                      }
 225   2              } 
 226   1              else if(keycount==1) //输出三角波
 227   1              {
 228   2                      P1 = thr_tab[mbjs];
 229   2                      mbjs++;
 230   2                      if(mbjs>=32)
 231   2                      {
 232   3                              mbjs=0;
 233   3                      }
 234   2              }
 235   1              else if(keycount==2) //输出锯齿波
 236   1              {
 237   2                      P1 = jc_tab[mbjs];
 238   2                      mbjs++;
 239   2                      if(mbjs>=32)
 240   2                      {
C51 COMPILER V7.50   DDS                                                                   11/15/2008 18:48:38 PAGE 5   

 241   3                              mbjs=0;
 242   3                      }
 243   2              } 
 244   1              else if(keycount==3)    //输出方波
 245   1              {
 246   2                      mbjs++;
 247   2                      if(mbjs>=32)
 248   2                      {
 249   3                              mbjs=0;
 250   3                      }
 251   2                      else if(mbjs<16) P1=0xff;
 252   2                      else P1=0x00;
 253   2      
 254   2              }
 255   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    966    ----
   CONSTANT SIZE    =    338    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     13    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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