单片机课程设计报告.docx

上传人:b****8 文档编号:10628278 上传时间:2023-02-22 格式:DOCX 页数:26 大小:352.83KB
下载 相关 举报
单片机课程设计报告.docx_第1页
第1页 / 共26页
单片机课程设计报告.docx_第2页
第2页 / 共26页
单片机课程设计报告.docx_第3页
第3页 / 共26页
单片机课程设计报告.docx_第4页
第4页 / 共26页
单片机课程设计报告.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

单片机课程设计报告.docx

《单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告.docx(26页珍藏版)》请在冰豆网上搜索。

单片机课程设计报告.docx

单片机课程设计报告

课程设计

 

课程名称单片机原理与接口技术课程设计

题目名称温度采集显示系统

学生学院工程学院

专业班级级电子科学与技术班

学号

姓名

指导教师何榕礼

 

2011年12月24日

目录

一、设计任务与要求…………………………………………………………………………1

二、原理电路设计……………………………………………………………………………1

1、方案比较…………………………………………………………………………………1

2、整体电路设计……………………………………………………………………………1

3、单元电路设计……………………………………………………………………………2

4、电路工作原理……………………………………………………………………………4

5、元件选择及元件清单……………………………………………………………………5

三、程序设计(C语言)……………………………………………………………………5

1、延时函数…………………………………………………………………………………5

2、关于DS18B20的函数……………………………………………………………………6

3、关于1602LCD的函数……………………………………………………………………8

4、键盘扫描函数……………………………………………………………………………9

5、报警函数…………………………………………………………………………………11

6、主函数……………………………………………………………………………………11

四、电路和程序调试过程与结果……………………………………………………………12

五、总结………………………………………………………………………………………14

附录1系统电路原理图………………………………………………………………………15

附录2系统PCB电路图……………………………………………………………………16

附录3电路板展示……………………………………………………………………………16

温度采集显示系统

一、设计任务与要求

1、温度测量范围0-99℃。

2、温度分辨率±1℃。

3、选择合适的温度传感器。

4、使用键盘输入温度的最高点和最低点,温度超出范围时候报警(报警温度不需要保存)。

二、原理电路设计

1、方案比较

(1)单片机的选择

采用STC89C52贴片芯片,其性能对于温度采集显示电路已经可以满足需求,国内外有关以51内核扩展出的单片机已被广泛用于工业测控系统,今后一段时间内仍将占有大量市场,而且现在有关51单片机的资料很多、很容易得到,故本课程设计选择STC89C52作为主要芯片以学习并掌握其基本应用,对以后接触单片机及相关开发电路有很大帮助。

相比于stm8系列单片机,由于目前有关次系列单片机的资料很有限,而且内核外围结构比51系列复杂,较难学习上手,所以不妨先掌握51系列单片机,然后融汇贯通,将stm8系列作为后面的学习对象。

(2)温度传感器的选择

DS18B20单总线数字式温度传感器灵敏度高,精度可配置,而且有防水型,可以测量液体温度,其探头较长,也便于测量某些狭窄地方的温度,相比热敏电阻有很大优势,故本设计采用防水型不锈钢封装DS18B20探头式温度传感器。

(3)显示器的选择

因为LED数码管只能显示数字和部分英文字母,可读性差,使用LCD显示可方便观察,清晰明了,能把报警上下限温度和当前温度同时显示出来,免去使用多片LED数码管,硬件开销、面积占用大的烦恼。

所以本设计采用1602LCD作为显示器。

2、整体电路设计

单片机最小系统为STC89C52芯片、复位电路和时钟电路,时钟电路使用11.0592MHz的晶振。

通过DS18B20测量到的温度输入单片机IO口,在LCD上显示出实时温度,同时显示出报警上下限温度,而报警上下限温度可通过按键输入电路修改。

整体系统框图如图2.2.1所示。

图2.2

3、单元电路设计

因为本设计需要制作PCB印刷电路板,所以会涉及到AltiumDesigner09软件的使用,以便从单元电路设计到完成PCB布线布局,然后用热转印法将PCB电路图转印到覆铜板,再腐蚀多余覆铜,焊接好电路即完成作品。

(1)单片机最小系统电路

本设计核心MCU型号为STC89C52RC的LQFP-44封装贴片芯片,由该芯片组成的最小系统电路还包括复位电路和外部晶振时钟电路,复位电路为手动按键控制阻容复位,晶振电路采用电容三点式(如图2.3.1和2.3.2)。

单片机可以串口下载,也可以借用实验板上的下载模块来下载程序。

图2.3.1复位电路图2.3.2时钟电路

(2)DS18B20温度采集电路

DS18B20为美国达拉斯(Dallas)公司的单线数字温度传感器,与传统的热敏电阻不同,DS18B20可直接将被测温度转化成串行数字信号,以供单片机处理。

本设计只用一个单线器件,如同时并接多个DS18B20可实现多点测温,R3为单线DQ的上拉电阻(如图2.3.3)。

DS18B20有两种供电方式:

寄生电源和外部电源,当使用寄生电源时VDD引脚必须接地,本设计将VDD引脚节外部电源(3~5.5V)。

因为,为使DS18B20能完成准确的温度转换,当温度变换发生时,DQ线上必须提供足够的功率,而DS18B20的工作电流高达1.5mA,10kΩ的上拉电阻将使得DQ线没有足够的驱动能力。

图2.3.3DS18B20温度采集电路

(3)LCD显示电路

本设计采用1602型液晶作显示器,电路如图2.3.4所示。

引脚接口说明:

液晶8位数据口接单片机上的P0口。

液晶接口1,2端为电源,15,16为背光电源,为防止直接加5V电压烧坏背光灯,在15脚串接一个10Ω电阻用于限流。

液晶3端为液晶对比度调节端,通过一个10kΩ电位器接地来调节液晶显示对比度。

液晶4端为液晶控制器写数据/写命令选择端,接单片机IO口。

5端为读/写选择端,因为不需要从液晶读取任何数据,只向其写入命令和显示数据,所以此端始终选择为写状态,即低电平接地。

液晶6端为使能信号,是操作时必需的信号,接单片机IO口。

图2.3.4LCD显示电路

(4)LED报警电路

但温度超出报警温度范围时,LED发光二极管会不停地闪灭循环。

LED只需阳极串接一个1kΩ的限流电阻至电源,阴极直接与单片机IO口相连,如图2.3.5。

图2.3.5LED报警电路

(5)按键输入电路

为调节报警温度上限温度和下限温度,采用4个独立键盘,其中两个调节上限温度的增加和减少,没按一下增加或减少上限温度1摄氏度,另外两个调节下限温度的增加和减少。

如图2.3.6,S1~S4为4个独立键盘,一端分别与单片机4个IO口相连,另一端共同接地。

图2.3.6键盘输入电路

4、电路工作原理

整体电路原理图见附录1。

DS18B20温度传感器完成温度转换后将温度数据通过单线DQ传送给单片机,单片机将数据处理并在1602LCD上显示出来,同时系统初始化设置报警的上下限温度也在LCD上显示。

如果测量温度超出报警温度范围,则LED发光二极管闪烁报警。

通过4个按键s1~s4可调节报警的上下限温度,按复位键s0可使系统复位,报警温度恢复为初始化设置值。

DS18B20可配置9~12位测量温度值分辨率,分别对应的温度分辨率为0.5℃、0.25℃、0.125℃、0.0625℃,降低温度值分辨率可以减少DS18B20转换温度所需的时间。

5、元件选择及元件清单

序号

元件型号名称

备注

数量

1

STC89C52RC

LQFP-44封装,串口编程下载

1

2

DS18B20温度传感器

不锈钢封装,防水型探头

1

3

1602型LCD

1

4

LED发光二极管

红色,0805封装

1

5

贴片按键开关

5

6

晶振

晶振频率为11.0592MHz,这决定单片机的指令运行时间

1

7

10K精密可调电位器

用于调节LCD屏幕分辨率

1

8

贴片电阻

0805封装

若干

9

贴片电容

其中除了复位电容外,其他均用0805封装,复位电容为钽电容1206封装

若干

因为制作PCB印刷电路板,所以另外还需要覆铜板、PCB热转印纸小电钻等工具。

三、程序设计(C语言)

为后面的程序更简明,在程序头先作下面两句宏定义,以便在定义无符号字符型和无符号整型数据是只需用“uchar”和“uint”即可。

#defineucharunsignedchar

#defineuintunsignedint

1、延时函数

单片机晶振频率为11.0592MHz,延时函数在此工作频率下调试确定。

voiddelayMs(uinta)//毫秒延时函数,形参a决定延时时长约为a毫秒

{

uinti,j;

for(i=a;i>0;i--)

for(j=112;j>0;j--);

}

voiddelayUs()//延时微妙数量级的函数

{

_nop_();

}

2、关于DS18B20的函数

sbitds=P2^4;//DS18B20的数据输出脚DQ定义为P2.4脚

voiddsInit()//产生复位脉冲初始化

{

unsignedinti;

ds=0;

i=100;//拉低约900us

while(i>0)i--;

ds=1;

i=4;//产生上升沿

while(i>0)i--;

}

voiddsWait()//等待应答脉冲函数

{

unsignedinti;

while(ds);//等待应答脉冲,应答脉冲到达后跳出

while(~ds);//~表示位取反,应答脉冲结束后跳出

i=4;

while(i>0)i--;

}

unsignedcharreadByte()//读取数据的一个字节

{

unsignedinti;

unsignedcharj,dat;

dat=0;

for(i=0;i<8;i++)

{

j=readBit();

dat=(j<<7)|(dat>>1);

}

returndat;

}

voidwriteByte(unsignedchardat)//写数据的一个字节

{

unsignedinti;

unsignedcharj;

bitb;

for(j=0;j<8;j++)

{

b=dat&0x01;

dat>>=1;

if(b)

{

ds=0;i++;i++;

ds=1;

i=8;while(i>0)i--;

}

else

{

ds=0;

i=8;while(i>0)i--;

ds=1;

i++;i++;

}

}

}

voidsendChangeCmd()//启动温度转换函数

{

dsInit();//产生复位脉冲,初始化DS18B20

dsWait();//等待DS18B20给出应答脉冲

delayMs

(1);//延时

writeByte(0xcc);//skiprom命令,即无须提供ROM序列号即可运行内存操作命令

writeByte(0x44);//convertT命令,即开始温度转换操作

delayMs(1000);//温度转换时间需要750ms以上

}

voidsendReadCmd()//读暂存器RAM函数

{

dsInit();//产生复位脉冲,初始化DS18B20

dsWait();//等待DS18B20给出应答脉冲

delayMs

(1);//延时

writeByte(0xcc);//skiprom命令,即无须提供ROM序列号即可运行内存操作命令

writeByte(0xbe);//readscratchpad命令,之后将读取暂存器RAM内容,从字节0一直读取到字节8

}

intgetTmpValue()//从暂存器中获取温度值,转化为10进制数并返回10进制数的温度值

{

unsignedinttmpvalue;

floatt;

intvalue;

unsignedcharlow,high;

sendReadCmd();//读取暂存器RAM内容,从字节0一直读取到字节8

low=readByte();//读取温度值低8位,即暂存器的字节0

high=readByte();//读取温度值高8位,即暂存器的字节1

tmpvalue=high;

tmpvalue<<=8;//左移8位,即把high置于高8位

tmpvalue|=low;//|为按位或,即将low置为低8位

value=tmpvalue;//16位数温度值,即两字节暂存RAM的第0、1字节

t=value*0.0625;//默认为12位分辨率,0.0625摄氏度

value=t*100+(value>0?

50:

-50);/*大于0加50,小于0减50,即为使VALUE值的十位四舍五入,如11556.55度四舍五入后为11607.05度*/

returnvalue;//返回温度值的100倍,十进制,带小数,如11607.05度

}

voiddisplay(intv)//测量温度值显示函数

{

unsignedcharcount;

unsignedchardatas[]={0,0,0};

unsignedinttmp=abs(v);

datas[0]=tmp/10000;

datas[1]=tmp%10000/1000;

datas[2]=tmp%1000/100;

//writeComm(0xc0+5);

/*if(v<0)

{

writeData(0x2d);//显示-号

}

else

{

writeData(0x2b);//显示+号

}*/

if(datas[0]!

=0)

writeData('0'+datas[0]);

if(datas[1]!

=0)

writeData('0'+datas[1]);

//for(count=1;count<3;count++)//原为count!

=5

writeData('0'+datas[2]);

writeData(0xdf);//显示度C

writeData(0x43);

writeData(0x20);//显示空格

}

3、关于1602LCD的函数

sbitRS=P1^0;//LCD引脚4端为液晶控制器写数据/写命令选择端,接P1.0脚

sbitLCDEN=P1^3;//LCD引脚6端为使能信号,接P1.3口

voidwriteComm(ucharcomm)//定义写指令函数,参数comm为要写的指令

{

RS=0;//RS清0为命令选择

P0=comm;//送指令码

LCDEN=1;//使能信号置1

delayUs();//地址建立时间TSP1最小30ns

LCDEN=0;//使能信号回复为低电平

delayMs

(1);

}

//写数据:

RS=1,RW=0;

voidwriteData(uchardat)//定义写数据函数,参数dat定义为字符型即为需要写的字符

{

RS=1;//RS置1为数据选择

P0=dat;//送要写字符数据

LCDEN=1;//使能信号E置1

delayUs();//地址建立时间TSP1最小30ns

LCDEN=0;//使能信号回复为低电平

delayMs

(1);

}

voidinit()//LCD初始化函数

{

writeComm(0x38);//显示模式

writeComm(0x0c);//0c:

b2位置1开显示;b1位置0指不显示光标;b0位的0指光标不显示

writeComm(0x06);//06:

b1位的1指写完一个字符后光标加1;b0位的0指整屏不移

writeComm(0x01);//清屏

}

voidwriteString(uchar*str,ucharlength)//写字符串

{

uchari;

for(i=0;i

{

writeData(str[i]);

}

}

4、键盘扫描函数

sbits1=P3^1;//4个按键s1~s4的一端分别接P3.1~P3.5脚

sbits2=P3^3;

sbits3=P3^4;

sbits4=P3^5;

voidkeys()//按键扫描函数

{

if(s1==0)

{

delayMs(15);//按键防抖动

if(s1==0)//再次判断为按键已按下

{

th=th+100;//上限温度增加1摄氏度

if(th>=10000)//上限温度最高不超过100摄氏度

th=10000;

}

delayMs(15);

while(!

s1);//等待按键松开

}

if(s2==0)

{

delayMs(15);

if(s2==0)

{

th=th-100;

if(th<=tl)

th=tl;

}

delayMs(15);

while(!

s2);

}

if(s3==0)

{

delayMs(15);

if(s3==0)

{

tl=tl+100;

if(tl>=th)

tl=th;

}

delayMs(15);

while(!

s3);

}

if(s4==0)

{

delayMs(15);

if(s4==0)

{

tl=tl-100;

if(tl<=0)

tl=0;

}

delayMs(15);

while(!

s4);

}

}

5、报警函数

sbitd1=P1^5;//LED发光二极管阴极接P1.5脚

intth=2500;//设置报警上限温度初始值为25摄氏度

inttl=1500;//设置报警下限温度初始值为15摄氏度

voidalarm(intv)//报警函数,参数v为需要判断是否超出报警范围的温度,即后面去测量温度

{

unsignedinttmp=abs(v);//去绝对值

if((tmp>th)|(tmp

d1=0;

delayMs(20);//LED亮20ms

d1=1;//LED灭的时间即是后面温度转换所需的约1s时间,故已足够,不用再加延时

}

6、主函数

voidmain()

{

P3=0xff;//按键所连IO口初始为高电平

sendChangeCmd();//启动温度转换

init();//初始化1602LCD

writeComm(0x80);//指针置于第1行第1个字符处

writeString(table,12);//写“Temperature:

writeComm(0xc0);//指针置于第2行第1个字符处

writeString(table_th,3);//写“TH:

writeComm(0xc0+8);//指针置于第2行第9个字符处

writeString(table_tl,3);//写“TL:

while

(1)//循环,不断进行温度转换、刷新显示、键盘扫描

{

keys();//键盘扫描

writeComm(0x80+12);//指针置于第1行第13个字符处

display(getTmpValue());//显示测量温度值

writeComm(0xc0+3);//指针置于第2行第4个字符处

display(th);//显示报警上限温度

writeComm(0xc0+11);//指针置于第2行第12个字符处

display(tl);//显示报警下限温度

alarm(getTmpValue());//报警判断

sendChangeCmd();//重新温度转换

}

}

四、电路和程序调试过程与结果

在调试延时子函数时,通过设置断点,观察运行延时函数指令下来所经历的时间,例如对毫秒延时函数,要求运行该函数指令所经历的时间为1ms。

观察在运行该函数指令前的时间(如图4.1),执行

“单步运行”命令以运行该指令后,再次观察时间(如图4.2),如果大约经历了1ms则符合要求,否则继续修改函数直至符合要求。

图4.1未运行指令前

图4.2运行指令后

在AltiumDesigner09上,设计好电路原理图后转为PCB电路图(见附录2),经过热转印至覆铜板上,并腐蚀和焊接好电路。

第一次下载程序到单片机后上电调试,LCD没有显示任何字符,这说明LCD屏幕分辨率未调好。

调节电位器使LCD第一行显示出一排清晰黑色小方格,即调好屏幕分辨率,但再此下载程序仍无显示。

经过用万用表对LCD连接单片机的数据传输引脚注意排查,发现LCD使能端引脚6所接单片机的P4.2脚不能正常工作。

对比DIP40封装的STC89C52芯片,LQFP-44封装比DIP40封装的多出P4口,但在编程时的头文件reg52.H中并没有P4口的定义,故需在程序中加上对P4口地址的定义sfrP4=0xE8,这是根据STC89C52的特殊功能寄存器映像(如图4.3)来定义的。

图4.3

后来考虑到P4口驱动能力等问题,最后经调整将LCD使能端引脚6连接至P1.3脚。

经修改后再次上电调试,成功显示出测温结果,报警、复位、按键功能正常,如图4.4所示。

图4.4

五、总结

1、作品的优点和不足

优点:

(1)本设计采用PCB印刷电路板,所占面积小。

(2)温度传感器为不锈钢防水型,可测量液体温度。

(3)相比数码管,采用LCD液晶显示,使显示结果容易观察,简洁明了。

不足:

(1)电路板面积还可以做得更小,应充分考虑PCB布线布局。

(2)按键电路程序为键盘扫描,没有使用单片机中断功能,所以需要按下键1s左右才有效。

(3)PCB布局存在缺陷,使可调电位器与LCD的位置相距太近,相互阻碍,需要把可调电位器倾斜放置。

(4)DS18B20温度传感器的温度值分辨率没有重新配置,由于设计要求测温温度

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1