📄 adda.c
字号:
{
g_cMainSignal = 0;
g_sTime.base = 0;
g_sTime.second= 0;
g_sTime.minute= 0;
g_cRecvPointer =0;
g_cRecvLength =0;
g_Temperature =0.0;
}
//-------------------------------------------------------------
// 函数名称:定时器0中断入口函数,完成计时功能,定时时间为25ms
// 输入参数: 无
// 输出参数: 无
//-------------------------------------------------------------
void timer0() interrupt 1
{
TH0=TMR0H;
TL0=TMR0L;
// 程序时基信号
if(++g_sTime.base>=TICKS_PER_SEC)
{// 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;
}
}
//------------------------------
// 进行一次电压采集
//-----------------------------
WORD SampleVoltageAndOut()
{
WORD nRet;
DWORD lt;
AMX0SL = 0; // 采集通道0
AD0INT = 0;
AD0BUSY = 1;
while(AD0INT==0);
AD0INT = 0;
// DA输出
DAC0L = ADC0L;
DAC0H = ADC0H;
nRet = ADC0H;
nRet<<=8;
nRet+=ADC0L;
lt = nRet+1;
lt =lt*AD_VREF;
lt >>=12;
nRet = lt;
return nRet;
}
//------------------------------
// 测量温度
// Vtemp=0.00286*Temp+0.776
//-----------------------------
float SampleTemperature()
{
WORD nRet;
DWORD lt;
//float fTemp;
AMX0SL = 8; // 采集通道8
AD0INT = 0;
AD0BUSY = 1;
while(AD0INT==0);
AD0INT = 0;
// 计算实际的电压
nRet = ADC0H<<8;
nRet+=ADC0L;
lt =nRet+1;
lt =lt*AD_VREF;
lt >>=12;
// 1000V
lt-=776;
return (float)lt/2.86;
}
//------------------------------------------------------------------
// 主函数开始
//-------------------------------------------------------------------
void main()
{
EA=0; // 禁止看门狗
WDTCN = 0xDE; // 实验中不使用看门狗
WDTCN = 0xAD;
Init_Device(); // 初始化系统
InitVariable(); // 初始化变量
EA = 1;
//
TR0 = 1; // 启动定时器0
SendString("C8051F02x core Module EC1,v1.0\r\n");
SendString("AD DA Test\r\n");
g_Voltage = SampleVoltageAndOut();
g_Temperature = SampleTemperature();
while(1)
{
if(g_cMainSignal&SECD_SIGNAL)
{// 秒信号
g_cMainSignal&=~SECD_SIGNAL;
P_LED2 = !P_LED2;
// 电压测量并从DA输出电压
g_Voltage=SampleVoltageAndOut();
sprintf(g_SendBuffer,"Voltage=%.3f\r\n",(float)g_Voltage/1000);
SendString(g_SendBuffer);
// 温度转换
g_Temperature += SampleTemperature();
g_Temperature/=2;
sprintf(g_SendBuffer,"Temperature=%.1f\r\n",g_Temperature);
SendString(g_SendBuffer);
}
if(g_cMainSignal&MINU_SIGNAL)
{// 分信号
g_cMainSignal&=~MINU_SIGNAL;
}
if(g_cMainSignal&UART0RECV_SIGNAL)
{// UART0接收完成信号
g_cMainSignal&=~UART0RECV_SIGNAL;
// 确保接收缓冲区内的字符串有结尾
g_cRecvBuffer[RECVBUF_LEN-1] = 0;
// 分析接收的命令
CommandProc(g_cRecvBuffer);
}
}
}
//......................................
// 功能:分析接收的命令
// 输入参数:
// pRecvString,char *:输入字符串
// 输出参数:无
// 命令格式说明:
// setled=灯序号,开关状态 \r
// 灯序号: 1,LED1;2,LED2
// 开关状态:ON,打开灯;OFF,关闭灯
// 命令字符不区分大小写
//.......................................
void CommandProc(char *pRecvString)
{
BYTE cRet=0;
int iPos;
if(strncmp(pRecvString,"setled=",7)==0)
{// 设置LED状态命令
pRecvString+=7;
iPos=strpos(pRecvString,',');
if(iPos==-1)
{// 无效命令
cRet = 0;
}
else
{
if(strncmp(pRecvString,"2",1)==0)
{// 控制LED2
pRecvString+=2;
if(strcmp(pRecvString,"on")==0)
{// 打开LED
P_LED2 = 1;
cRet = 1;
}
else if(strcmp(pRecvString,"off")==0)
{// 关闭LED
P_LED2 = 0;
cRet = 1;
}
else
{
cRet = 0;
}
}
}
}
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -