单片机.docx
- 文档编号:23416672
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:24
- 大小:1.29MB
单片机.docx
《单片机.docx》由会员分享,可在线阅读,更多相关《单片机.docx(24页珍藏版)》请在冰豆网上搜索。
单片机
厦门理工学院
课设报告书
课程名称:
单片机原理及应用课程设计
实验名称:
最小系统板
专业班级:
11通信工程1班
姓名:
王二重、郅瑞行
学号:
1106052155、1106052159
日期:
2014年6月13号
地点:
单片机实验室
成绩:
教师签名:
光电与通信工程学院
目录
一、摘要3
二、正文3
三、硬件电路原理描述;3
1、单片机驱动电路设计3
2、温度显示模块电路设计4
3、温度测量模块电路设计5
4、单片机总控制电路:
6
四、软件设计流程及描述6
1、主流程框图6
2、数据采集流程图7
3、仿真图8
五、心得体会8
六、参考文献9
七、附录10
1、系统总硬件电路原理图;10
2、系统源程序代码(要有注释)。
11
(1)主程序代码11
(2)DS18B20获取温度并转换18
(3)向地址器件发送多字节数据函数19
(4)向有子地址器件读取多字节数据函数20
一、摘要
此次单片机课程设计是利用STC89C52、DS18B20、LCD1602、AT24C02等元器件设计温度采集与显示系统,利用DSI8B20单总线温度传感器和单片机与其它外围设备结合在一起实现温度的测量和显示。
该设计主要分为以下三大部分:
硬件设计、软件设计和整个系统的调试与实现。
其中硬件设计主要是由Protel99SE软件进行电路的设计;软件设计采用C语言编写实现。
实现了基于DS18B20进行的各项软硬件的设计、调试和处理,实现了多点温度测量和显示。
关键词:
温度测量;硬件;软件;温度传感器DS18B20
二、正文
1、系统的主要功能及工作流程;
(1)系统具有以下功能:
1、能正确检测温度;
2、在1602上实时显示温度;
3、每隔10秒采集一次温度数据并保存到AT24C02
4、按键按下后,可逐个显示之前采集到的数据;
5、可进行复位操作
6、可对显示屏进行调时操作
工作流程:
本课程设计的硬件电路设计分为单片机驱动电路设计、温度显示模块电路设计、温度测量模块电路设计单片机驱动电路作为运作的条件驱动单片机正常工作,温度测量模块是本系统的重点设计,采用温度传感器DS18B20来实现,利用温度传感器的的特性,与单片机进行通信,同时采用液晶显示屏LCD1602显示实时温度,通过按键与单片机的通信来控制显示器上显示的时间,进行调整时分秒,设置按键,将之前采集到的温度数据存储在AT24C02中,并能按键查看之前的数据。
三、硬件电路原理描述;
1、单片机驱动电路设计
单片机能正常工作,必须要有它的驱动电路,即单片机最小系统。
单片机最小系统主要包括其供电系统,时钟电路和复位电路。
本系统单片机的复位电路采用手动复位。
单片机驱动电路设计、复位电路、以及供电电路如下图,同时单片机芯片的主要技术参数及接口信号说明请看附录
图1单片机驱动电路设计
2、温度显示模块电路设计
本设计使用的LCD1602的主要技术参数及接口信号说明请看附录。
根据LCD1602的引脚接口说明与单片机连接,设计本系统的显示模块接口电路设计如图2所示
图2系统显示模块电路设计
3、温度测量模块电路设计
本课程设计选择DS18B20传统供电模式的电路接法,从VDD引脚接入一个外部电源,这样做的好处是单总线上不需要强上拉,而且总线不用在温度转换期间总保持高电平。
温度测量模块电路设计如图3所示
图3系统温度测量模块电路设计
4、单片机总控制电路:
四、软件设计流程及描述
1、主流程框图
2、数据采集流程图
3、仿真图
五、心得体会
看到此次的课程设计题目,刚开始觉得好难,没有一点头绪,在经过两天的资料查询后,慢慢的在参考查到的各种资料后,慢慢有了着手点,开始在Protel软件上进行电路的设计,并进行电路仿真,发现可以正常的工作,接下来就是开始了焊接工作,两个人分工一人负责焊,一人负责检查是否有焊错,在经过一天的焊接后,完成了整个的焊接工作,接通电源后,发现没有预期的结果出现,显示器只能亮,不能显示温度和时间数据,在经过检查后找出了一些焊接失误的地方,但是纠正过来以后还是不能出现预期的现象,再在两个人仔细的检查,对比电路图后也还是没有发现错误在哪儿,最后在同学的帮助下找到了问题所在,是排阻的焊接方法有问题,在经过调整后,最终显示器能显示预期的现象,也能完成基本的设计要求,比如调时,复位,存储,但是只能将单片机芯片放在试验箱上下载后再放在系统板上才能工作,不能直接在系统板上的数据接口上完成下载,在由老师对接口的讲解后,开始检测接口对应的引脚,但是到最后也没有实现这一功能。
六、参考文献
1、
2、各芯片管脚图
七、附录
1、系统总硬件电路原理图;
2、系统源程序代码(要有注释)。
(1)主程序代码
#include
#include
charmiao,shi,fen;
uints1num;
ucharcount;
uintsu,tt,mm,m,n;
ucharbuff[4];
unsignedcharpDat[7],pDat1[7];
sbits1=P3^0;
sbits2=P3^1;
sbits3=P3^6;
voidmain()
{
m=0;
n=0;
init();
EX0=1;
//init_com();//包含了对定时器0的设定
while
(1)
{
write_sfm(10,miao);
write_sfm(7,fen);
write_sfm(4,shi);
dis_temp(tt);
dis_temp1(mm);
keyscan();
}
}
voidint_0()interrupt0
{
EA=0;
IRcvStr(0xa0,n,&pDat1[0],8);
//mm=pDat1[0];
//mm<<=8;//两个字节组合为1个字
//mm=mm|pDat1[1];
mm=pDat1[0]*100+pDat1[1]*10+pDat1[2];
pDat1[0]=0;
pDat1[1]=0;
pDat1[2]=0;
n=n+8;
EA=1;
}
voidkeyscan()
{
if(s1==0)
{
delay(5);
if(s1==0)
{s1num++;
while(!
s1);
if(s1num==1)
{
TR0=0;
write_com(0x80+0x40+10);
write_com(0x0f);
}
}
if(s1num==2)
{
write_com(0x80+0x40+7);
}
if(s1num==3)
{
write_com(0x80+0x40+4);
}
if(s1num==4)
{
s1num=0;
write_com(0x0c);
TR0=1;
}
}
if(s1num!
=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!
s2);
if(s1num==1)
{
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);//指针回原位
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);//指针回原位
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);//指针回原位
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!
s3);
if(s1num==1)
{
/*if(miao==0)
{
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}*/
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
su++;
if(su==20)
{
su=0;
tempchange();
tt=get_temp();
//pDat[0]=(uchar)((tt>>8)&0xff);
//pDat[1]=(uchar)(tt&0xff);
pDat[0]=tt/100;
pDat[1]=(tt%100)/10;
pDat[2]=tt%10;
ISendStr(0xa0,m,&pDat[0],8);//存温度
m=m+8;
pDat[0]=0;
pDat[1]=0;
pDat[2]=0;
}
count++;
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
//write_sfm(4,shi);
}
//write_sfm(7,fen);
}
//write_sfm(10,miao);
}
}
(2)DS18B20获取温度并转换
voidtempchange(void)
{
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是整型
}
//显示程序调用lcd中的write_sfm1十位地址写4个位为5小数为7
voiddis_temp(uintt)
{
uinti;
i=t/100;
write_sfm1(0,i);
i=(t%100)/10;
write_sfm1(1,i);
i=t%10;
write_sfm1(3,i);
}
voiddis_temp1(uintt)//显示储存的温度
{
uinti;
i=t/100;
write_sfm1(9,i);
i=(t%100)/10;
write_sfm1(10,i);
i=t%10;
write_sfm1(12,i);
}
(3)向地址器件发送多字节数据函数
#include
bitISendStr(unsignedcharsla,unsignedcharsuba,unsignedchar*s,unsignedcharno)
{
unsignedchari;
Start_I2c();/*启动总线*/
SendByte(sla);/*发送器件地址*/
if(ack==0)return(0);
SendByte(suba);/*发送器件子地址*/
if(ack==0)return(0);
for(i=0;i { SendByte(*s);/*发送数据*/ if(ack==0)return(0); s++; } Stop_I2c();/*结束总线*/ return (1); } (4)向有子地址器件读取多字节数据函数 bitIRcvStr(unsignedcharsla,unsignedcharsuba,unsignedchar*s,unsignedcharno) { unsignedchari; Start_I2c();/*启动总线*/ SendByte(sla);/*发送器件地址*/ if(ack==0)return(0); SendByte(suba);/*发送器件子地址*/ if(ack==0)return(0); Start_I2c();/*重新启动总线*/ SendByte(sla+1); if(ack==0)return(0); for(i=0;i { *s=RcvByte();/*发送数据*/ Ack_I2c(0);/*发送就答位*/ s++; } *s=RcvByte(); Ack_I2c (1);/*发送非应位*/ Stop_I2c();/*结束总线*/ return (1); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机