📄 telcontrol.c
字号:
#include "msp430x11x1.h"
unsigned char count; // 0.1秒定时中断中,计数中断的次数
unsigned char ok; // 0.1秒定时中断中,检查忙音波形是否正确,正确加一
unsigned char sys_state; // 系统状态,0->挂机态 1->通话态
void delay(unsigned int t); /* 延时 */
void tel_on(void); // 接通电话
void tel_off(void); // 挂断电话
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
count++;
if((count==1)||(count==2)||(count==3))
{
if((P2IN&BIT0)==0X00) ok++;
}
if((count==4)||(count==5))
{
if((P2IN&BIT0)!=0X00) ok++;
}
if(count==6)
{
if((P2IN&BIT0)!=0X00) ok++;
if(ok==6) // 检测正确
{
tel_off();
}
else
{
ok=0;
count=0;
TAR=0;
}
}
}
#pragma vector=PORT2_VECTOR
__interrupt void p2_in (void)
{
if(P2IFG&BIT0) // 忙音下降沿
{
ok=0;
count=0;
TAR=0;
TACTL |= MC0; // Start Timer_a in 增计数模式
P2IFG &=~BIT0;
}
if(P2IFG&BIT1) // 振铃
{
tel_on();
delay(1000);
P2IFG =0x00;
}
if(P2IFG&BIT2) // 按钮
{
if(sys_state==0) // 挂机态
{
tel_on();
}
else
{
tel_off();
}
delay(5000);
P2IFG =0x00;
}
}
void main(void)
{
WDTCTL = WDTPW+WDTHOLD;
P1DIR=0Xff;
P2DIR=0XF8; // 1111,1000
P2IE =0X07; // 0000,0111
P2IES=0Xff; // 下降延中断
// 初始化 Timer A
TACTL = TASSEL0 + TACLR; // ACLK, 清除 TAR
CCR0 = 3276; // 每秒10次
CCTL0 = CCIE; // CCR0 允许中断
tel_off(); // 挂机
P2IFG=0X00;
_EINT();
while(1)
{
;
}
}
void tel_on(void) // 接通电话 P1.0
{
sys_state=1;
P1OUT|=BIT0;
P2IE|=BIT0; // 忙音
P2IE&=~BIT1; // 振铃
// TACTL |= MC0; // Start Timer_a in 增计数模式
delay(10);
P2IFG=0X00;
}
void tel_off(void) // 挂断电话
{
sys_state=0;
P1OUT&=~BIT0;
P2IE&=~BIT0; // 忙音
P2IE|=BIT1; // 振铃
TACTL &= ~MC0; // Stop Timer_a
delay(10000);
P2IFG=0X00;
}
void delay(unsigned int t) /* 延时 */
{
unsigned int i;
unsigned char j;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -