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

📄 3.lst

📁 AT89S52单片机驱动AD9833产生信号
💻 LST
字号:
C51 COMPILER V6.23a  3                                                                     04/24/2007 09:41:58 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE 3
OBJECT MODULE PLACED IN 3.OBJ
COMPILER INVOKED BY: D:\PROGRA~1\keil\C51\Bin\c51.exe 3.c DB OE SMALL ROM(LARGE) 

stmt level    source

   1          #include <reg52.h>
   2          #include <intrins.h>
   3          sbit  SDATA=P3^0;
   4          sbit  SCLK=P3^1;
   5          sbit  FSYNC=P3^7;
   6          
   7          unsigned  char k_value  _at_ 0x30;//k_value为键值
   8          unsigned  char bdata protect  _at_ 0x20;//对位变量区进行保护
   9          unsigned  char i;                 //定时器统计时基用
  10          float          f_word;            //频率值
  11          unsigned long  f_bj;              //频率步进量
  12          unsigned char  key_word;          //核心状态控制量
  13          
  14          sbit      k_f = protect^0;//k_f为有键按下标志位
  15          sbit      zh  = protect^1;//位中转,用于保存C,在键盘采值子程序中
  16          sbit      ss  = protect^2;//数码管闪烁控制位  
  17          sbit      k_rx= protect^3;//修改频率状态标志位
  18          sbit      f_sx= protect^4;//正弦波状态频率刷新请求,为1使能
  19          sbit      f_sxs=protect^5;//三角波状态频率刷新请求,为1使能
  20          sbit      f_squ=protect^6;//方波状态频率刷新请求,为1使能
  21          
  22          //程序编号:0
  23          //名称:键盘采值子程序
  24          //功能:把采到的值在保存在k_value中(30H),并置位k_f(位00H)
  25          void keyboard(void);//键盘采值函数,真正的函数体是用汇编语言写的,在keyboard文件中
  26          
  27          //编号7,延时2ms
  28          void dl_2ms (void)
  29            {unsigned int i;
  30   1          for(i=0;i<580;i++)
  31   1            {}
  32   1        }
  33            
  34          //编号12
  35          //0.5S定时信号产生
  36          void second_500ms() interrupt 1 using 0
  37            {TH0=0xBF;
  38   1         TL0=0x63;
  39   1         if(i<=25)
  40   1           {i++;}
  41   1         else
  42   1           {i=0;
  43   2            ss=!ss;
  44   2           }
  45   1         TF0=0;
  46   1        }
  47                     
  48          //编号3,显示频率函数。。。。。。。。。。。。。。。  
  49          //将频率值分成八个单数送到数码管显示    
  50          void dispaly (float f_word,unsigned char XC)//f_word为频率值,XC为控制位,数字表示相应位灭
  51            {unsigned char led_1;//数码管个位
  52   1         unsigned char led_2;//数码管十位
  53   1         unsigned char led_3;//数码管百位
  54   1         unsigned char led_4;//数码管K位
  55   1         unsigned char led_5;//数码管10K位
C51 COMPILER V6.23a  3                                                                     04/24/2007 09:41:58 PAGE 2   

  56   1         unsigned char led_6;//数码管100K位
  57   1         unsigned char led_7;//数码管m位
  58   1         unsigned char led_8;//数码管10m位
  59   1               
  60   1         unsigned char code xsm[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  61   1                                      0x07,0x7f,0x6f,0x00};
  62   1            
  63   1         led_8=(unsigned long)f_word/10000000;//提取十兆位
  64   1         led_7=(unsigned long)f_word/1000000%10;//提取兆位
  65   1         led_6=(unsigned long)f_word/100000%10;//提取100K位
  66   1         led_5=(unsigned long)f_word/10000%10;//提取10K位
  67   1         led_4=(unsigned long)f_word/1000%10;//提取1K位
  68   1         led_3=(unsigned long)f_word/100%10;//提取百位
  69   1         led_2=(unsigned long)f_word/10%10;//提取十位 
  70   1         led_1=(unsigned long)f_word%10;//提取个位
  71   1         
  72   1         if(led_8==0)           //高位为0消影
  73   1           {led_8=0x0a;
  74   2            if(led_7==0)
  75   2              {led_7=0x0a;
  76   3               if(led_6==0)
  77   3                 {led_6=0x0a;
  78   4                  if(led_5==0)
  79   4                    {led_5=0x0a;
  80   5                     if(led_4==0)
  81   5                       {led_4=0x0a;
  82   6                        if(led_3==0)
  83   6                          {led_3=0x0a;
  84   7                           if(led_2==0)
  85   7                             {led_2=0x0a;
  86   8                              if(led_1==0)
  87   8                                {led_1=0x0a;
  88   9                                }
  89   8                             }
  90   7                          }
  91   6                       }
  92   5                    } 
  93   4                  }
  94   3              } 
  95   2           }
  96   1                 
  97   1            if(XC==1) 
  98   1               {P0 = 00;   // 关闭最右边的一个,个位
  99   2                P2 = 0x80;}
 100   1            else
 101   1               {led_1=xsm[led_1];//数转码
 102   2               P0=0;
 103   2               P2 = 0x80;// 选中最右边的一个
 104   2               P0=led_1;
 105   2               dl_2ms();}//送码
 106   1            
 107   1            if(XC==2)                        //十位                                
 108   1               {P0 = 00;
 109   2                P2 = 0x40;
 110   2                }
 111   1            else    
 112   1               {led_2=xsm[led_2];//数转码
 113   2                P0=0;
 114   2                P2 = 0x40;// 
 115   2                P0=led_2;
 116   2                dl_2ms();}//送码
 117   1                
C51 COMPILER V6.23a  3                                                                     04/24/2007 09:41:58 PAGE 3   

 118   1            if(XC==3)                        //百位
 119   1               {P0 = 00;
 120   2                P2 = 0x20;
 121   2                }
 122   1            else    
 123   1               {led_3=xsm[led_3];//数转码
 124   2                P0=0;
 125   2                P2 = 0x20;// 
 126   2                P0=led_3;
 127   2                dl_2ms();}//送码
 128   1            
 129   1            if(XC==4)                         //K位
 130   1               {P0 = 00;
 131   2                P2 = 0x10;
 132   2                }
 133   1            else    
 134   1               {led_4=xsm[led_4];//数转码
 135   2                P0=0;
 136   2                P2 = 0x10;// 
 137   2                P0=led_4;
 138   2                dl_2ms();}//送码
 139   1             
 140   1            if(XC==5)                         //10K位
 141   1               {P0 = 00;
 142   2                P2 = 0x08;
 143   2                }
 144   1            else
 145   1               {led_5=xsm[led_5];//数转码
 146   2                P0=0;
 147   2                P2 = 0x08;// 
 148   2                P0=led_5 ;
 149   2                dl_2ms();}//送码
 150   1                
 151   1            if(XC==6)                          //100K位
 152   1               {P0 = 00;
 153   2                P2 = 0x04;
 154   2                }
 155   1            else    
 156   1               {led_6=xsm[led_6];//数转码
 157   2                P0=0;
 158   2                P2 = 0x04;// 
 159   2                P0=led_6 ;
 160   2                dl_2ms();}//送码
 161   1            
 162   1            if(XC==7)                         //M位
 163   1               {P0 = 00;
 164   2                P2 = 0x02;
 165   2                }
 166   1            else
 167   1               {led_7=xsm[led_7];//数转码
 168   2                P0=0;
 169   2                P2 = 0x02;// 
 170   2                P0=led_7 ;
 171   2                dl_2ms();}//送码
 172   1                
 173   1            if(XC==8)                         //10M位,最左边的数码管
 174   1               {P0 = 00;
 175   2                P2 = 0x01;
 176   2                }
 177   1            else    
 178   1               {led_8=xsm[led_8];//数转码
 179   2                P0=0;
C51 COMPILER V6.23a  3                                                                     04/24/2007 09:41:58 PAGE 4   

 180   2                P2 = 0x01;// 
 181   2                P0=led_8;
 182   2                dl_2ms();}//送码
 183   1             }
 184                
 185          //函数编号4,串行发送16位数据
 186          void send_2B(unsigned int word)
 187               {unsigned char i;
 188   1            EA=0;//时序严格要求区,必须关闭中断
 189   1            SCLK=1;
 190   1            SDATA=0;
 191   1            FSYNC=1;
 192   1            _nop_ ();
 193   1            _nop_ ();
 194   1            FSYNC=0;
 195   1            for (i=0;i<16;i++)
 196   1              {SCLK=1;
 197   2               if(word&0x8000)
 198   2                 {SDATA=1;}
 199   2               else
 200   2                 {SDATA=0;}
 201   2                 _nop_ ();
 202   2               SCLK=0;
 203   2               word=word<<1;
 204   2               SCLK=1;
 205   2               SDATA=0; 
 206   2              }
 207   1              FSYNC=1;
 208   1              EA=1;//操作完毕后开启中断
 209   1           }
 210          
 211                              
 212          //函数编号编号5,将期望频率值换算为AD9833控制字并发
 213          void frejs(float fout)//频率计算,处理。频率控制函数,入口参数为频率值,经该函数处理,直接控制AD9833输出相

⌨️ 快捷键说明

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