基于51单片机的波形发生器程序
时间: 2023-08-13 18:06:03 浏览: 101
基于51单片机的波形发生器
5星 · 资源好评率100%
好的,下面是一个基于51单片机的波形发生器程序供你参考:
```
#include <reg51.h>
#define FREQ 1000 // 波形频率
#define AMP 127 // 波形振幅
#define PHASE 0 // 波形相位
#define SAMPLE_RATE 20 // 采样率
sbit DAC_CS = P1^0; // DAC芯片使能端
sbit DAC_CLK = P1^1; // DAC芯片时钟端
sbit DAC_DIN = P1^2; // DAC芯片数据输入端
unsigned char waveform[256] = { // 正弦波形数据表
128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 162, 165, 168, 171, 174,
177, 180, 183, 186, 189, 192, 195, 198, 201, 204, 207, 209, 212, 215, 218, 220,
223, 226, 228, 231, 233, 236, 238, 240, 243, 245, 247, 249, 251, 253, 255, 256,
258, 259, 261, 263, 264, 266, 267, 269, 270, 272, 273, 274, 276, 277, 278, 279,
280, 281, 282, 283, 284, 285, 285, 286, 287, 287, 288, 288, 289, 289, 289, 289,
290, 290, 290, 290, 290, 290, 290, 290, 289, 289, 289, 288, 288, 287, 287, 286,
285, 285, 284, 283, 282, 281, 280, 279, 278, 277, 276, 274, 273, 272, 270, 269,
267, 266, 264, 263, 261, 259, 258, 256, 255, 253, 251, 249, 247, 245, 243, 240,
238, 236, 233, 231, 228, 226, 223, 220, 218, 215, 212, 209, 207, 204, 201, 198,
195, 192, 189, 186, 183, 180, 177, 174, 171, 168, 165, 162, 158, 155, 152, 149,
146, 143, 140, 137, 134, 131, 128, 125, 122, 119, 116, 113, 110, 107, 104, 101,
98, 94, 91, 88, 85, 82, 79, 76, 73, 70, 67, 64, 61, 58, 55, 52,
49, 46, 44, 41, 38, 36, 33, 31, 28, 26, 24, 21, 19, 17, 15, 14,
12, 10, 8, 7, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 2, 3, 4, 5, 7, 8, 10, 12, 14, 15, 17, 19, 21,
24, 26, 28, 31, 33, 36, 38, 41, 44, 46, 49, 52, 55, 58, 61, 64, 67,
70, 73, 76, 79, 82, 85, 88, 91, 94, 98, 101, 104, 107, 110, 113, 116, 119,
122, 125
};
void delay_us(unsigned int us) { // 微秒级延时函数
while(us--);
}
void DAC_Write(unsigned char data) { // DAC芯片写入函数
DAC_CS = 0; // 使能DAC芯片
DAC_CLK = 0; // 置时钟为低电平
delay_us(1); // 延时
for(int i = 0; i < 8; i++) { // 8位数据依次写入
DAC_DIN = (data & 0x80); // 获取最高位
data <<= 1; // 左移一位
DAC_CLK = 1; // 置时钟为高电平
delay_us(1); // 延时
DAC_CLK = 0; // 置时钟为低电平
delay_us(1); // 延时
}
DAC_CS = 1; // 关闭DAC芯片
}
void Timer0_ISR() interrupt 1 { // 定时器中断服务程序
static unsigned char index = 0; // 波形数据表索引
static unsigned char sample_count = 0; // 采样计数器
index = (index + 1) % 256; // 更新波形数据表索引
sample_count++; // 更新采样计数器
if(sample_count >= SAMPLE_RATE) { // 达到采样率
sample_count = 0; // 重置采样计数器
DAC_Write(waveform[(index + PHASE) % 256] + AMP); // 写入DAC芯片
}
}
void main() {
TMOD = 0x01; // 定时器0工作在模式1
TH0 = (65536 - FREQ * SAMPLE_RATE) >> 8; // 初始化定时器初值高字节
TL0 = (65536 - FREQ * SAMPLE_RATE) & 0xFF; // 初始化定时器初值低字节
ET0 = 1; // 使能定时器中断
EA = 1; // 使能总中断
TR0 = 1; // 启动定时器
while(1); // 程序循环
}
```
这个程序实现了一个正弦波形的发生器,使用定时器和DAC芯片输出模拟信号。其中,通过修改`FREQ`、`AMP`、`PHASE`和`SAMPLE_RATE`等参数可以控制波形的频率、振幅、相位和采样率。
希望这个程序能够帮助你!
阅读全文