?? generator.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 + -