基于单片机的智能风扇设计Word格式文档下载.docx
《基于单片机的智能风扇设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的智能风扇设计Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。
1.5DS18B20读一个字节:
1.6DS18B20写一个字节:
DS18B20写程序与读程序的流程图,此图将DS18B20的工作过程清晰的显示出来,方便读程序和写程序的人观看。
DS18B20拥有其独特的特点,如独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯和DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。
1.7获取温度:
DS18B20获得测温度的原理是:
低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
1.8单片机的程序设计:
/*******************************************************************************1
*描述:
*
*1602字符型LCD显示演示程序*
*在第一行显示10030105_22_23*
*在第二行显示温度风力*
**
********************************************************************************/
#include<
reg51.h>
intrins.h>
//18b20定义/////////////////////////////////////
#defineucharunsignedchar
#defineuintunsignedint
sbitD18B20=P3^7;
//18b20的引脚定义
uintTemperature;
//用来存放读出温度后的值
uchartemp_buff[9];
//存储读取的字节,readscratchpad为9字节,readromID为8字节
uchar*p,TIM;
voidGetTemp();
#defineNOP()_nop_()/*定义空指令*/
#define_Nop()_nop_()/*定义空指令*/
voidTempDelay(ucharus);
//18b20的函数声明
voidInit18b20(void);
voidWriteByte(ucharwr);
//单字节写入
voidread_bytes(ucharj);
ucharCRC(ucharj);
voidGemTemp(void);
voidTemperatuerResult(void);
voidsystem_Ini()
{
TMOD|=0x11;
TH1=0xfe;
//11.0592
TL1=0x33;
IE=0x8A;
2
TR1=1;
}
///////////////////////////////////////////////
//1602定义///////////////////////////////////////
typedefunsignedcharBYTE;
typedefunsignedintWORD;
typedefbitBOOL;
bitflag;
sbitrs=P2^6;
//
sbitrw=P2^5;
sbitep=P2^7;
BYTEcodedis1[]={"
10030105_22_23"
};
BYTEcodedis2[]={"
Wen:
"
BYTEcodedis2_1[]={"
Feng:
BYTEdis2_2[3];
//装温度
BYTEdis2_3[2];
//装风力
delay(BYTEms);
BOOLlcd_bz();
lcd_wcmd(BYTEcmd);
lcd_pos(BYTEpos);
lcd_wdat(BYTEdat);
lcd_init();
////////////////////////////////////
//moter定义////////////////////////////
unsignedchartimer1;
sbitPWM=P1^1;
/
//主程序/////////////////////////////////3
main()
BYTEi;
system_Ini();
lcd_init();
//初始化LCD
delay(10);
//静态显示
lcd_pos(0);
//设置显示位置为第一行的第5个字符
i=0;
while(dis1[i]!
='
\0'
)
{//显示字符"
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x40);
//设置显示位置为第二行第1个字符
while(i<
=3)
{
lcd_wdat(dis2[i]);
}
lcd_pos(0x48);
//设置显示位置为第二行第个字符
=4)
lcd_wdat(dis2_1[i]);
//动态显示
while
(1)
GetTemp();
dis2_2[0]=Temperature%100/10+0x2f;
//十位4
dis2_2[1]=Temperature%10+0x30;
//个位
lcd_pos(0x44);
//显示实时温度
=1)
lcd_wdat(dis2_2[i]);
//if(dis2_2[0]=50)dis2_3[0]=dis2_2[1]/3+0x35;
//dis2_3[0]=dis2_2[1]/3+0x31;
//dis2_3[0]=50;
if(dis2_2[0]==48)dis2_3[0]=48;
elseif(dis2_2[0]==49)dis2_3[0]=49+(dis2_2[1]-48)/3;
elseif(dis2_2[0]==50)dis2_3[0]=52+(dis2_2[1]-48)/3;
elsedis2_3[0]=55;
lcd_pos(0x4d);
=0)
lcd_wdat(dis2_3[i]);
//moter,电机,
if(dis2_3[0]==48)if(TIM<
10)PWM=0;
elsePWM=1;
if(dis2_3[0]==49)if(TIM<
40)PWM=0;
if(dis2_3[0]==50)if(TIM<
50)PWM=0;
if(dis2_3[0]==51)if(TIM<
55)PWM=0;
if(dis2_3[0]==52)if(TIM<
60)PWM=0;
if(dis2_3[0]==53)if(TIM<
65)PWM=0;
if(dis2_3[0]==54)if(TIM<
70)PWM=0;
if(dis2_3[0]==55)if(TIM<
75)PWM=0;
/////////////////////////////////
//1602子程序/////////////////////
delay(BYTEms)
{//延时子程序
while(ms--)
for(i=0;
i<
250;
i++)
{
_nop_();
}
BOOLlcd_bz()
{//测试LCD忙碌状态
BOOLresult;
rs=0;
rw=1;
ep=1;
_nop_();
result=(BOOL)(P0&
0x80);
ep=0;
returnresult;
lcd_wcmd(BYTEcmd)
{//写入指令数据到LCD
while(lcd_bz());
rw=0;
P0=cmd;
lcd_pos(BYTEpos)
{//设定显示位置
lcd_wcmd(pos|0x80);
lcd_wdat(BYTEdat)
{//写入字符显示数据到LCD
rs=1;
P0=dat;
lcd_init()
{//LCD初始化设定
lcd_wcmd(0x38);
//
delay
(1);
lcd_wcmd(0x0c);
lcd_wcmd(0x06);
lcd_wcmd(0x01);
//清除LCD的显示内容
///////////////////////////////////////////////////
//18b20子程序//////////////////////////////////////
voidGetTemp()
{
if(TIM==100)//每隔1000ms读取温度
{TIM=0;
TemperatuerResult();
/************************************************************
*Function:
延时处理
*parameter:
*Return:
*Modify:
*************************************************************/
voidTempDelay(ucharus)
while(us--);
18B20初始化
voidInit18b20(void)
D18B20=1;
D18B20=0;
TempDelay(80);
//delay530uS//80
TempDelay(14);
//delay100uS//14
if(D18B20==0)
flag=1;
//detect1820success!
else
flag=0;
//detect1820fail!
TempDelay(20);
//20
D18B20=1;
向18B20写入一个字节
voidWriteByte(ucharwr)//单字节写入
unsignedcharidatai;
for(i=0;
i<
8;
i++)
D18B20=0;
_nop_();
D18B20=wr&
0x01;
TempDelay(3);
//delay45uS//5
D18B20=1;
wr>
>
=1;
读18B20的一个字节
unsignedcharReadByte(void)//读取单字节
unsignedcharidatai,u=0;
for(i=0;
u>
D18B20=1;
if(D18B20==1)
u|=0x80;
TempDelay
(2);
return(u);
读18B20
voidread_bytes(ucharj)
j;
*p=ReadByte();
p++;
读取温度
voidGemTemp(void)
Temperature=temp_buff[1]*0x100+temp_buff[0];
//Temperature*=0.625;
Temperature/=16;
TempDelay
(1);
18B20ID全处理
voidTemperatuerResult(void)
Init18b20();
WriteByte(0xcc);
//skiprom
WriteByte(0x44);
//Temperatureconvert
WriteByte(0xbe);
//readTemperature
p=temp_buff;
read_bytes(9);
GemTemp();
/*************************************
[t1(10ms)中断]中断
*************************************/
voidT1zd(void)interrupt3
TIM++;
2.总结:
单片机对于自动化专业是很重要的,这次通过制作课程设计,让我了解到独立完成一个小方案是多么的不容易。
从程序的写入到从网上查找资料再到对硬件的购买,这些看似简单的小事情,但每一件事情真的做的时候都会发现其实里面还有很多我们没有想到的困难。
我需要把这些复杂的东西理清头绪,使思路清晰,即使是将一些程序整合都要注意是否做到了前后程序搭配的一致,以及语法是否严谨,因为一点点的错误都会造成程序的运行错误。
所以在做每一件事情的时候都要严谨认真,这对编写程序尤为重要。
3.参考文献
[1]郑锋.51单片机应用系统.北京:
中国铁道部出版社,2010.
[2]李林功.单片机原理与应用.北京:
机械工业出版社,2008.
[3]谭浩强.C语言设计(第三版).北京:
清华大学出版社,2005.
[4]杨素行.模拟电子技术基础(第三版).北京:
高等教育出版社,2005.
[5]李群芳.单片机微机计算机与接口技术(第三版)