delay1ms();
}
voidWarning()
{
warning=0;
LED=0;
delay(100);
LED=1;//报警系统
}
bitBusyTest(void)
{
bitresult;
RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;//E=1,才允许读写
_nop_();//空操作
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
result=BF;//将忙碌标志电平赋给result
E=0;
returnresult;
}
voidWrite_com(unsignedchardictate)
{
while(BusyTest()==1);//如果忙就等待
RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0;//E置低电平(写指令时,
//就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_();//空操作两个机器周期,给硬件反应时间
P0=dictate;//将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
voidWriteAddress(unsignedcharx)
{
Write_com(x|0x80);//显示位置的确定方法规定为"80H+地址码x"
}
voidWriteData(unsignedchary)
{
while(BusyTest()==1);
RS=1;//RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0;//E置低电平(写指令时,,
//就是让E从0到1发生正跳变,所以应先置"0"
P0=y;//将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
voidLcdInt(void)
{
delay(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间
Write_com(0x38);//显示模式设置:
16×2显示,5×7点阵,8位数据接口
delay(5);//延时5ms
Write_com(0x38);
delay(5);
Write_com(0x38);//3次写设置模式
delay(5);
//Write_com(0x0F);//显示模式设置:
显示开,有光标,光标闪烁
//delay(5);
Write_com(0x0c);//显示模式设置:
显示开,不显示光标
delay(5);
Write_com(0x06);//显示模式设置:
光标右移,字符不移
delay(5);
Write_com(0x01);//清屏幕指令,将以前的显示内容清除
delay(5);
}
voiddisplay(unsignedcharadd,unsignedcharx)//add为显示字符的位置,x为显示的字符在第二行显示
{
WriteAddress(0x00);
delay(5);
Write_com(0x80+0x40+add);
WriteData(0x30+x);
}
voidLCD1602()//1602初显示
{
intj;
LcdInt();//调用LCD初始化函数
delay(10);
Write_com(0x01);//清屏
delay(5);
WriteAddress(0x00);//设置显示位置为第一行第一个字,这条语句可以不用写,因为默认是从第一行第一个字显示
delay(5);
WriteData('T');delay(5);//第一行显示Temperature,第二行最后一位显示℃
WriteData('e');delay(5);
WriteData('m');delay(5);
WriteData('p');delay(5);
WriteData('e');delay(5);
WriteData('r');delay(5);
WriteData('a');delay(5);
WriteData('t');delay(5);
WriteData('u');delay(5);
WriteData('r');delay(5);
WriteData('e');delay(5);
WriteData(':
');delay(5);
Write_com(0x80+0x40+12);
WriteData('.');delay(5);
/*以下为自定义“℃”语句*/
Write_com(0x40);//设定CGRAM地址
delay(5);
for(j=0;j<8;j++)
{
WriteData(User[j]);//写入自定义图形℃
}
WriteAddress(0x80+0x40+15);//设定屏幕上的显示位置
delay(5);
WriteData(0x00);//从CGRAM里取出自定义图形显示
/*以上为自定义“℃”语句*/
}
voiddsreset(void)//18B20复位,初始化函数
{
uinti;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bittempreadbit(void)//读1位函数
{
uinti;
bitdat;
ds=0;i++;//i++起延时作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchartempread(void)//读1个字节
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
voidtempwritebyte(uchardat)//向18B20写一个字节数据
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;//写0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
voidtempchange(void)//DS18B20开始获取温度并转换
{
dsreset();
delay
(1);
tempwritebyte(0xcc);//写跳过读ROM指令
tempwritebyte(0x44);//写温度转换指令
}
uintget_temp()//读取寄存器中存储的温度数据
{
uchara,b;
dsreset();
delay
(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();//读低8位
b=tempread();//读高8位
temp=b;
temp<<=8;//两个字节组合为1个字
temp=temp|a;
f_temp=temp*0.0625;//温度在寄存器中为12位分辨率位0.0625°
temp=f_temp*10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入
f_temp=f_temp+0.05;
returntemp;//temp是整型
}
voiddis_temp(uintt)
{
uchari;
i=t/100;
display(10,i);//十位
i=t%100/10;
display(11,i);//个位
i=t%100%10;
display(13,i);//小数位
}
voidmain()
{
LCD1602();
while
(1)
{
tempchange();
dis_temp(get_temp());
if(f_temp>50)
{
uinto;
for(o=0;o<5;o++)
{
Warning();
delay(20);
}
}
LED=1;
warning=1;
}
}
五、总结和体会
通过本次课程的课程设计,是自己学会了Proteuskeil编程软件的使用,在这个过程中由于对两个软件的不熟悉所以花费了很多时间,通过自己的努力,终于还是完成了本次课程设计,相对来说还是比较满意的,学会了更多关于本专业的知识,且锻炼了查阅资料与自主思考的能力。
此次课程设计通过看书学习了51单片机的相关知识,在网上学习了51单片机C语言编程的相关内容,且在这个过程中还找了相关人员进行了技术指导。
整个课程设计由硬件电路和软件程序组成,程序主要有18B20检测和LCD显示程序两部分组成,制作后期对于整个课程设计已经有了完整的掌握。
通过本次的学习,发现了自己的不足之处,在后面的学习中,将进一步的完善。
六、参考文献
[1]李广弟等.单片机基础[M].北京航空航天出版社,2001.
[2]王东峰等.单片机C语言应用100例[M].电子工业出版社,2009.
[3]陈海宴.51单片机原理及应用[M].北京航空航天大学出版社,2010.
[4]刘守义等.单片机技术基础[M].西安电子科技大学出版社,2007.
[5]钟富昭等.8051单片机典型模块设计与应用[M].人民邮电出版社,2007.
[6]李平等.单片机入门与开发[M].机械工业出版社,2008.