51单片机输出正弦波程序
时间: 2023-08-13 13:04:30 浏览: 224
51单片机正弦波发生器设计程序_单片机输出正弦波汇编程序
5星 · 资源好评率100%
以下是51单片机输出正弦波的示例程序:
```c
#include <reg52.h>
#include <math.h>
#define FOSC 11059200L // 晶振频率
#define BAUD 9600 // 串口波特率
#define PI 3.1415926535897932384626
// 定义波形数据,可以通过Excel等软件生成
const unsigned char sine_table[] = {128,141,153,166,178,190,201,212,221,230,237,244,250,253,255,255,253,250,244,237,230,221,212,201,190,178,166,153,141,128,115,103,90,78,66,55,44,35,26,19,12,6,3,1,1,3,6,12,19,26,35,44,55,66,78,90,103,115};
// 定时器0中断服务程序,每隔一段时间调用一次
void timer0_isr() interrupt 1
{
static unsigned char index = 0; // 波形数据的下标
static unsigned int counter = 0; // 计数器,用于调整输出频率
static unsigned int period = 100; // 输出周期,单位为微秒
TH0 = (65536 - period) / 256; // 设置定时器初值
TL0 = (65536 - period) % 256;
counter++; // 计数器加1
if (counter >= 16) // 每16次中断,输出一次波形
{
counter = 0;
P0 = sine_table[index];
index++;
if (index >= sizeof(sine_table)) // 波形数据循环
{
index = 0;
}
}
}
int main()
{
unsigned long int freq = 1000; // 输出频率,单位为Hz
unsigned int period = FOSC / 12 / freq; // 输出周期,单位为微秒
TMOD = 0x01; // 设置定时器0为模式1
TH0 = (65536 - period) / 256; // 设置定时器初值
TL0 = (65536 - period) % 256;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
while (1)
{
// 可以通过串口等方式修改输出频率
}
return 0;
}
```
程序的思路很简单,就是利用定时器0产生一定频率的中断,在中断服务程序中输出预先定义好的正弦波形数据。其中,预先定义好的正弦波形数据可以通过Excel等软件生成,然后拷贝到程序中即可。此外,程序还可以通过串口等方式动态修改输出频率。
阅读全文