?? 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 + -