|
楼主 |
发表于 2009-4-17 17:18:12
|
显示全部楼层
1、找出点问题,中断一没打开。
2、clk通过一个电容接了晶振的一端。我用的片子是mega128,时序可能和51的不同。clk引脚接了porta。7,并加了延时。
问题还是多多。电话通后,按键没反应。不能进中断。(软件模拟可以的)
#include "port128.h"
#include <avr/io.h>
#include "avrlibdefs.h"
#include <avr/interrupt.h>
#include "dtmf.h"
#include "delay.h"
//PORTA0-PORTA3:D0-D3
//PORTA4:RW
//PORTA5:RS0
//PORTA6:CLK ++++++ avrµ¥Æ¬»úºÍ51µ¥Æ¬»úʱÐòÎÊÌ⣿¶ÔÓÚ51ͨ¹ýÒ»¸ö30pµÄµç×è½Ó¾§Õñ¹Ü½Å¡£¡£¡£¡£¡£¡£
#define DTMF PORTA
unsigned char data;
unsigned char dt_number=0;
unsigned char r_buf[8];
/* MT8880оƬ³õʼ»¯×Óº¯Êý */
void MT8880_initialize(void)
{
DTMF=0x3f; /* ¶ÁSR */
DTMF |= 0x40; //CS=0;
delay_1us();
DTMF=0x20; /* CRA=0000 */
DTMF &= 0xdf; //CS=1;
DTMF |= 0x40; //CS=0;
delay_1us();
DTMF=0x20; /* CRA=0000 */
DTMF &= 0xdf; //CS=1;
DTMF |= 0x40; //CS=0;
delay_1us();
DTMF=0x28; /* CRA=1000 */
DTMF &= 0xdf; //CS=1;
DTMF |= 0x40; //CS=0;
delay_1us();
DTMF=0x20; /* CRB=0000 */
DTMF &= 0xdf; //CS=1;
}
/* ½ÓÊÕ³õʼ»¯×Óº¯Êý */
void MT8880_rece_init(void)
{
cli();
cbi(DDRD,1);
sbi(PORTD,1);
EIMSK &= 0xfd;//ÆÁ±Îint1 1111 1101
EICRA = (EICRA|0x08)&0xfb;//int1ϽµÑØÑØ´¥·¢ ****10**
EIFR |= 0x02;//ÇåÁãintf1
EIMSK|= 0x02;//ʹÄÜint1
sei();
}
/* ½ÓÊÕÖжϷþÎñ³ÌÐò */
SIGNAL(SIG_INTERRUPT1)
{
cli();
DTMF |= 0x40; //CS=0;
delay_1us();
DTMF=0x3f; /* ¶ÁSR */
DTMF &= 0xdf; //CS=1;
DTMF |= 0x40; //CS=0;
delay_1us();
DTMF=0x1f; /* ¶ÁRDR */
DTMF &= 0xdf; //CS=1;
r_buf[dt_number++]=DTMF&0x0f; /* ±£´æ */
sei();
}
试验中,请路过的高手多多指教。 |
|