单片微型计算机原理与接口技术课程设计报告 - 温度测量 联系客服

发布时间 : 星期一 文章单片微型计算机原理与接口技术课程设计报告 - 温度测量更新完毕开始阅读804b7c82a7c30c22590102020740be1e650ecc8b

本系统设计三个按键,采用查询方式,一个用于选择切换设置温度上下限和当前温度,另外两个分别用于设置报警温度的加和减。均采用软件消抖。

图3.4按键电路

3.5步进电机

3.5.1步进电机驱动电路

本设计选用驱动芯片ULN2003驱动四相步进电机。

ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。ULN2003 的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和 CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。

ULN2003 工作电压高,工作电流大,灌电流可达 500mA,并且能够在关态时承受 50V 的电压,输出还可以在高负载电流并行运行。

图3.5.2.1 ULN2003方框图

表3.5.2 ULN2003极限值参数

ULN2003

与单片机连接驱动步进电机原理图如下:

图3.5.2.2步进电机驱动电路

3.6双机通信

利用单片机串行口实现两个单片机(主机、从机)之间的通信,其中

一个单片机作为主机(发送方),另一个为从机(接收方),主机读入按键值并将相应命令发送给从机,从机收到命令后执行相应的功能。双机通信示意图如下:

TXD RXD GND RXD TXD GND AT89C51 AT89C51 图3.6双机通信示意图

4、软件清单

系统程序主要包括主程序和通信程序。

其中主程序包括延时函数、扫描显示函数、DS18B20 复位函数、DS18B20 写命令函数、DS18B20 读1 字节函数、读出温度函数、温度数据处理函数、报警函数、步进电机函数、设置温度显示转换函数、按键查询程序、主函数。

通信上位机程序包括延时函数、扫描显示函数、初始化函数、按键查询程序、主函数。下位机函数包括初始化、接收程序、主函数。 上位机软件清单:

#include \

#include \//_nop_();延时函数用

#define dm P0 //段码输出口 #define uchar unsigned char #define uint unsigned int uint h;

sbit w0=P2^0; //数码管4

sbit w1=P2^1; //数码管3 sbit w2=P2^2; //数码管2 sbit w3=P2^3; //数码管1 sbit aa=P1^0; sbit bb=P1^1; sbit cc=P1^2;

uchar idata buf[1];

uchar code table_dm[15]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x38,0x76,0x39};

//共阴LED 段码表\\\\\\不亮%uchar data display[4]={0x00,0x00,0x00,0x00}; //显示单元数据,共4 个数据和一个运算暂用

/******11us 延时函数*******/ void delay(uint t) {

for (;t>0;t--); }

/************scan*************/ void scan() { int j;

for(j=0;j<4;j++) {

switch (j) { case 0: dm=table_dm[display[0]];w0=0;delay(50);w0=1; case 1: dm=table_dm[display[1]];w1=0;delay(50);w1=1; case 2: dm=table_dm[display[2]];w2=0;delay(50);w2=1; case 3: dm=table_dm[display[3]];w3=0;delay(50);w3=1; } } }

/**********初始化函数***********/ void init() {

TMOD=0x20; TH1=0xfd; TL1=0xfd; PCON=0x00; TR1=1;

SCON=0x50; }

/*************keyscan***********/ void keyscan() {

if (aa==0) {

SBUF=0x06;

do{} while(TI==0);TI=0; }

else if (bb==0) {

SBUF=0xaa;

do{} while(TI==0);TI=0; }

else if(cc==0) {SBUF=0x55; display[3]=0x0d; display[2]=0x0d; display[1]=0x0d; display[0]=0x0d;

do{} while(TI==0);TI=0; } else ; }

/************main***************/ void main() { init();

dm=0x00; //初始化端口 w0=0; w1=0; w2=0; w3=0;

for(h=0;h<4;h++) //开机显示\{

display[h]=0; }

while(1) {

scan();