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

📄 main.c

📁 单片机和PC机通讯的调试代码
💻 C
📖 第 1 页 / 共 2 页
字号:
//********************** 主处理 ****************
#include "msp430x14x.h"
#include "main.h"
//2002-11-10 14:31 全面检查一遍
/**************************************************************************************************************************/

//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
//from Mt8889.c
extern void init_8889(void);
//from Dtmf.c
extern void DtmfPhysicsReceive(void);
extern unsigned char g_chDtmfPhysicsReceive_50ms;
extern void DtmfPhysicsSend(void);
extern void BuildDTMF(void);
extern unsigned char g_chBuildDTMFTime_1s;
//from Debug.c
extern void ExternInsertDebugSendBuf(unsigned char *pData, unsigned int intLen);
extern void MainDebugProcess(void);
extern unsigned char  g_chMainDebugSendTimeout_1s;
extern unsigned char  g_chMainDebugProcessTimeout_1s;
extern unsigned char  g_chDebugTail;
extern unsigned int g_int135Ver;
//from commpc.c
extern void QueryReportPC(void);
extern unsigned char g_chMainPushReportTime_1s;
extern unsigned char g_chSendPCBuf_1s;
extern void ReceivePCBuf(void);
extern void SendPCBuf(void);
extern void MainPushReport(void);
extern unsigned char g_chReceivePCBuf_1s;
extern unsigned char g_chMainPushReport_Stat;
//from flash.c
extern void InitInformationRam_PowerOn(void);
//from lcd.c
extern void InitLcd(void);
//from innerComm.c
extern void MainInnerComm(void);
extern unsigned char g_chMainInnerComm_50ms;
extern unsigned char g_chInnerCommSendBuf[MacroInnerCommSendBufMax];
extern void AddCheckSum(unsigned char chLen);
extern unsigned int g_intGP_FixedCurrent[8];
//from Env.c
extern void ProcessTemperatures(void);
extern unsigned char g_chDoorSwitch_50ms;
extern unsigned char g_chDoorOpened_1s;
extern unsigned char g_chDoorClosed_50ms;
extern void ReadDoorID(void);
extern void MainDoor(void);
extern void ProcessSwitch(void);
extern void ProcessAD(void);
extern unsigned char g_chProcessAD_50ms;
//from ds1820drv.c
extern void DS1820_Init(void);
//from lcd.c
extern void LcdDrive(void);
extern unsigned char g_chLcdDrive_50ms;
//from lcdshow.c
extern void MainLcdProcess(void);
extern unsigned char g_chMainLcdProcess_1s;
extern void ProcessKeyStoke(void);
extern unsigned char g_chMainLcdProcess_Stat;
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
///////////////////本模块函数声明//////////////////////////////
void Set_DCO (void);
void SysInit_IO(void);
//用作为 16 个位!BOOLEAN 变量来使用
unsigned int g_intMark;
unsigned int g_intMarkA;
//每 50 ms 的计数器!
unsigned int intTBCount_50ms;
//时间处理
unsigned char g_chSecond, g_chMinute = Ver_ID4, g_chHour = Ver_ID3, g_chDay = 4, g_chMonth = 9, g_chYear = 3, g_chSecondAdjust;
//unsigned char g_chSecond, g_chMinute, g_chHour, g_chDay, g_chMonth, g_chYear;
//                     *********调试版本 Hour:Minute  *** ###编译时间 Year-Month-Day #######################
unsigned char g_chKeyStoke_1s;
/**************************************************************************************************************************/

/**************************************
*功能:主程序       
*参数:
*返回:
**************************************/
void main(void)
{   
    g_intMark = 0;
    g_intMarkA = 0;
    SysInit_IO();
    //调用外部
    init_8889();
    InitLcd();
    DS1820_Init();
    //也可在后的地方开中断
    _EINT();
    //用于开机要问 工频固定数值的标志
    g_intGP_FixedCurrent[0] = 9999;
    //test
//    g_intMark |= CommDebugUart_Mark;
//    g_intMark |= RS232DTMFSendPC_Mark;
    //g_intMark |= CommBuilded_Mark;
    //开机必须要有这个标志
    g_intMark |= ICanPush_Mark;
    //写上电标志
    g_intMark |=  PowerOn_Mark;
    //开机下一次时间!下时间!---在每次更改的时候下!
    //g_chMainInnerComm_Stat = 0;
    g_chInnerCommSendBuf[1] = 216;
    //second minute hour
    g_chInnerCommSendBuf[2] = g_chSecond;
    g_chInnerCommSendBuf[3] = g_chMinute;
    g_chInnerCommSendBuf[4] = g_chHour;
    //5 sum
    //6 200
    AddCheckSum(5);
    while (1)
    {
        //实时运行
        if(g_intMarkA & RunLess1Minute_MarkA)
        {//运行后 超过一分钟
            if(g_intMarkA & RunBetween12Minute_MarkA)
            {//运行后 超过二分钟
                //让灯 反转
                P2OUT ^= Run_LED;
            }
            else
            {//运行后 一分钟 到 二分钟之间
                //让灯 亮
                P2OUT &= ~Run_LED;
                //显示按键有问题!
                if(g_intMarkA & KeyStokeGood_MarkA)
                {
                    //表明按纽OK
                }
                else
                {
                    if((g_intMarkA & KeyStokeMute_MarkA) || (g_intMarkA & KeyStokeAuto_MarkA))
                    {//表明肯定有一个有问题
                        g_chMainLcdProcess_Stat = 8;
                    }
                }
            }
        }
        else 
        {//运行后 不到一分钟
            if(g_intMarkA & KeyStokeGood_MarkA)
            {//两个按纽是否正常
                //按自校验按纽超过 5 秒  g_chKeyStoke_1s
                if(P1IN & CHEK)
                {//CHEK BIT2        //CHEK----P1.2,自检按键控制端,常态为高,低有效
                    //高,没有动作
                    g_chKeyStoke_1s = 0;
                }
                else
                {
                    if(g_chKeyStoke_1s > 5)
                    {//启动 自己校验自己
                        //----------no--------
                    }
                }
            }
            else
            {//检查!
                if(P6IN & NOspeak)
                {//NOspeak BIT7 //P6.7--J2.4---Speak按键控制端,低有效
                    //高,没有动作
                }
                else
                {
                    //可能有问题!
                    g_chKeyStoke_1s = 0;
                    g_intMarkA |= KeyStokeMute_MarkA;//如果有问题,在这里记录!
                }
                if(P1IN & CHEK)
                {//CHEK BIT2        //CHEK----P1.2,自检按键控制端,常态为高,低有效
                    //高,没有动作
                }
                else
                {
                    g_chKeyStoke_1s = 0;
                    g_intMarkA |= KeyStokeAuto_MarkA;//如果有问题,在这里记录!
                }
                if(g_chKeyStoke_1s > 5)
                {
                    //表明按纽OK
                    g_intMarkA |= KeyStokeGood_MarkA;
                    //以下太严格,开机后不可以按一下!---改为不如果一分钟里 不停在按键,表示坏
//                  if((g_intMarkA & KeyStokeMute_MarkA) || (g_intMarkA & KeyStokeAuto_MarkA))
//                  {//表明肯定有一个有问题
//                      g_chMainLcdProcess_Stat = 8;
//                  }
                }
            }
        }    
        //处理软 RESET
        if(g_intMark & SoftReset_Mark)
        {
            if(intTBCount_50ms > 20)//借用
            {//1 s
                WDTCTL = 0;
            }
        }
        DtmfPhysicsReceive();
        MainDebugProcess();
        ReceivePCBuf();
        SendPCBuf();
        MainPushReport();
        MainInnerComm();
        ReadDoorID();
        MainDoor();
        ProcessSwitch();
        LcdDrive();
        MainLcdProcess();
        ProcessAD();
        ProcessKeyStoke();
        if(g_int135Ver > 0)
        {
            if(g_intMark & HaveDTMFModule_Mark)
            {//有DTMF模块
                BuildDTMF();
            }
            else
            {//由于无 DTMF模块,这里保证不使用 DTMF 通信
                g_intMark &= ~DTMFPhysicsReceiveWorkToPCBuf_Mark;//保证DTMF不工作
                g_intMark &= ~RS232DTMFSendPC_Mark;//保证DTMF不工作
                g_intMark &= ~DtmfPhysicsReceive_Mark;//保证DTMF不工作
            }
        }
        //每 50 ms 处理一次
        if(g_intMark & Time_50_ms_Mark)
        {
            g_intMark &= ~Time_50_ms_Mark;
            //
            g_chMainInnerComm_50ms++;
            g_chDoorSwitch_50ms++;
            g_chDoorClosed_50ms++;
            g_chLcdDrive_50ms++;
            g_chProcessAD_50ms++;
            g_chDtmfPhysicsReceive_50ms++;
            //
            DtmfPhysicsSend();
        }
        //每 300 ms 处理一次
        if(g_intMark & Time_300_ms_Mark)
        {
            g_intMark &= ~Time_300_ms_Mark;
            //2。喂狗  要勤快----开启了看门狗
            WDTCTL = WDT_ARST_1000; //使用 ACLK 1 秒 RESET
            //
            QueryReportPC();
        }
        //每 1 s 处理一次
        if(g_intMark & Time_1_s_Mark)
        {
            g_intMark &= ~Time_1_s_Mark; 
            //
            g_chMainDebugSendTimeout_1s++;
            g_chMainPushReportTime_1s++;
            g_chSendPCBuf_1s++;
            g_chBuildDTMFTime_1s++;
            g_chMainDebugProcessTimeout_1s++;
            g_chReceivePCBuf_1s++;
            g_chDoorOpened_1s++;
            g_chMainLcdProcess_1s++;
            g_chKeyStoke_1s++;
            //
            ProcessTemperatures();
            //运行时间段标志
            if(g_intMarkA & RunLess1Minute_MarkA)
            {//运行后 超过一分钟
                //不做任何事情
            }
            else
            {//运行后 不到一分钟
                //每 秒 反转一一次
                P2OUT ^= Run_LED;
            }
            //时间处理
            g_chSecondAdjust++;//没有不要考虑 g_chSecondAdjust 的其他地方 清 0
            if(g_chSecondAdjust > 249)//2002-8-11,运行 13 小时后慢1--2 秒
            {//由于时间 每 249.5 秒  会快一秒   所以这里每 249秒停止加 1 秒,用来校准时间
                g_chSecondAdjust = 0;
            }
            else
            {
                g_chSecond++;
            }
            if(g_chSecond >= 60)
            {
                g_chSecond = 0;//(保证0---59)
                g_chMinute++;
                if(g_chMinute >= 60)
                {
                    g_chMinute = 0;//(保证0---59)
                    g_chHour++;
                    if(g_chHour >= 24)
                    {
                        g_chHour = 0;//(保证0---23)
                        g_chDay++;
                        if(g_chDay >= 32)
                        {
                            g_chDay = 1;//(保证1---31)
                            g_chMonth++;
                            if(g_chMonth > 13)
                            {
                                g_chMonth = 1;//(保证1---12)
                                g_chYear++;//(不保证)
                            }   
                        }
                    }
                }
            }
        }
        
        //每 60 s 处理一次

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -