📄 at45_main.#3
字号:
InitSMBus();
SPI_Init();
Interrupts_Init();
}
//------------------------------------------------
// 函数名称:InitVariable()
// 函数功能:初始化系统全局变量
//------------------------------------------------
void InitVariable()
{
g_cMainSignal = 0;
g_sTime.base = 0;
g_sTime.second= 0;
g_sTime.minute= 0;
g_cRecvPointer =0;
g_cRecvLength =0;
}
//-------------------------------------------------------------
// 函数名称:定时器0中断入口函数,完成计时功能,定时时间为25ms
// 输入参数: 无
// 输出参数: 无
//-------------------------------------------------------------
void timer0() interrupt 1
{
TH0=TMR0H;
TL0=TMR0L;
// 程序时基信号
if(++g_sTime.base>19)
{// 1s到
g_sTime.base = 0;
g_cMainSignal|=SECD_SIGNAL; // 产生秒信号
if(++g_sTime.second>59)
{// 1分钟到
g_sTime.second = 0;
g_cMainSignal|=MINU_SIGNAL; // 产生分信号
if(++g_sTime.minute>59) g_sTime.minute=0;
}
}
}
//..................................................
// 串口0中断服务程序
//
//.................................................
void Uart0() interrupt 4
{
BYTE cRecvData;
if(RI0) // 如果收到数据
{
RI0=0; // 清除收到数据标志
cRecvData = SBUF0; // 读取数据
SBUF0 = cRecvData; // 回显
if(cRecvData=='\r')
{// 回车符作为结束标志
g_cRecvBuffer[g_cRecvPointer]=0; // 接收结束
g_cRecvPointer = 0;
g_cMainSignal|=UART0RECV_SIGNAL; // 接收完成信号
}
else if(cRecvData==0x08)
{// CTRL+H控制键,退格
if(g_cRecvPointer>0) g_cRecvPointer--;
}
else
{
if(g_cRecvPointer<RECVBUF_LEN)
{
if(isupper(cRecvData))
{// 大写字符转换为小写
cRecvData = _tolower(cRecvData);
}
g_cRecvBuffer[g_cRecvPointer++]=cRecvData;
}
else
{// 数据长度错误
g_cRecvPointer = 0;
}
}
}
if(TI0) // 如果数据发送结束
{
TI0=0;
}
}
//------------------------------------------------------------------
// 主函数开始
//-------------------------------------------------------------------
void main()
{
Init_Device(); // 初始化系统
InitVariable(); // 初始化变量
EA=0; // 禁止看门狗
WDTCN = 0xDE; // 实验中不使用看门狗
WDTCN = 0xAD;
EA = 1; // 打开中断控制位
TR0 = 1; // 启动定时器0
SendString("C8051F02x core Module EC1,v1.0\r\n");
if(IsFromFail())
{
SetNowTime(0x20,0x07,0x05,0x3,0x00,0x00,0x00);
}
SendString(GetNowTime());
SendString("\r\n");
while(1)
{
if(g_cMainSignal&SECD_SIGNAL)
{// 秒信号
g_cMainSignal&=~SECD_SIGNAL;
P_LED1 = !P_LED1;
}
if(g_cMainSignal&MINU_SIGNAL)
{// 分信号
g_cMainSignal&=~MINU_SIGNAL;
// 打开下面的注释可以实现模块每分站向主机发送一次当前时间
//SendString(GetNowTime());
//SendString("\r\n");
}
if(g_cMainSignal&UART0RECV_SIGNAL)
{// UART0接收完成信号
g_cMainSignal&=~UART0RECV_SIGNAL;
// 确保接收缓冲区内的字符串有结尾
g_cRecvBuffer[RECVBUF_LEN-1] = 0;
// 分析接收的命令
CommandProc(g_cRecvBuffer);
}
}
}
//------------------------------------------------------------------
// 功能:分析接收的命令
// 输入参数:
// pRecvString,char *:输入字符串
// 输出参数:无
//..................................................................
void CommandProc(char *pRecvString)
{
BYTE cRet=0;
int iPos;
if(strncmp("setled=",pRecvString,7)==0)
{// 设置LED状态命令
pRecvString+=7;
iPos=strpos(pRecvString,',');
if(iPos==-1)
{// 无效命令
cRet = 0;
}
else
{
if(strncmp(pRecvString,"1",1)==0)
{// 命令控制LED1
pRecvString+=2;
if(strcmp(pRecvString,"on")==0)
{// 打开LED
P_LED1 = 0;
cRet = 1;
}
else if(strcmp(pRecvString,"off")==0)
{// 关闭LED
P_LED1 = 1;
cRet = 1;
}
else
{// 错误
cRet = 0;
}
}
else if(strncmp(pRecvString,"2",1)==0)
{// 控制LED2
pRecvString+=2;
if(strcmp(pRecvString,"on")==0)
{// 打开LED
P_LED2 = 0;
cRet = 1;
}
else if(strcmp(pRecvString,"off")==0)
{// 关闭LED
P_LED2 = 1;
cRet = 1;
}
else
{
cRet = 0;
}
}
}
}
else if(strncmp(pRecvString,"settime=",8)==0)
{// 设置时间
}
else if(strncmp(pRecvString,"gettime",8)==0)
{
SendString("\r\n");
SendString(GetNowTime());
SendString("\r\n");
cRet = 1;
}
else
{// 无效命令
cRet = 0;
}
// 向主机发送应答
if(cRet)
{
SendString("\r\nOK\r\n");
}
else SendString("\r\nError\r\n");
}
//-----------------------------------------------------
// 函数功能:循环方式发送字符串
// 输出参数:pSendString,char*:欲发送的字符串的缓冲区
// 输出:无
//-----------------------------------------------------
void SendString(char *pSendString)
{
// 循环发送,首先关闭中断
ES0 =0;
while(*pSendString!=0)
{
SBUF0 = *pSendString++;
while(TI0==0);
TI0=0;
}
ES0 = 1;
}
//---------------------------------------------------------
// 软件延时函数
//---------------------------------------------------------
// ;时钟周期数
// lcall ;4
void dly(BYTE cnt){while(cnt){cnt--;}} // delay: mov a,r7 ;1
// jz quit ;2
// dec r7 ;1
// sjmp delay ;2
// quit: ret ;1
// 6n+5 sysclk @c8051f022(0.5425)
// 延时(6n+5)*0.0904us @11.0592MHZ
//....................................................................................
// 延时ms毫秒
//....................................................................................
void Dlyms(WORD ms) // 延时cnt(ms)@11.0592MHZ
{
while(ms)
{
dly(250);
dly(210);
dly(250);
dly(210);
dly(250);
dly(210);
dly(250);
dly(210);
ms--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -