个人收集整理仅供参考学习
单片微型计算机原理
与接口技术课程设计报
告
题目:温度测量
班级:
学号:
姓名:
指导老师:
实习日期:6.27~7.1
1/ 18
个人收集整理仅供参考学习
1、课程设计要求
(1)通过按键设置温度上、下限
(2)读入A/D转换数据:
若数据<下限,则显示温度并显示L、报警并使步进电机正转; 若数据>上限,则显示温度并显示H、报警并使步进电机反转; 若下限<数据<上限,则显示C
(3)本机地址为06H,当接到上位机发地06H时,则回发06H 当接到上位机发地AAH时,则将当前温度发给上位机
当接到上位机发地55H时,则小灯亮,提示修改上、下限2、方案论证
类地器件利用其感温效应,在将随被测温度变化地电压或电流采集过来,
由于本设计是于ATC51 可以使用热敏电阻之
进行A/D
地对应值地计算,比较麻烦.所以采用DS18B20温度传感器,这样可以很容
易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都容易实
现,而且使用单片机地接口便于系统地再扩展,满足设计要求.b5E2RGbCAP
步进电机模块,由于步进电机地额定工作电流过大,单片机无法
驱动其工作,因而在接口电路与步进电机之间加入ULN2003A驱动芯片,利用驱动芯片地电流放大作用,使步进电机可靠地运转.p1EanqFDPw
总体设计方框图如图2.1所示.
2 / 18
个人收集整理仅供参考学习
温度 | 传感器 | 单 | 步进电机 |
控制按键 | 显示 | ||
片 | |||
机 | |||
报警 |
图2.1 总体设计方框图
3、硬件系统设计及原理图
3.1单片机主控电路
本设计中采用美国Atmel公司地8 位单片机ATC51作为单片机控制模块地核心部件,该型单片机在本设计中地应用如下:晶振采用12MHZ,
复位电路采用上电加按钮复位.DXDiTa9E3d
3.2 显示电路 | 图3.1.2 复位电路 |
|
|
3/ 18
个人收集整理仅供参考学习
显示电路采用4位共阴极LED数码管,P0 口由上拉电阻提高驱动能力,作为段码输出并作为数码管地驱动.P2 口地低四位作为数码管地位选端.采用动态扫描地方式显示.RTCrpUDGiT
图3.2数码管显示电路
3.3温度传感器
测温度,并且可根据实际要求通过简单地编程实现9-12位地数字值读数方式.5PCzVD7HxA
图3.3温度传感器与单片机地连接 4/ 18
个人收集整理仅供参考学习
3.4温度上下限调整按键
本系统设计三个按键,采用查询方式,一个用于选择切换设置温度上
下限和当前温度,另外两个分别用于设置报警温度地加和减.均采用软件消抖.jLBHrnAILg
3.5步进电机
本设计选用驱动芯片ULN2003驱动四相步进电机.
ULN2003 是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成.ULN2003地每一对达林顿都串联一个2.7K地基极电阻,在5V地工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理地数据.xHAQX74J0X
ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 地电压,输出还可以在高负载电流并行运行.LDAYtRyKfE
5/ 18
个人收集整理仅供参考学习
图3.5.2.1 ULN2003方框图
表3.5.2 ULN2003极限值参数
ULN2003
图3.5.2.2步进电机驱动电路
3.6 双机通信
利用单片机串行口实现两个单片机(主机、从机)之间地通信,其中
6 / 18
个人收集整理仅供参考学习
一个单片机作为主机(发送方),另一个为从机(接收方),主机读入按键
值并将相应命令发送给从机,从机收到命令后执行相应地功能.双机通信示
意图如下:Zzz6ZB2Ltk
ATC51 | TXD | RXD |
RXD | TXD | |
GND | GND | |
ATC51 |
图3.6双机通信示意图
4、软件清单
写命令函数、DS18B20读1字节函数、读出温度函数、温度数据处理函数、
报警函数、步进电机函数、设置温度显示转换函数、按键查询程序、主函
数.dvzfvkwMI1
通信上位机程序包括延时函数、扫描显示函数、初始化函数、按键查询程
序、主函数.下位机函数包括初始化、接收程序、主函数.rqyn14ZNXI
上位机软件清单:
#include "reg51.h"
#include "intrins.h" //_nop_();延时函数
sbitw0=P2^0; //数码管4
sbitw1=P2^1; //数码管3
用 sbit w2=P2^2; //数码管2
#define dm P0 //段码输出口#define uchar unsigned char #define uint unsigned int
uint h;
sbit w3=P2^3; //数码管1 sbitaa=P1^0;
sbit bb=P1^1; sbit cc=P1^2;
7/ 18
个人收集整理仅供参考学习
ucharidata buf[1]; TH1=0xfd;
ucharcode table_dm[15]= TL1=0xfd;
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0 PCON=0x00;
x07,0x7f,0x6f,0x00,0x40,0x38,0x76,0x3 TR1=1;
9};EmxvxOtOco SCON=0x50;
//共阴LED段码表"0""1" "2" "3" "4" }
"5" "6" "7" "8""9" "不 亮 " /*************keyscan***********/
"-"'L''H''C'SixE2yXPq5 voidkeyscan()
uchar data {
display[4]={0x00,0x00,0x00,0x00};//显 if(aa==0)
示单元数据,共4个数据和一个运算 {
暂用6ewMyirQFL SBUF=0x06;
/******11us延时函数*******/ do{}while(TI==0);TI=0;
voiddelay(uint t) }
{ elseif (bb==0)
for(;t>0;t--); {
} SBUF=0xaa;
/************scan*************/ do{}while(TI==0);TI=0;
voidscan() }
{
intj;
for(j=0;j<4;j++)
{ display[2]=0x0d;
{
case
dm=table_dm[display[0]];w0=0;delay(5 }
switch (j)
0);w0=1;kavU42VRUs else;
case 1: }
dm=table_dm[display[1]];w1=0;delay(5 /************main***************/
0);w1=1;y6v3ALoS voidmain()
case 2: {
dm=table_dm[display[2]];w2=0;delay(5 init();
0);w2=1;M2ub6vSTnP dm=0x00;//初始化端口
case 3: w0=0;
dm=table_dm[display[3]];w3=0;delay(5 w1=0;
0);w3=1;0YujCfmUCw w2=0;
} w3=0;
} for(h=0;h<4;h++)//开机显示"0000"
} {
/**********初始化函数***********/ display[h]=0;
voidinit()
{
}
while(1)
TMOD=0x20; {
8/ 18
个人收集整理仅供参考学习
scan(); display[1]=buf[0]%100/10;keyscan(); display[0]=buf[0]%10;if(RI==1) }
{ else
RI=0; {
buf[0]=SBUF; display[3]=0x0a;
if(buf[0]==0x55) display[2]=0x0e;
{ display[1]=buf[0]%100/10;} display[0]=buf[0]%10;else if(buf[0]==0x06) }
{ }
display[3]=0x0a; }
display[2]=0x0a; }
下位机软件清单
#include "reg51.h" uchar tt=0;
#include "intrins.h"//_nop_();延时函数 ucharscale;
用 uchar idatabuf[1]={0x00};
#define dm P0 //段码输出口 intnum=0;
#define uchar unsigned char
#define uint unsignedint uchar Table[4]={0x03,0x06,0x0c,0x09};//*****温度小数部分用查表法****//
ditab[16]={0x00,0x01,0x01,0x02,0x03,
uchar code
uchar
sbit w0=P2^0; //数码管4 sbit w1=P2^1; //数码管3 sbit w2=P2^2; //数码管2 sbit w3=P2^3; //数码管1
table_dm[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0 x38,0x76,0x39};sQsAEJkW5T
//共阴LED段码表"0""1" "2" "3" "4"
sbit beep=P3^7; //蜂鸣器和指示灯 "5" "6" "7" "8" "9" "不 亮 "
sbit set=P2^6; //温度设置切换键 "-"'L''H''C'GMsIasNXkA
sbit add=P2^4; //温度加 uchar
sbit dec=P2^5; //温度减 table_dm1[]={0xbf,0x86,0xdb,0xcf,0xe
sbit lig=P3^6; 6,0xed,0xfd,0x87,0xff,0xef}; //个位带
int temp1=0; //显示当前温度和设置温度地标志位为0 时显示当前温度
小数点地断码表TIrRGchYzg
uchardata temp_data[2]={0x00,0x00};
uint h; //读出温度暂放
uint temp; uchar data
uchar r; display[5]={0x00,0x00,0x00,0x00,0x00};
uchar high=35,low=20; uchar sign;
uchar q=0;
//显示单元数据,共4个数据和一个运算暂用7EqZcWLZNX
/**********延时函数************/
9/ 18
个人收集整理仅供参考学习
void delay(uint t) presence=~DQ;
{ }
for(;t>0;t--); DQ=1; //拉高电平
} }
//********扫描显示函数******// /*******DS18B20 写命令函数*****/void scan() //向1-WIRE 总线上写1个字节{ void write_byte(ucharval)
int j; {
for(j=0;j<4;j++) uchar i;
{ for(i=8;i>0;i--)
switch (j) {
{ DQ=1;_nop_();_nop_(); //从高拉倒低case 0: DQ=0;_nop_();_nop_();_nop_();_nop_();dm=table_dm[display[0]];w0=0;delay(5 //5 us
0);w0=1;//xiaoshulzq7IGf02E DQ=val&0x01; //最低位移出
case
1: delay(6); //66 us dm=table_dm1[display[1]];w1=0;delay( val=val/2; //右移1位
50);w1=1;//geweizvpgeqJ1hk }
case 2:
DQ=1;dm=table_dm[display[2]];w2=0;delay(5
0);w2=1;//shiweiNrpoJac3v1case dm=table_dm[display[3]];w3=0;delay(5/*****S18B20 读1字节函数*****/ //从总线上取1个字节
} } } uchar value=0;
//******18B20 复位函数*******/ for(i=8;i>0;i--)
ow_reset(void)
{ { DQ=1;_nop_();_nop_();
char presence=1; value>>=1;
while(presence) DQ=0;_nop_();_nop_();_nop_();_nop_();
{
//4 us while(presence) DQ=1;_nop_();_nop_();_nop_();_nop_();
{ //4 us
DQ=1;_nop_();_nop_();//从高拉倒低 if(DQ)value|=0x80;
DQ=0;
delay(6); //66 us delay(50); //550 us }
DQ=1; DQ=1;
delay(6); //66 us return(value);
presence=DQ;//presence=0 复位成功,继 }
续下一步
}
delay(45); //延时500 us
/*******读出温度函数******//read_temp()
{
10/ 18
个人收集整理仅供参考学习
ow_reset(); //总线复位 {
delay(200); display[3]=0x0c;
write_byte(0xcc); //发命令 }
write_byte(0x44); //发转换命令 }
ow_reset(); else
delay(1); {
write_byte(0xcc);//发命令 display[3]=0x0d;
write_byte(0xbe); }
temp_data[0]=read_byte();//读温度值
地第字节 if(!display[2])
temp_data[1]=read_byte(); //读温度值 {
地高字节 display[2]=0x0a;//次高位为0时不显temp=temp_data[1];
示temp<<=8; }
temp=temp|temp_data[0]; // 两字节合 }
成一个整型变量. //*******报警函数******//
return temp; //返回温度值
voidBEEP() } {
/*******温度数据处理函数*******/ if((r>high&&r<129)||r<low)
work_temp(uinttem)
{ display[4]=tem&0x0f; // 取小数部分地值 else
数部分显示值
整数部分地值 }
display[3]=display[4]/100; //取百位数 /*********步进电机函数*********/
据暂存 voidstepper()
display[1]=display[4]%100; // 取后两
{位数据暂存 if(r>high)
display[2]=display[1]/10; // 取十位数 {
据暂存 TR0=1;
display[1]=display[1]%10; //个位数据
if(num1<8)r=display[1]+display[2]*10+display[3]* {
100; do{}while(!TF0);num1++;TH0=0x06;T
/////符号位显示判断///// L0=0x06;
if(r<high)
} { else
if(r>low) {
{ num1=0;
display[3]=0x0e; }
else
P1=Table[num]; num++;
if(num==4) num=0;
11/ 18
个人收集整理仅供参考学习
} void keyscan()
} {
else if(r<low) //int temp1;//最高温度和最低温度标{ 志位
TR0=1; if(set==0)
if(num1<8) {
{ while(1)
do{}while(!TF0);num1++;TH0=0x06;T {
L0=0x06; delay(500);//消抖
} if(set==0)
else {
{ temp1++;
num1=0; while(!set)
P1=Table1[num]; scan();
num++; }
if(num==4) num=0; if(temp1==1)
} {
} xianshi(high);
else TR0=0; scan();
}
//*******设置温度显示转换*****//void xianshi(int horl) { scan();
{
display[2]=horl%100/10; {
if(horl==high)
display[1]=horl%10; while(!dec)
display[0]=0; scan();
} high-=1;
else }
{ }
display[3]=0x0c; if(temp1==2)
display[2]=horl%100/10; {
display[1]=horl%10; xianshi(low);
display[0]=0; if(add==0)
} {
if(!display[2]) while(!add)
{ scan();
display[2]=0x0a;//次高位为0 时不显 low+=1;
示 }
} } if(dec==0) {
//*********按键查询程序********// while(!dec)
12/ 18
个人收集整理仅供参考学习
scan(); SBUF=0x55;
low-=1; do{} while(TI==0);TI=0;
} }
scan(); else ;
} }
if(temp1>=3) /*********主函数*********/ { void main()
temp1=0; {
break; init();
} dm=0x00; //初始化端口
} w0=0;
} w1=0;
} w2=0;
/**********初始化***********/ w3=0;
void init (void) for(h=0;h<4;h++) //开机显示"0000"{ {
TMOD=0x22; display[h]=0;
TH0=0x06;TL0=0x06; }
TH1=0xfd; ow_reset(); //开机先转换一次
TL1=0xfd; write_byte(0xcc); //Skip ROM
PCON=0x00; TR1=1;SCON=0x50; write_byte(0x44); //发转换命令 for(h=0;h<100;h++)//开机显示"0000" {
}
void receive () {
SBUF=0x55;
{ if(RI==1)
buf[0]=SBUF; {
if(buf[0]==0x06) RI=0;
{ receive ();
lig=1; }
SBUF=0x06; if (temp1==0)
do{}while(TI==0);TI=0; {
} work_temp(read_temp()); //处理温度数elseif(buf[0]==0xaa) 据
{ stepper();
lig=1; scan(); //显示温度值
SBUF=r; BEEP();
do{} while(TI==0);TI=0; keyscan();
} }
elseif(buf[0]==0x55) { else {
lig=0x00; keyscan();
13/ 18
个人收集整理仅供参考学习
} }
}
5、实验仿真
5.1从机
进入protuse后,连接好电路,并将程序下载进去.数码管显示温度与传感器地温度相同.当前温度高于上限值时,步进电机倒转并蜂鸣器报警;当前温低于下限值时,步进电机正转并蜂鸣器报
警.fjnFLDa5Zo
当按下SET键一次时,进入温度上限调节,此时显示软件设置地温度上限,按ADD或DEC分别对上限温度进行加一或减
当再次按下 SET键时,进入温度下限调节,此时显示软件设置
一.tfnNhnE6e5
一.HbmVN777sL 当第三次按下SET 键时,退出温度报警线设置.显示当前温度.
14 / 18
个人收集整理仅供参考学习
5.2 主机
图5.2 主机仿真图
5.3 双机通信
15 / 18
个人收集整理仅供参考学习
上电时主机显示“0000”.按下左键向从机发送“06h”,从机回发“06h”,主机显示“06”;按下中键向从机发送“0aah”,从机将当前温度回发给主机,主机显示当前温度值;按下右键,向从机发送“055h”,从机发光二极管亮,并重新设定温度上下限,主机显示“HHHH”.V7l4jRB8Hs
6、实验心得体会
通过本次单片机接口设计实习,本组成员在软件及硬件上均设计并实
现了实习要求地功能.在软件功能地实现方面,成员们结合单片机原
理图,经过反复推敲,最终统一思路以中断地方式进行程序地编译,
同时熟悉并掌握了proteus软件地使用,用该软件进行了一些功能地
初步演示仿真.这次实验中,我主要负责硬件部分,在完成步进电机地
时候受到了一些阻碍,在硬件接线上和程序那里出了一些问题后来经
过查找资料和咨询最终得到了解决.本次实习虽然有许多不足之处,
但是每个成员都很努力去完成本次暑期单片机实习,在单片机知识地
16/ 18
个人收集整理仅供参考学习
深入理解和团结协作上都有较大收获,为今后更深入地学习做了很好地铺垫.83lcPA59W9
版权申明
本文部分内容,包括文字、图片、以及设计等在网上搜集整理.
版权为个人所有
This article includes some parts, including text, pictures, |
anddesign. Copyright is personalownership.mZkklkzaaP
用户可将本文地内容或服务用于个人学习、研究或欣赏,以及其
他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律 |
for personal study, research or appreciation, and othernon-commercial or non-profit purposes, but at the same time, theyshall abide by the provisions of copyright law and other relevantlaws, and shall not infringe upon the legitimate rights of thiswebsite and its relevant obligees. In addition, when any content orservice of this article is used for other purposes, writtenpermission and remuneration shall be obtained from the personconcerned and the relevant
17 / 18
个人收集整理仅供参考学习
obligee.ORjBnOwcEd
转载或引用本文内容必须是以新闻性或资料性公共免费信息为
使用目地地合理、善意引用,不得对本文内容原意进行曲解、修改,
并自负版权等法律责任.2MiJTy0dTT
Reproduction or quotation of the content of this article
must be reasonable and good-faith citation for the use of news
or informative public free information. It shall not
misinterpret or modify the original intention of the content
of this article, and shall bear legal liability such as
copyright.gIiSpiue7A
18 / 18
Copyright © 2019- tjwe.cn 版权所有
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务