• 基于51单片机的可调节占空比四种三种波形发生器proteus仿真


    资料地址:http://www.jh-tec.cn/archives/8351
    简介:

    1. 该系统显示器为LCD1602,可实时显示波形的参数情况
    2. 可显示四种波形,分别是正弦波 三角波方波以及锯齿波
    3. 该系统可以通过按键调节波形的占空比
    4. 波形输出通过仿真软件的示波器可以查看得到
    5. 波形发生器的核心芯片是利用DAC0832产生+运放LM324经过放大之后输出
    6. 其中正弦波和方波输出频率范围100-180HZ,三角波范围为180-500HZ,锯齿波范围也是180-500HZ
    7. 在使用的过程中需要注意的是刚切换波形的时候,LCD上的显示频率还不稳定,需要按频率降低按键来操作回到正常值

    DAC0832芯片的简要介绍:

    DAC0832是双列直插式8位D/A转换器。能完成数字量输入到模拟量(电流)输出的转换。图1-1和图1-2分别为DAC0832的引脚图和内部结构图。
    其主要参数如下:分辨率为8位,转换时间为1μs,满量程误差为±1LSB,参考电压为(+10-10)V,供电电源为(+5+15)V,逻辑电平输入
    与TTL兼容。从图1-1中可见,在DAC0832中有两级锁存器,第一级锁存器称为输入寄存器,它的允许锁存信号为ILE,第二级锁存器称为DA
    C寄存器,它的锁存信号也称为通道控制信号 /XFER。
    图1-1中,当ILE为高电平,片选信号 /CS 和写信号 /WR1为低电平时,输入寄存器控制信号为1,这种情况下,输入寄存器的输出随输入而
    变化。此后,当 /WR1由低电平变高时,控制信号成为低电平,此时,数据被锁存到输入寄存器中,这样输入寄存器的输出端不再随外部数
    据DB的变化而变化。
    对第二级锁存来说,传送控制信号 /XFER 和写信号 /WR2同时为低电平时,二级锁存控制信号为高电平,8位的DAC寄存器的输出随输入而
    变化,此后,当 /WR2由低电平变高时,控制信号变为低电平,于是将输入寄存器的信息锁存到DAC寄存器中。
    图1-1中其余各引脚的功能定义如下:
    (1)、DI7~DI0 :8位的数据输入端,DI7为最高位。
    (2)、IOUT1 :模拟电流输出端1,当DAC寄存器中数据全为1时,输出电流最大,当 DAC寄存器中数据全为0时,输出电流为0(3)、IOUT2 :模拟电流输出端2, IOUT2与IOUT1的和为一个常数,即IOUT1+IOUT2=常数。
    (4)、RFB :反馈电阻引出端,DAC0832内部已经有反馈电阻,所以 RFB端可以直接接到外部运算放大器的输出端,这样相当于将一个反馈
    电阻接在运算放大器的输出端和输入端之间。
    (5)、VREF :参考电压输入端,此端可接一个正电压,也可接一个负电压,它决定0255的数字量转化出来的模拟量电压值的幅度,VREF
    范围为(+10-10)V。VREF端与D/A内部T形电阻网络相连。
    (6)、Vcc :芯片供电电压,范围为(+5~ 15)V。
    (7)、AGND :模拟量地,即模拟电路接地端。
    (8)、DGND :数字量地。
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    LM324的简要介绍:

    LM324是四运放集成电路,它采用14脚双列直插塑料封装,外形如图所示。它的内部包含四组形式完全相同的运算放大器,
    除电源共用外,四组运放相互独立。 
    每一组运算放大器可用图1所示的符号来表示,它有5个引出脚,其中“+”、“-”为两个信号输入端,“
    V+”、“V-”为正、负电源端,“Vo”为输出端。两个信号输入端中,Vi--)为反相输入端,表示运放输出端Vo的信号
    与该输入端的相位相反;Vi++)为同相输入端,表示运放输出端Vo的信号与该输入端的相位相同。LM324的引脚排列见图2
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    下面是仿真图:
    在这里插入图片描述
    仿真图2简介:

    本系统采用C51单片机作为系统的MCU,该系统显示器为LCD1602,可实时显示波形的参数情况
    可显示三种波形,分别是正弦波 三角波方波,其中三角波频率范围是50-500HZ,方波的频率范围是20-2000HZ,正弦波范围是10-100HZ
    该设计不支持调节波形的占空比
    波形输出通过仿真软件的示波器可以查看得到
    波形发生器的核心芯片是利用DAC0832产生+运放经过放大之后输出
    三个功能按键分别是波形选择、频率增加、频率减少
    在这里插入图片描述

    参考代码如下:

    #include 
    #include
    #define uchar unsigned char
    #define uint unsigned int
    sbit RS=P3^0;
    sbit RW=P3^1;
    sbit EN=P3^3;
    sbit K1=P2^0;
    sbit K2=P2^1;
    sbit K3=P2^2;
    sbit K4=P2^3;
    sbit K5=P2^4;
    uchar WaveChoice=1;
    uchar ys=30;
    uchar i,a=0;
    uchar sqar_num=128;
    uint freq;
    uchar code Sin[]={"Sine      "};
    uchar code Squ[]={"Square    "} ;
    uchar code Tri[]={"Triangle  "};
    uchar code Saw[]={"Sawtooth  "} ;
    uchar code No[]={"No Signal out "};
    uchar code Wave[]={"Wave :"}; 
    uchar code Fre[]={"Freq :"};
    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 DelayMS(uchar ms)
    {
    	uchar i;
    	while(ms--) for(i=0;i<120;i++);
    }
     void Delay1(uint y)
     {
     	uint i;
    	for(i=y;i>0;i--);
     }
    uchar Busy_Check()
    {
    	uchar LCD_Status;
    	RS=0;  //	寄存器选择
    	RW=1; //读状态寄存器
    	EN=1;  // 开始读
    	DelayMS(1);
    	LCD_Status=P1;
    	EN=0;
    	return  LCD_Status;
    
    }
    void Write_LCD_Command(uchar cmd)
    {
    	   while((Busy_Check()&0x80)==0x80);   //忙等待
    	   RS=0;  //选择命令寄存器
    	   RW=0;  //写
    	   EN=0;
    	   P1=cmd;EN=1;DelayMS(1);EN=0;
    }
    void Write_LCD_Data(uchar dat)
    {
    	 while((Busy_Check()&0x80)==0x80);   //忙等待	
    	  RS=1;  RW=0; EN=0; P1=dat;EN=1;DelayMS(1);EN=0;	
    }
    void Init_LCD()
    {		
    	Write_LCD_Command(0x38);
    	DelayMS(1);
    	Write_LCD_Command(0x01); //清屏
    	DelayMS(1);
    	Write_LCD_Command(0x06); //字符进入模式:屏幕不动,字符后移
    	DelayMS(1);
    	Write_LCD_Command(0x0C); //显示开、关光标
    	DelayMS(1);
    }
    void Write_freq(uint k)
    {
    	uchar qian,bai,shi,ge;
    	qian=k/1000;
    	bai=k/100%10;
    	shi=k/10%10;
    	ge=k%10;
    	Write_LCD_Command(0x86+0x40);
    	Write_LCD_Data(0x30+qian);
    	Write_LCD_Data(0x30+bai);
    	Write_LCD_Data(0x30+shi);
    	Write_LCD_Data(0x30+ge);
    	Write_LCD_Data(0x48);
    	Write_LCD_Data(0x5a);
    }
      void Xianshi_f()		   
    {
      if(WaveChoice==1)
      {
         freq=(10000000/(50000+2860*ys));
    	 Write_freq(freq);
      }
      if(WaveChoice==2)
      {
         freq=(10000000/(50000+2300*ys));
    	 Write_freq(freq);
      }
       if(WaveChoice==3)
      {
         freq=(10000000/(14000+2300*ys));
    	 Write_freq(freq);
      }
        if(WaveChoice==4)
      {
         freq=(10000000/(15000+2300*ys));
    	 Write_freq(freq);
      }
    }
    void Write_wave(uchar  t )
    {
    	switch(t)
    	{
    		case 0:
    				 Write_LCD_Command(0x86);
      				 DelayMS(5);
       				 for (i=0;i<sizeof(No)-1;i++)
    					{
    						Write_LCD_Data(No[i]);
    						DelayMS(5);
    					}
    					break;
    		case 1:
    				ys=25;
    				Write_LCD_Command(0x86);
      				 DelayMS(5);
       				 for (i=0;i<sizeof(Sin)-1;i++)
    					{
    						Write_LCD_Data(Sin[i]);
    						DelayMS(5);
    					}
    				break;
    		case 2:
    				ys=30;
    				Write_LCD_Command(0x86);
      				 DelayMS(5);
       				 for (i=0;i<sizeof(Squ)-1;i++)
    					{
    						Write_LCD_Data(Squ[i]);
    						DelayMS(5);
    					 }
    			
    				break;
    		case 3:
    				ys=30;
    				Write_LCD_Command(0x86);
      				 DelayMS(5);
       				 for (i=0;i<sizeof(Tri)-1;i++)
    					{
    						Write_LCD_Data(Tri[i]);
    						DelayMS(5);
    					}
    				break;
    		case 4:
    				ys=30;
    			  	 Write_LCD_Command(0x86);//液晶显示位置
      				 DelayMS(5);
       				 for (i=0;i<sizeof(Saw)-1;i++)
    					{
    						Write_LCD_Data(Saw[i]);
    						DelayMS(5);
    					 }
    				break;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
  • 相关阅读:
    Windows的Git Bash使用tree命令
    【小航的算法日记】哈希
    es6 数据类型
    车载以太网-传输层-TCP
    服务器数据恢复-UNIX类文件系统软件层级故障的数据恢复可能性分析
    软件测试面试真题 | 什么是PO设计模式?
    本周内容整理
    Shell脚本之正则表达式详解
    【Spring】IDEA&spring-mybatis的整合----关于配置文件的整合、AOP事务处理(配置&注解)
    【xxl-job】你与xxl-job仅差这个示例
  • 原文地址:https://blog.csdn.net/jianghuxiaoge/article/details/127915858