⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 单片机和PC机通讯的调试代码
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -