单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

proteus仿真的51单片机信号发生器 课程设计

  [复制链接]
跳转到指定楼层
楼主
51单片机简易信号发生器的proteus仿真图:




程序,仿真文件,课程设计论文下载: signal-generator.zip (1.44 MB, 下载次数: 636)

程序:
  1. #include
  2. #include
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. //--LCD控制引脚
  6. sbit RS=P3^0;
  7. sbit RW=P3^1;
  8. sbit EN=P3^3;
  9. //--按键
  10. sbit K1=P2^0;
  11. sbit K2=P2^1;
  12. sbit K3=P2^2;
  13. sbit K4=P2^3;
  14. sbit K5=P2^4;

  15. uchar WaveChoice=1;
  16. uchar ys=30;
  17. uchar i,a=0;
  18. uchar sqar_num=128;
  19. uint freq;

  20. uchar code Sin[]={"Sine      "};
  21. //uchar code exp[]={"Exp      "};
  22. uchar code Squ[]={"Square    "} ;
  23. uchar code Tri[]={"Triangle  "};
  24. uchar code Saw[]={"Sawtooth  "} ;
  25. uchar code No[]={"No Signal out "};
  26. uchar code Wave[]={"Wave :"};
  27. uchar code Fre[]={"Freq :"};

  28. uchar code tosin[256]=
  29. {0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,
  30. 0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,
  31. 0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,
  32. 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
  33. 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,
  34. 0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,
  35. 0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,
  36. 0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,
  37. 0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,
  38. 0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,
  39. 0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,
  40. 0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,
  41. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,
  42. 0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,
  43. 0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,
  44. 0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e ,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,
  45. 0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 }; //正弦波码

  46. //--延时MS
  47. void DelayMS(uchar ms)
  48. {
  49.         uchar i;
  50.         while(ms--) for(i=0;i<120;i++);
  51. }
  52. //--延时y*9us
  53. void Delay1(uint y)
  54. {
  55.          uint i;
  56.         for(i=y;i>0;i--);
  57. }
  58. //-------------
  59. //忙检查
  60. //-----------------------------
  61. uchar Busy_Check()
  62. {
  63.         uchar LCD_Status;
  64.         RS=0;  //        寄存器选择
  65.         RW=1; //读状态寄存器
  66.         EN=1;  // 开始读
  67.         DelayMS(1);
  68.         LCD_Status=P1;
  69.         EN=0;
  70.         return  LCD_Status;

  71. }
  72. //----------------------------
  73. //写LCD命令
  74. //---------------------------------
  75. void Write_LCD_Command(uchar cmd)
  76. {
  77.            while((Busy_Check()&0x80)==0x80);   //忙等待
  78.            RS=0;  //选择命令寄存器
  79.            RW=0;  //写
  80.            EN=0;
  81.            P1=cmd;EN=1;DelayMS(1);EN=0;
  82. }
  83. //--------------------------------------
  84. //发送数据
  85. //---------------------------------------
  86. void Write_LCD_Data(uchar dat)
  87. {
  88.          while((Busy_Check()&0x80)==0x80);   //忙等待        
  89.           RS=1;  RW=0; EN=0; P1=dat;EN=1;DelayMS(1);EN=0;        
  90. }
  91. //------------------------------------
  92. //LCD初始化
  93. //-----------------------------------------
  94. void Init_LCD()
  95. {               
  96.         Write_LCD_Command(0x38);
  97.         DelayMS(1);
  98.         Write_LCD_Command(0x01); //清屏
  99.         DelayMS(1);
  100.         Write_LCD_Command(0x06); //字符进入模式:屏幕不动,字符后移
  101.         DelayMS(1);
  102.         Write_LCD_Command(0x0C); //显示开、关光标
  103.         DelayMS(1);
  104. }

  105. //--向LCD写频率值
  106. void Write_freq(uint k)
  107. {
  108.         uchar qian,bai,shi,ge;
  109.         qian=k/1000;
  110.         bai=k/100%10;
  111.         shi=k/10%10;
  112.         ge=k%10;
  113.         Write_LCD_Command(0x86+0x40);
  114.         Write_LCD_Data(0x30+qian);
  115.         Write_LCD_Data(0x30+bai);
  116.         Write_LCD_Data(0x30+shi);
  117.         Write_LCD_Data(0x30+ge);
  118.         Write_LCD_Data(0x48);
  119.         Write_LCD_Data(0x5a);
  120. }

  121. //--LCD上显示不同波形频率
  122.   void Xianshi_f()                  
  123. {
  124.   if(WaveChoice==1)
  125.   {
  126.      freq=(10000000/(50000+2860*ys));
  127.          Write_freq(freq);
  128.   }
  129.   if(WaveChoice==2)
  130.   {
  131.      freq=(10000000/(50000+2300*ys));
  132.          Write_freq(freq);
  133.   }
  134.    if(WaveChoice==3)
  135.   {
  136.      freq=(10000000/(14000+2300*ys));
  137.          Write_freq(freq);
  138.   }
  139.     if(WaveChoice==4)
  140.   {
  141.      freq=(10000000/(15000+2300*ys));
  142.          Write_freq(freq);
  143.   }
  144. }
  145. //--LCD上写波形类型
  146. void Write_wave(uchar  t )
  147. {
  148.         switch(t)
  149.         {
  150.                 case 0:
  151.                                 //-- 无输出
  152.                                  Write_LCD_Command(0x86);
  153.                                    DelayMS(5);
  154.                                     for (i=0;i<sizeof(no)-1;i++)
  155.                                         {
  156.                                                 Write_LCD_Data(No[i]);
  157.                                                 DelayMS(5);
  158.                                         }
  159.                                         break;
  160.                 case 1:
  161.                                 //--正弦波
  162.                                 ys=25;
  163.                                 Write_LCD_Command(0x86);
  164.                                    DelayMS(5);
  165.                                     for (i=0;i<sizeof(sin)-1;i++)
  166.                                         {
  167.                                                 Write_LCD_Data(Sin[i]);
  168.                                                 DelayMS(5);
  169.                                         }
  170.                                 break;
  171.                 case 2:
  172.                                 //---矩形波
  173.                                 ys=30;
  174.                                 Write_LCD_Command(0x86);
  175.                                    DelayMS(5);
  176.                                     for (i=0;i<sizeof(squ)-1;i++)
  177.                                         {
  178.                                                 Write_LCD_Data(Squ[i]);
  179.                                                 DelayMS(5);
  180.                                          }
  181.                         
  182.                                 break;
  183.                 case 3:
  184.                                 //---三角波
  185.                                 ys=30;
  186.                                 Write_LCD_Command(0x86);
  187.                                    DelayMS(5);
  188.                                     for (i=0;i<sizeof(tri)-1;i++)
  189.                                         {
  190.                                                 Write_LCD_Data(Tri[i]);
  191.                                                 DelayMS(5);
  192.                                         }
  193.                                 break;
  194.                 case 4:
  195.                                 //----锯齿波
  196.                                 ys=30;
  197.                                    Write_LCD_Command(0x86);//液晶显示位置
  198.                                    DelayMS(5);
  199.                                     for (i=0;i<sizeof(saw)-1;i++)
  200.                                         {
  201.                                                 Write_LCD_Data(Saw[i]);
  202.                                                 DelayMS(5);
  203.                                          }
  204.                                 break;
  205.         }
  206. }
  207. //---输出波形
  208. void Out_Wave(uchar i)
  209. {         uchar j;        
  210.         switch(i)
  211.         {
  212.                 case 0:        P0=0x00;break;
  213.                 case 1:
  214.                                 //---正弦波
  215.                                 for (j=0;j<255;j++)
  216.                                 {
  217.                                         P0=tosin[j];
  218.                                         Delay1(ys);
  219.                                 }
  220.                                  break;
  221.                 case 2:
  222.                                 //----矩形波
  223.                                 {
  224.                                         if(a<sqar_num)
  225.                                                 {
  226.                                                         P0=0xff;
  227.                                                         Delay1(ys);
  228.                                                 }
  229.                                         else  
  230.                                                 {
  231.                                                         P0=0x00;
  232.                                                         Delay1(ys);
  233.                                                 }
  234.                                                 a++;
  235.                                 }  break;
  236.                 case 3:
  237.                                 //----三角波
  238.                                 {
  239.                                         if(a<128)
  240.                                                 {
  241.                                                         P0=a;
  242.                                                         Delay1(ys);
  243.                                                 }
  244.                                         else  
  245.                                                 {
  246.                                                         P0=255-a;
  247.                                                         Delay1(ys);
  248.                                                 }
  249.                                                 a++;
  250.                                 }   break;
  251.                 case 4:
  252.                            //----锯齿波
  253.                                 {
  254.                                          if(a<255)
  255.                                         {
  256.                                                 P0=a;
  257.                                                 Delay1(ys);
  258.                                         }
  259.                                 
  260.                                 a++;
  261.                         if(a==255)
  262.                                 {
  263.                                         a=0;
  264.                                 }   break;
  265.                 }
  266.         }
  267. }
  268. //----按键扫描
  269. void keyscanf()
  270. {        
  271.         if(K2==0)
  272.         {
  273.                 DelayMS(5);
  274.                 if(K2==0)
  275.                 {
  276.                         while(!K2);
  277.                         ys--;
  278.                         if(ys==0)
  279.                         ys=20;
  280.                 }
  281.         }
  282.         if(K3==0)
  283.         {
  284.                 DelayMS(5);
  285.                 if(K3==0)
  286.                 {
  287.                         while(!K3);
  288.                         ys++;
  289.                         if(ys>22)
  290.                         ys=20;
  291.                 }
  292.         }
  293.         if(K4==0)
  294.         {
  295.                 DelayMS(5);
  296.                 if(K4==0)
  297.                 {
  298.                         while(!K4);
  299.                         if(WaveChoice==2)
  300.                         sqar_num=sqar_num+2;
  301.                         if(sqar_num==238)
  302.                                 sqar_num=128;
  303.                 }
  304.         }
  305.         if(K5==0)
  306.         {
  307.                 DelayMS(5);
  308.                 if(K5==0)
  309.                 {
  310.                         while(!K5);
  311.                         if(WaveChoice==2)
  312.                         sqar_num=sqar_num-2;
  313.                         if(sqar_num==18)
  314.                                 sqar_num=128;                        
  315.                 }
  316.         }
  317. }

  318. //----主程序---
  319. void main()
  320. {
  321.         Init_LCD();
  322.         IE=0X81;
  323.         IT0=1;
  324.         Write_LCD_Command(0x80);//--显示wave:
  325.            DelayMS(5);                 
  326.    for (i=0;i<sizeof(wave)-1;i++)
  327.                 {
  328.                         Write_LCD_Data(Wave[i]);
  329.                         DelayMS(5);
  330.                 }
  331.             Write_LCD_Command(0x80+0X40);//----显示freq:
  332.      DelayMS(5);
  333.     for (i=0;i<sizeof(fre)-1;i++)
  334.                 {
  335.                         Write_LCD_Data(Fre[i]);
  336.                         DelayMS(5);
  337.                 }
  338.            Write_wave(WaveChoice);
  339.         while (1)
  340.         {
  341.                          keyscanf();
  342.                 Out_Wave(WaveChoice);
  343.                 if(!(K1&K2&K3))
  344.                                 Xianshi_f();
  345.         }         
  346. }

  347. //---INT0中断
  348. void EX_INT0() interrupt 0
  349. {

  350.                 WaveChoice++;
  351.                 if(WaveChoice==5) WaveChoice=1;
  352.                 Write_wave(WaveChoice);

  353. }
复制代码

以下是论文预览:

课程设计



题    目 基于proteus仿真的简易信号发生器的设计

学    院管理科学与工程学院

专    业 电子信息工程

班    级     08信工(3)班

学    号201883062

姓    名高 攀


信号发生器是一种常用的信号源,广泛地应用于电子电路、自动控制系统和教学实验等领域。 本设计采用AT89C51单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)、运放电路(LM324)、按键和LCD液晶显示电路。电路采用单片机和一片DAC0832数模转换器组成数字式低频信号发生器,可产生正弦波、矩形波、锯齿波和三角波四种波形。系统通过单片机产生数字信号,通过DAC0832转换为模拟信号,再通过放大器LM324就可以得到双极性的各种波形,最终由示波器显示出来。通过键盘来控制四种波形的类型选择、频率变化,并通过液晶1602显示其各自的波形类型以及频率数值。

本设计硬件电路简单,软件功能完善,控制系统可靠,性价比较高,具有一定的实用价值和参考价值。

关键词AT89C51 单片机; 函数信号发生器;DAC0832;LCD液晶显示

Abstract

Signal generator is a common signal source, widely used in electronic circuits, automatic control systems and experiments in areas such as teaching. The design using AT89C51 microcontroller as the control, external digital/analog conversion circuit (DAC0832), op-amp circuit (LM324), buttons and liquid crystal display of 1602. Circuit adopts single-chip microcomputer and a digital-to-analog converters DAC0832 consisting a low frequency signal generator, can produce four waveform such as the sine wave, the rectangle wave, the sawtooth wave and the triangle wave. System through the microcontroller create a digital signal, through DAC0832 into analog signals, again through the amplifier LM324 can get dual polarity by various waveform, finally shown by An oscilloscope. In this system, through the keyboard to control four waveform type selection, frequency variation, and displays those through liquid crystal display of 1602.

In this design, the hardware circuits are simple, software functions are consummate, and the control system is reliable, so it has some practical value and reference value.

KeywordsAT89C51;function generator;DAC0832;LCD display

1 系统总体设计              1

1.1 系统基本模块设计与论证              1

1.1.1 信号发生模块              1

1.1.2 输出显示模块              1

1.1.3 键盘模块              1

1.1.4 电路设计最终方案              2

1.2 系统原理及总体结构图              2

1.2.1 系统总体结构图              2

1.2.2 系统工作原理              2

2 系统硬件设计              3

2.1 系统硬件仿真原理图              3

2.2 系统主要单元电路设计              4

2.2.1 主控制器AT89C51              4

2.2.2 数/模转换电路              7

2.2.3 电流/电压转换放大电路

2.2.4 液晶显示电路            

2.2.5 键盘电路

3 系统软件设计

3.1 系统主程序流程框图

3.2 信号产生子程序

3.2.1 正弦波发生子程序

3.2.2 矩形波发生子程序              18

3.2.3 三角波发生子程序              18

3.2.4 锯齿波发生子程序              20

3.3按键处理子程序              20

3.4液晶显示子程序

3.5 INT0中断子程序              1

4 系统调试

4.1 系统调试过程

4.2 调试中的问题及解决方法

4.3 系统仿真结果

5 结论              28

5.1 结论              28

参考文献8




1 系统总体设计1.1 系统基本模块设计与论证 1.1.1 信号发生模块

方案一:利用MAX038芯片组成的电路输出波形。MAX038是精密高频波形产生芯片,能够产生准确的三角波、方波和正弦波三种周期性波形。但此方案成本高,程序复杂度高。

方案二:采用分立元件实现非稳态的多谐振振荡器,然后根据需要加入积分电路等构成正弦、矩形、三角等波形发生器。这种信号发生器输出频率范围窄,而且电路参数设定较繁琐,其频率大小的测量往往需要通过硬件电路的切换来实现,操作不方便。               

方案三:采用单片机和DAC0832数模转换器生成波形。通过编程的方法来控制输入到数模转换电路的数字量,从而控制输出信号的波形和频率。它的特点是价格低、设计简单,在低频范围内稳定性好、操作方便、体积小、耗电少。

经比较,方案三既可满足毕业设计的基本要求又能充分发挥其优势,电路简单,易控制,性价比较高,所以采用该方案。

1.1.2 输出显示模块

方案一:用数码管进行显示。数码管由于显示速度快,使用简单,显示效果简洁明了而得到了广泛应用。但是由于我们计划显示输出信号波形类型和频率,内容很多。用数码管无法显示如此丰富的内容,因此我们放弃了此方案。

方案二:用LCD液晶进行显示。LCD由于其显示清晰,显示内容丰富,显示信息量大,使用方便,显示快速而得到了广泛的应用。

对于此系统我们选用的LCD LM016L液晶能够显示英语字母和数字,能够很好的满足显示要求,因此我们选择了此方案。

1.1.3键盘模块

方案一:采用独立式按键电路,每个按键单独占有一根I/O接口线,每个I/O口的工作状态互不影响,此类键盘采用端口直接扫描方式。缺点为当按键较多时占用单片机的I/O口数目较多,优点为电路设计简单,且编程相对比较容易。

方案二:采用矩阵式键盘,键盘为4*4矩阵式行列扫描,优点是当按键较多时可降低占用单片机的I/O口数目。

对于此系统,由于按键数目不多,故采用方案一。

1.1.4 电路设计最终方案

本系统包括主控模块,显示模块,信号发生模块,键盘模块,运放模块,综上各方案所述,确定最终设计方案为:采用AT89C51作为主控制系统,LCD液晶显示作为显示部分,独立式按键作为键盘模块,数模转换芯片DAC0832作为信号发生模块,LM324作为电流/电压转换放大模块。

1.2 系统原理及总体结构图1.2.1 系统总体结构图

根据上述电路设计的最终方案,系统总体设计结构如图1所示。

图1  系统总体结构图
1.2.2系统工作原理

数字信号可以通过数/模转换器转换成模拟信号,因此可通过产生数字信号再转换成模拟信号的方法来获得所需要的波形。在本设计中,AT89C51是整个波形发生器的核心部分,外围电路包括数字/模拟转换电路、电流/电压转换放大电路、按键电路、LCD液晶显示电路和晶振电路。外接12MHz晶振电路为单片机提供工作脉冲。单片机的P1口接LCD液晶显示电路,用来显示波形类型和频率大小;P0口接数模转换芯片DAC0832的DI0~DI7,为数模转换芯片提供数字信号;P2.0~P2.4外接独立键盘,以控制信号的类型、频率等;P3部分口作为LCD的控制信号。

通过对单片机编写程序,控制从P0口输出的数字信号类型,P0口的数字信号再输入到数模转换芯片DAC0832中,从而转换为模拟信号输出。DAC0832输出的模拟信号为电流信号,所以用电流/电压运算放大器LM324将电流信号再转换成电压信号输出。用两片LM324可以得到输出波形的双极性输出,将输出的波形与示波器相连即可观察输出波形的特征。独立式键盘可以控制从P0口输出的数字信号,按下不同的键可以使此输出信号改变,从而使输出的波形实现正弦波、矩形波、锯齿波和三角波之间的转变,并能够改变波形输出频率的大小。在此过程中,单片机将信号的类型和频率经过处理后,由P1口送到LCD液晶显示器上进行显示,LCD1602第一行显示信号的类型,第二行显示波形的频率。

2 系统硬件设计2.1系统硬件仿真原理图

硬件设计是系统设计的重点之一,选择合适的元器件尤为重要。在本设计中,根据设计的总体方案,选择AT89C51作为主控制器、DAC0832为数模转换芯片、LM324为电流/电压转换元件、LM016L为LCD液晶显示元件、5个独立式按键为按键模块元件。本设计在Proteus软件中绘制的硬件电路图如图2所示。

图2  硬件仿真原理图
2.2 系统主要单元电路设计2.2.1 主控制器AT89C51

AT89C51是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,片内含4KB的可反复擦除的只读程序存储器(PEROM)和128B随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和FLASH存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合。

主要性能参数:

①与MCS-51产品指令系统完全兼容

②4K字节可重擦写FLASH闪速存储器

③1000次擦写周期

④全静态操作:0HZ-24MHZ

⑤三级加密程序存储器

⑥128

8字节内部RAM

⑦32个可编程I/O口线

⑧2个16位定时/计数器

⑨6个中断源

⑩可编程串行UART通道

                     

                       图3   AT89C51 引脚封装图

AT89C51引脚封装如图3所示,其芯片引脚介绍如下:

(1)主电源引脚

VCC:+5 V电源   VSS:地线。

(2)时钟电路引脚

XTAL1和XTAL2:外接晶体引线端。当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。

(3)控制信号引脚

RST/VPD:复位信号。当输入的复位信号延续两个机器周期以上的高电平时即为有效,用以完成单片机的复位初始化操作;当单片机掉电时,此引脚上可接备用电源,由VPD向片内RAM提供备用电源,以保持片内RAM中的数据不丢失。

ALE/PROG:地址锁存控制信号。在系统扩展时,ALE用于控制把P0口输出的低8位地址锁存起来,以实现低位地址和数据的隔离。此外,由于ALE是以晶振1/6的固定频率输出的正脉冲,因此,可作为外部时钟或外部定时脉冲使用。

PSEN:片外程序存储器读选通信号输出端。

EA/VPP:访问程序存储控制信号。当EA信号为低电平时,对ROM的读操作限定在外部程序存储器;当EA信号为高电平时,对ROM的读操作是从内部程序存储器开始,并可延至外部程序存储器。

              (4)I/O引脚

P0.0 ~ P0.7 :P0口8位双向口线;P1.0 ~ P1.7 :P1口8位双向口线;

P2.0 ~ P2.7 :P2口8位双向口线;P3.0 ~ P3.7 :P3口8位双向口线。

P3口线的第二功能。P3的8条口线都定义有第二功能,详见表1。

表1  P3口各引脚与第二功能表

引脚

第二功能

信号名称

P3.0

RXD

串行数据接收

P3.1

TXD

串行数据发送

P3.2

INT0

外部中断0申请

P3.3

INT1

外部中断1申请

P3.4

T0

定时/计数器0的外部输入

P3.5

T1

定时/计数器1的外部输入

P3.6

WR

外部RAM写选通

P3.7

RD

外部RAM读选通

以上把8051单片机的全部信号引脚分别以第一功能和第二功能的形式列出。对于各种型号的芯片,其引脚的第一功能信号是相同的,所不同的只在引脚的第二功能信号。对于9、30和31三个引脚,由于第一功能信号与第二功能信号是单片机在不同工作方式下的信号,因此不会发生使用上的矛盾。但是P3口的情况却有所不同,它的第二功能信号都是单片机的重要控制信号。因此,在实际使用时,都是先按需要选用第二功能信号,剩下的才以第一功能的身份作数据位的输入/输出使用。

如图4所示,本设计中单片机资源的分配情况如下:

(1)单片机使用外部电路来提供时钟脉冲。引脚XTAL1和XTAL2之间接12MHz的石英晶体,使单片机的一个机器周期为1us。

(2)P0口与DAC0832的DI0-DI7数据输入口相连;P1口与LCD液晶显示数据输入口相连;P2口的P2^0-P2^4分别与5个独立按键相连;P3部分口与LCD液晶显示控制信号接口相连。

图4  单片机控制模块

2.2.2 数模转换电路

数模转换电路是本设计的关键电路,它决定着将数字信号转变为模拟信号,从而得到各种所需要的波形。

1. 数模转换器的工作原理

数模转换器可将数字量信号转换成与此数值成正比的模拟量信号。需要转换的数字量由一个二进制数字表示,每位二进制数字都有一定的权,在转换中,应将二进制数的每一位按照权的大小转换成相应的模拟量输出分量,然后将各个输出分量叠加,总和就是与数字量成正比的模拟量数值。

上述的D/A转换,常用如图5所示的倒T形解码网络加以实现。

                                                                                   图5  倒T形电阻网络D/A转换器

电路设计如图5所示,包括由R-2R组成的电阻网络、模拟电子开关和集成运算放大器。

对于电阻网络,无论从哪个R-2R节点看,等效电阻都是R,因此,从参考电压端输入的电流为:  IR=VREF/R

根据分流公式,各支路电流为:

I7=I/21I6 =I/22I5 =I/23I4 =I/24I3 =I/25I2 =I/26I1 =I/27I0 =I/28

于是,经过运算放大器输出的模拟电压VO为:

VO = - RF∑Ii= -Rfb VREF/R×28(D7×27 +D6×26 +D5×25+

D4×24+D3×23+D2×22+D1×21+D0×20)

其中VREF是进行D/A转换的系统提供的参考电压,Rfb为集成运算放大器的反馈电阻,D7 ~ D0取值为0或1,0表示切换开关与地相连,1表示与参考电压相连。通过上述电路,即完成了二进制数字信号到模拟电压信号的转换。

2.数模转换器的主要技术指标

  • 分辨率

分辨率指输入给D/A转换器的单位数字量引起的模拟量输出的变化,通常定义为输出满刻度值与2n之比(n为D/A转换器的二进制位数)。显然,二进制位数越多,分辨率越高,即D/A转换器对输入量变化的敏感程度越高。例如,8位的D/A转换器,若满量程输出为10V,根据分辨率定义,则分辨率为10V/2n,分辨率为10V/256=39.1mV,即输入的二进制最低位的变化可引起输出的模拟电压变化39.1mV,该值占满量程的0.391%,常用1LSB表示。使用时,应根据对D/A转换器分辨率的需要来选定D/A转换器的位数。

  • 相对精度

相对精度是指在满刻度已经校准的前提下,在整个刻度范围内,对应于任一数码的模拟量输出与它的理论值之差。通常用偏差几个LSB来表示。

  • 建立时间

建立时间是描述D/A转换器转换快慢的一个参数,用于表明转换时间或转换速度。其值为从输入数字量到输出达到总值误差±(1/2)LSB(最低有效位)时所需的时间。电流输出的转换时间较短,而电压输出的转换器,由于要加上完成I-V转换的运算放大器的延迟时间,因此转换时间要长一些。快速D/A转换器的转换时间可控制在1us以下。

  • 线性度

通常用非线性误差的大小表示D/A转换器的线性度,输入输出特性的偏差与满刻度输出之比的百分数表示非线性误差。一定温度下的最大非线性误差一般为0.01%~0.03%。

3. DAC0832数模转换芯片主要特性与结构

DAC0832系列为美国国家半导体公司生产的具有2个数据寄存器的8位分辨率的D/A转换芯片。此芯片与微处理器完全兼容,并且价格低廉,接口简单,转换控制容易,在单片机应用系统中得到了广泛的应用。

1.DAC0832的主要特性

  • 分辨率为8位;
  • 转换时间为1us
  • 可单缓冲、双缓冲或者直接数字转换;
  • 只需在满量程下调整其线性度;
  • 逻辑电平输入与TTL兼容;
  • 单一电源供电(+5V+15V);
  • 基准电压的范围为±10V

2.DAC0832的内部结构

DAC0832的内部结构框图如图6所示。它由8位输入锁存器、8位DAC寄存器、8位D/A转换器及转换控制电路构成,通过两个输入寄存器构成两级数据输入锁存。

                                                                                                  图 6   DAC0832内部逻辑框图

              使用时,数据输入可以采用两级锁存(双锁存)、单级锁存(一级锁存,一级直通方式)或直接输入(两级直通)形式。上图中,2个与门电路组成寄存器输出控制逻辑电路,该逻辑电路的功能是进行数据锁存控制。

3.DAC0832的引脚功能

              DI0~DI7:8位数据输入线。

              :片选信号输入,低电平有效。

              ILE:数据锁存允许控制信号,高电平有效。

1:输入寄存器写选通输入信号,低

平有效。                                                                                                                                                                        图 7  DAC0832的引脚                                            

              2:DAC寄存器写选通输入信号,低电平有效。

              :数据传送控制信号,低电平有效。上述两个信号控制DAC寄存器是否为数据直通方式。当2=0和=0时,为DAC寄存器直通方式;当2=1或=1时,为DAC寄存器锁存方式。

              IOUT1、IOUT2:电流输出,IOUT1+IOUT2=常数。

Rfb:反馈电阻输入端。内部接反馈电阻,外部通过该引脚接运放输出端。为了取得电压输出,需要在输出端接运算放大器,Rfb即为运算放大器的反馈电阻端。

              Vref:基准电压,其值为-10V~+10V。

              AGND:模拟信号地。

              DGND:数字信号地,为工作电源地和数字逻辑地,可在基准电源处进行单点共地。

              VCC:电源输入端,其值为+5V~+15V。

4.DAC0832芯片与单片机的接口

DAC0832根据控制信号的接法可分为三种工作方式:直通方式、单缓冲方式、双缓冲方式。

  • 单缓冲方式

此时输入锁存器和DAC寄存器相应的控制信号引脚分别连在一起,使数据直接写入DAC寄存器,立即进行D/A转换(这种情况下,输入锁存器不起锁存作用)。此方式适用于只有一路模拟量输出,或有几路模拟量输出但是并不要求同步的系统。            

2. 双缓冲方式

对于多路D/A转换输出,如果要求同步进行,可以采用双缓冲同步方式。DAC0832工作于双缓冲工作方式时,数字量的输入锁存和D/A转换是分两步完成的。首先CPU的数据总线分时向各路D/A转换器输入要转换的数字量,并将其锁存在各自的输入锁存器中,然后CPU对所有的DAC发出控制信号,使各个DAC输入锁存器中的数据打入DAC寄存器,实现同步转换输出。

              3. 直通工作方式

当DAC0832芯片的片选信号、写信号1、2及传送控制信号的引脚全部接地,允许输入锁存信号ILE引脚+5V时,DAC0832芯片就处于直通工作方式,数字量一旦输入,就直接进入DAC寄存器,进行D/A转换,从输出端得到转换的模拟量。

本设计中,为了降低数模转换建立的时间,数模转换芯片DAC0832采用直通的工作方式。

2.2.3 电流/电压转换放大电路

由于从DAC0832转换出来的模拟信号为电流信号,为了方便观测输出信号的特征,特将DAC0832输出的信号经过电流/电压转换放大电路转变为电压信号。本设计中使用的运放为LM324。LM324运算放大器是价格便宜的带差动输入功能的四运算放大器。其引脚图如图8所示。

   LM324的特点:

1.短路保护输出

2.真差动输入级            

3.可单电源工作:3V-32V

4.低偏置电流:最大100nA(LM324A)

5.每封装含四个运算放大器。

6.具有内部补偿的功能。

7.共模范围扩展到负电源

8.行业标准的引脚排列

9.输入端具有静电保护功能                   图8  LM324引脚


DAC0832输出信号经运放电路转变为电压后有两种输出方式。一种为单极性输出方式。此方式中,DAC0832通过使用一片LM324运算放大器将从单片机输入的数字量Din转换为电压输出,其输出电压为Uout=Din/28 *(-VREF)。当VREF=5V时,Uout的输出范围为-5V~0V。另一种为双极性输出方式。本设计中采用双极性输出方式,如图9所示。其双极性输出原理为:因为U1为-5V~0V,根据电流环路定理有

即:Uout=-VREF-2U1

所以当VREF=5V,而U1为-5V~ 0V输出时,Uout的输出为-5~+5V,即实现了双极性输出。

图9  DAC0832和两片LM324实现双极性输出
3.2.4 液晶显示电路

显示模块主要是用来显示输出信号的波形类型和频率大小,本设计中以LM016L作为显示器件。LM016L智能型显示模块是一种低功耗、低价值、低损耗的显示器件,它不但可以显示各式各样的字符、汉字和图形,同时具有可编程能力,且与单片机接口方便。

1引脚功能说明

LCD LM016L采用标准的14脚接口,各引脚接口说明如下:

第1脚:VSS为地电源。

第2脚:VDD接5V正电源。

第3脚:VEE为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

2.基本操作时序表

读写操作时序如图10和图11所示。

图10 读操作时序

图11  写操作时序

3LCD LM016LRAM地址映射及标准字库表

液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图12是016的内部显示地址。

图12  1602LCD内部显示地址

例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。

在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。

016液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图13所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等。每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

图13 字符代码与图形对应图

4.液晶LM016L显示电路图

本设计中,液晶显示电路与单片机的连接如图14所示。

图14 液晶显示电路

2.2.5键盘电路

该子系统是5个独立键盘和一个2输入与门组成,其中与门输出端连接单片机的P3.2口以便形成外部中断。5个按键分别连接单片机的P2.0~P2.4口。2输入与门一引脚与K1按键相连,另一引脚接高电平。当K1按下时,INT0为低电平,可知外部中断到了,系统执行中断程序。当K2~K5按键某一个按下时,对应的P2.1~P2.4口中某个为低电平,系统可以感知此按键按下,从而执行相应的程序。每个按键的功能如表2所示。

表2 按键功能表

按键

功能

属性

K1

波形选择

自动复位

K2

频率升高

自动复位

K3

频率降低

自动复位

K4

占空比升高

自动复位

K5

占空比降低

自动复位

按键电路的电路图如图15所示。

图15 按键电路图
3 系统软件设计

系统软件主要是用来控制信号发生器系统按照设计的逻辑进行运行。在软件设计上,根据功能分成了多个模块编程,主要包括:主程序模块、四种不同的波形产生模块、按键处理模块、外部中断模块、液晶显示模块等。

3.1 系统主程序流程框图

系统主程序流程图如图16所示,源程序见附件。

图16  系统主程序流程图

3.2 信号产生子程序

本系统采用编程的方法,来输出四种不同的波形即正弦波、矩形波、三角波、锯齿波。各种波形的产生方法如下。

3.2.1 正弦波发生子程序

正弦波的产生比较特殊,它不能由单片机直接产生,只能由如图17所示的阶梯波来向正弦波逼近。很显然,在一个周期内阶梯波的阶梯数目越多,单片机输出的波形也就越接近正弦波。

图17 正弦波信号的产生

先假定正弦波的振幅是2.56 V,则波谷对应的数字量为最小值00H,波峰对应的数字量为最大值FFH。将正弦波的第一个周期的波形按角度均分为若干等份,并计算出各点对应的电压值,电压值计算方法:Vx=2.5·(1+sinθ),因为00H~FFH对应的数字量为0~255,所以根据算出的电压就可直接写出各点所对应的数字量。单片机将一个周期的数字量存入一定的存储区域中,然后依次循环取出这些数字量,并送D/A电路转换成阶梯波,即近似的正弦波输出。图18为正弦波产生的流程图。

图18 正弦波产生的流程图
3.2.2 矩形波发生子程序

如图19所示,矩形波的实现比较简单。首先定义一个无符号字符型变量i=0,使自变量i不断的自动加1,若i的值小于squa_num,将P0口赋值为0xFF;若i的值大于squa_num,则将P0口赋值为0x00。当i自加到256后又自动变为0,以此循环,即可得到矩形波。当squa_num=128时,此时输出的为方波。调节squa_num的大小,即可实现矩形波占空比的调节;调节延时时间的大小,即可实现矩形波频率的改变。

图19 矩形波产生流程图
3.2.3 三角波发生子程序

三角波中的斜线用一个个小台阶来逼近,当台阶间隔很小时,波形基本上近似一直线。首先定义一个无符号字符型变量i=0,使自变量i不断的自动加1,若i的值小于128,将P0口赋值为i;若i的值大于128,则将P0口赋值为256-i。当i自加到256后又自动变为0,以此循环,从而P0口实现了周期性的数字量变换,在经过数模转换后转变成模拟信号,经运算放大电路后就得到了周期性的三角波。三角波产生流程图如图20所示。

图20 三角波发生流程图
3.2.4 锯齿波发生子程序

锯齿波的实现过程与三角波类似,也是定义一个变量i=0,并使P0=i,自变量i不断的自动加1,直到加到255,然后i又可以自动归为0,再不断的重复上过程。在此过程中,P0口的值也随着i一样变化,经数模转换DAC0832后,周期性逐一变化的数字量就转换为锯齿波输出了。通过调节P0口每相邻两个值之间的延迟时间,就可以改变锯齿波的频率。图21为锯齿波发生流程图。

图21 锯齿波发生流程图
3.3按键处理子程序

在本设计中,主要是通过按键来调节输出波形的类型、频率的大小及矩形波的占空比,采用程序控制扫描方式,时刻监视着有无按键按下。为了能够更准确的判断按键的情况,一旦有按键按下时,先延时去除按键的抖动,再判断是哪个按键按下,从而单片机对应的执行相应的程序。图22为按键处理流程图。

图22 按键处理流程图
3.4液晶显示子程序

LCD LM016L的显示函数很简单,只要严格按照其时序图操作,并结合其相关指令集,写好LCD的初始化程序,清屏程序,写指令程序,写数据程序,读数据程序等一系列驱动程序,即可完成LCD的所有显示需要。在本设计中,由于需要显示的内容比较多,且有些需要重复显示,有些只要显示一次,故只画出液晶显示的基本流程,如图23所示。

图23 液晶显示流程图
3.5 INT0中断子程序

中断子程序是用来控制输出波形的选择及将输出波形的类型在LCD液晶显示屏上显示出来。当波形选择按键K1按下时,进入中断程序中,此时波形选择标识WaveChoice加1,LCD液晶显示屏上显示出相应的波形类型。中断结束后,主程序中根据WaveChoice的值输出相应的波形。图24为INT0中断流程图。

图24 INT0中断流程图

4 系统调试4.1 系统调试过程

1.编译、连接项目,形成目标文件

打开Keil新建工程文件,然后添加源程序文件,保存时把文件后缀名改成“.c”,再直接导入新建的工程中。

把源程序全部录入后,先粗略的检查一遍,主要改正明显的各种错误,这样可以减少之后的修改工作量。接着Options for Target “Target 1”,点击Output ,勾选Create Hex 那个选项,生成可执行的文件。然后点击Project菜单下的Built Target命令然后再进行编译、连接,形成目标文件。编译、连接用Project菜单下的Built Target命令(或快捷键F7),也可以直接点击工具栏中相对应的图标。

编译、连接时,如果程序存在语法有错,则不会通过编译,并在下面的信息窗口给出相应的出错提示信息,其中错误是一定得改正的,警告可以忽略。双击下面显示错误信息的那一行,可以直接定位错误所在的行,用户可以方便的对程序进行修改。修改后再编译、连接,继续进行调试,这个过程可能会重复多次。如果没有任何语法上的错误,则编译、连接成功,并且信息窗口给出提示信息。

2.运行调试

在Proteus软件中先从元件库中加载要使用的那些元件,然后把元件放在图纸上一个一个的接线,尽量不让线交错,便于查看、分析,有必要时,使用接线标号法。完成所有元器件的接线后,在单片机上右击选Edit Properties,在Program file 那一行右侧点击,然后选择前面生成的以“.hex”为后缀名的文件,为单片机AT89C51添加可执行文件。然后点击左下角的相关按键,开始进行仿真。

4.2 调试中的问题及解决方法

在设计方案确定后,为了更好的调试,可以先分别对不同模块进行调试,最后在进行整体调试。在整个调试的过程中,遇到了不少的问题,经自己查阅资料,并向老师、同学请教后,这些问题基本已解决。调试中遇到的问题及解决方法如下:

(1) 在调试LCD显示过程中,当波形选择按键变化时,对应的LCD上显示的波形类型也跟着变化,达到设计的目的。但由于不同波形类型的显示字符长度不一样,由字符长的向字符短的跳转时,字符长的多余的几位还在显示,使显示结果出现错误。

解决方法:将四种需要显示的波形类型的字符串长度设定为一样,字母不足的用空格来补充,这样就达到了显示所需效果。

(2) 在调试波形产生过程中,波形选择按键按下时,没有波形输出或只输出一种波形。

解决方法:若无波形输出,则要先检查硬件原理图是否连接好,再检查程序是否出现问题。若仅有一种波形输出,则要检查程序中是否出现了死循环,还应检查按键控制程序是否符合逻辑要求。

(3) 当个个模块的功能都可以实现时,就可以进行总体的调试。在总体的调试中,发现波形选择按键按下时,液晶显示波形类型变化和输出波形的变化并不能同时实现。

解决方法:当波形选择按键按下时,液晶上的显示只要做一次就可以,而信号波形的输出则是连续着的。所以使用外部中断INT0,当有按键按下时,先响应中断程序,显示输出波形的类型,然后再回到主程序中,输出对应的波形。

(4) 系统使用的是控制延时的方法来改变输出信号的频率,故频率值的大小不好计算。

解决方法:设定不同的延时时间,从示波器显示的输出波形来计算其对应的频率,并记录下来。再根据每条指令大约的执行时间,来粗略的估计出输出信号的频率与延时时间的函数关系。当然,这种方法所测得的频率与实际频率的误差还是很大的,此问题并没得到完美的解决。

4.3 系统仿真结果

经以上调试,确认程序没有问题时,加载到Proteus软件中进行仿真,所得仿真结果如下。

(1)刚开始运行程序,没有按键操作时,仿真结果如图25所示。

图25 仿真初始化结果
(2)当K1键按下进行波形四种波形选择时,每种波形的仿真结果如下。
图26 正弦波

图27 方波

图28 三角波

图29 锯齿波

(3)波形为正弦波,K2键按下时,输出波形的频率增大仿真如图30 所示。

图30 正弦波频率增加仿真


(4)当波形为矩形波且K4键按下后,矩形波的占空比增加。其仿真结果如图31所示。

图31 矩形波占空比增加仿真
5 结论

经过两个月的努力,终于完成了信号发生器的设计,总结两个月以来的工作,主要有以下几个方面:

(1)通过查阅大量资料使自己对信号发生器的研究现状、原理、工作方式等的基本概念及技术发展有了更好的理解。

(2)针对设计的任务和要求,确定信号发生器的设计方案,并逐步来实现。

(3)本系统使用了单片机作为主控制器,直接由软件产生不同波形信号的输出,因此在如何编写程序方面下了很大的功夫,也收获了很多知识。

(4)在Keil中编写仿真程序,在Proteus中绘制硬件仿真图,并实现联调仿真。从仿真的结果来看,基本完成了设计的要求。

在这两个月的工作中,我也学习到了很多东西。首先,经过此次设计学会了很多关于电子方面的软件:如Proteus、Keil51等。了解到了一个模型从项目选择、方案选择和论证电路设计、元器件选择等到软硬件的设计及实现,再到最终的整机测试和调试整个工作过程,为以后工作打下了坚实的基础。其次,经过这次毕业设计,使我深刻地认识到学好专业知识的重要性,也理解了理论联系实际的含义,提升了我对电子设计和制作的兴趣。

参考文献

[1] 彭伟.单片机C语言程序设计实训100例——基于8051+Proteus仿真[M].电子工业出版社,2009

[2] 王为青,程国刚.单片机Keil Cx51应用开发技术[M].北京:人民邮电出版社,2007

[3] 龚云新.单片机C语言开发技术[M].北京:清华大学出版社,2006

[4] 于永,戴佳.51单片机C语言常用模块与综合系统设计实例讲解[M].北京:电子工业出版社,2007

[5] 蔡美琴等.MCS-51系列单片机系统极其应用[M].北京:高等教育出版社,2004

[6] 林伸茂.8051单片机彻底研究实习篇[M].北京:人民邮电出版社,2004

[7] 胡学海.单片机原理极其应用系统设计[M].北京:电子工业出版社,2005  

[8] 韩志军.单片机应用系统设计[M].北京:机械工业出版社,2005

[9] 舒怀林.单片机原理与接口技术[M].武汉:华中科技大学出版社,2001

[10] 徐爱军,彭秀华.8051单片机实践教程[M].北京:电子工业出版社,2005


评分

参与人数 6黑币 +25 收起 理由
chrccc + 5
yy921311266 + 5 很给力!
吴明山 + 5 很给力!
削刻陶杯 + 3 很给力!
2256611327 + 4 赞一个!
匆匆岁月 + 3 回帖助人的奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏13 转播转播 分享分享4 分享淘帖 顶3 踩
回复

使用道具 举报

沙发
20130626 发表于 2016-4-22 15:00 来自手机 | 只看该作者
这是函数发生器
回复

使用道具 举报

板凳
mingxingxiaobai 发表于 2016-4-27 22:01 | 只看该作者
不错不错
回复

使用道具 举报

地板
yuan2016 发表于 2016-4-29 13:06 | 只看该作者
正在研究这方面的制作,下载下来参考一下。
回复

使用道具 举报

5#
徐小仙 发表于 2016-6-1 21:34 | 只看该作者
很详细的帖子,棒!
回复

使用道具 举报

6#
vanl 发表于 2016-6-6 11:34 | 只看该作者
谢谢楼主,非常感谢
回复

使用道具 举报

7#
Madison 发表于 2016-6-10 16:12 | 只看该作者
谢谢楼主谢谢楼主谢谢楼主谢谢楼主
回复

使用道具 举报

8#
陈丽萍 发表于 2016-6-21 23:39 | 只看该作者
请问谁下载了这个文件的,我怎么下不下来呀,求赐教
回复

使用道具 举报

9#
shabishini 发表于 2016-7-4 16:45 | 只看该作者
非常感谢
回复

使用道具 举报

10#
q317488870 发表于 2016-9-29 19:44 | 只看该作者
有没有联系方式啊,为什么我运行显示逻辑错误啊  LOGIC connection detected
回复

使用道具 举报

11#
a550771322 发表于 2016-10-31 13:22 | 只看该作者
很好,学习到了很多
回复

使用道具 举报

12#
亘黑鹿 发表于 2016-11-2 18:31 | 只看该作者
函数发生器??有什么用??
不管  下载看看!好高档的样子!善哉一个哈哈
回复

使用道具 举报

13#
亘黑鹿 发表于 2016-11-2 18:35 | 只看该作者
程序 50多个错误????
我还是找个简单的吧!
回复

使用道具 举报

14#
416356084 发表于 2016-11-25 22:06 | 只看该作者
谢谢分享
回复

使用道具 举报

15#
erdo1635 发表于 2016-12-20 10:35 | 只看该作者
正在研究这方面的制作,下载下来参考一下。
回复

使用道具 举报

16#
未雨 发表于 2016-12-20 20:29 | 只看该作者
啊啊啊  需要这个呀
回复

使用道具 举报

17#
未雨 发表于 2016-12-20 20:34 | 只看该作者
需要需要
回复

使用道具 举报

18#
rgafhfha 发表于 2016-12-21 11:15 | 只看该作者
好难啊,一脸蒙比
回复

使用道具 举报

19#
k5526226 发表于 2016-12-22 14:54 | 只看该作者
好难啊 下载下来看看
回复

使用道具 举报

20#
lmhzmr 发表于 2016-12-30 13:40 | 只看该作者
这个也没有下载的地方哟
回复

使用道具 举报

21#
飞飞鹰 发表于 2017-2-28 16:20 | 只看该作者
很厉害,顶一顶楼主
回复

使用道具 举报

22#
511搞IT 发表于 2017-4-6 10:30 | 只看该作者
谢谢楼主分享 很详细
回复

使用道具 举报

23#
15178768869 发表于 2017-4-18 16:25 | 只看该作者
楼主  我是新手  想提高正弦波频率   不知道从这个程序中可以从哪些方面改进   
回复

使用道具 举报

24#
山中人家 发表于 2017-5-3 17:27 | 只看该作者
好人一个
回复

使用道具 举报

25#
csh2007100 发表于 2017-5-13 16:34 | 只看该作者
proteus仿真的51单片机信号发生器 课程设计   这个设计感觉不错呦。
回复

使用道具 举报

26#
晴蓝奶茶 发表于 2017-5-17 18:41 | 只看该作者
感谢楼主分享~
回复

使用道具 举报

27#
帅伟 发表于 2017-5-19 13:22 | 只看该作者
楼主不错,很喜欢
回复

使用道具 举报

28#
削刻陶杯 发表于 2017-6-11 21:32 | 只看该作者
如果把占空比改成幅度可调,那该怎么改线路呢?
回复

使用道具 举报

29#
qzm 发表于 2017-6-13 09:53 | 只看该作者
请问怎么在这个基础上改频率步长
回复

使用道具 举报

30#
maoxiaoh 发表于 2017-6-13 10:46 | 只看该作者
楼主写的不错,支持。
回复

使用道具 举报

31#
jwzjwzjwz 发表于 2017-7-3 16:01 | 只看该作者
楼主写的很不错,对我很有帮助
回复

使用道具 举报

32#
aliangliang 发表于 2017-7-7 16:52 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

33#
51heizlxz 发表于 2017-9-5 08:58 | 只看该作者
楼主写得太好了,学习了。
回复

使用道具 举报

34#
qq771555915 发表于 2017-10-9 15:39 | 只看该作者
很感谢,有用
回复

使用道具 举报

35#
活到老。学到老 发表于 2017-10-23 03:29 来自手机 | 只看该作者
直得学习,
回复

使用道具 举报

36#
唐磊 发表于 2017-11-7 23:35 | 只看该作者
帖子很好,正在研究
回复

使用道具 举报

37#
kkkvvvggg 发表于 2017-11-8 00:23 | 只看该作者
直得学习
回复

使用道具 举报

38#
yatou520 发表于 2017-11-10 09:17 来自手机 | 只看该作者
下载下来看看,学习学习
回复

使用道具 举报

39#
hzy11 发表于 2017-12-18 20:22 | 只看该作者
为什么我运行程序出现了错误啊
回复

使用道具 举报

40#
吴明山 发表于 2018-1-9 11:30 | 只看该作者
值得学习
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛5群 联系QQ:125739409;技术交流QQ群174280738

Powered by 单片机教程网

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