测温不正常
原因:
unsigned long Temp;
unsigned long GetTemp()
{
unsigned char low,high;
unsigned long temp;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
temp=high&0x0f;
temp<<=8;
temp|=low;
temp=temp*625;
return temp;
}
main中的Temp大小定义应该与后面ds18b20中返回值定义一致,否则会发生错误。
涉及到的地方:
unsigned long Temp;
unsigned long GetTemp()
unsigned long temp;
定时器2作串口1收不到信息
使用stc-isp自动生成波特率设置后,要注意两点:
- 下载时设置的的频率要与生成代码时设置的频率一致
- 初始化要打开CPU的总中断允许控制位,即EA=1;
还要打开串行口1中断允许位,即ES=1;
void Uart1Init(void) //9600bps@12.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0xC7; //设置定时初始值
T2H = 0xFE; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
EA=1;ES=1; //这一句自己加的
}
关于按键问题
刚开始按键任务里面是用swich写的,所以没发生问题
现在没用switch问题就出现了
注意写条件的时候要加上key!=0
void Task_Key()
{
if((Key==11)&(show==1))
{
State[0]=20;State[1]=20;State[2]=20;State[3]=20;
weiflag=1;show=2;
}
else if((Key!=0)&(show==2))
{
LEDx_ON(weiflag);weiflag++;
}
}
关于LED闪烁频率变换
在定时器中写的时候要注意不要写==
比如定时器已经数到333了此时要数到400
而此时频率修改从400变成了200,此时就需要把==变成>=
if(++shijian_tt>=shijian_flag){shijian_Ref=1;shijian_tt=0;}
关于写闪烁逻辑正确却没有闪烁现象
最简单的错了,那就是定义
往往定义是一秒,那在写的时候往往是复制粘贴改的,所以发生了错误
比如这是时钟的定义
u8 DS_tt;
bit DS_Ref;
往往我是复制这个的,昨天明明还在写,今天却没出现闪烁现象
检查一番发现是定义错了
void Task_Timer()
{
if(++SEG_tt==50){SEG_Ref=1;SEG_tt=0;}
if(++DS_tt==100){DS_Ref=1;DS_tt=0;}
if(++TEMP_tt==100){TEMP_Ref=1;TEMP_tt=0;}
if(++SS_tt==500){SS_Ref=1;SS_tt=0;}
}
应该是这样
u16 SS_tt;
bit SS_Ref;
关于闪烁的改进
原来的:
void Task_Timer()
{
if(++SS_tt==500){SS_Ref=1;SS_tt=0;}
}
///
void Task_Cpu()
{
if (SS_Ref==1)
{
SS_Ref=0;
ssflag=!ssflag;
}
}
现在的:
void Task_Timer()
{
if(++SS_tt==500){SS_Ref=!SS_Ref;SS_tt=0;}
}
关于超声波测距数码管显示
在这很明显可以看到中间不显示的地方只有三位而不是四位
当距离是三位数时,显示三位,而两位则只显示两位,而不是百位上显示0
if(Sonic_Value>=100)
{
DigBuf[5]=Sonic_Value/100;DigBuf[6]=Sonic_Value%100/10;DigBuf[7]=Sonic_Value%10;
}
else
{
DigBuf[5]=20;DigBuf[6]=Sonic_Value%100/10;DigBuf[7]=Sonic_Value%10;
}
关于串口发送字符串
void Uartsend(unsigned char byte)//发送
{
SBUF=byte;//把数据写入发送缓冲区SBUF
//数据发送完成的标志是TI=1;所以等待数据传送完
while(TI==0);
TI=0;//软件清零
}
void Uartsend_Str(u8 *str)
{
while(*str!='\0')
{
Uartsend(*str);
str++;
}
}
题目要求:
则:
if(Sonic_Value<100)
{
x1=Sonic_Value/10+48;x2=Sonic_Value%10+48;
Uartsend_Str("Distance:");
Uartsend(x1);
Uartsend(x2);
Uartsend_Str("cm");
}
else
{
x1=Sonic_Value/100+48;x2=Sonic_Value%100/10+48;x3=Sonic_Value%10+48;
Uartsend_Str("Distance:");
Uartsend(x1);
Uartsend(x2);
Uartsend(x3);
Uartsend_Str("cm");
}
需要吧数字拆开分别发送,而且因为是文本模式不能直接发送数字
要在数字原本的基础上+48发送