?? main14.c
字號:
/********************************************************************************************************
** RidenFlow
**
** 版權所有 (c) 2007,羅建
** 保留所有權利
**
** V1.0
**
**
**-------------------------------------------------文件信息----------------------------------------------
**文 件 名: Main.C
**設 計 者: 羅建
**最后修改日期: 2007年11月24日
**描 述: 源程序。
**其 它:MCU采用C8051F020,外部晶振為22.1184MHz,采用臺達3.8'LCD觸摸屏顯示測量數據和輸入配置信息,
** 并控制電磁閥和比例閥對,
**所屬項目概述:RIDEN FLOW流量計是用于測試氣體流量的裝置,其工作原理為:壓縮空氣經空氣過濾器到達比例控制閥,
** 經比例控制閥調壓穩定后,通過氣路通斷控制閥,到達氣體流量計,然后進入產品。該裝置功能就是測
** 量流過氣體的質量流量。
** 各部件的作用如下:
** 1、比例控制閥:其作用是調節前端的高壓氣體以使其穩定在設置的壓力值附近,為測試提供一個穩定的
** 氣源。
** 2、氣路通斷控制閥:在每一個測量周期內,此閥通斷一次,即在測試檢測過程中打開,測試完成后關閉,
** 直到下一個測試開始。
** 3、氣體流量計:用于測量流經該傳感器的壓縮空氣的流量。
**基本技術參數:1、被測介質: 壓縮空氣,<0.8MPa;
** 2、氣體流量范圍: 0-50L/min(超量程50% 顯示 Out Range);
** 3、流量精度: 0.01L/min;
** 4、采集及顯示頻率: 3Hz;
** 5、測試壓力: 0-50KPa(自動調節,穩壓);
** 6、測試壓力精度: 0.1KPa;
** 7、充氣時間: 0-999.9S;
** 8、測試時間: 0-999.9S;
** 9、校準系數: 5段;
** 10、通訊接口(To PC): RS232。
**
**-----------------------------------------------歷史版本信息--------------------------------------------
** 設計者: 羅建
** 版 本: V1.00
** 日 期: 2007年11月24日
** 描 述: 原始版本
**
**-----------------------------------------------當前版本修訂--------------------------------------------
** 修改者: 羅建
** 版 本: V1.00
** 日 期: 2007年11月24日
** 描 述: 原始版本。
**
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include <c8051f020.h> // SFR declarations
//#include <Intrins.h>
//#include <String.h>
#include "GlobeDef.h"
//-------------------------------------------------------------------------------------------------------
/* C8051F02x單片機的16位SFR定義 */
sfr16 DP = 0x82; // data pointer
sfr16 TMR3RL = 0x92; // Timer3 reload value
sfr16 TMR3 = 0x94; // Timer3 counter
sfr16 ADC0 = 0xbe; // ADC0 data
sfr16 ADC0GT = 0xc4; // ADC0 greater than window
sfr16 ADC0LT = 0xc6; // ADC0 less than window
sfr16 RCAP2 = 0xca; // Timer2 capture/reload
sfr16 T2 = 0xcc; // Timer2
sfr16 RCAP4 = 0xe4; // Timer4 capture/reload
sfr16 T4 = 0xf4; // Timer4
sfr16 DAC0 = 0xd2; // DAC0 data
sfr16 DAC1 = 0xd5; // DAC1 data
//-------------------------------------------------------------------------------------------------------
/* 本項目對C8051F02x單片機的引腳重定義,其中,XBR0 = 0x1F,XBR1 = 0x14,XBR2 = 0x44,P0MDOUT = 0x15,P1MDOUT = 0x01,P2MDOUT = 0x00,P3MDOUT = 0x80 */
// P0
sbit UART0_TX = P0^0; // XBR0.2 = 1(UART0EN = 1),P0MDOUT.0 = 1,TX0作為推挽方式
sbit UART0_RX = P0^1;
sbit SPI_SCK = P0^2; // XBR0.1 = 1(SPI0EN = 1),P0MDOUT.2 = 1,P0MDOUT.4 = 1,SPI_SCK和SPI_MOSI作為推挽方式
sbit SPI_MISO = P0^3;
sbit SPI_MOSI = P0^4;
sbit SPI_NSS = P0^5;
sbit I2C_SDA = P0^6; // XBR0.0 = 1(SMB0EN = 1)
sbit I2C_SCL = P0^7;
// P1
sbit UART1_TX = P1^0; // XBR2.2 = 1(UART1EN = 1),P1MDOUT.0 = 1,TX1作為推挽方式
sbit UART1_RX = P1^1;
sbit PCA0_CEX0 = P1^2; // XBR0.[5..3] = 011(PCA0ME = 011),CEX0、CEX1和CEX2連到三個端口上
sbit PCA0_CEX1 = P1^3;
sbit PCA0_CEX2 = P1^4;
sbit INT0_SCK = P1^5; // XBR1.2 = 1(INT0E = 1),P1MDOUT.5 = 0,漏極開路方式,并使INT0_SCK = 1將其配置為數字輸入
sbit INT1_CS = P1^6; // XBR1.4 = 1(INT1E = 1),P1MDOUT.6 = 0,漏極開路方式,并使INT1_CS = 1將其配置為數字輸入
sbit INT2_MOSI = P1^7; // GPIO,P1MDOUT.7 = 0,漏極開路方式,并使INT2_MOSI = 1將其配置為數字輸入
// P2
sbit KEY_START = P2^0; // P2MDOUT.0 = 0,漏極開路方式,并使KEY_START = 1將其配置為數字輸入
sbit KEY_STOP = P2^1; // P2MDOUT.1 = 0,漏極開路方式,并使KEY_STOP = 1將其配置為數字輸入
sbit PORT_P22 = P2^2; // 保留
sbit PORT_P23 = P2^3; // 保留
sbit DRV_PASS = P2^4; // P2MDOUT.4 = 0,漏極開路方式,作為數字輸出,高電平由外部上拉電阻確定
sbit DRV_FAIL = P2^5; // P2MDOUT.5 = 0,漏極開路方式,作為數字輸出,高電平由外部上拉電阻確定
sbit DRV_WARN = P2^6; // P2MDOUT.6 = 0,漏極開路方式,作為數字輸出,高電平由外部上拉電阻確定
sbit DRV_VALVE = P2^7; // P2MDOUT.7 = 0,漏極開路方式,作為數字輸出,高電平由外部上拉電阻確定
// P3
sbit LCD_RS = P3^0; // P3MDOUT.0 = 0,漏極開路方式,作為數字輸出,高電平由外部上拉電阻確定
sbit LCD_RW = P3^1; // P3MDOUT.1 = 0,漏極開路方式,作為數字輸出,高電平由外部上拉電阻確定
sbit LCD_E = P3^2; // P3MDOUT.2 = 0,漏極開路方式,作為數字輸出,高電平由外部上拉電阻確定
sbit LCD_CS1 = P3^3; // P3MDOUT.3 = 0,漏極開路方式,作為數字輸出,高電平由外部上拉電阻確定
sbit LCD_CS2 = P3^4; // P3MDOUT.4 = 0,漏極開路方式,作為數字輸出,高電平由外部上拉電阻確定
sbit LCD_LED = P3^5; // P3MDOUT.5 = 0,漏極開路方式,作為數字輸出,高電平由外部上拉電阻確定
sbit LCD_RST = P3^6; // P3MDOUT.6 = 0,漏極開路方式,作為數字輸出,高電平由外部上拉電阻確定
sbit SPI_CS = P3^7; // P3MDOUT.7 = 1,推挽方式,作為數字輸出,高電平由內部弱上拉電阻確定
// P4
sfr LCD_DBX = 0x84; // P4,P74OUT = 0x00,P4口被配置為漏極開路方式,作為數字輸出,高電平由外部上拉電阻確定
// ------------------------------------------------------------------------------------------------------
/* 定義位變量 */
bit gbReadyWarn; /* 指示是否進入告警超時檢測過程,0~否,1~是 */
bit gbCanGetKey; /* 指示是否可以再次檢測按鍵,0~否,1~是 */
bit gbTimeOver; /* 指示規定的定時間隔時間(100ms)時否到,0~未到,1~已到 */
bit gbTestOver; /* 指示當前是否已完成或退出了檢測狀態,0~非檢測狀態或檢測過程未結束,1~檢測完成(但未退出檢測進程) */
bit gbSyncOneOK0; /* 指示串口0數據幀的第一個同步字節是否接收完畢,0~未收到,1~收到 */
bit gbSyncTwoOK0; /* 指示串口0數據幀的第二個同步字節是否接收完畢,0~未收到,1~收到 */
bit gbSyncOneOK1; /* 指示串口1數據幀的第一個同步字節是否接收完畢,0~未收到,1~收到 */
bit gbSyncTwoOK1; /* 指示串口1數據幀的第二個同步字節是否接收完畢,0~未收到,1~收到 */
bit gbStarted; /* 指示<啟動鍵>是否按下,0~未按下,1~按下 */
bit gbFilling; /* 指示當前是否工作于充氣狀態,0~否,1~是 */
bit gbTesting; /* 指示當前是否工作于測試狀態,0~否,1~是 */
/* 定義字節變量 */
INT8U data gnCntADC; /* ADC0采集間隔時間計數器(為了降低LCD的刷新率) */
INT8U data gnCntWarn; /* 壓力告警超時計數器 */
INT8U data gnCntAdjust; /* 壓力調節時間計數器 */
INT8U data gnCnt10ms; /* 10ms定時計數器,用于實現100ms定時 */
INT8U data gnCntGetKey; /* 兩次檢測按鍵之間的時間間隔(實際間隔是該值乘以100ms */
INT8U data gnTxdID0; /* 串口UART0發送緩沖區數組索引 */
INT8U data gnRxdID0; /* 串口UART0接收緩沖區數組索引 */
INT8U data gnRxdID1; /* 串口UART1接收緩沖區數組索引 */
INT8U data gnTxdNums0; /* 串口UART0發送緩沖區數組中的數據個數,即要發送的數據個數 */
INT8U data gnT0OverCnt; /* 代表T0中斷溢出的次數 */
INT8U idata gnRxdBuf0[64]; /* 代表串口UART0接收緩沖區數組 */
INT8U idata gnRxdBuf1[2]; /* 代表串口UART1接收緩沖區數組,高字節在前 */
INT8U idata gnTxdBuf0[16]; /* 代表串口UART0發送緩沖區數組 */
/* 定義字變量 */
INT16U data gnADC0Res=0; /* ADC0的轉換結果(數字量) */
INT16U data gnPressGet=0; /* 測得的氣體壓力(單位為0.1KPa) */
INT16U data gnLeakGet=0; /* 測得的氣體流量(單位為0.01L/min) */
INT16U data gnPressSet=0; /* 用戶通過觸摸屏設定的氣體壓力(單位為0.1KPa) */
INT16U data gnPressMax=0; /* 用戶通過觸摸屏設定的允許最大氣體壓力(單位為0.1KPa) */
INT16U data gnPressMin=0; /* 用戶通過觸摸屏設定的允許最小氣體壓力(單位為0.1KPa) */
INT16U data gnLeakMax =0; /* 用戶通過觸摸屏設定的允許最大氣體流量(單位為0.01L/min) */
INT16U data gnLeakMin =0; /* 用戶通過觸摸屏設定的允許最小氣體流量(單位為0.01L/min) */
INT16U data gnCurrTime=0; /* 代表當前操作正在進行的時間 */
INT16U data gnFillTime=0; /* 用戶通過觸摸屏設定的充氣時間 */
INT16U data gnTestTime=0; /* 用戶通過觸摸屏設定的測試時間 */
INT16U idata gnLeakAreaMax[6]; /* 用戶通過觸摸屏設定的分段修正流量最大值(單位為0.01L/min) */
INT16U idata gnLeakAreaCoef[6]; /* 用戶通過觸摸屏設定的分段修正流量系數 */
INT16U data gnPressOut=0; /* 輸出到比例控制閥的壓力信號值(單位為0.1KPa) */
// ------------------------------------------------------------------------------------------------------
/* 函數聲明 */
void DeviceInit(void);
void SysInit(void);
void SetRxd0OK(void);
void SetRxd1OK(void);
void AdjustPress(void);
void DoneKey(void);
void DoneTest(void);
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數名稱: main
** 功能描述: 主程序。
** 輸 入: 無
** 輸 出: 無
** 全局變量: 略
** 全局常量:略
** 調用模塊:略
** 設 計 者:羅建 日 期:2007年12月09日
** 版 本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void main(void)
{
WDTCN = 0xDE; // 禁止看門狗定時器
WDTCN = 0xAD;
DeviceInit(); // 初始化片上系統外圍設備
EIP2|=0x40;
SysInit(); // 初始化系統變量
while (TRUE) // 主程序循環
{
while (!gbTimeOver); // 檢查定時間隔是否到(0.1秒)
gbTimeOver = FALSE; // 準備重新延時
if (gnCntADC-- == 0)
{
gnCntADC = ADC_WAIT;
AD0EN = TRUE;
}
// 檢查壓力是否超出設定的最大與最小值,是則警告
if ((gnPressGet > gnPressMax) || (gnPressGet < gnPressMin))
{
if (!gbReadyWarn) // 當首次檢測到壓力超出設定值時,開始計時
{
gbReadyWarn = TRUE;
gnCntWarn = WARN_WAIT;
}
else if (gnCntWarn-- == 0) // 當壓力超出設定值的時間持續10秒后,輸出報警指示
{
gbReadyWarn = FALSE;
DRV_WARN = OPEN;
}
}
else // 壓力在設定值區間內,不用報警
{
gbReadyWarn = FALSE;
gnCntWarn = 0;
DRV_WARN = CLOSE;
}
AdjustPress(); // 進行壓力調節
DoneKey(); // 按鍵檢測處理
DoneTest(); // 執行流量測試
}
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數名稱: DeviceInit
** 功能描述: 片上系統外圍設備初始化子程序。
** 輸 入: 無
** 輸 出: 無
** 全局變量: 略
** 全局常量:略
** 調用模塊:略
** 其它說明:外部系統時鐘啟動過程建議為:
** 1)允許外部振蕩器;
** 2)等待至少1ms;
** 3)查詢XTLVLD是否由“0”=>“1”;
** 4)將系統時鐘切換到外部振蕩器。
**
** 設 計 者:羅建 日 期:2007年12月09日
** 版 本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DeviceInit(void)
{
int i; // 延時計數器
// 系統時鐘初始化
OSCXCN = 0x67; // 啟動外部22.1184MHz晶體振蕩器
for (i=0;i<3000;i++); // 等待XTLVLD消隱期(>1ms)
while ((OSCXCN & 0x80) == 0); // 等待外部晶振穩定
OSCICN = 0x08; // 選擇外部振蕩器作為系統時鐘SYSCLK,同時禁止時鐘丟失檢測功能
// 數字量輸入輸出端口初始化
P0MDOUT = 0x15; // TX0、SPI_SCK和SPI_MOSI作為推挽方式
P1MDOUT = 0x01; // TX1作為推挽方式
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -