仿真图1简介:

本系统采用51单片机作为系统的MCU(具体型号见下图),该系统显示器为四位数码管,可实时显示波形的参数情况
可显示四种波形,分别是方波、正弦波、三角波、锯齿波。
该设计具有电压表功能,可显示当前所测电压参数,其中ADC芯片采用的是PCF8591
该设计不支持调节波形的占空比
波形输出通过仿真软件的示波器可以查看得到
系统设计有一个功能按键作为波形切换功能。

#include <reg51.h>
#include <PCF8591.h>
#include <seg.h>sbit KEY = P3^7;unsigned char code sin_num[]={0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,
2,3,3,4,4,4,5,5,6,6,7,7,8,8,9,9,
10,10,11,12,12,13,14,15,15,16,17,18,18,19,20,21,
22,23,24,25,25,26,27,28,29,30,31,32,34,35,36,37,
38,39,40,41,42,44,45,46,47,49,50,51,52,54,55,56,
57,59,60,61,63,64,66,67,68,70,71,73,74,75,77,78,
80,81,83,84,86,87,89,90,92,93,95,96,98,99,101,102,
104,106,107,109,110,112, 113,115,116,118,120,121,123,124,126,128,
129,131, 132,134,135, 137, 139,140,142,143,145,146,148, 149,151,153,
154,156,157,159,160,162,163,165, 166,168,169,171,172,174,175,177,
178,180,181, 182,184,185,187,188,189,191,192,194,195,196,198,199,
200,201,203,204,205,206,208,209,210,211,213,214,215,216,217,218,
219,220,221,223,224,225,226,227,228,229,230,230,231,232,233,234,
235,236,237,237,238,239,240,240,241,242,243,243,244,245,245,246,
246,247,247,248,248,249,249,250,250,251,251, 251,252,252,253,253,
253,253,254,254,254,254,254,255,255,255,255, 255,255,255,255,255
}; //这是正弦波上升半周期的采样uchar Recv_Buffer;//数据接收缓冲
uchar Voltage[]="0.000V  ";//数据分解为电压x.xx
float Vol_Am;                               //放大后的电压值
uchar key_ms;
uchar mode;void delay(unsigned int x)//延时
{while(--x);
}void key_pro()
{if(KEY == 0) key_ms++;if(key_ms    >= 5){if(KEY == 0){key_ms = 0;mode++;if(mode >= 5) mode = 0;while(!KEY);}}
}void DAC_Wave()
{int i;switch(mode){case 1: //三角波for(i=0;i<255;i++){DAC_PCF(i);key_pro();}for(i=255;i>0;i--){DAC_PCF(i);key_pro();}break;case 2://方波DAC_PCF(0);delay(2500);DAC_PCF(0xff);delay(2500);break;case 3://三角波for(i=255;i>0;i--){DAC_PCF(i);key_pro();}break;case 4: //正弦波 采用数组采样值 波形更好for(i=0;i<255;i++){DAC_PCF(sin_num[i]);key_pro();}for(i=255;i>=0;i--){DAC_PCF(sin_num[i]);key_pro();}break;default : DAC_PCF(0x00);//否则为0 防错}
}// 转换模数转换后得到的值
void Convert_To_Voltage(uchar val)
{Vol_Am = val;Vol_Am = Vol_Am*5/255*1000;Voltage[4]=(uint)Vol_Am%10+'0';Voltage[3]=(uint)Vol_Am/10%10+'0';Voltage[2]=(uint)Vol_Am/100%10+'0';Voltage[0]=(uint)Vol_Am/1000%10+'0';
}void dis_pro()
{if(mode == 0){ISendByte(0x00);Recv_Buffer=IRcvByte(); Convert_To_Voltage(Recv_Buffer);seg_display((uint)Vol_Am);}else{seg_display_One(mode);DAC_Wave();}
}void main()
{while(1){key_pro();dis_pro();}
}

仿真图2简介:

本系统采用51单片机作为系统的MCU(具体型号见下图),该系统显示器为两个两位数码管,分别显示波形频率和幅度
可显示三种波形,分别是方波、正弦波、三角波。
该设计不支持调节波形的占空比
波形输出通过仿真软件的示波器可以查看得到
系统设计有七个功能按键,其中三个分别是波形选择按键,另外四个按键分别功能是频率加减和幅度加减。
波形发生器的核心芯片是利用DAC0832产生+运放LM358经过放大之后输出

#include<reg51.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code tab2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //  带小数点的0-9uchar ds[]={135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128};
uchar code sin_param[64]={135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128};uchar code Triangle[64]={0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,
248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0};uchar flag=1,time=0,sum=0,timer=0;
unsigned long frequency=10,volt=50,chuzhi=20000;
double acc=1;
uint  SH=0xff,SL=0x38,SQH=0xb1,SQL=0xe0;
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;  //  三种波按钮
sbit key4=P2^3;     //  频率-
sbit key5=P2^4;     //  频率+
sbit key6=P2^5;     //  幅值+
sbit key7=P2^6;     //  幅值-
sbit fsw=P3^4;
sbit fgw=P3^5;
sbit vgw=P3^6;
sbit vxw=P3^7;void delay()
{uchar i;for(i=0;i<125;i++);
}void init_ST()
{uint schuzhi;schuzhi=(15625/frequency);SH=(65536-schuzhi)/256;SL=(65536-schuzhi)%256;}
void init_Sq()
{if(frequency>=8)chuzhi=500000/frequency;elsechuzhi=50000/frequency;SQH=(65536-chuzhi)/256;SQL=(65536-chuzhi)%256;}void display()
{fsw=0;P0=tab1[frequency/10];delay();P0=0x00;fsw=1;fgw=0;P0=tab1[frequency%10];delay();P0=0x00;fgw=1;vgw=0;P0=tab2[volt/10];delay();P0=0x00;vgw=1;vxw=0;P0=tab1[volt%10];delay();P0=0x00;vxw=1;}void main()
{TMOD=0X11;EA=1;IT0=1;ET0=1;ET1=1;EX0=1;TH0=0xff;TL0=0x38;  //200usTH1=(65536-20000)/256;TL1=(65536-20000)%256;TR0=1; while(1){display();}
}void  zhongduan0() interrupt 1
{ TH0=SH;TL0=SL;time++;if(time==64)time=0;if(flag==1){sum=ds[time];P1=sum;}if(flag==2){sum=ds[time];P1=sum;}if(flag==3){TR0=0;TR1=1; }}void zhongduan1() interrupt 3
{TH1=SQH;TL1=SQL;timer++;if(flag==3){ if(frequency>=8){ sum=0xff*acc;if(timer%2==0)P1=0x00;elseP1=sum;}else{sum=0xff*acc;if((timer/10)%2==0)P1=0x00;elseP1=sum;}}if(flag==1||flag==2){TR1=0;TR0=1;}if(timer==100)timer=0;}void keyscanFV() interrupt 0
{uchar i;EX0=0;delay();if(key1==0){flag=1;for(i=0;i<64;i++)ds[i]=sin_param[i];}if(key2==0){flag=2;for(i=0;i<64;i++)ds[i]= Triangle[i];}if(key3==0)flag=3;if (key4==0){if(frequency<99){frequency++;init_ST();init_Sq();}}else if(key5==0){ if(frequency>0){frequency--;init_ST();init_Sq();}}

仿真图3简介:

本系统采用C51单片机作为系统的MCU,该系统显示器为LCD12864,可实时显示波形的参数情况
可显示四种波形,分别是正弦波 三角波方波锯齿波,且它们的频率范围均是0-400HZ
该设计不支持调节波形的占空比
波形输出通过仿真软件的示波器可以查看得到
波形发生器的核心芯片是利用DAC0832产生+运放UA741经过放大之后输出,可以通过电位器手动调节波形的幅度大小
系统设计有两个功能按键分别是切换波形和频率调节等功能。

#include <reg52.h>
#include <math.h>
#include <intrins.h>
#include <lcd12864.h>#define DAC_OUT  P2sbit change_wave=P3^2;               //改变波形按键
sbit change_rate=P3^3;               //改变频率按键
uchar mode=0,rate=0,delay_time=0,k,p; //为波形发生模块提供中间变量
uchar *which_wave,*which_wave2;
uint rate_num;uchar code Sine_wave[64]=                                    //DA输出对应电压值对应的数字量,正弦波
{128,114,102,90,78,66,55,45,36,28,20,14,9,5,2,1,1,1,3,7,11,17,24,32,41,50,61,72,84,96,108,121,133,146,158,170,182,193,204,213,222,230,237,243,247,251,253,254,254,252,249,245,240,234,226,218,209,199,188,176,167,158,145,135
};uchar code Sawtooth_Wave[64]=                                //锯齿波
{255,251,247,243,239,235,231,227,223,219,215,210,206,202,198,194,190,186,182,178,174,170,166,162,158,154,150,146,142,138,134,130,125,121,117,113,109,105,101,97,93,89,85,81,77,73,69,61,57,53,49,45,40,36,32,28,24,20,16,12,8,4,0
};uchar code Square_wave[64]=                                  //方波
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
};uchar code Triangular_Wave[64]=                              //三角波
{0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
};void wave_delay()                         //波形延时函数
{int a,b;for(a=1; a>0; a--)for(b=122; b>0; b--);
}void wave_init()             //波形发生模块的初始化(外部中断0、1)
{EA=1;IT0=1;             //下降沿触发EX0=1;IT1=1;EX1=1;
}void disp_wave(uchar *wave)   //显示波形函数
{uchar page,i;uint date;select(1);                              //选择左屏for(i=32; i<64; i++){page=7-(wave[i]/4)/8;date=7-(wave[i]/4)%8;date=pow(2,date);setpos(page,i);              //选择行列lcd_wdat(date);}select(2);                                //选择右屏for(i=0; i<64; i++){page=7-(wave[i]/4)/8;date=7-(wave[i]/4)%8;date=pow(2,date);setpos(page,i);               //选择行列lcd_wdat(date);}
}void main()
{lcd_init();clr_screen();which_wave=&Sine_wave[0];disp_chinese();disp_function(chinese_sine);disp_rate(400);disp_xy();disp_wave(which_wave);wave_init();while(1){delay_time=rate;            //rate=0时,12mhz下,为400hz的波形。循环一次的时间为0.00025msDAC_OUT=*(which_wave+k);k++;if(k==64)k=0;while(delay_time)delay_time--;}
}void int0() interrupt 0    //波形选择中断服务程序
{EX0=0;wave_delay();mode++;if(mode==4)mode=0;switch(mode){case 0 :                                                                                //显示正弦波which_wave=&Sine_wave[0];which_wave2=&chinese_sine[0];break;case 1 :                                                                               //显示三角波which_wave=&Triangular_Wave[0];which_wave2=&chinese_triangular[0];break;case 2 :                                                                               //显示方波which_wave=&Square_wave[0];which_wave2=&chinese_square[0];break;case 3 :                                                                                //显示锯齿波which_wave=&Sawtooth_Wave[0];which_wave2=&chinese_sawtooth[0];break;}wave_delay();clr_screen();                                                                        disp_chinese();                                                             disp_rate(400/rate);disp_function(which_wave2);disp_xy();disp_wave(which_wave);while(!change_wave);EX0=1;
}void int1() interrupt 2       //频率选择
{EX1=0;wave_delay();p++;if(p==50)p=0;rate=p;wave_delay();rate_num=1/((0.000036+0.000006*rate)*64);clc_rate();disp_rate(rate_num);while(!change_rate);EX1=1;
}

源文件: http://www.jh-tec.cn/archives/8351

基于51单片机的波形发生器proteus仿真数码管LCD12864显示相关推荐

  1. 基于51单片机MPX4115的压力测量仪proteus仿真 数码管显示

    硬件设计 (末尾附文件) 总体设计方案 本次设计是基于8051单片机的测量与显示.利用传感器将压力转换为电信号后,在经过ADC0832的模数转换器经A/D转换后由单片机进行有效处理,然后用数码管进行显 ...

  2. 基于51单片机的计算器 汇编语言 proteus仿真 数码管显示

    之前讲的计算器都是基于C语言的,接下来讲一下基于汇编语言的简易计算器. 硬件设计 显示器仍然是数码管,MCU是C51,支持整数部分的计算 仿真图: 程序设计 YJ EQU 50H ;结果存放 YJ1 ...

  3. 基于51单片机的波形发生器(四种波形)(毕业设计资料)

    四种波形的产生,包括锯齿波.三角波.方波.正弦波.通过LCD液晶显示当前波形以及波形的频率.可以通过按键切换波形,并可以通过按键进行设置当前波形的频率大小,也可以设置频率设置不步进值.资料从主页链接中 ...

  4. 【019】基于51单片机的交通灯Proteus仿真设计

    一.资料内容 (1).基于51单片机的交通灯proteus仿真设计一份: (2).基于51单片机的交通灯proteus仿真设计keli源代码一份: (3).基于51单片机的交通灯proteus仿真设计 ...

  5. 【034】基于51单片机的HX711电子秤Proteus仿真设计

    一.压缩包资料内容 (1).基于51单片机的HX711电子秤proteus仿真设计一份: (2).基于51单片机的HX711电子秤proteus仿真设计keli源代码一份: (3).基于51单片机的H ...

  6. 基于51单片机的烟雾火灾报警器proteus仿真设计

    基于51单片机的烟雾火灾报警器proteus仿真设计 1 开发环境 仿真图:proteus8.9以上 程序代码:KEIL4/KEIL5 原理图:AD 设计编号:A0004 代码讲解+仿真讲解+仿真演示 ...

  7. 【002】基于51单片机的电子万年历proteus仿真设计

    一.资料内容(私信获取) (1).基于51单片机的电子万年历proteus仿真设计一份: (2).基于51单片机的电子万年历proteus仿真设计keli源代码一份: (3).基于51单片机的电子万年 ...

  8. 【008】【毕业设计】基于51单片机的烟雾报警系统proteus仿真与实物设计

    ​一.压缩包资料内容(私信获取) (1).基于51单片机的烟雾报警系统proteus仿真设计一份: (2).基于51单片机的烟雾报警系统proteus仿真设计keli源代码一份: (3).基于51单片 ...

  9. 【013】【毕业设计】基于51单片机的节能路灯proteus仿真设计

    ​一.资料内容(私信) (1).基于51单片机的节能路灯proteus仿真设计一份: (2).基于51单片机的节能路灯proteus仿真设计keli源代码一份: (3).基于51单片机的节能路灯pro ...

最新文章

  1. python 把集合转成字典的方法
  2. 掌握Python字典的12个例子
  3. 前端学习(3161):react-hello-react之样式的模块化
  4. 素描java字母_进行Java基本GUI设计需要用到的包是
  5. MacOS下载钉钉直播回放经验总结
  6. Qt创建多线程的两种方法
  7. 【NER】NLP-入门实体命名识别(NER)+Bilstm-CRF模型原理Pytorch代码详解——最全攻略...
  8. linux mint xmind运行,linux安装Xmind的经验
  9. php学校整站,PHP适应式大学院校学校类网站整站源码(自适应手机移动端) dedecms内核...
  10. JavaScript 基础(超详细)
  11. 安装华为P10plus的手机驱动过程
  12. 视觉能力提升112%!李飞飞团队让AI进入社会,学会了“骗”标注…
  13. c语言 重新输入,C语言函数重新输入
  14. 多益网络2022届校招提前批全面启动【免筛推荐码QEAQU】
  15. echarts3在Y轴上做基准线
  16. HTML <div> 标签的 align 属性 align=“absmiddle“
  17. SpringBoot OSS实战之用户头像上传
  18. steam搬砖价值3000的教程
  19. 多种方法简单轻松的清理站点多余缩略图(建站必备)
  20. 虚拟空间+AI设计是锦上添花吗?|​聊聊虚拟空间设计

热门文章

  1. Hibernate配置文件的编写一
  2. 程序猿如何练习用英语讲好一个笑话?
  3. QT实现窗口置顶、置顶状态切换、多窗口置顶优先关系
  4. Qt 窗口置顶与取消
  5. Win10预览版常用快捷键
  6. CDH6.3整合Carbondata
  7. 【第50篇】迈向快速、灵活、稳健的微光图像增强
  8. 系统架构设计笔记(103)—— 标准化知识
  9. 2022G2电站锅炉司炉考题及在线模拟考试
  10. HTML垂直居中布局