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

📄 main.c

📁 51实战工程级源码
💻 C
字号:
/*
*************************************************************************************************************
*                                                Kingst-51
*                                        Development board samples
*
*                                 (c) Copyright 2009-2012, Kingst Studio
*                                           All Rights Reserved
*
*                                          http://www.kingst.org
* 文件名:main.c
* 描  述:工程主文件
* 版本号:1.0.0
*************************************************************************************************************
*/
#define _MAIN_C
#include <string.h>
#include "config.h"
#include "main.h"
#include "UartCom.h"
#include "KeyBoard.h"
#include "Lcd1602.h"
#include "LedNumber.h"


/*
********************************************************************************
* ----------------------- Local variables  -------------------------------------
********************************************************************************
*/
/* 通信命令与其响应函数的封装结构 */
typedef struct _sComAnswer{
	const uint8 *cmdstr;  //命令字符串的指针
	const uint8  cmdlen;  //命令字符串的长度
	void (*answer) (uint8 *para, int8 len); //响应函数的指针
} sComAnswer;

/* 蜂鸣器开关状态的枚举类型 */
typedef enum {
    BUZZ_OFF, BUZZ_ON
} eBuzzSwitch;
static bit BuzzSwitch = BUZZ_OFF; //蜂鸣器开关状态

static bit flag100ms = 0; //100ms定时间隔标志
static bit staStopwatch = 1; //秒表状态
static uint32 tmrStopwatch = 0; //秒表定时器


/*
***************************************************************************************************
* ---------------------------------- Source codes  ------------------------------------------------
***************************************************************************************************
*/
void ComHandle(void);
void Stopwatch(void);


/*
*==============================================================================
* 函数名:main
* 描  述:C语言main函数,即程序执行入口
*==============================================================================
*/
void main (void)
{
	/* 配置T0作为系统定时器 */
    TMOD &= 0xF0;
    TMOD |= 0x01;
	ET0 = 1;
	TR0 = 1;

	UartComInit();
    Lcd1602Init();
    LedNumberInit();
    
	/* 使能中断,开始主循环 */
    EA = 1;
    while(1) {
        KeyHandle();
		ComHandle();
        Stopwatch();
    }
}


/*
* 描  述:以下皆为串口命令响应函数,参数相同,功能见各自开头的描述
* 输  入:para - 串口命令之后附带的参数指针
*         len  - 参数长度
* 输  出:无
*/
/* 回传命令,将命令码之后的字符回传给上位机 */
void ComCallback(uint8 *para, int8 len)
{
	if (len > 0) {
		UartWrite(para, len);
	}
	else {
		UartWrite("none\r\n", sizeof("none\r\n")-1);
	}
}
/* 蜂鸣器开关命令,控制蜂鸣器鸣叫的开启和关闭 */
void ComBuzzSwitch(uint8 *para, int8 len)
{
	para++; //消除编译器警告
	len++;  //消除编译器警告
	if (BuzzSwitch == BUZZ_OFF) {
		BuzzSwitch = BUZZ_ON;
		UartWrite("turn on\r\n", sizeof("turn on\r\n")-1);
	}
	else {
		BuzzSwitch = BUZZ_OFF;
		UartWrite("turn off\r\n", sizeof("turn off\r\n")-1);
	}
}
/* 字符串显示命令,在液晶上显示命令码之后的字符串 */
void ComShowString(uint8 *para, int8 len)
{
	if ((*para==' ') && (len>1)) {
        /* 显示命令码之后的字符 */
        para++;
        len--;
		*(para+len) = '\0';
		Lcd1602ShowStr(para, 0, 0);
        /* 不满一行时清楚屏幕后续字符位 */
        if (len < 16) {
            Lcd1602Clear(len, 0, 16-len);
        }
		UartWrite("complete\r\n", sizeof("complete\r\n")-1);
	}
	else {
		UartWrite("error\r\n", sizeof("error\r\n")-1);
	}
}

/*
* 函数名:ComHandle
* 描  述:串口通信命令解析处理函数
*/
void ComHandle(void)
{
	int8 i,len;
	uint8 xdata buff[40];
	
	/* 可响应的所有命令列表 */
    const sComAnswer code ca[] = {
        {"callback", sizeof("callback")-1, ComCallback},
        {"buzz switch", sizeof("buzz switch")-1, ComBuzzSwitch},
        {"showstr", sizeof("showstr")-1, ComShowString}
    };

	/* 监控串口接收状态 */
	if (UartRxSta == RX_NONE) {
		return;
	}
	UartRxSta = RX_NONE;

	/* 接收完一帧命令后处理该命令 */
	len = UartRead(buff, sizeof(buff));
    for (i=0; i<ArraySize(ca); i++) {
        if (memcmp(buff, ca[i].cmdstr, ca[i].cmdlen) == 0) {
            ca[i].answer(buff+ca[i].cmdlen, len-ca[i].cmdlen);
            return;
        }
    }
	
	/* 命令不在支持列表中时返回"无效命令"信息 */
	if (i >= ArraySize(ca)) {
    	UartWrite("invalid command\r\n", sizeof("invalid command\r\n")-1);
	}
}


/*
* 函数名:Stopwatch
* 描  述:秒表功能函数
*/
void Stopwatch(void)
{
    if (flag100ms) {
        flag100ms = 0;
        /* 每隔100ms,秒表计数器+1 */
        if (staStopwatch) {
            tmrStopwatch++;
        }
        /* 秒表计数器当前值显示在数码管上 */
        LedNumberShow(tmrStopwatch, 1);
    }
}
/*
* 函数名:ResetStopwatch
* 描  述:重置秒表,定时器归零
*/
void ResetStopwatch(void)
{
    staStopwatch = 0;
    tmrStopwatch = 0;
}
/*
* 函数名:KickStopwatch
* 描  述:启动/停止秒表计数
*/
void KickStopwatch(void)
{
    staStopwatch = ~staStopwatch;
}



/*
* 函数名:Timer0_ISR
* 描  述:Timer0定时中断服务函数
*/
void Timer0_ISR() interrupt 1
{
    static uint8 t100ms = 0;
    
    /* Timer1定时1ms */
    TL0 = (uint8)((65535 - SYS_MCLK/1000) + 18);
    TH0 = (uint8)(((65535 - SYS_MCLK/1000) + 18) >> 8);

    /* 蜂鸣器控制 */
	if (BuzzSwitch == BUZZ_ON) {
		BUZZ_CTRL = 0;
	}
    
    /* 100ms定时标志处理 */
    t100ms++;
    if (t100ms >= 100) {
        t100ms = 0;
        flag100ms = 1;
    }
    
    /* 其他需定时处理的函数 */
	KeyScan();
	LedNumberScan();
	UartRxMonitor(1);
	
	BUZZ_CTRL = 1;
}

⌨️ 快捷键说明

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