C51温度采集与控制实验Word格式.docx

上传人:b****6 文档编号:21189834 上传时间:2023-01-28 格式:DOCX 页数:27 大小:24.18KB
下载 相关 举报
C51温度采集与控制实验Word格式.docx_第1页
第1页 / 共27页
C51温度采集与控制实验Word格式.docx_第2页
第2页 / 共27页
C51温度采集与控制实验Word格式.docx_第3页
第3页 / 共27页
C51温度采集与控制实验Word格式.docx_第4页
第4页 / 共27页
C51温度采集与控制实验Word格式.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

C51温度采集与控制实验Word格式.docx

《C51温度采集与控制实验Word格式.docx》由会员分享,可在线阅读,更多相关《C51温度采集与控制实验Word格式.docx(27页珍藏版)》请在冰豆网上搜索。

C51温度采集与控制实验Word格式.docx

当扫描整个数码管的频率应当保证在50Hz以上时,就不会看到明显的闪

烁,肉眼观察,看上去是一起亮的。

原理图如下:

图1数码管的动态扫描原理图

2、蜂鸣器工作原理

蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动

膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,

单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大

的电路。

原理图见图:

图2蜂鸣器的原理图

如图2所示,蜂鸣器的负极经电阻R3接地,蜂鸣器的正极接到三极管的

4

集电极C,三极管的基级B经过限流电阻R2后由单片机的P1.3引脚控制,当

P1.3输出高电平时,三极管Q1截止,没有电流流过线圈,蜂鸣器不发声;

P1.3输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。

因此,我们可以通过程序控制P1.3脚的电平来使蜂鸣器发出声音和关闭。

序中改变单片机P1.3引脚输出波形的频率,就可以调整控制蜂鸣器音调,产

生各种不同音色、音调的声音。

另外,改变P1.3输出电平的高低电平占空比,

则可以控制蜂鸣器的声音大小。

3、I2C工作原理

1)I2C总线概述

I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需

的包括总线裁决和高低速器件同步功能的高性能串行总线。

2)I2C信号线

I2C总线只有两根双向信号线。

一根是数据线SDA,另一根是时钟线SCL。

I2C总线通过上拉电阻接正电源。

当总线空闲时,两根线均为高电平。

连到

总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA

及SCL都是线“与”关系。

图3I2C总线框图

3)I2C总线的数据传送

a)数据位的有效性规定

I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必

须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或

低电平状态才允许变化。

图4SDA与SCL的工作时序图

5

b)起始和终止信号

SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号

SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。

始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的

状态;

在终止信号产生后,总线就处于空闲状态。

c)I2C总线的数据传送速率

I2C总线的通信速率受主机控制,能快能慢,最高速率限制为100Kb/s

d)I2C总线的数据传送格式

主机向从机发送数据

从机向主机发送数据

图5I2C总线的数据传送格式

S:

起始位SA:

从机地址,7位

W/:

写标志位,1位R:

读标志位,1位

A:

应答位,1位A/:

非应答位,1位

D:

数据,8位P:

停止位

阴影:

主机产生的信号无阴影:

从机产生的信号

4)总线的寻址

I2C总线协议有明确的规定:

采用7位的寻址字节(寻址字节是起始信号

后的第一个字节)。

寻址字节的位定义

D7~D1位组成从机的地址。

D0位是数据传送方向位,为“0”时表示主机

向从机写数据,为“1”时表示主机由从机读数据。

6

主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行

比较,如果相同,则认为自己正被主机寻址,根据R/位将自己确定为发送器或

接收器。

从机的地址由固定部分和可编程部分组成。

在一个系统中可能希望接入多

个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。

如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8

个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。

4、LM75特征及应用

LM75A是一个使用了内置带隙温度传感器和模数转换技术的温度-数字转换

器I2C总线接口。

工作温度范围-55oC~+125oC,精度可达0.125oC。

LM75A可设置成工作在两种模式:

正常工作模式或关断模式。

在正常工作模

式中,每隔100ms执行一次温度-数字的转换,Temp寄存器保存着最后一次更新

的结果;

但是,在该模式下,器件的I2C接口仍然有效,寄存器读/写操作纠结

执行。

器件的工作模式通过配置寄存器可编程位B0业设定。

当器件上电或从关

断模式进入正常工作模式时启动温度转换。

LM75A可配置成不同的工作条件。

它可设置成在正常工作模式下周期性地对

环境温度进行监控或进入关断模式来将器件功耗降至最低。

OS输出有2种可选

的工作模式:

OS比较器模式和OS中断模式。

OS输出可选择高电平或低电平有

效。

图表6LM75A工作原理图

温度寄存器(Temp)

Temp寄存器存放着每次A/D转换的或监控到的数字结果。

包含2个8位的

数据字节,由一个高数据字节(MS)和一个低数据字节(LS)组成。

其中,只

有11位用来存放分辨率为0.125oC的Temp数据(以二进制补码数据的形式)

对于正的温度值,D10=0T=Temp*0.125oC

对于负的温度值,D10=1T=-Temp的补码*0.125oC

7

LM75A主要应用于系统温度管理、个人计算机、电子设备和工业控制器等地

方,典型应用实例为:

图7LM75A典型应用

5、步进电机驱动原理

步进电机是一种将电脉冲转化为角位位移的执行机构。

通俗一点讲:

当步进驱动器接收到一个脉冲从头到尾,它就驱动步进电机按设定的方向转

动一个固定的角度(即步进角)。

所以,我们可以通过控制脉冲个数来控制角

位移量,从而达到准确定位的目的,同时也可以通过控制脉冲频率来控制电

机转动的速度和加速度,从而达到调整的目的。

本实验中驱动电机的信号仍

由PWM脉冲方波控制。

原理图如图8所示。

图8步进电机驱动原理图

6、程序框图

8

主程序

初始化

SysInit()开启16位定时器T0

DispInit()数据管显示初始化

开启中断T1

I2C_Init()I2C总线协议初始化

设定PWM,温度初值

读取温度

显示温度

扫描键盘

判断是否有键按下

‘+’,温度cnt++

更新DispBuf

设置延时标志flag的值

中断时间到蜂鸣器响0.5s

‘-‘,温度cnt--

判断k

更新温度值

判断是否有键抬起

每1ms进入一次中断(T1)

中断服务程序开始

更新扫描数据

判断延时标志flag

为0,BUZZER取反

比较cnt与temp,设置

PwmValue值为差的绝

对值

中断服务程序结束

PwmValue的值

控制脉冲宽度

t>

PwmValue

PWM=0

t<

PWM=1

PWM_MAX

t=0

9

思考题:

设定温度的按键改用外部中断模式,电路如何修改

(画示意图)?

程序如何修改,写出中断服务程序。

答:

将KEY1与KEY2键通过跳线分别接到INT0与INT1接口上。

开启中断:

SysInit()

{…

EA=0;

//禁止总中断

EX1=1;

//使能/INT1中断

EX0=1;

//使能/INT0中断

EA=1;

}//使能总中断

中断服务程序:

voidINT0SVC()interrupt0

{

if(cnt<

=31)cnt++;

}

voidINT1SVC()interrupt2

{

if(cnt>

=17)cnt--;

}示意图

七、总结及心得体会

通过本实验课程,我对中断和定时有了较深入的了解,对单片机的认识也

进一步的提高。

在编程的过程中,遇到了一些问题,本质原因是因为对单片

机的认识不足,对工作机理不清楚,望文生义,从而导致一些程序行不通,

不过最终还是在老师和同学的帮助下,顺利的完成了实验。

我想,对于语言

来说,要想机器懂你,就必须遵守规则,所以,先弄懂是怎么运行的,再着

手编程,会更顺理成章一点。

八、对本实验过程及方法、手段的改进建议

九、附录

1、学号+秒表+按键+电机的程序

2、温度采集控制(数码管+直流电机)程序

10

附录1:

学号+秒表+按键+电机的程序

/*

main.c

加减计数器

*/

#include<

reg51.h>

absacc.h>

ctype.h>

//定义按键

sbitKEY1=P2^0;

//按键1

sbitKEY2=P2^1;

//按键2

sbitBUZZER=P3^2;

sbitPWM=P3^3;

//定义PWM最大级数

#definePWM_MAX50

//定义PWM级数,分为0~PWM_MAX-1级

unsignedcharcnt=18;

//定义计数器变量

intflag=1;

unsignedcharPwmValue;

unsignedcharsec=0;

unsignedintcount=998;

codeunsignedcharTab[]=

{//定义0123456789AbCdEF的数码管字型数据

0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,

0x7F,0x6F

};

unsignedcharDispBuf[8];

函数:

KeyScan()

功能:

键盘扫描

返回:

扫描到的键值

unsignedcharKeyScan()

unsignedchark='

\0'

;

if(KEY1==0)k='

+'

if(KEY2==0)k='

-'

returnk;

11

T1INTSVC()

定时器T1的中断服务函数

voidT1INTSVC()interrupt3

codeunsignedcharcom[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

staticunsignedcharn=0;

staticunsignedchart=0;

TR1=0;

TH1=0xFC;

TL1=0x66;

TR1=1;

P1=0xFF;

//暂停显示

XBYTE[0xE800]=~DispBuf[n];

//更新扫描数据

P1=~com[n];

//重新显示

n++;

t++;

n&

=0x07;

if(flag==0)

BUZZER=!

BUZZER;

}

if(n==8){n=0;

{count++;

//统计毫秒

//pwmcnt++;

if(count==999)//一秒时间到

sec++;

count=0;

DispBuf[4]=Tab[sec/10];

//分离十位

DispBuf[3]=Tab[sec%10];

//分离个位

if(sec==30){sec=0;

if(cnt>

sec)

PwmValue=cnt-sec;

else

PwmValue=sec-cnt;

if(t>

=PWM_MAX)t=0;

if(t<

=PwmValue)

PWM=1;

PWM=0;

12

DispClear()

清除数码管的所有显示

voidDispClear()

unsignedchari;

for(i=0;

i<

8;

i++)

DispBuf[i]=0x00;

}}

DispChar()

在数码管上显示字符

参数:

x:

数码管的坐标位置(0~7)

c:

要显示的字符(仅限16进制数字和减号)

dp:

是否显示小数点,0-不显示,1-显示

DispInit()

数码管扫描显示初始化

voidDispInit()

DispClear();

//初始为全灭

EA=0;

TMOD&

=0x0F;

TMOD|=0x10;

ET1=1;

EA=1;

Delay()

延时0.01~2.56s

t>

0时,延时(t*0.01)s

t=0时,延时2.56s

说明:

晶振用11.0592MHz

13

voidDelay(unsignedchart)

do

TH0=0xDC;

TL0=0x00;

TR0=1;

while(!

TF0);

TR0=0;

TF0=0;

}while(--t!

=0);

SysInit()

系统初始化

voidSysInit()

=0xF0;

TMOD|=0x01;

//设置定时器T0为16位定时器

DispInit();

//数码管扫描显示初始化

PwmValue=PWM_MAX/2;

//设置PWM初值

}//PWM管脚为高

voidmain()

unsignedchark;

//定义键值变量

SysInit();

//系统初始化

DispBuf[7]=Tab[1];

DispBuf[6]=Tab[5];

DispBuf[1]=Tab[cnt/10];

DispBuf[0]=Tab[cnt%10];

for(;

{for(;

{Delay(5);

//延时50ms

k=KeyScan();

//键盘扫描

if(k!

='

flag=0;

Delay(50);

flag=1;

}break;

switch(k)//判断键值,执行具体功能

{case'

:

14

if(cnt<

25)

cnt++;

break;

case'

if(cnt>

16)

cnt--;

default:

Delay(5);

if(KeyScan()=='

)break;

//如果按键抬起,退出循环

15

附录2:

温度采集控制(数码管+直流电机)程序

LM75A数字温度计

#include"

I2C.h"

string.h>

sbitLED0=P2^2;

sbitLED1=P2^3;

//定义LED由P0.0控制//定义LED由P0.0控制

sbitLED2=P2^4;

//定义LED由P0.0控制

unsignedcharcnt=25;

unsignedinttemp;

0x7F,0x6F};

16

if(cnt==temp/8)

{LED2=0;

LED1=1;

LED0=1;

temp/8)

{PwmValue=cnt-temp/8;

if(PwmValue>

1)

{LED0=0;

LED2=1;

}}

if(cnt<

{PwmValue=temp/8-cnt;

{LED1=0;

17

DispClea

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

当前位置:首页 > 经管营销 > 销售营销

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

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