📄 main.c
字号:
if(g_intMark & Time_60_s_Mark)
{
g_intMark &= ~Time_60_s_Mark;
//
if(g_intMarkA & RunLess1Minute_MarkA)
{
g_intMarkA |= RunBetween12Minute_MarkA;
}
else
{
g_intMarkA |= RunLess1Minute_MarkA;
}
//打印时间
if(g_chDebugTail == 0)//保证只写一个时间信息 秒没有意义
{//选择在非交流状态下,打印时间,避免会丢掉一些重要信息
unsigned char chM[] = "[xx:xx]\n\r";
chM[1] = (g_chHour / 10) + 48;
chM[2] = (g_chHour % 10) + 48;
chM[4] = (g_chMinute / 10) + 48;
chM[5] = (g_chMinute % 10) + 48;
ExternInsertDebugSendBuf(chM,sizeof(chM) - 1);
}
}
}
}
/***************************************************
*功能: 调整系统时钟晶振
*参数: DELTA : 将晶振调整到 DELTA * 4096
*返回: 无
****************************************************/
void Set_DCO (void) // Subroutine to set DCO to selected frequency
{//用查询的方式工作,不需要中断处理程式
unsigned int Compare, Oldcapture;
#ifdef Only_SPY
unsigned int intMax;
#endif
unsigned char chTimer;
chTimer = 0;
Oldcapture = 0;
CCTL2 = CCIS0 + CM0 + CAP; // Define CCR2, CAP, ACLK
TACTL = TASSEL1 + TACLR + MC1; // SMCLK, continous mode
//根据实际调试的结果,给。。。值,以加快运行速度
DCOCTL = 184;//101 11000
BCSCTL1 = 182;//1011 0111 1[关闭8M] 0[使用32K] 11[ACLK八分频] 0[必须=0]
while (1)
{
while ((CCTL2 & CCIFG) != CCIFG); // Wait until capture occured!
CCTL2 &= ~CCIFG; // Capture occured, clear flag
Compare = CCR2; // Get current captured SMCLK
Compare = Compare - Oldcapture; // SMCLK difference
Oldcapture = CCR2; // Save current captured SMCLK
if (DELTA == Compare)
{
break; // if equal, leave "while(1)"
}
else if (DELTA < Compare) // DCO is too fast, slow it down
{
DCOCTL--;
if (DCOCTL == 0xFF) // Did DCO role under?
{
if(BCSCTL1 <= 176)
{
BCSCTL1 = 182;
}
else
{
BCSCTL1--; // Select next lower RSEL
}
}
}
else
{
#ifdef Only_SPY
if(intMax < Compare)
{//记录最大的次数
intMax = Compare;
if(chTimer > 10)
{//已经运行过 一回
if((DELTA - 50) < Compare)
{//950 即可
break;
}
}
}
if(chTimer > 15)
{//已经尽力了!-------------所有与时间有关的东西尽量使用 32K的定时器
if ((intMax - 50) < Compare)
{//...
break;
}
}
#endif
if((chTimer % 5) == 0)
{
P2OUT ^= ParamReset_LED;
P2OUT ^= ParamAuto_LED;
}
DCOCTL++;
if (DCOCTL == 0x00) // Did DCO role over?
{
if(BCSCTL1 >= 183)
{
BCSCTL1 = 176;
chTimer++;
}
else
{
BCSCTL1++; // Select next higher RSEL
}
}
}
}
CCTL2 = 0; // Stop CCR2 function
TACTL = 0; // Stop Timer_A
}
///////////////////////////////////////////////////////////////////////////////////////////////////
/*************************************
*功能: 系统初始化端口---------位于最前端!
*参数: 无
*返回: 无
**************************************/
void SysInit_IO(void)
{
//将系统频率调整到4MHZ---必须位于最开始处
unsigned int i;
//先把所有的I/O变成 高阻 状态!
//P1--P6 为普通IO ,并且为输入
P1SEL = 0;
P1DIR = 0;
P2SEL = 0;
P2DIR = 0;
P3SEL = 0;
P3DIR = 0;
P4SEL = 0;
P4DIR = 0;
P5SEL = 0;
P5DIR = 0;
P6SEL = 0;
P6DIR = 0;
//让LED10亮 #define Run_LED BIT0 //Run_LED//----P2.0 输出控制,送低亮
//调节频率
P2DIR |= LCD_All;//输出
P2OUT &= ~LCD_All;//送低亮
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗定时器
BCSCTL1 |= DIVA1 + DIVA0; // ACLK = LFXT1CLK/8 = 4kHz---不再变化,最慢 = 4kHz
for (i = 0xFFFF; i > 0; i--); // Delay for XTAL to settle
Set_DCO(); //将系统频率调整到4MHZ----------debug
P2OUT |= LCD_All;//送高不亮
InitInformationRam_PowerOn();
//IO 的定义 IO 的定义 IO 的定义 IO 的定义 IO 的定义 IO 的定义
//打开定时器B:
TBCTL = TBSSEL0 + TBCLR + ID_2; // ACLK, clr. TBR, 1/4 input divider = 1kHz, + CNTL_0 16bit = 0 不用画,
TBCCTL0 = CCIE; // TRCCR0 interrupt enabled
TBCCR0 = 50; //CCR 0 50 ms
TBCTL |= MC0;
//两个串口-----------用做串口,发输出,收输入
P3SEL |= TXD; //用做串口
P3DIR |= TXD; //TXD0//-----P3.4--与PC通讯
P3SEL |= RXD; //用做串口
// P3DIR |= RXD0 ; //RXD0//-----P3.5-- 默认为输入,不需要设置
P3SEL |= TXDA; //用做串口
P3DIR |= TXDA; //HTXD//-----P3.6--与环境板通讯
P3SEL |= RXDA; //用做串口
// P3DIR |= HRXD ; //HRXD//-----P3.7-- 默认为输入,不需要设置
//打开串口0--与 PC 9600
UCTL0 = CHAR; // 8-bit character
UTCTL0 = SSEL1; // UCLK = SMCLK
// UBR00 = 0xAA; // 4096k/9600 - 426.65(01AAH)
// UBR10 = 0x01; //
// UMCTL0 = 0x6E; // Modulation
UBR00 = 0x55; // 4096k/4800 - 853.33333(0355H)
UBR10 = 0x03; //
UMCTL0 = 0xD0;
if(*(unsigned char *)CommMode_Info == '2')// 960000
{
UBR00 = 0xAA; // 4096k/9600 - 426.65(01AAH)
UBR10 = 0x01; //
UMCTL0 = 0x6E; // Modulation
}
if(*(unsigned char *)CommMode_Info == '4')// 2400
{
UBR00 = 0xAA; // 4096k/2400 - 1706.66666(06AAH)
UBR10 = 0x06; //
UMCTL0 = 0x6E;
}
ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD
IE1 |= URXIE0 + UTXIE0; // Enable USART0 RX TX interrupt
// //打开串口1--与 ENV 9600
UCTL1 = CHAR; // 8-bit character
UTCTL1 = SSEL1; // UCLK = SMCLK
// UBR01 = 0xAA; // 4096k/9600 - 426.65(01AAH)
// UBR11 = 0x01; //
// UMCTL1 = 0x6E; // Modulation
// UBR01 = 0x55; // 4096k/4800 - 853.33333(0355H)
// UBR11 = 0x03; //
// UMCTL1 = 0xD0;
UBR01 = 0xAA; // 4096k/2400 = (06AAH)
UBR11 = 0x06; //
UMCTL1 = 0x6E;
ME2 |= UTXE1 + URXE1; // Enable USART0 TXD/RXD
IE2 |= URXIE1 + UTXIE1; // Enable USART0 RX TX interrupt
//三个温度传感器输入端 --P3.1----P3.3
P3DIR &= ~(DQ + DQ1 + DQ2); //双向IO,定义输入即可!
//五个与DTMF有关的位
////SAD//---P1.5,DTMF寄存器选择 //MT88L89//-P1.6,88L89的片选 输出
P1DIR |= MT88L89; //输出
P1OUT |= MT88L89; //高芯片无效
//其他部分 在 mt8889中定义
//六个环境检测信号输入端 ---光偶不动作 读到为低,光偶动作 读到为高 P50---P53 T0、T1、T2、T3
//默认为读状态,不用做如何改动
//LCD 有四个 全部为控制
//LCDrs//----P1.4--J1.5---LCD 是数据,还是指令 H: Data L: Instruction Code
//LCDrw//----P2.7--J1.16--LCD 读写控制 H: Read L: Write
//LCDenb//---P3.0--J1.17--LCD 可用工作,高电平工作
//LCDcs//----P5.7--J2.23--LCD 的片选, 低电平有效
P1DIR |= LCDrs;
P2DIR |= LCDrw;
P3DIR |= LCDenb;
P5DIR |= LCDcs;
P3OUT &= ~LCDenb;//低 无效
P5OUT |= LCDcs;//高 无效
//两个Speak的控制端
//P6.5--J2.6---Speak控制端,高有效
P6DIR |= Speak; //输出
P6OUT &= ~Speak; //低,不叫
//NOspeak-P4.5,Speak按键控制端,低有效---默认为读状态,不用做如何改动
//两个继电器控制端
//Mjout1-P5.5,继电器T1控制端,高有效 //Mjout2-P5.6,继电器T2控制端,高有效
P5DIR |= Mjout1 + Mjout2; // 输出
P5OUT &= ~(Mjout1 + Mjout2); //低 继电器 不动作
//三个模拟信号输入端
//INAD1--P6.0,INAD2--P6.1 两路模拟信号输入端 IN48---P6.2,48V模拟信号输入
P6SEL |= INAD1 + INAD2 + IN48; //模拟信号输入端
//ADC12CTL0 = ADC12ON + SHT0_12+ REFON + REF2_5V + MSC; //打开AD,定义采样周期、内部参考电压
// 和触发方式
ADC12CTL0 = ADC12ON + MSC + SHT0_12 + SHT1_12; // Turn on ADC12, set sampling time
//ADC12CTL1 = SHP + CONSEQ_1 + ADC12SSEL_2; //序列单次,MCLK
ADC12CTL1 = SHP + CONSEQ_1 + ADC12SSEL_1 + CSTARTADD_0; //序列单次,ACLK,从那里开始
//ADC12MCTL15 = EOS; //定义第 ? 个通道序列转换的最后通道
ADC12MCTL0 = SREF_2 + INCH_0; // Vr+=Vref+,通道的设定
ADC12MCTL1 = SREF_2 + INCH_1;
ADC12MCTL2 = SREF_2 + INCH_2;
ADC12MCTL3 = SREF_2 + INCH_0; // Vr+=Vref+,通道的设定
ADC12MCTL4 = SREF_2 + INCH_1;
ADC12MCTL5 = SREF_2 + INCH_2;
ADC12MCTL6 = SREF_2 + INCH_0; // Vr+=Vref+,通道的设定
ADC12MCTL7 = SREF_2 + INCH_1;
ADC12MCTL8 = SREF_2 + INCH_2;
ADC12MCTL9 = SREF_2 + INCH_0; // Vr+=Vref+,通道的设定
ADC12MCTL10 = SREF_2 + INCH_1;
ADC12MCTL11 = SREF_2 + INCH_2;
ADC12MCTL12 = SREF_2 + INCH_0; // Vr+=Vref+,通道的设定
ADC12MCTL13 = SREF_2 + INCH_1;
ADC12MCTL14 = SREF_2 + INCH_2;
ADC12MCTL15 = SREF_2 + INCH_0 + EOS; // Vr+=Vref+,通道的设定
ADC12CTL0 |= ENC; // Enable conversions
//一个按键输入信号 //CHEK----P1.2,自检按键控制端,常态为高,低有效 -- 默认为输入,不需要设置
//输出PWM #define TTDA BIT3 //TTDA----P1.3
BCSCTL2 &= ~SELS;//选择DCOCLK作为 SMCLK的源
TACTL = TASSEL1 + TACLR; // SMCLK, Clear Tar
CCR0 = 100; // PWM Period
CCTL2 = OUTMOD_2; // CCR1 reset/set 在0---CCR1 低 在 CCR1---CCR0 高
CCR2 = 50; // CCR1 PWM duty cycle
P1DIR |= TTDA; // P1.3 output
P1SEL |= TTDA; // P1.3 TA1/2 otions
TACTL |= MC0;
//得到 1.69V 的 电压 12.5 us 的宽度
//八个指示灯,输出控制,送低亮 P20---P27
P2DIR |= LCD_All; //全部输出
P2OUT &= ~LCD_All; //灯全部亮
}
/*************************************
*功能: Timer B0 interrupt service routine
*参数: 无
*返回: 无
*备注: 每 50 ms 产生一个中断
**************************************/
interrupt[TIMERB0_VECTOR] void Timer_B0 (void)
{
intTBCount_50ms++; // 50 ms 要从 1 开始 因为 0 ++ = 1
g_intMark |= Time_50_ms_Mark;
//50 ms * 6 = 300 ms
if((intTBCount_50ms % 6 == 0))
{
g_intMark |= Time_300_ms_Mark;
}
//50 ms * 20 = 1 s
if((intTBCount_50ms % 20 == 0))
{
g_intMark |= Time_1_s_Mark;
}
//50 ms * 1200 = 60 s
if((intTBCount_50ms % 1200 == 0))
{
g_intMark |= Time_60_s_Mark;
}
//64800 / 1200 = 54
intTBCount_50ms %= 64800;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -