⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 generator.c

📁 利用单片制作信号发生器
💻 C
字号:
#include <reg51.h>
#include "hardware.h"
/* 
 *	在TIMER0的ISR中,将数据送入DAC0832, 
 *  通过在功能按键的中断中,改变HZ和幅度值,
 *  TIMER0的ISR将监测这些变量,达到调控的作用,
 */
unsigned char code data_buf[] = {
	128,131,134,137,140,143,146,149,
	152,156,159,162,165,168,171,174,
	176,179,182,185,188,191,193,196,
	199,201,204,206,209,211,213,216,
	218,220,222,224,226,228,230,232,
	234,236,237,239,240,242,243,245,
	246,247,248,249,250,251,252,252,
	253,254,254,255,255,255,255,255,
	256,255,255,255,255,255,254,254,
	253,252,252,251,250,249,248,247,
	246,245,243,242,240,239,237,236,
	234,232,230,228,226,224,222,220,
	218,216,213,211,209,206,204,201,
	199,196,193,191,188,185,182,179,
	176,174,171,168,165,162,159,156,
	152,149,146,143,140,137,134,131,
	128,124,121,118,115,112,109,106,
	103,99,96,93,90,87,84,81,
	79,76,73,70,67,64,62,59,
	56,54,51,49,46,44,42,39,
	37,35,33,31,29,27,25,23,
	21,19,18,16,15,13,12,10,
	9,8,7,6,5,4,3,3,
	2,1,1,0,0,0,0,0,
	0,0,0,0,0,0,1,1,
	2,3,3,4,5,6,7,8,
	9,10,12,13,15,16,18,19,
	21,23,25,27,29,31,33,35,
	37,39,42,44,46,49,51,54,
	56,59,62,64,67,70,73,76,
	78,81,84,87,90,93,96,99,
	103,106,109,112,115,118,121,124
};

bit	cur_signal = 0x20;	//当前输出波形, 0 方波 , 1 正弦
unsigned int data freq;	//频率

/* 方波占空比 */
unsigned char data time_high = 1, time_low = 1;

/* 与方波频率相关 */
unsigned char data rect_high_TH0;
unsigned char data rect_high_TL0;
unsigned char data rect_low_TH0;
unsigned char data rect_low_TL0;

/* 正弦频率相关 */
unsigned char data sin_TH0;
unsigned char data sin_TL0;

/* 与正弦幅度相关 */
unsigned char data range_low = 0, range_high = 0xff;
float data proportion = 1; /* 幅度与DAC量程之比 */ 

unsigned int data cur_pos = 0;

void enable_timer0()
{
	TMOD = 0X01; /* 方式1, 定时器	*/ 
	ET0 = 1;
	EA = 1;
	TR0 = 1;
}

void TIMER0_ISR() interrupt 1 using 1
{
	static rect_signal = 0;
	unsigned char sin_data;
	if (cur_signal == SIG_RECT) {
		//根据HZ和占空比计算两段时间(在KeyInt中完成),相继的送给THO/TL0
		if (rect_signal == 0) {
			TH0 = rect_high_TH0;
			TL0 = rect_high_TL0;
			DAC0832_data = 0xff;
			rect_signal = 1;
		} else {
			TH0 = rect_low_TH0;
			TL0 = rect_low_TL0;
			DAC0832_data = 0x0;
			rect_signal = 0;
		}
	} else if (cur_signal == SIG_SIN) { //正弦波
		TH0 = sin_TH0;
		TL0 = sin_TL0;
		sin_data = data_buf[(cur_pos++) % 256];
		sin_data = sin_data * proportion + range_low;
		DAC0832_data = sin_data;
	} else ;
	//	printerr("undefined signal", 16);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -