单片机输出正弦波c语言程序,dac0832产生正弦波的c程序

下面是一个51单片机做的正弦波发生器,用的最古老的dac0832,程序很有参考价值,大家看看吧。

#include"reg52.h"

#include"absacc.h"

#include "math.h"

typedef unsigned char uint8;

typedef unsigned int uint16;

typedef unsigned long uint32;

#define DAC0832_PORT XBYTE[0X7FFF]

uint8 const code ZXB_code[256]={

0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,

0xa5,0xa8,0xab,0xae,0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,

0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,0xda,0xdc,0xde,0xe0,

0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,

0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,

0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf3,0xf2,

0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdc,

0xda,0x

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用AT80C51和DAC0832两个LM324输出正弦波C语言代码: ``` #include <reg52.h> #include <intrins.h> #define CLK 11059200UL // 定义时钟频率为11.0592MHz #define BAUD 9600 // 定义波特率为9600 sbit CS = P2^0; // 定义DAC0832的CS引脚 sbit LDAC = P2^1; // 定义DAC0832的LDAC引脚 sbit SCLK = P2^2; // 定义DAC0832的SCLK引脚 sbit DIN = P2^3; // 定义DAC0832的DIN引脚 unsigned char code sin_table[256] = { // 正弦波表 128,131,134,137,140,143,146,149, 152,155,158,162,165,167,170,173, 176,179,182,185,188,191,193,196, 199,201,204,206,209,211,213,215, 218,220,222,223,225,227,228,230, 231,233,234,235,236,237,238,239, 239,240,240,240,240,240,239,239, 238,237,236,235,234,233,231,230, 228,227,225,223,222,220,218,215, 213,211,209,206,204,201,199,196, 193,191,188,185,182,179,176,173, 170,167,165,162,158,155,152,149, 146,143,140,137,134,131,128,125, 122,119,116,113,110,107,104,101, 98,95,92,88,85,83,80,77, 74,71,68,65,62,59,57,54, 51,49,46,44,41,39,37,35, 32,30,28,27,25,23,22,20, 19,17,16,15,14,13,12,11, 10,9,8,7,6,6,5,5, 4,4,3,3,2,2,2,1, 1,1,1,0,0,0,0,0, 0,0,0,0,1,1,1,1, 2,2,2,3,3,4,4,5, 5,6,6,7,8,9,10,11, 12,13,14,15,16,17,19,20, 22,23,25,27,28,30,32,35, 37,39,41,44,46,49,51,54, 57,59,62,65,68,71,74,77, 80,83,85,88,92,95,98,101, 104,107,110,113,116,119,122,125 }; void delay_us(unsigned int us) // 微秒级延时函数 { while (us--) { _nop_(); _nop_(); } } void delay_ms(unsigned int ms) // 毫秒级延时函数 { while (ms--) { delay_us(1000); } } void init_uart() // 初始化串口函数 { TMOD = 0x20; // 定时器1工作在模式2,用于串口波特率发生器 TH1 = 256 - CLK / 32 / BAUD; // 计算波特率发生器重载值 TL1 = TH1; TR1 = 1; // 启动定时器1 SM0 = 0; // 设置串口工作在模式1,8位数据,无校验位,1位停止位 SM1 = 1; REN = 1; // 允许接收数据 TI = 0; // 确保发送标志位为0 } void init_dac0832() // 初始化DAC0832函数 { CS = 1; // 禁止选择DAC0832芯片 LDAC = 1; // 禁止更新DAC0832输出 SCLK = 0; // SCLK引脚置0 DIN = 0; // DIN引脚置0 } void send_data(unsigned char data) // 发送数据到DAC0832函数 { unsigned char i; for (i = 0; i < 8; i++) { if (data & 0x80) // 发送数据的最高位先传输 { DIN = 1; } else { DIN = 0; } data <<= 1; SCLK = 1; SCLK = 0; } } void main() { unsigned char i = 0; unsigned char data_h, data_l; init_uart(); init_dac0832(); while (1) { data_h = sin_table[i]; // 从正弦波表中读取高8位数据 data_l = 0; // DAC0832只有12位,低4位置0 send_data(data_h); // 发送高8位数据到DAC0832 send_data(data_l); // 发送低4位数据到DAC0832 LDAC = 0; // 更新DAC0832输出 LDAC = 1; delay_ms(1); // 控制正弦波的频率,1ms表示1kHz i++; // 正弦波表的指针加1 if (i == 256) // 正弦波表的指针范围为0~255 { i = 0; } } } ``` 上面的代码通过AT80C51单片机DAC0832数模转换芯片实现了正弦波输出,具体实现步骤如下: 1. 定义正弦波表:将256个正弦波的数据存储在一个数组中,用于后续的正弦波输出。 2. 初始化串口和DAC0832芯片:设置串口波特率、模式和启动定时器,同时设置DAC0832的CS、LDAC、SCLK和DIN引脚。 3. 发送正弦波数据:从正弦波表中读取高8位数据,低4位置0,然后通过DAC0832芯片的DIN引脚将数据发送出去。 4. 更新DAC0832输出:将LDAC引脚置0,然后再置1,即可更新DAC0832输出。 5. 控制正弦波频率:通过延时函数控制正弦波的频率,1ms表示1kHz。 6. 指针加1:将正弦波表的指针加1,如果超过256,则重新从0开始。 通过以上步骤,就可以实现AT80C51和DAC0832两个LM324输出正弦波的功能。需要注意的是,正弦波表中的数据需要根据实际需要进行修改,以达到输出不同频率、不同幅度的正弦波的目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值