用单片机输出方波三角波及锯齿波

合集下载

89C51单片机设计多功能低频函数信号发生器,能产生方波、正弦波、三角波等信号波形

89C51单片机设计多功能低频函数信号发生器,能产生方波、正弦波、三角波等信号波形

波形发生器是一种常用的信号源,广泛地应用于电子电路、自动控制系统和教学实验等领域。

本次课程设计使用的AT89S51 单片机构成的发生器可产生锯齿波、三角波、正弦波等多种波形,波形的周期可以用程序改变,并可根据需要选择单极性输出或双极性输出,具有线路简单、结构紧凑等优点。

在本设计的基础上,加上按钮控制和LED显示器,则可通过按钮设定所需要的波形频率,并在LED上显示频率、幅值电压,波形可用示波器显示。

二、系统设计波形发生器原理方框图如下所示。

波形的产生是通过AT89S51 执行某一波形发生程序,向D/A转换器的输入端按一定的规律发生数据,从而在D/A转换电路的输出端得到相应的电压波形。

在AT89S51的P2口接5个按扭,通过软件编程来选择各种波形、幅值电压和频率,另有3个P2口管脚接TEC6122芯片,以驱动数码管显示电压幅值和频率,每种波形对应一个按钮。

此方案的有点是电路原理比较简单,实现起来比较容易。

缺点是,采样频率由单片机内部产生故使整个系统的频率降低。

1、波形发生器技术指标1)波形:方波、正弦波、锯齿波;2)幅值电压:1V、2V、3V、4V、5V;3)频率:10HZ、20HZ、50HZ、100HZ、200HZ、500HZ、1KHZ;2、操作设计1)上电后,系统初始化,数码显示6个…-‟,等待输入设置命令。

2)按钮分别控制“幅值”、“频率”、“方波”、“正弦波”、“锯齿波”。

3)“幅值“键初始值是1V,随后再次按下依次增长1V,到达5V后在按就回到1V。

4)“频率“键初始值是10HZ,随后在按下依次为20HZ、50HZ、100HZ、200HZ、500HZ、1000HZ循环。

三、硬件设计本系统由单片机、显示接口电路,波形转换(D/A)电路和电源等四部分构成。

电路图2附在后1、单片机电路功能:形成扫描码,键值识别、键处理、参数设置;形成显示段码;产生定时中断;形成波形的数字编码,并输出到D/A接口电路和显示驱动电路。

利用单片机AT89C52采用程序设计方法产生锯齿波

利用单片机AT89C52采用程序设计方法产生锯齿波

1 引言本系统利用单片机AT89C52采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,能产生10Hz—10kHz的波形。

通过键盘来控制四种波形的类型选择、拨码开关控制频率的变化,并通过液晶屏1602显示其各自的类型以及数值,系统大致包括信号发生部分、数/模转换部分以及液晶显示部分三部分,其中尤其对数/模转换部分和波形产生和变化部分进行详细论述。

2设计方案2.1系统硬件设计概述经过考虑,我们确定方案如下:利用AT89C52单片机采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,通过键盘来控制四种波形的类型选择、频率变化,最终输出显示其各自的类型以及数值。

2.2、设计要求1)、利用单片机采用软件设计方法产生四种波形2)、四种波形可通过键盘选择3)、波形频率可调4)、需显示波形的种类及其频率2.1.2方案设计与论证1.2.1 信号发生电路方案论证方案一:通过单片机控制D/A,输出四种波形。

此方案输出的波形不够稳定,抗干扰能力弱,不易调节。

但此方案电路简单、成本低。

方案二:使用传统的锁相频率合成方法。

通过芯片IC145152,压控振荡器搭接的锁相环电路输出稳定性极好的正弦波,再利用过零比较器转换成方波,积分电路转换成三角波。

此方案,电路复杂,干扰因素多,不易实现。

方案三:利用MAX038芯片组成的电路输出波形。

MAX038是精密高频波形产生电路,能够产生准确的锯齿波、三角波、方波和正弦波四种周期性波形。

但此方案成本高,程序复杂度高。

以上三种方案综合考虑,选择方案一。

1.2.2 单片机的选择论证方案一:AT89C52单片机是一种高性能8位单片微型计算机。

它把构成计算机的中央处理器CPU、存储器、寄存器、I/O接口制作在一块集成电路芯片中,从而构成较为完整的计算机、而且其价格便宜。

51-单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程序

51-单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程序

显示频率,幅度可调,可产生四种波形,正弦波,方波,锯齿波,三角波,希望你能喜欢,给你发了一张效果图,喜欢的话别忘了采纳我的回答啊#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define DAdata P0 //DA数据端口sbit DA_S1= P2^0; // 控制DAC0832的8位输入寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit DA_S2= P2^1; // 控制DAC0832的8位DAC寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit key= P3^2;uchar wavecount; //'抽点'计数uchar THtemp,TLtemp;//传递频率的中间变量uchar judge=1; //在方波输出函数中用于简单判别作用uchar waveform; //当其为0、1、2时,分别代表三种波uchar code freq_unit[3]={10,50,200}; //三种波的频率单位uchar idata wavefreq[3]={1,1,1}; //给每种波定义一个数组单元,用于存放单位频率的个数uchar code lcd_hang1[]={"Sine Wave " "Triangle Wave " "Square Wave " "Select Wave: " "press No.1 key! "};uchar idata lcd_hang2[16]={"f= Hz "};uchar code waveTH[]={0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xec,0xf6,0xf9,0xfb,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe};uchar code waveTL[]={0x06,0x8a,0x10,0x4e,0x78,0x93,0xa8,0xb3,0xbe,0xc6, //正弦波频率调整中间值0xac,0xde,0x48,0x7a,0x99,0xaf,0xbb,0xc8,0xd0,0xde, //三角波频率调整中间值0x88,0x50,0x90,0x32,0x34,0xbe,0x4a,0xa3,0xe5,0x2c};/**************************************************************************************** *********/uchar code triangle_tab[]={ //每隔数字8,采取一次0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x 60,0x68,0x70,0x78,0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0x e0,0xe8,0xf0,0xf8,0xff,0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x9 8,0x90,0x88,0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x 18,0x10,0x08,0x00};uchar code sine_tab[256]={//输出电压从0到最大值(正弦波1/4部分)0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa 5,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,//输出电压从最大值到0(正弦波1/4部分)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,0x d6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9 c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,//输出电压从0到最小值(正弦波1/4部分)0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5 a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x 22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x 03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,//输出电压从最小值到0(正弦波1/4部分)0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x 06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x 29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x 63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};void delay(uchar z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void triangle_out() //三角波输出{DAdata=triangle_tab[wavecount++];if(wavecount>64) wavecount=0;DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器void sine_out() //正弦波输出{DAdata=sine_tab[wavecount++];DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器}void square_out() //方波输出{judge=~judge;if(judge==1) DAdata=0xff;else DAdata=0x00;DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器}/************1602液晶的相关函数*************/#define lcd_ports P1sbit rs=P2^2;sbit rw=P2^3;sbit lcden=P2^4;void write_com(uchar com){rs=0; //置零,表示写指令lcden=0;lcd_ports=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){rs=1; //置1,表示写数据(在指令所指的地方写数据)lcden=0;lcd_ports=date;delay(5);lcden=1;delay(5);lcden=0;void disp_lcd(uchar addr,uchar *temp1){uchar num;write_com(addr);delay(1); //延时一会儿???for(num=0;num<16;num++){write_date(temp1[num]);//或者这样写write_date(*(temp1+num));delay(1);}}void init_lcd(){//uchar num;lcden=0; //可有可无???rw=0; //初始化一定要设置为零,表示写数据write_com(0x38); //使液晶显示点阵,为下面做准备write_com(0x0c); //初始设置write_com(0x06); //初始设置write_com(0x01); //清零write_com(0x80); //使指针指向第一行第一格disp_lcd(0x80,&lcd_hang1[3*16]); //在第一行显示disp_lcd(0xc0,&lcd_hang1[4*16]); //在第二行显示}/********************1602液晶函数声明结束*********************/ void main(){uchar i=0;DA_S2=0; //使DAC寄存器处于直通状态DAdata=0;DA_S1=1; //关闭8位输入寄存器init_lcd();waveform=0;TMOD=0x01; //设置定时器0为16位工作方式IT0=1; //设置外部中断0为下降沿触发ET0=1; //开定时器中断EX0=1;EA=1;while(1){//DAout(0xff); //可输出TTL波形//DAout(0x80);//T_temp=32;}}void timer0() interrupt 1{TH0=THtemp;TL0=TLtemp;if(waveform==0) sine_out();else if(waveform==1) triangle_out();else if(waveform==2) square_out();}void key_int0() interrupt 0{uchar keytemp;uint total_freq; //总频率EA=0; TR0=0; //关总中断与定时器delay(5); //延时够吗???if(key==0) //确实有按键按下而引发中断{keytemp=P3&0xf0; //获取P3口高四位的值switch(keytemp){case 0xe0: //选择波形waveform++;if(waveform>2) waveform=0;break;case 0xd0: //频率按规定单位依次增加wavefreq[waveform]++;if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*这边要用“>10”,因为它比“=11”可靠break;case 0xb0: //频率按规定单位依次衰减wavefreq[waveform]--;if(wavefreq[waveform]<1) wavefreq[waveform]=10; //这边要用“<1”,因为它比“=0”可靠性更高break;case 0x70: //TTL输出DA_S2=1; //使DAC寄存器关闭break;}THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括号中选取第几个数后,并把该值赋给T_tempTLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];total_freq= wavefreq[waveform] * freq_unit[waveform]; //求输出频率(个数*单位)lcd_hang2[5]=total_freq%10+0x30; //在液晶中显示个位,(0x30 在液晶显示中表示数字0)total_freq/=10; lcd_hang2[4]=total_freq%10+0x30; //在液晶中显示时十位total_freq/=10; lcd_hang2[3]=total_freq%10+0x30; //在液晶中显示时百位total_freq/=10; lcd_hang2[2]=total_freq%10+0x30; //在液晶中显示时千位disp_lcd(0x80,&lcd_hang1[waveform*16]); //在第一行显示disp_lcd(0xc0,lcd_hang2); //在第二行显示}wavecount=0; //'抽点'计数清零while(!key);EA=1; TR0=1; //开启总中断与定时器}。

单片机产生各种波形及其程序图

单片机产生各种波形及其程序图

,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe
9,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,0x e9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda ,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb 1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0 x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51 ,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0 x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0 x02,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,0 x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e ,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0 x80 }; void delayms(uint t) {

用单片机输出方波三角波及锯齿波

用单片机输出方波三角波及锯齿波

实验四实验任务:AT89C51单片机的数字式低频信号发生器。

采用AT89C51 单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)、运放电路(LM324)、按键等。

通过按键控制可产生方波、锯齿波、三角波。

原理图:注:1.如上图所示2.此原理图应用Proteus 7 ISIS 7.5 SP3绘制,所选用晶体振荡器频率为12MHz。

其余元件参数见图上标注。

程序内容:#include<absacc.h>#include<reg51.h>#define DA0832 XBYTE[0xfffe] #define uchar unsigned char #define uint unsigned int sbit juchi=P1^0;sbit sanjiao=P1^1;sbit fangbo=P1^2;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void aa(){uchar n;if(juchi==0){while(1){for(n=0;n<=255;n=n++) {DA0832=n;}}}}void bb(){uchar n;if(sanjiao==0){while(1) {for(n=0;n<=256;n=n++){if(n<128)DA0832=n;elseDA0832=256-n;}}}}void cc(){uchar n;if(fangbo==0){while(1){for(n=0;n<=255;n=n++){if(n<128) DA0832=0; else DA0832=255;}}}}void main(){aa();bb();cc();}程序流程图::。

单片机产生方波、锯齿波、三角波程序

单片机产生方波、锯齿波、三角波程序
sbit S0=P3^0; //波形选择,每次按下将产生不同的波形
sbit S1=P3^1; //频率减
sbit S2=P3^2; //频率加
sbit S3=P3^3; //调节方波的占空比
uchar code SinTab[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
单片机产生方波、锯齿波、三角波程序
单片机产生方波、锯齿波、三角波程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char x=0,m=0,y=128;
sbit WR_DA=P2^1;
sbit CS_DA=P2^0;//DA与单片机的接口
,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 };
if(S0==0) m++;
while(!S0);//松手检测
}
if(S1==0)
{
delayms(10);
if(S1==0) x=x+1;

基于51单片机和DAC0832的多路波形发生器(汇编语言编写)

基于51单片机和DAC0832的多路波形发生器(汇编语言编写)

以多种波形发生器为对象,选择单片机、独立按键及D/A转换器,设计相应的电路构成多种波形发生器。

功能要求:1.有4个功能键,分别用来选择输出:三角波、锯齿波、梯形拨、方波。

2.按下某个功能键,进入中断,在中断程序中查询、确定是哪个功能键,并输出对应的波形。

3.显示器2位,显示功能号01、02、03、04,代表输出三角波、锯齿波、梯形拨、方波。

设计任务:1、完成单片机最小系统电路设计。

2、完成按键电路设计。

3、完成D/A转换及接口电路的设计。

4、完成显示电路的设计。

电路图如下:(proteus仿真通过)其一仿真图:源程序如下:ORG 00HSTART:LJMP MAINORG 0003H;外部xxxxLJMP INSER;转到xx服务程序ORG 0030HMAIN:MOV DPTR,#7FFFH;DAC0832地址SETB EX0;允许xxSETB IT0;负边沿触发方式SETB EA;开xxHERE:JB 20H.0,ST;锯齿波处理JB 20H.1,TRI;三角波处理JB 20H.2,SQ;方波处理JB 20H.3,TXB;梯形波处理SJMP HERE;等待xxINSER:JNB P1.0, LL1;中断服务程序,查询按键SJMP L1LL1:MOV 20H,#00HSETB 20H.0;设置锯齿波标志SJMP RTL1:JNBP1.2, LL2SJMP L2LL2:MOV 20H,#00HSETB 20H.1;设三角梯波标志SJMP RTL2:JNB P1.4, LL3SJMP L3LL3:MOV 20H,#00HSETB 20H.2;设置方波标志SJMP RTL3:JNB P1.6, LL4SJMP RTLL4:MOV 20H,#00HSETB 20H.3;设置梯形波标志RT:RETI;xx返回ST:1.1;锯齿波CLR P1.3SETB P1.5CLR P1.7MOVA,#00HLOOPP:MOVX@DPTR,A;启动D/A转换INCAJB20H.0,LOOPP;连续输出波形LJMPHERETRI:CLR P1.1;三角波CLR P1.3CLR P1.51.7MOVA,#00HUP:MOVX@DPTR,A;启动D/A转换INCA;上升沿CJNEA,#0FFH,UPDOWN:MOVX@DPTR,A;启动D/A转换DECA;下降沿CJNEA,#00H,DOWNJB20H.1,UP;连续输出波形LJMPHERESQ:CLR P1.1;方波SETB P1.3CLR P1.5CLR P1.7MOVA,#00HMOVX@DPTR,A;DAC输出低电平ACALLDELAY;xx1MOVA,#0FFHMOVX@DPTR,A;DAC输出高电平ACALLDELAY;xx2JB20H.2, SQ;连续输出波形LJMPHERETXB:CLR P1.1;梯形波CLR P1.3SETB P1.5SETB P1.7MOV A,#00HMOVX @DPTR,AACALL DELAYLOOP:MOVX @DPTR,AINC ACJNE A,#0FFH,LOOP ACALL DELAY MOVX @DPTR,A LOOP1:DEC A MOVX @DPTR,A CJNE A,#00H,LOOP1 MOVX @DPTR,A ACALL DELAYJB 20H.3,LOOP DELAY:MOVR4,#0FHLOOP11:MOVR5,#10H LOOP22: NOPNOPNOPDJNZR5,LOOP22 DJNZR4,LOOP11 RETEND;xx子程序。

STM32产生频率可调正弦波、锯齿波、三角波amp;LCD界面控制

STM32产生频率可调正弦波、锯齿波、三角波amp;LCD界面控制

STM32产生频率可调正弦波、锯齿波、三角波 amp;LCD界面控制STM32产生频率可调正弦波、锯齿波、三角波&amp;LCD界面控制此程序能输出两路通道,三路波形,利用STM32的DAC,TIM,LCD,和DMA控制的发射出正弦波,锯齿波和三角波,每种波形频率可调,独立输出,独立显示频率,使能。

最高频率达12.5KHz。

三种波形都是有一个简易小UI界面,电阻式触摸屏,能够完全手动控制通道的选择,波形的选择频率的选择以及各种波形的使能。

/*************************************************************** *****************************使用手册:0.初学即兴所敲,不喜勿喷。

1.通道1和通道2只能分开输出。

2.只有选中响应的波形选择框,才能设置频率或者使能。

3.使能端只能在通道1或者通道2打开的情况下才能被使按下操作有效。

4.每次使能一个波形,其他波形使能将自动关闭。

5.当通道1和通道2都关闭,使能将自动无效。

6.通道1和通道2切换,必须重新使能。

7.开发平台为STM32战舰版。

USER:Zhang Changhao**************************************************************** *****************************/#include "led.h"#include "delay.h"#include "key.h"#include "sys.h"#include "lcd.h"#include "usart.h"#include "24cxx.h"#include "flash.h"#include "touch.h"#include "STM32_WaveOutput.h"u8 t,Mode1,Mode2,Mode1_Flag,Mode2_Flag;u8 sinewave_flag,sawtooth_flag,triangle_flag, sinewave_mode,sawtooth_mode,triangle_mode;u8 sinewave_en,sawtooth_en,triangle_en;u8 sinewave_fre,sawtooth_fre,triangle_fre;u8 output_wave;u16 output_fre;#define MODE1 1#define MODE2 2#define sinewave 1#define sawtooth 2#define triangle 3void wave_show(u8 wavemode);void en_show(u8 wavemode);void Mode_Show(u8 mode);void wave_fre(u8 wavemode);void judge_tongdao();void judge_wave();void judge_en();void judge_fre();void show_init();void fengbi_tongdao();int main(void){delay_init(); NVIC_Configuration(); uart_init(9600); LED_Init();LCD_Init(); KEY_Init(); tp_dev.init(); show_init(); while(1){ t=TP_Scan(0); if(t) { t=0; //延时函数初始化 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 //串口初始化为9600 //LED端口初始化// // //printf("%d,%d\r\n",tp_dev.x[0],tp_dev.y[0]); judge_tongdao();judge_wave(); judge_en(); judge_fre();if(sinewave_en==1||sawtooth_en==1||triangle_en==1){ if(Mode1_Flag!=DISABLE) { if(sinewave_en) { output_wave=sinewave;output_fre=sinewave_fre*100; } else if(sawtooth_en){ output_wave=sawtooth;output_fre=sawtooth_fre*100; } else if(triangle_en){ output_wave=triangle; output_fre=triangle_fre*100; }printf("%d,%d\r\n",output_wave,output_fre);Wave_Init((output_wave-1),output_fre,ENABLE,(output_wave-1),output_fre,DISABLE);printf("%d\r\n",TIM_TimeBaseStructure.TIM_Period);Set_WaveFre(0,output_fre); } else if(Mode2_Flag!=DISABLE){ if(sinewave_en) { output_wave=sinewave; output_fre=sinewave_fre*100; } else if(sawtooth_en) { output_wave=sawtooth;output_fre=sawtooth_fre*100; }else if(triangle_en){output_wave=triangle;output_fre=triangle_fre*100;}Wave_Init((output_wave-1),output_fre,DISABLE,(output_wave-1),output_fre,ENABLE); printf("%d,%d\r\n",output_wave,output_fre);}}else{Wave_Init(0,1,DISABLE,0,1,DISABLE);}} //if(t)LED1=!LED1;delay_ms(100);}}void show_init(){//清屏 LCD_Clear(CYAN); POINT_COLOR=BROWN;//设置字体为红色LCD_Fill(0,0,2,320,BROWN); LCD_Fill(0,0,240,2,BROWN) ;LCD_Fill(0,318,240,320,BROWN); LCD_Fill(238,0,240,320,BROWN);LCD_Fill(7,7,9,313,BROWN); LCD_Fill(7,7,233,9,BROWN) ;LCD_Fill(7,311,233,313,BROWN); LCD_Fill(231,7,233,313,BROWN);LCD_DrawLine(0,0,7,7); LCD_DrawLine(233,313,240,320);LCD_DrawLine(233,7,240,0); LCD_DrawLine(7,313,0,320);//通道1 2的初始化 POINT_COLOR=RED;//设置字体为红色LCD_Fill(20,20,110,65,MAGENTA);LCD_ShowString(38,35,80,16,16,"Output1");LCD_Fill(130,20,220,65,MAGENTA);LCD_ShowString(148,35,80,16,16,"Output2"); //正弦初始化LCD_Fill(50,80,145,110,LIGHTGREEN) ;LCD_ShowString(67,88,64,16,16,"SineWave"); LCD_Fill(155,80,200,110,RED) ; POINT_COLOR=GREEN; Draw_Circle(55,125,13);LCD_DrawLine(42,125,68,125); LCD_DrawLine(55,112,55,138); POINT_COLOR=BROWN; Draw_Circle(168,125,13);LCD_DrawLine(155,125,181,125) ;LCD_ShowString(72,120,80,16,16,"Fre:0.0KHz"); //锯齿初始化POINT_COLOR=RED; LCD_Fill(50,150,145,180,DARKBLUE);LCD_ShowString(67,158,64,16,16,"SawTooth"); LCD_Fill(155,150,200,180,RED) ; POINT_COLOR= GREEN; Draw_Circle(55,195,13); LCD_DrawLine(42,195,68,195); LCD_DrawLine(55,182,55,208);POINT_COLOR=BROWN; Draw_Circle(168,195,13);LCD_DrawLine(155,195,181,195);LCD_ShowString(72,190,80,16,16,"Fre:0.0KHz"); //三角初始化POINT_COLOR=RED; LCD_Fill(50,220,145,250,YELLOW) ;LCD_ShowString(63,228,64,16,16,"triangle");LCD_Fill(155,220,200,250,RED) ; POINT_COLOR= GREEN;Draw_Circle(55,265,13);LCD_DrawLine(42,265,68,265); LCD_DrawLine(55,252,55,278);POINT_COLOR= BROWN;Draw_Circle(168,265,13); LCD_DrawLine(155,265,181,265);LCD_ShowString(72,260,80,16,16,"Fre:0.0KHz"); LED0=0;//张长浩POINT_COLOR=DARKBLUE;LCD_ShowString(65,295,168,16,16,"BY:Zhang Changhao^_^");POINT_COLOR= BROWN;}void judge_tongdao(){//通道1 2 的识别操作if((tp_dev.x[0]&gt;19)&amp;&amp;(tp_dev.x[0]&lt;111)&amp;&amp;(tp_dev.y[0]&gt;19)&amp;&amp;(tp_dev.y[0]&lt;66)){ printf("\r\n"); if(Mode1_Flag) { Mode1_Flag=0; Mode1=DISABLE;//fengbi_tongdao(); Mode_Show(MODE1); } else { Mode1_Flag=1; if(Mode2_Flag) { Mode2=0; Mode2_Flag=0; Mode_Show(MODE2) ; } Mode1=ENABLE; Mode_Show(MODE1); } fengbi_tongdao(); } else if((tp_dev.x[0]&gt;129)&amp;&amp;(tp_dev.x[0]&lt;221)&amp;&amp;(tp_dev.y[0]&gt;19)&amp;&amp;(tp_dev.y[0]&lt;66)){ if(Mode2_Flag) { Mode2_Flag=0; Mode2=DISABLE;//fengbi_tongdao();Mode_Show(MODE2);}else{Mode2_Flag=1;if(Mode1_Flag){Mode1=0;Mode1_Flag=0;Mode_Show(MODE1); }Mode2=ENABLE;Mode_Show(MODE2) ;}fengbi_tongdao();}}void judge_wave(){//三个波的识别操作if((tp_dev.x[0]&gt;49)&amp;&amp;(tp_dev.x[0]&lt;146)&amp;&amp;(tp_dev.y[0]&gt;79)&amp;&amp;(tp_dev.y[0]&lt;111)) { if(sinewave_flag){sinewave_flag=0;sinewave_mode=DISABLE;wave_show(sinewave);}else{sinewave_flag=1; if(sawtooth_flag){sawtooth_flag=0;sawtooth_mode=0;wave_show(sawtooth) ; }else if(triangle_flag){} } triangle_flag=0; triangle_mode=0; wave_show(triangle) ; } sinewave_mode=ENABLE; wave_show(sinewave); /////////////// elseif((tp_dev.x[0]&gt;49)&amp;&amp;(tp_dev.x[0]&lt;146)&amp;&amp;(tp_dev.y[0]&gt;149)&amp;&amp;(tp_dev.y[0]&lt;181)){ if(sawtooth_flag) { sawtooth_flag=0; sawtooth_mode=DISABLE;wave_show(sawtooth); } else { sawtooth_flag=1; if(sinewave_flag){ sinewave_flag=0; sinewave_mode=0;wave_show(sinewave) ; } else if(triangle_flag) { triangle_flag=0; triangle_mode=0; wave_show(triangle) ; }sinewave_mode=ENABLE; wave_show(sawtooth); } }/////////////////////////////////// elseif((tp_dev.x[0]&gt;49)&amp;&amp;(tp_dev.x[0]&lt;146)&amp;&amp;(tp_dev.y[0]&gt;219)&amp;&amp;(tp_dev.y[0]&lt;251)) { } }void judge_en() {if(triangle_flag) { triangle_flag=0; triangle_mode=DISABLE;wave_show(triangle); } else { triangle_flag=1; if(sinewave_flag){ sinewave_flag=0; sinewave_mode=0; wave_show(sinewave) ; }if(sawtooth_flag) { sawtooth_flag=0; sawtooth_mode=0;wave_show(sawtooth) ; } triangle_mode=ENABLE; wave_show(triangle); } //三种波的使能显示if((tp_dev.x[0]&gt;154)&amp;&amp;(tp_dev.x[0]&lt;201)&amp;&amp;(tp_dev.y[0]&gt;79)&amp;&amp;(tp_dev.y[0]&lt;111)){ if(sinewave_flag&amp;&amp;(Mode1||Mode2)){ if(sinewave_en) { sinewave_en=0;en_show(sinewave); } else { sinewave_en=1;} if(sawtooth_en) { sawtooth_en=0;en_show(sawtooth) ; } else if(triangle_en) { triangle_en=0;wave_show(triangle) ; } en_show(sinewave); } } else{ sinewave_en=0; en_show(sinewave); } /////////////// elseif((tp_dev.x[0]&gt;154)&amp;&amp;(tp_dev.x[0]&lt;201)&amp;&amp;(tp_dev.y[0]&gt;149)&amp;&amp;(tp_dev.y[0]&lt;181)){ if(sawtooth_flag&amp;&amp;(Mode1||Mode2)) { if(sawtooth_en){ sawtooth_en=0; en_show(sawtooth); } else { sawtooth_en=1;if(sinewave_en) { sinewave_en=0; en_show(sinewave) ; } elseif(triangle_en) { triangle_en=0; en_show(triangle) ; }} en_show(sawtooth); } } else { sawtooth_en=0; en_show(sawtooth); } /////////////////////////////////// elseif((tp_dev.x[0]&gt;154)&amp;&amp;(tp_dev.x[0]&lt;201)&amp;&amp;(tp_dev.y[0]&gt;219)&amp;&amp;(tp_dev.y[0]&lt;251)){ if(triangle_flag&amp;&amp;(Mode1||Mode2)) { if(triangle_en){ triangle_en=0; en_show(triangle); } else { triangle_en=1;if(sinewave_en){ sinewave_en=0; en_show(sinewave) ; } if(sawtooth_en){ sawtooth_en=0;en_show(sawtooth) ; } en_show(triangle); } } else { triangle_en=0; en_show(triangle); } } //使能判断if(triangle_en==0||sawtooth_en==0||sinewave_en==0) {TIM_Cmd(TIM6, DISABLE);TIM_Cmd(TIM2, DISABLE); }}void judge_fre(){// 频率检测if((tp_dev.x[0]-55)*(tp_dev.x[0]-55)+(125-tp_dev.y[0])*(125-tp_dev.y[0])&lt;150) { if(sinewave_flag) { sinewave_fre+=1;wave_fre(sinewave); } } elseif((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(125-tp_dev.y[0])*(125-tp_dev.y[0])&lt;150) { if(sinewave_flag) { sinewave_fre-=1;wave_fre(sinewave); } } elseif((tp_dev.x[0]-55)*(tp_dev.x[0]-55)+(195-tp_dev.y[0])*(195-tp_dev.y[0])&lt;150) { if(sawtooth_flag) { sawtooth_fre+=1;wave_fre(sawtooth); } } elseif((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(195-tp_dev.y[0])*(195-tp_dev.y[0])&lt;150) { if(sawtooth_flag)} { } sawtooth_fre-=1; wave_fre(sawtooth); elseif((tp_dev.x[0]-55)*(tp_dev.x[0]-55)+(265-tp_dev.y[0])*(265-tp_dev.y[0])&lt;150) { if(triangle_flag) { triangle_fre+=1; wave_fre(triangle); } } elseif((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(265-tp_dev.y[0])*(265-tp_dev.y[0])&lt;150) { if(triangle_flag) { triangle_fre-=1; wave_fre(triangle); }} //判断频率}void Mode_Show(u8 mode){u16 color;color = POINT_COLOR;if(mode==1) //如果是模式1 就对模式1进行操作 {if(Mode1==1){//横打印LCD_Fill(20,20,110,25,BLACK);LCD_Fill(20,60,110,65,BLACK);//竖打印LCD_Fill(105,20,110,65,BLACK);LCD_Fill(20,20,25,65,BLACK);}else{ //横打印LCD_Fill(20,20,110,25,MAGENTA);LCD_Fill(20,60,110,65,MAGENTA);//竖打印 LCD_Fill(105,20,110,65,MAGENTA);LCD_Fill(20,20,25,65,MAGENTA); } } else { if(Mode2==1){ //横打印 LCD_Fill(130,20,220,25,BLACK);LCD_Fill(130,60,220,65,BLACK); //竖打印LCD_Fill(215,20,220,65,BLACK); LCD_Fill(130,20,135,65,BLACK); } else { //横打印LCD_Fill(130,20,220,25,MAGENTA); LCD_Fill(130,60,220,65,MAGENTA); // 竖打印LCD_Fill(215,20,220,65,MAGENTA);LCD_Fill(130,20,135,65,MAGENTA); }}POINT_COLOR=color;}void wave_show(u8 wavemode){u16 color;color = POINT_COLOR;if(wavemode==1) //如果是sine 就对模式2进行操作{ if(sinewave_flag==1) { //横打印 LCD_Fill(50,80,145,85,BLACK);LCD_Fill(50,105,145,110,BLACK); //竖打印LCD_Fill(50,80,55,110,BLACK); LCD_Fill(140,80,145,110,BLACK); } else } { } //横打印 LCD_Fill(50,80,145,85,LIGHTGREEN);LCD_Fill(50,105,145,110,LIGHTGREEN); //竖打印LCD_Fill(50,80,55,110,LIGHTGREEN);LCD_Fill(140,80,145,110,LIGHTGREEN);else if(wavemode==2) { if(sawtooth_flag==1) { //如果是saw 就对模式2进行操作 //横打印 LCD_Fill(50,150,145,155,BLACK);LCD_Fill(50,175,145,180,BLACK); //竖打印LCD_Fill(50,150,55,180,BLACK);LCD_Fill(140,150,145,180,BLACK); } else{ LCD_Fill(50,150,145,155,DARKBLUE); LCD_Fill(50,175,145,180,DARKBLUE); //竖打印LCD_Fill(50,150,55,180,DARKBLUE);LCD_Fill(140,150,145,180,DARKBLUE); } } else if(wavemode==3) //如果是tri 就对模式3进行操作 { if(triangle_flag==1) { //横打印LCD_Fill(50,220,145,225,BLACK); LCD_Fill(50,245,145,250,BLACK); //竖打印 LCD_Fill(50,220,55,250,BLACK); LCD_Fill(140,220,145,250,BLACK); } else{//横打印LCD_Fill(50,220,145,225,YELLOW); LCD_Fill(50,245,145,250,YELLOW);//竖打印LCD_Fill(50,220,55,250,YELLOW); LCD_Fill(140,220,145,250,YELLOW); } }POINT_COLOR=color;}void en_show(u8 wavemode){u16 color;color = POINT_COLOR;if(wavemode==1) //如果是sine 就对模式2进行操作{ if(sinewave_flag==1) { if(sinewave_en){ LCD_Fill(155,150,200,180,RED); } }LCD_Fill(155,220,200,250,RED);//切换波形后吧其他波形给关了LCD_Fill(155,80,200,110,GREEN); } else{ LCD_Fill(155,80,200,110,RED); } if(wavemode==2) //如果是saw 就对模式2进行操作 { if(sawtooth_flag==1) { if(sawtooth_en){ LCD_Fill(155,80,200,110,RED); LCD_Fill(155,220,200,250,RED);LCD_Fill(155,150,200,180,GREEN);} } } else { LCD_Fill(155,150,200,180,RED); }if(wavemode==3) //如果是saw 就对模式2进行操作 {if(triangle_flag==1){if(triangle_en){LCD_Fill(155,150,200,180,RED);LCD_Fill(155,80,200,110,RED);LCD_Fill(155,220,200,250,GREEN);}else {LCD_Fill(155,220,200,250,RED);}}}POINT_COLOR=color;}void wave_fre(u8 wavemode){if(wavemode==1) //如果是sine 就对模式2进行操作 { if(sinewave_flag==1){LCD_ShowNum(104,120,(sinewave_fre/10),1,16);LCD_ShowNum(120,120,(sinewave_fre%10),1,16); } }if(wavemode==2) //如果是sine 就对模式2进行操作 { if(sawtooth_flag==1){} } LCD_ShowNum(104,190,(sawtooth_fre/10),1,16); LCD_ShowNum(120,190,(sawtooth_fre%10),1,16);if(wavemode==3) //如果是sine 就对模式2进行操作 { if(triangle_flag==1){LCD_ShowNum(104,260,(triangle_fre/10),1,16);LCD_ShowNum(120,260,(triangle_fre%10),1,16); } }}void fengbi_tongdao(){sinewave_en=0;sawtooth_en=0;triangle_en=0;LCD_Fill(155,150,200,180,RED); LCD_Fill(155,220,200,250,RED); LCD_Fill(155,80,200,110,RED); if(Mode1==DISABLE){TIM_Cmd(TIM2, DISABLE);}if(Mode2==DISABLE){TIM_Cmd(TIM6, DISABLE);}}。

[汇编]da转换方波,锯齿波,三角波c措辞编程

[汇编]da转换方波,锯齿波,三角波c措辞编程

DA转换(函数波形发生器)功能说明:1.该程序可产生三种不同的波形分别是(方波,锯齿波,三角波)2.分别可以通过三个按键选择对应的波形。

#include<reg52.h>#include<stdio.h>#include<intrins.h>#def ine uchar unsigned char#def ine uint unsigned int#def ine out P0sbit f bo=P2^0;//选择方波按钮sbit jcbo=P2^1;//选择锯齿波按钮sbit sjbo=P2^2;//选择三角波按钮void anjsm();void delay(uchar date){ uchar i,k;f or (i=date;i>0;i--)f or(k=50;k>0;k--);}void f bodate()//方波子程序{ while(1){ out=0x00;delay(5);out=0xff;delay(5);anjsm();}}void jcbodate()//锯齿波子程序{ uchar h;while(1){f or(h=0;h<255;h++){ out=h;anjsm();}}}void sjbodate()//三角波子程序{ uchar h;while(1){f or(h=0;h<255;h++){ out=h;anjsm();}f or(h=255;h>0;h--){ out=h;anjsm();}}}void txbodate()//梯形波子程序{ uchar h;while(1){f or(h=0;h<255;h++){ out=h;anjsm();}delay(1);f or(h=255;h>0;h--){ out=h;anjsm();delay(1);}}}void anjsm()//键盘扫描子程序{ if(f bo==0)f bodat e();if(j cbo==0)jcbodate();if(sjbo==0)sjbodate();if(txbo==0)txbodate();}void main(){while(1){anjsm();}}。

单片机课程设计产生三角波、正弦波、方波

单片机课程设计产生三角波、正弦波、方波

STC89C51单片机产生正弦波、方波、三角波LED显示频率源程序#include <stdio.h>#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit LATCH1=P2^6;//定义锁存使能端口段锁存sbit LATCH2=P2^7;// 位锁存unsigned char TempData[8]; //存储显示值的全局变量unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code DuanMa2[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};// 显示段码值0~9unsigned char code DuanMa1[3]={0x77,0x7c,0x39};unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码#define DataPort P0sbit keyA=P3^3;sbit keyB=P3^4;sbit keyC=P3^5;sbit wc=P1^0;sbit scl=P1^1;sbit sda=P1^2;sbit scl1=P1^3;sbit sda1=P1^4;sbit p5=P1^5;sbit p6=P1^6;sbit p7=P1^7;uint sign,ad;uchar temp[10], temp1[3];//定义显示区域临时存储数组uchar voltage; //定义浮点变量uchar l=0,m=100,n=0;uchar code sin[200] = {52,53,55,56,58,59,61,62,64,65,67,68,70,71,73,74,75,77,78,79,81,82,83,84,85,86,88,89,90,90,91,92,93,94,95,95,96,96,97,97,98,98,98,99,99,99,99,100,100,100,100,100,9 9,99,99,99,98,98,98,97,97,96,96,95,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,79,7 8,77,75,74,73,71,70,68,67,65,64,62,61,59,58,56,55,53,52,50,48,47,45,44,42,41,39,38,3 6,34,33,32,30,29,27,26,24,23,22,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,5,4,4,3,2,2,2,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,2,2,2,3,4,4,5,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,22,23,24,26,27,29,30,32,33,35,36,38,39,41,42,44,45,47,48,50};void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}void delay(){ ;; }void delay1(uchar x){uchar a,b;for(a=x;a>0;a--)for(b=110;b>0;b--);}void Delay2(unsigned int t){while(--t);}void Display(){uchar i;for(i=0;i<4;i++){DataPort=WeiMa[i]; //取位码LATCH2=1; //位锁存LATCH2=0;if(i==0) DataPort=DuanMa1[sign-1];else if(i==1) DataPort=DuanMa2[temp1[i]];else DataPort=DuanMa[temp1[i]]; //取显示数据,段码LATCH1=1; //段锁存LATCH1=0;Delay2(500); // 扫描间隙延时,时间太长会闪烁,太短会造成重影}}//pcf8591void init1(){sda1=1;delay();scl1=1;delay();}void start1() //开始信号{sda1=1;delay();scl1=1;delay();sda1=0;delay();}void stop1() //停止{sda1=0;delay();scl1=1;delay();sda1=1;delay();}void respons1() //应答{uchar i;scl1=1;delay();while((sda1==1)&&(i<250))i++;scl1=0;delay();}void write_byte1(uchar date) {uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl1=0;delay();sda1=CY;delay();scl1=1;delay();}scl1=0;delay();sda1=1;delay();}uchar read_byte1(){uchar i,k;scl1=0;delay();sda1=1;delay();for(i=0;i<8;i++){scl1=1;delay();k=(k<<1)|sda1;scl1=0;delay();}return k;}void write_add1(uchar date) //写入DA{start1();write_byte1(0x90);respons1();write_byte1(0x40);respons1();write_byte1(date);respons1();// delay1(100);stop1();}uchar read_add1( uchar address ) //读AD值{uchar date;start1();write_byte1(0x90);respons1();write_byte1(0x40|address);respons1();start1();write_byte1(0x91);respons1();date=read_byte1();stop1();return date;}//键盘void keyscan(){if(keyA==0){delay1(10);if(keyA==0)sign=1;while(!keyA);}if(keyB==0){delay1(10);if(keyB==0)sign=2;while(!keyB);}if(keyC==0){delay1(10);if(keyC==0)sign=3;while(!keyC);}}//eepromvoid start() //开始信号{sda=1;delay();scl=1;delay();sda=0;delay();}void stop() //停止{sda=0;delay();scl=1;delay();sda=1;delay();}void respons() //应答{uchar i;scl=1;delay();while((sda==1)&&(i<250))i++;scl=0;delay();}void init(){sda=1;delay();scl=1;delay();}void write_byte(uchar date){uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;sda=CY;delay();scl=1;delay();}scl=0;delay();sda=1;delay();}uchar read_byte(){uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i<8;i++){scl=1;delay();k=(k<<1)|sda;scl=0;delay();}return k;}void write_add(uchar date[],uchar address ) {uchar i,*pdate;pdate=date;for(i=0;i<2;i++){write_byte(0xae);respons();write_byte(address+i);respons();write_byte(*(pdate+i));respons();stop();}}void read_add(uchar date[] ,uchar address ) {uchar i,*pdate;pdate=date;for(i=0;i<2;i++){start();write_byte(0xae);respons();write_byte(address+i);respons();start();write_byte(0xaf);respons();*(pdate+i)=read_byte();stop();}}void sj(){if(l<100){write_add1(l);l++;}if(l>=100&m>0){write_add1(m);m--;}if(l>=100&m<=0){l=0;m=100;}p5=0;p6=1;p7=1;}void zx(){if(l<200){write_add1(sin[l]);l++;}if(l>=200)l=0;p6=0;p7=1;p5=1;}void fb(){if(l<100){write_add1(255);l++;}if(l>=100&n<100){write_add1(0);n++;}if(l>=100&n>=100){l=0;n=0;}p7=0;p5=1;p6=1;}void main(){uchar i,num,tab[2];//定义显示区域临时存储数组wc=0;num=0;tab[0]=0;tab[1]=0;TMOD=0x21;//设置定时器1为工作方式2定时器0为工作方式1 TH1=0xfd;TL1=0xfd;TR1=1;REN=1;SM0=0;SM1=1;EA=1;ES=1;init();init1();for(i=0;i<5;i++)num=read_add1(0);read_add(tab,1);sign=tab[0];ad=(uint)num*100;TH0=(65536-ad)/256;TL0=(65536-ad)%256;ET0=1; //定时器中断打开TR0=1;while(1){keyscan();for(i=0;i<5;i++)num=read_add1(0);voltage=500/num;ad=(uint)num*100;tab[0]=sign;tab[1]=ad;write_add(tab,1);num=read_add1(0);voltage=500/num;temp1[0]=voltage/100;temp1[1]=(voltage%100)/10;temp1[2]=voltage%1000;Display();}}void ser() interrupt 4{RI=0;sign=SBUF;}void T0_time() interrupt 1{ad=(uint)read_add1(0)*100;TH0=(65536-ad)/256;TL0=(65536-ad)%256;if(sign==1) sj(); if(sign==2) zx(); if(sign==3) fb(); }。

单片机按键波形转换

单片机按键波形转换
VREF:基准电压输入线,范围为(-10~+10)V;
AGND:模拟信号地;
DGND:数字信号地。
4.3
系统软件由主程序和产生波形的子程序组成,软件设计主要是产生各种波形的子程序的编程。通过编程可得到各种波形。频率的改变可采用插入延时子程序的方法来实现。
实验流程图:
4-2实验流程图
本电路仿真图如下:
我们这个课设选择双缓冲方式,来达到课设目的。
附件(源程序)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define KEY P1
#define DATA P0
sbit cs=P3^1;
sbit wr=P3^4;
我们小组利用端口按键判断技术(按键显示数字)中的按键设计。端口按键判断部份由8个轻触按键组成,一端接地,一端由JP48引出,当按下按键时,相应端口为低电平。我们需要这个键盘去对应相应的波形,通过按键盘上的K01,,K02,K03三个按键,实现相应的波形输出。
然后我们应用实验12:DA转换DAC0832的原理与应用来实现波形的变换。锯齿波我们在实验课上就已经实现了,而三角波我们在考试的时候也实现了,剩下的矩形波比较简单,根据书本上的程序就可以得出相应的结果。
接线方法:
1用一个1PIN数据线一端插入CPU部份JP53(P3口)的P3.4,另外一端插入DAC0832部份的输入端JP24的
WR端。
2用一个1PIN数据线一端插入CPU部份JP53(P3口)的P3.1,另外一端插入DAC0832部份的输入端JP24的
CS端。
3用一根8PIN的数据排线,一端插入DAC0832部份的数据输入端JP27,另一端插入CPU部份JP51(P0口)

单片机简易波形

单片机简易波形

目录第一章前言 (5)1.1课程设计内容与要求 (5)1.2单片机的发展前景 (5)第二章总体设计方案 (7)2.1设计总体思路 (7)2.2工作原理 (8)第三章系统硬件设计及说明 (9)3.1 DAC0832简介 (9)3.2 DAC0832引脚图 (10)3.3 DAC0832各引脚功能 (10)3.4 DAC0832三种数据输入方式 (11)第四章系统软件设计 (13)4.1流程总图及各波形流程图 (13)4.2子程序及其说明 (15)第五章总结体会 (18)附录 (19)附录A 系统原理图 (19)附录B 程序清单 (20)第一章前言1.1课程设计内容与要求用单片机与DAC0832 构成的波形发生器,可产生方波、三角波、锯齿波、正弦波等多种波形,波形的周期可用程序改变,并可根据需要选择单极性输出或双极性输出,具有线路简单、结构紧凑、性能优越等特点。

1.2单片机的发展前景当今世界在以电子信息技术为前提下推动了社会跨跃式的进步,科学技术的飞速发展日新月异带动了各国生产力的大规模提高。

由此可见科技已成为各国竞争的核心,尤其是电子信息技术更显得尤为重要,在国民生产各部门电子信息技术得到了广泛的应用。

漫步在繁华的现代化的大都市的大街上,随时都可以看到街上有很多可以用卡取钱的机器(ATM自动柜机),十字路口的交通灯。

我们家里数码电视机、数码音响、遥控器、空调、智能玩具..... 这些“高科技”看上去是如此的神秘,它到底是怎样构成的,它是通过什么样的程序和什么样的方式来完成这一系列指令的呢?让我们取钱更方便、避免城市的交通混乱和交通阻塞……给我们生活带来了处处方便。

其实这也是用单片机来控制的,单片机在我们生活中触手可及,它是如此地贴近我们的生活,单片机给我们的生活带来的有如此多的便利。

目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。

导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。

基于单片机的波形发生器

基于单片机的波形发生器

基于单片机的波形发生器一、波形发生器的技术1、波形:方波、正弦波、三角波、锯齿波2、幅值电压:0V到5V3、频率:0V到10K4、输出极性:双极型。

二、操作设计1、上电,系统初始化,数码管显示6个0,等待输入设置命令。

2、按“F”、“V”、“W”键,分别进入频率、幅值、波形设置,数码管显示“-”。

输入相应的参数,显示参数值,按“CL”键,清除所有已设定参数,参数设定完毕按“EN”键,数码管显示波形的编号、频率、电压幅值等。

3、波形发生器输出信号时,按下任意键可停止信号输出,等待重新设置参数。

4、要停止使用波形发生器,可按复位按键,将系统复位,然后关闭电源。

三、硬件组成由单片机、键盘/显示接口电路、波形转换(D/A)电路和电源等四部分构成。

1、单片机电路功能:扫描码,键值识别、键处理、码数设置;形成显示段码;产生定时中断;形成的数字编码,并输出到D/A接口电路。

电路如图1所示。

89C51的P0、P2口作为扩展I/O,与8255A、DAC0832、74LS373相连接,可寻址片外接口芯片和内部存储器统一编址,P0和P2提供16位地址线。

P1口的低4位接4只发光二极管,作为波形指示。

用T0定时/计数器作为中断源。

不同的频率值对应不同的定时初值,允许定时器溢出中断。

定时器中断的特殊功能寄存器设置如下:TCON=00010000B TMOD=00000000B IE=10000010B2、键盘/显示电路功能:驱动6位数码管动态显示,扫描键盘。

由并口扩展芯片8255、锁存器74LS273、74LS244、反向驱动器ULN2803A、6位共阴极数码管和4╳4键盘等组成。

8255的C口作键盘接口,C口的低4位输出扫描码,高4位作为行状态输入,A口作为数码管的段选口,与74LS244相连,B口作为位选口,与ULN2803相连接。

8255的寄存器地址如下:控制口:7FFFH、A口:7FFCH、B口:7FFDH、C口:7FFEH。

利用单片机AT89C52采用程序设计方法产生锯齿波

利用单片机AT89C52采用程序设计方法产生锯齿波

1 引言本系统利用单片机AT89C52采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,能产生10Hz—10kHz的波形。

通过键盘来控制四种波形的类型选择、拨码开关控制频率的变化,并通过液晶屏1602显示其各自的类型以及数值,系统大致包括信号发生部分、数/模转换部分以及液晶显示部分三部分,其中尤其对数/模转换部分和波形产生和变化部分进行详细论述。

2设计方案2.1系统硬件设计概述经过考虑,我们确定方案如下:利用AT89C52单片机采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,通过键盘来控制四种波形的类型选择、频率变化,最终输出显示其各自的类型以及数值。

2.2、设计要求1)、利用单片机采用软件设计方法产生四种波形2)、四种波形可通过键盘选择3)、波形频率可调4)、需显示波形的种类及其频率2.1.2方案设计与论证1.2.1 信号发生电路方案论证方案一:通过单片机控制D/A,输出四种波形。

此方案输出的波形不够稳定,抗干扰能力弱,不易调节。

但此方案电路简单、成本低。

方案二:使用传统的锁相频率合成方法。

通过芯片IC145152,压控振荡器搭接的锁相环电路输出稳定性极好的正弦波,再利用过零比较器转换成方波,积分电路转换成三角波。

此方案,电路复杂,干扰因素多,不易实现。

方案三:利用MAX038芯片组成的电路输出波形。

MAX038是精密高频波形产生电路,能够产生准确的锯齿波、三角波、方波和正弦波四种周期性波形。

但此方案成本高,程序复杂度高。

以上三种方案综合考虑,选择方案一。

1.2.2 单片机的选择论证方案一:AT89C52单片机是一种高性能8位单片微型计算机。

它把构成计算机的中央处理器CPU、存储器、寄存器、I/O接口制作在一块集成电路芯片中,从而构成较为完整的计算机、而且其价格便宜。

输出三角波+锯齿波+方波+正弦波

输出三角波+锯齿波+方波+正弦波

输出三⾓波+锯齿波+⽅波+正弦波⼀、⽬的与要求1.进⼀步掌握并⾏接⼝芯⽚8255A和微机接⼝的连接及其编程⽅法;2.进⼀步熟悉DAC0832数模转换器的特性和接⼝⽅法,掌握D/A 输出程序的设计和调试⽅法;3.掌握汇编语⾔程序设计⽅法;4.掌握接⼝芯⽚的应⽤,提⾼综合运⽤所学知识解决实际问题的基本⽅法;5.提⾼硬软件调试的⽅法。

⼆、实验内容或题⽬(1)8255A相关部分实验原理与8255A相关部分如图11.4所⽰,PC⼝8位仅使⽤PC0,PC1两位接2个开关K1、K2,PB⼝8位接2个发光⼆极管(L1、L2),从PC⼝读⼊2位开关量送PB⼝显⽰。

拨动K1、K2,PB⼝上接的2个发光⼆极管L1、L2对应显⽰K1、K2的状态。

此外,随着PC0、PC1输⼊的四种开关状态(00、01、10、11)的改变,实时改变:1.2个发光⼆极管(L1、L2)的显⽰;2.8个LED数码管的显⽰(显⽰要求:0832――0x)x为0、1、2、3中的1个数;3.DAC0832的输出波形。

具体要求:00-输出⽅波; 01-输出锯齿波;10-输出三⾓波;11-输出正弦波。

(2)DAC0832相关部分实验原理如图11.5所⽰,由于DAC0832有数据锁存器、选⽚、读、写控制信号线,故可与8088CPU 总线直接接⼝。

图中是只有⼀路模拟量输出,且为单极型电压输出。

DAC0832⼯作于单缓冲⽅式,它的ILE接+5V,CS#和XFER#相接后作为0832芯⽚的⽚选0832CS。

这样,对DAC0832执⾏⼀次写操作就把⼀个数据直接写⼊DAC寄存器、模拟量输出随之⽽变化。

(3)实验线路连接图11.4 图11.51.8255A芯⽚PC0、PC1插孔依次接K1、K2;2.8255A芯⽚PB0、PB1插孔依次接L1、L2;3.8255A的CS插孔接译码输出060H-06FH插孔;4.将0832⽚选信号0832CS插孔和译码输出070H~07FH插孔相连。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档