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

显示频率,幅度可调,可产生四种波形,正弦波,方波,锯齿波,三角波,希望你能喜欢,给你发了一张效果图,喜欢的话别忘了采纳我的回答啊

#include

#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,0x60,0x68,0x70,0x78,

0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0xe0,0xe8,0xf0,0xf8,0xff,

0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x98,0x90,0x88,0x80,

0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00};

uchar code sine_tab[256]={

//输出电压从0到最大值(正弦波1/4部分)

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,

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是80C51单片机连接DAC0832和LCD1602,输出锯齿正弦波,三角矩形C语言代码: ```c #include <reg51.h> #include <math.h> // 定义LCD1602引脚 sbit RS = P2^0; sbit EN = P2^1; sbit RW = P2^2; sbit LCD_D4 = P2^4; sbit LCD_D5 = P2^5; sbit LCD_D6 = P2^6; sbit LCD_D7 = P2^7; // 定义DAC0832引脚 sbit DAC_CS = P1^0; sbit DAC_CLK = P1^1; sbit DAC_DIN = P1^2; // 定义函数 void Delay(int time); void LCD_Init(); void LCD_WriteCommand(unsigned char command); void LCD_WriteData(unsigned char data); void DAC_Write(unsigned int data); void SawtoothWave(); void SineWave(); void TriangleWave(); void SquareWave(); // 主函数 void main() { LCD_Init(); // 初始化LCD1602 while(1) { SawtoothWave(); // 输出锯齿 Delay(1000); SineWave(); // 输出正弦波 Delay(1000); TriangleWave(); // 输出三角 Delay(1000); SquareWave(); // 输出矩形 Delay(1000); } } // 延时函数 void Delay(int time) { int i, j; for(i=0; i<time; i++) for(j=0; j<100; j++); } // LCD1602初始化函数 void LCD_Init() { LCD_WriteCommand(0x38); // 设置8位数据线,2行显示,5x7点阵字符 LCD_WriteCommand(0x0C); // 开启显示,光标关闭 LCD_WriteCommand(0x06); // 光标右移,字符不移动 LCD_WriteCommand(0x01); // 清屏 } // 写入命令到LCD1602 void LCD_WriteCommand(unsigned char command) { RS = 0; // RS置低,表示写入的是命令 RW = 0; // RW置低,表示写入模式 LCD_D7 = command & 0x80; LCD_D6 = command & 0x40; LCD_D5 = command & 0x20; LCD_D4 = command & 0x10; EN = 1; // EN置高,使能 Delay(1); EN = 0; // EN置低,完成写入 LCD_D7 = command & 0x08; LCD_D6 = command & 0x04; LCD_D5 = command & 0x02; LCD_D4 = command & 0x01; EN = 1; // EN置高,使能 Delay(1); EN = 0; // EN置低,完成写入 } // 写入数据到LCD1602 void LCD_WriteData(unsigned char data) { RS = 1; // RS置高,表示写入的是数据 RW = 0; // RW置低,表示写入模式 LCD_D7 = data & 0x80; LCD_D6 = data & 0x40; LCD_D5 = data & 0x20; LCD_D4 = data & 0x10; EN = 1; // EN置高,使能 Delay(1); EN = 0; // EN置低,完成写入 LCD_D7 = data & 0x08; LCD_D6 = data & 0x04; LCD_D5 = data & 0x02; LCD_D4 = data & 0x01; EN = 1; // EN置高,使能 Delay(1); EN = 0; // EN置低,完成写入 } // 写入DAC0832数据 void DAC_Write(unsigned int data) { unsigned char i; DAC_CS = 0; // 使能DAC0832 for(i=0; i<16; i++) { if(data & 0x8000) DAC_DIN = 1; else DAC_DIN = 0; DAC_CLK = 0; data = data << 1; DAC_CLK = 1; } DAC_CS = 1; // 禁用DAC0832 } // 输出锯齿 void SawtoothWave() { unsigned int i, j; for(i=0; i<256; i++) { j = i*16; DAC_Write(j); // 写入DAC0832数据 LCD_WriteCommand(0x80); // 光标回到第一行第一列 LCD_WriteData('S'); LCD_WriteData('a'); LCD_WriteData('w'); LCD_WriteData('t'); LCD_WriteData('o'); LCD_WriteData('o'); LCD_WriteData('t'); LCD_WriteData('h'); LCD_WriteData(':'); LCD_WriteData(i/100+48); LCD_WriteData(i%100/10+48); LCD_WriteData(i%10+48); Delay(1); } } // 输出正弦波 void SineWave() { unsigned int i, j; for(i=0; i<256; i++) { j = (unsigned int)(127*sin(2*3.1415926*i/256)+127); DAC_Write(j); // 写入DAC0832数据 LCD_WriteCommand(0xC0); // 光标回到第二行第一列 LCD_WriteData('S'); LCD_WriteData('i'); LCD_WriteData('n'); LCD_WriteData('e'); LCD_WriteData(':'); LCD_WriteData(j/100+48); LCD_WriteData(j%100/10+48); LCD_WriteData(j%10+48); Delay(1); } } // 输出三角 void TriangleWave() { unsigned int i, j; for(i=0; i<256; i++) { if(i<128) j = i*2; else j = (255-i)*2; DAC_Write(j); // 写入DAC0832数据 LCD_WriteCommand(0x80); // 光标回到第一行第一列 LCD_WriteData('T'); LCD_WriteData('r'); LCD_WriteData('i'); LCD_WriteData('a'); LCD_WriteData('n'); LCD_WriteData('g'); LCD_WriteData('l'); LCD_WriteData('e'); LCD_WriteData(':'); LCD_WriteData(j/100+48); LCD_WriteData(j%100/10+48); LCD_WriteData(j%10+48); Delay(1); } } // 输出矩形 void SquareWave() { unsigned int i, j; for(i=0; i<256; i++) { if(i<128) j = 0; else j = 255; DAC_Write(j); // 写入DAC0832数据 LCD_WriteCommand(0xC0); // 光标回到第二行第一列 LCD_WriteData('S'); LCD_WriteData('q'); LCD_WriteData('u'); LCD_WriteData('a'); LCD_WriteData('r'); LCD_WriteData('e'); LCD_WriteData(':'); LCD_WriteData(j/100+48); LCD_WriteData(j%100/10+48); LCD_WriteData(j%10+48); Delay(1); } } ``` 注意:此代码仅供参考,具体实现还需根据硬件电路进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值