📄 kongwen.c
字号:
float qqq=0.0;
float qq[3];
unsigned int temp_data=0;
AMX0SL = 0x0f; // 选择温度传感器的信号输入到dac中
delay_time(100);
for(i=0;i<3;i++)
{
AD0INT=0; //清除转换完成标志
AD0BUSY=1; //启动转换
while(AD0INT==0); //等待转换结束
temp_data=ADC0>>4; // 读取值并进行处理
qq[i]=temperature(1,temp_data);
}
qqq=(0.5*(qq[1]+qq[2]));
AMX0SL = 0x00; // 选择温度传感器的信号输入到dac中
delay_time(100);
data_tx="当前温度为";
Tdata(data_tx);
Tdata(mysprint(qqq,1));
Tdata(c_end);
return qqq;
}
// 定时器1作为串口时钟, 变量<baudrate>代表波特率,8位数据,无校验,1位停止位.
void uart0_init (void)
{
SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX
// IP|=0x10; //设置uart为最高优先级中断
TMOD = 0x20; // TMOD: 定时器1,方式2,8位重装载
TH1 = -(sysclk/BAUDRATE/16); // 设定波特率
TR1 = 1; // 启动定时器1
CKCON |= 0x10; // 定时器1选用系统时钟作为时钟源
PCON |= 0x80; // SMOD0 = 1
// ES0 = 1; // 指示发送准备好
TI0=1;
}
//定时器4中断服务子程序
void timer4_ISR (void) interrupt 16 using 3
{
static unsigned phase_acc1 = 0; // 锯齿波相位累加器变量
static unsigned phase_acc2=0; //方波相位累加变量
T4CON &= ~0x80; // 清定时器4的溢出标志
phase_acc1 += phase_add1; // 增加相位累加器
phase_acc2 += phase_add2;
switch (output_waveform)
{
case heat:
{
solid=1;
}
break;
case adjust:
{
solid=1;
}
break;
case res:
{
repeat_value=1;
}
break;
case vol:
{
repeat_value=2;
}
break;
case tem:
{
repeat_value=3;
}
break;
case off:
{
solid=1;
repeat_value=0;
}
break;
default:
{
data_tx="default";
Tdata(data_tx);
Tdata(c_end);
clr_datarx();
}
}
}
//串口发送数据
void send_lcd_data(char *str)
{
unsigned char i;
for(i=0;str[i];i++) //循环发送字符串
{
write_ram(str[i]);
}
}
//串口发送数据
void Tdata(char *str)
{
unsigned char i;
ES0=0;
for(i=0;str[i];i++) //循环发送字符串
{
SBUF0=str[i];
while(TI0==0);//发送完成
TI0=0;
}
ES0= 1;
}
//发送单个数据
void Tdatar(char s)
{
ES0=0;
SBUF0=s;
while(TI0==0);//发送完成
TI0=0;
ES0=1;
}
//从字符串中取字符 s:字符串指针,begin:开始位置,longth:要取的字符串长度
char * strmid(char * s,unsigned char begin,unsigned char longth)
{
unsigned char ii;
ii=0;
for(ii=0;ii<longth;ii++) array[ii]=s[begin+ii];
array[ii]='\0';
return array;
}
//去除字符串两边的空格
char * trim(char * str)
{
unsigned char commandlen;
unsigned char i=1;
commandlen=strlen1(str);
for(i=0;(*(str+i)==32)&&(i<commandlen);i++);
return (str+i);
}
//相当于c语言中的atoi函数
char atoii(char chr)
{
switch (chr)
{
case 48:
return 0;
case 49:
return 1;
case 50:
return 2;
case 51:
return 3;
case 52:
return 4;
case 53:
return 5;
case 54:
return 6;
case 55:
return 7;
case 56:
return 8;
case 57:
return 9;
default:
return 10;
}
}
//相当于c语言中的atof函数
float atoff(char * c)
{
char i=0,j=0,dot=0;
char flag=0; float xdata t3;
unsigned char flag1=0;
t3=0;
if(strlen1(c)==0) return (atoffERROR); //*******含有非法字符**************
if(c[0]==45) flag=1;
for(i=(flag>0)?1:0;;i++)
{
if(c[i]==0||c[i]==0x20||c[i]==0xd||c[i]==44) break;
if((c[i]>='0')&&(c[i]<='9')||(c[i]=='.'))
{
if(flag1) flag1++;
if(c[i]=='.') flag1++;
else
{
t3*=10.0;
t3+=(float)(c[i]-0x30);
}
}
else {return (atoffERROR);} //*******含有非法字符**************
}
for(i=1;i<flag1;i++) t3/=10;
if(flag) t3=0-t3;
return t3;
}
//判断串口接受字符是否为预定义命令
char selfun()
{
char bbb;
clr_datarx();
return bbb;
}
//字符串查找命令//相当于c语言中的strstr函数
char * strstr1(char *s1,char *s2)
{
unsigned char i=0,j=1,flag=1;
while (*(s1+i)!=0)
{
if(*(s1+i)==*s2)
{
j=1;
flag=1;
while ((*(s2+j)!=0)&&(*(s1+i+j)!=0)&&flag)
{
if(*(s1+i+j)!=*(s2+j))
{
flag=0;
}
j++;
}
if((flag==1)&&(*(s2+j)==0)) return (s1+i);
}
i++;
}
return 0;
}
//字符串长度命令//相当于c语言中的strlen函数
char strlen1(char * s1)
{
unsigned char i=0;
while (*(s1+i)!=0)
{
i++;
}
return i;
}
//字符串合并命令//相当于c语言中的strcat函数
char * strcat1(char *s1,char *s2)
{
unsigned char i=0,j=0,k;
i=strlen1(s1);
for(j=0;j<i;j++) array[j]=s1[j];
k=strlen1(s2)+i;
for(j=i;j<k;j++) array[j]=s2[j-i];
return s1;
}
//清除串口接收数组
void clr_datarx()
{
unsigned char jj;
for(jj=0;jj<130;jj++) data_rx[jj]=0;
}
//系统内部自检
char hwtanalyze(void) //系统内部自检
{
return 1; //测量温度
}
//各通道执行函数 ,有用与否?????????????
//停止输出波形
char heat_off(void)
{
output_waveform = off;
return 1;
}
//输出电流函数
char current_out(unsigned int current)
{
unsigned int dac0_data=0;
if((current<0)||(current>490))
{
return 0;
}
else
{
dac0_data=(current*83/10)<<4;
DAC0=dac0_data;
return 1;
}
}
//接收中断
void UART0_ISR (void) interrupt 4 using 3
{
unsigned char the_char;
if (RI0 == 1)
{ // handle receive function
RI0 = 0; // clear RX complete indicator ||(the_char==13))
the_char=SBUF0;
if((uartcount==0)&&((the_char==' ')||(the_char==10)))
{
// T4CON |= 0x04; // 启动定时器4
return;
}
if(the_char==8)//*******退格
{
if(uartcount>0) data_rx[(--uartcount)]=0;
// T4CON |= 0x04; // 启动定时器4
return;
}
else
{
data_rx[uartcount]=the_char; //数据接收,存至Data数组中
if(data_rx[uartcount++]==13) //回车符13 ZN122
{
T4CON = 0; //定时器4停止计数
uartcount=0;
uartflag=1;
}
}
}
}
//浮点数到ascii的转换
char *mysprint(float discode,unsigned char a1)
{
unsigned int num=13;
char ret[15];
long temp; long div=1;
unsigned char kk,ii;
unsigned char flag=0;
for(ii=0;ii<a1;ii++)
discode*=10;
temp=discode;
ret[14]=0;
if(temp<0) {flag=1;temp=0-temp;}
for(ii=0;ii<a1;ii++)
div*=10;
for(ii=0;ii<a1;ii++)
{
kk=(temp%10);
temp/=10;
ret[num--]='0'+kk;
}
if(a1) ret[num--]='.' ;
kk=(temp%10);
temp/=10;
ret[num--]='0'+kk;
while(1)
{
if(temp==0) break;
kk=(temp%10);
temp/=10;
ret[num--]='0'+kk;
}
if(flag) ret[num--]='-';
return ret+num+1;
}
char robot_an()
{
lookresult=strstr1(data_rx,"m"); //开始查找manner参数,
if(lookresult==0) //如果没有则采用上一次设定结果
{
robot1.manner=robot2.manner;
}
else
{
lookresult1=strstr1(lookresult,","); //有则寻找m后边的","
if (lookresult1==0)
{
clr_datarx(); //如果没有“,”,则返回,数组清零
return 0; //error
}
lookresult=lookresult+1;
lookresult=trim(lookresult);
strmid(lookresult,0,lookresult1-lookresult);
robot1.manner=atoff(array); //计算manner参数
if((robot1.manner<=0)|(robot1.manner>30)) //判别参数是否异常
{
clr_datarx();
return 0; //异常直接返回
}
else //不异常,备份数据
{
robot2.manner=robot1.manner;
}
}
lookresult=strstr1(data_rx,"sl"); //开始查找sl参数,
if(lookresult==0)
{
robot1.speed_left=robot2.speed_left; //如果没有则采用上一次设定结果
}
else
{
lookresult1=strstr1(lookresult,",");
if (lookresult1==0)
{
clr_datarx();
return 0; //error //如果没有“,”,则返回,数组清零
}
lookresult=lookresult+2;
lookresult=trim(lookresult);
strmid(lookresult,0,lookresult1-lookresult);
robot1.speed_left=atoff(array);
if((robot1.speed_left<=0)|(robot1.speed_left>950)) //判别参数是否异常
{
clr_datarx();
return 0;
}
else
{
robot2.speed_left=robot1.speed_left;
}
}
lookresult=strstr1(data_rx,"sr"); //开始查找sr___right参数,
if(lookresult==0)
{
robot1.speed_right=robot2.speed_right; //如果没有则采用上一次设定结果
}
else
{
lookresult1=strstr1(lookresult,",");
if (lookresult1==0)
{
clr_datarx();
return 0; //error //如果没有“,”,则返回,数组清零
}
lookresult=lookresult+2;
lookresult=trim(lookresult);
strmid(lookresult,0,lookresult1-lookresult);
robot1.speed_right=atoff(array);
if((robot1.speed_right<=0)|(robot1.speed_right>950)) //判别参数是否异常
{
clr_datarx();
return 0;
}
else
{
robot2.speed_right=robot1.speed_right;
}
}
lookresult=strstr1(data_rx,"so"); //开始查找so____rotate参数,
if(lookresult==0)
{
robot1.speed_rotate=robot2.speed_rotate; //如果没有则采用上一次设定结果
}
else
{
lookresult1=strstr1(lookresult,",");
if (lookresult1==0)
{
clr_datarx();
return 0; //error //如果没有“,”,则返回,数组清零
}
lookresult=lookresult+2;
lookresult=trim(lookresult);
strmid(lookresult,0,lookresult1-lookresult);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -