电子电信单片机毕业课程设计.docx
《电子电信单片机毕业课程设计.docx》由会员分享,可在线阅读,更多相关《电子电信单片机毕业课程设计.docx(11页珍藏版)》请在冰豆网上搜索。
电子电信单片机毕业课程设计
一、实习目的与要求
1、本设计是利用AT89C52系列单片机实现温度自动检测与报警,温度范围在0℃至+100℃之间。
DS18B20可以程序设定9-12位的分辨率,精度为±0.5℃。
随机显示所采集的温度,可以设定温度的范围,对周围环境的温度进行有效检测与报警。
数码管显示温度。
上限为36℃下限为20℃。
超过上限或低于下限则开始报警。
通过设计,进一步熟悉和掌握8052单片机的结构及工作原理掌握以单片机核心的电路设计的基本方法和技术,了解表关电路参数的计算方法。
掌握单片机的接口技术及相关外围芯片的外特性,控制方法。
通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。
通过完成一个包括电路设计和程序开发的完整过程,使了解开发一单片机应用系统的全过程,为今后从事相应打下基础。
2、具体设计思想是:
先设定上限温度和下限温度,然后计算最适温度,再利用温度传感器采集周围环境中的温度值。
再将采样值和设定值进行比较,如果超出设定范围就进行报警提示操作人员予以处理,如果高于最适温度就提示降温,低于最适温度就提示加温。
用户设定的报警温度存储在EEPROM中,掉电后依然保存本设计基本上满足了温度检测与报警的要求,采样值与设定值基本一致,易于操作。
二、单片机开发板原理及各部分功能说明
1、单片机开发板原理
单片机
AT89C52
DS18B20温度传感器
蜂鸣器报警
时钟振荡
定时器
LED数码管显示
2、各部分功能说明
具体分析如下
1).DS18B20
DS18B20的引脚排列:
(底视图)
DS18B20引脚功能描述:
1.GND电源地2.DQ数据输入/输出引脚。
开漏单总线接口引脚。
3.VDD电源正极引脚。
工作电压为3~5.5V。
DS18B20的使用方法:
由于DS18B20采用的是一线总线协议方式,而对AT89S52单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是以主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求DS18B20回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
单片机(主机)控制DS18B20完成温度转换必须经过每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM命令,最后发送RAM命令,这样才能对DS18B20进行预定的操作。
复位要求主CPU将数据线下拉500us,然后释放,收到信号后等待16~60us左右,后发出60~240us的存在低脉冲,主CPU收到此信号表示复位。
DS18B20的温度计算:
温度转换后存放在寄存器的第1﹑第2个字节内容中,DS18B20的温度数据输出是以16位符号扩展的二进制补码格式表示。
2).LED显示电路设计
LED数码管是一种半导体发光器件,其基本单元是发光二极管,通过对其不同的管脚输入相对的电流,会使其发亮,从而显示出数字。
数码管按段数按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳极数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳极数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
动态扫描就是所要工作的若干个数码管轮流显示,只要轮流显示的速度足够快,每秒约50次以上,由于人眼的“视觉暂留”特性,看起来就像是连续显示,这样称为动态扫描。
3).蜂鸣器报警
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,S52增强型单片机实验板通过一个三极管来放大驱动蜂鸣器,蜂鸣器的正极接到VCC(+5V)电源上面,蜂鸣器的负极接到三极管的发射极E,三极管的基级B经过限流电阻R1后由单片机的P2.1引脚控制,当P2.1输出高电平时,三极管T1截止,没有电流流过线圈,蜂鸣器不发声;当P2.1输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。
因此,我们可以通过程序控制P2.1脚的电平来使蜂鸣器发出声音和关闭。
程序中改变单片机P2.1引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。
4).89C52单片机主要特性
a).一个8位的微处理器(CPU)。
b).片内数据存储器RAM(128B),用以存放可以读/写的数据,如运算的中间结果、最终结果以及欲显示的数据等,SST89系列单片机最多提供1K的RAM。
c).片内程序存储器ROM(4KB),用以存放程序、一些原始数据和表格。
单片机分别集成了16K、32K、64KFlash存储器,可供用户根据需要选用。
d).四个8位并行I/O接口P0~P3,每个口既可以用作输入,也可以用作输出。
e).两个定时器/计数器,每个定时器/计数器都可以设置成计数方式,用以对外部事件进行计数,也可以设置成定时方式,并可以根据计数或定时的结果实现计算机控制。
为方便设计串行通信,目前的52系列单片机都会提供3个16位定时器/计数器。
f).五个中断源的中断控制系统。
现在新推出的单片机都不只5个中断源,。
g).一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单机与微机之间的串行通信。
h).片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。
最高允许振荡频率为12MHz。
最高允许振荡频率达40MHz,因而大大的提高了指令的执行速度。
时钟振荡
AT89C52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
振荡器就是可以产生一定频率的交变电流信号的电路.看门狗就是其中一种。
定时器
80C52内部设有两个16位的可编程定时器/计数器。
16位的定时/计数器分别由两个8位专用寄存器组成,即:
T0由TH0和TL0构成;T1由TH1和TL1构成。
每个寄存器均可单独访问。
这些寄存器是用于存放定时或计数初值的。
此外,其内部还有一个8位的定时器方式寄存器TMOD和一个8位的定时控制寄存器TCON。
这些寄存器之间是通过内部总线和控制逻辑电路连接起来的。
TMOD主要是用于选定定时器的工作方式;TCON主要是用于控制定时器的启动停止,此外TCON还可以保存T0、T1的溢出和中断标志。
输出时钟频率=振荡器频率/{4*[65536-(RCP2H,RCP2L)]}初始化的步骤一般如下:
1).确定工作方式(即对TMOD赋值);2).预置定时或计数的初值(可直接将初值写入TH0、TL0或TH1、TL1);3).根据需要开放定时器/计数器的中断(直接对IE位赋值);4).启动定时器/计数器
三、硬件调试
根据电路图焊接单片机,单片机焊接完成后,开始进行硬件调试,用KEIL编程,用STC-ISP冷下载test程序到单片机上,观察流水灯现象,数码管显示,蜂鸣器救护声音,温度传感器测温,现象正常,说明硬件没有问题。
下面进行自己的编程与调试。
系统框图:
四、软件开发
1.实现程序
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint;
#defineduanxP0//数码管的段
sbitP27=P2^7;//设置灯的端口
sbitseg1=P1^3;//第1位数码管
sbitseg2=P1^4;//第2位数码管
sbitDQ=P2^0;//ds18b20端口
sbitBEEP=P2^1;//设置蜂鸣器端口
uintm=0;
ucharn=0;
uchartemp;
ucharflag_get,count,num,minute,second;
ucharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//7段数码管段码表-共阳
ucharstr[4];//存温度数据
voiddelay1(ucharMS);
unsignedcharReadTemperature(void);
voidInit_DS18B20(void);
unsignedcharReadOneChar(void);
voidWriteOneChar(unsignedchardat);
voiddelay(unsignedinti);
main()
{TMOD|=0x01;//定时器设置
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
P1=0xff;
count=0;
while
(1)
{str[0]=tab[temp/10];//十位温度
str[1]=tab[temp%10];//个位温度
str[2]=tab[temp*10%10];//小数第一位
str[3]=tab[temp*100%10];//小数第二位
if(flag_get==1)//定时读取当前温度
{
temp=ReadTemperature();
flag_get=0;
}
}
}
voidtim(void)interrupt1using1//中断,用于数码管扫描和温度检测间隔
{TH0=0xef;//定时器重装值
TL0=0xf0;
num++;
if(num==50)
{num=0;
flag_get=1;//标志位有效
second++;
if(second>=60)
{second=0;
minute++;
}
}
duanx=0xff;
count++;
if(count==1)
{P1=0xdf;
duanx=str[0];}
if(count==2)
{P1=0xef;
duanx=str[1];}//数码管扫描
if(count==3)
{P1=0xf7;
duanx=str[2];}
if(count==4)
{P1=0xfb;
duanx=str[3];}
if(count==5)
{P1=0xfd;
duanx=0x9c;}
if(count==6)
{P1=0xef;
duanx=0x7f;}
if(count==7)
{P1=0xfe;
duanx=0xc6;
count=0;}
if(temp>36||temp<20)
{for(m=0;m<2;m++)
{for(n=0;n<2;n++);//延时
{BEEP=0;//取反产生频率脉冲
}
P27=0;}
BEEP=1;P27=1;
}}
voiddelay(unsignedinti)//延时函数
{while(i--);
}
voidInit_DS18B20(void)//18b20初始化函数
{unsignedcharx=0;
DQ=1;//DQ复位
delay(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay(80);//精确延时大于480us
DQ=1;//拉高总线
delay(10);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(5);
}
unsignedcharReadOneChar(void)//读一个字节
{unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay(5);}
return(dat);}
voidWriteOneChar(unsignedchardat)//写一个字节
{unsignedchari=0;
for(i=8;i>0;i--)
{DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;}
delay(5);}
unsignedcharReadTemperature(void)//读取温度
{unsignedchara=0;
unsignedcharb=0;
unsignedchart=0;//floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
delay(100);
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
b<<=4;
b+=(a&0xf0)>>4;
t=b;//tt=t*0.0625;//t=tt*10+0.5;//放大10倍输出
return(t);
}}
五、总结及体会
通过这次的实习,我在动脑方面和动手方面都得到了锻炼,在实习的前一阶段往电路板上安各个元器件,我明白了细心的重要性,因为元器件有的有正负管脚之分,如果不仔细难免按错。
当然元器件和电路板上都有相应标识只要认真就能发现。
在焊接过程中,前几个焊点也许会焊得不好,但是遇到问题不能退缩不能放弃,要积极想解决的方法。
期间我找到了很多焊接的技巧,比如焊元器件是容易出现“踩高跷”现象,后来知道了,只要将一个管脚扳平就可以起到固定的作用。
焊锡送入的不能多也不能少,多了容易两个粘连,少了容易虚焊。
这一阶段让我们充分锻炼了动手能力。
在实习的后一阶段是编程阶段,在我们以前学过的单片机的知识的基础上对单片机有跟深入的了解,对单片机编程知识有更熟练的掌握。
而且学会了单片机与C语言的结合。
学习单片机要有一定的基础:
电子技术方面要有数字电路和模拟电路等方面的理论基础,特别是数字电路;编程语言要求汇编语言或C语言。
学习语言不是一朝一夕的事情,需要在运用中熟悉,对C语言中if语句,while循环语句运用更熟练。
对单片机的各个部分功能有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能也有了深入的了解。
单片机是一门非常重视实践的技术,但要学习它首先应看书,对单片机引脚、内部结构、寄存器和原理有一定地了解和感官认识,也掌握了DS18B20的特点与使用方法。
编译过程中不懂得地方要反复琢磨,研究老师给的例子,弄懂之后开始自己编。
学习单片机没有捷径,别指望两三天就学会,要坚持不懈,重在积累。
一定要记住动手,不要只说不做,这样会行成眼高手低,不管什么样的程序都要亲手做过才能说会了。
我有深刻体会,这个必须自己实践,实践了掌握的就很快了老师是宝贵的资源,但也别忘了书的作用,多看程序、分析程序思想。
技术是靠不断的积累和交流才会进步的,与老师、同学交流,进而不断地提高自己!
将来我若想有所提高,有所成就,就还必须努力完善自己。
打开调试软件坐在电脑前,先学会怎么用调试软件,然后从最简单的流水灯实验做起,等你能让那八个流水灯按照你的意愿随意流动时你已经入门了,你会发现单片机是多么迷人的东西啊,通过这次单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
创新可以是在原有的基础上进行改进,使之功能不断完善,成为自己的东西。