?? dtmf.~c
字號:
/********************************************************
http://www.sl.com.cn
雙龍電子公司----雙音頻信號(DTMF)演示程序
鍵盤布置圖:
1 2 3 A--PB4
4 5 6 B--PB5
7 8 9 C--PB6
* 0 # D--PB7
| | | |
P P P P
B B B B
0 1 2 3
喇叭接線圖:PD5(OC1A)--1K電阻--喇叭
********************************************************/
#include <io8515.h>
#include <macros.h>
#define Xtal 8000000 // 系統時鐘頻率
#define prescaler 1 // T1預分頻系數
#define N_samples 128 // 在查找表中的樣本數
#define Fck Xtal/prescaler // T1工作頻率
#define delaycyc 10 // 讀取port C口延時循環數
#pragma interrupt_handler ISR_T1_Overflow:7
/*************************** 正弦表 *****************************
樣本表: 一個周期分成128個點,每點按7位進行量化
****************************************************************/
flash unsigned char auc_SinParam [128] = {
64,67,
70,73,
76,79,
82,85,
88,91,
94,96,
99,102,
104,106,
109,111,
113,115,
117,118,
120,121,
123,124,
125,126,
126,127,
127,127,
127,127,
127,127,
126,126,
125,124,
123,121,
120,118,
117,115,
113,111,
109,106,
104,102,
99,96,
94,91,
88,85,
82,79,
76,73,
70,67,
64,60,
57,54,
51,48,
45,42,
39,36,
33,31,
28,25,
23,21,
18,16,
14,12,
10,9,
7,6,
4,3,
2,1,
1,0,
0,0,
0,0,
0,0,
1,1,
2,3,
4,6,
7,9,
10,12,
14,16,
18,21,
23,25,
28,31,
33,36,
39,42,
45,48,
51,54,
57,60};
//*************************** x_SW *************************
// x_SW 表(8倍): x_SW = ROUND(8*N_samples*f*510/Fck)
//************************************************************
//高頻(列)
//1209hz ---> x_SW = 79
//1336hz ---> x_SW = 87
//1477hz ---> x_SW = 96
//1633hz ---> x_SW = 107
const unsigned char auc_frequencyH [4] = {
107,96,
87,79};
//低頻(行)
//697hz ---> x_SW = 46
//770hz ---> x_SW = 50
//852hz ---> x_SW = 56
//941hz ---> x_SW = 61
const unsigned char auc_frequencyL [4] = {
61,56,
50,46};
//************************** 全局變量 ****************************
unsigned char x_SWa = 0x00; // 高頻信號脈沖寬度
unsigned char x_SWb = 0x00; // 低頻信號脈沖寬度
unsigned int X_LUTaExt = 0;
unsigned int X_LUTbExt = 0;
unsigned int X_LUTa;
unsigned int X_LUTb;
/*****************************************************************
定時器溢出中斷服務程序
******************************************************************/
void ISR_T1_Overflow (void)
{
X_LUTaExt += x_SWa;
X_LUTbExt += x_SWb;
// 數據規格化
X_LUTa = (char)(((X_LUTaExt+4) >> 3)&(0x007F));
X_LUTb = (char)(((X_LUTbExt+4) >> 3)&(0x007F));
// 計算 PWM 值: 高頻值 + 3/4 低頻值
OCR1A = (auc_SinParam[X_LUTa] + (auc_SinParam[X_LUTb]-(auc_SinParam[X_LUTb]>>2)));
}
/***********************************************************
初始化
***********************************************************/
void init (void)
{
MCUCR=0x00;
TIMSK = 0x80; // T1 溢出中斷使能
TCCR1A = (1<<COM1A1)+(1<<PWM10); // 不翻轉、8位PWM
TCCR1B = (1<<CS10); // 預分頻系數為1、即CLK/1
DDRD = (1 <<PD5); // PD5 (OC1A)用作輸出
_SEI(); // 全局中斷使能
}
/*********************************************************************
為從PORT C口讀取穩定的按鍵數據,所必須的延時程序(消抖延時)
*********************************************************************/
void Delay (void)
{
int i;
for (i = 0; i < delaycyc; i++) _NOP();
}
/********************************************************************
主程序
從PORT C口讀取按鍵數據(如:SL
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -