51单片机温度报警器原理图和程序有吗

51单片机温度报警器原理图和程序有吗,第1张

这个是自动控制温度的一个例子,温度降低到一定程度就启动加热。

//温度传感器:DS18B20

//显示方式:LED

#include <reg51h>

#define uchar unsigned char

sbit keyup=P1^0;

sbit keydn=P1^1;

sbit keymd=P1^2;

sbit out=P3^7; //接控制继电器

sbit DQ = P3^4;   //接温度传感器18B20

uchar t[2],number=0,pt;    //温度值

uchar  TempBuffer1[4]={0,0,0,0};

uchar Tmax=18,Tmin=8;

uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xfe,0xf7};

uchar dismod=0,xiaodou1=0,xiaodou2=0,currtemp;

bit flag;

void t0isr() interrupt 1

{

 TH0=(65536-5000)/256;

 TL0=(65536-5000)%256;

 switch(number)

 {

  case 0:

       P2=0x08;

        P0=distab[TempBuffer1[0]];

        break;

  case 1:

       P2=0x04;

        P0=distab[TempBuffer1[1]];

        break;

  case 2:

       P2=0x02;

        P0=distab[TempBuffer1[2]]&0x7f;

        break;

  case 3:

       P2=0x01;

        P0=distab[TempBuffer1[3]];

        break;

  default:

       break;

 }

 number++;

 if(number>3)number=0;

}

void delay_18B20(unsigned int i)

{

 while(i--);

}

/ds18b20初始化函数/

void Init_DS18B20(void)

{

  bit x=0;

 do{

  DQ=1;

  delay_18B20(8);

  DQ = 0;          //单片机将DQ拉低

  delay_18B20(90); //精确延时 大于 480us

  DQ = 1;          //拉高总线

  delay_18B20(14);

  x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败,继续初始化

 }while(x);

  delay_18B20(20);

}

/ds18b20读一个字节/

unsigned char ReadOneChar(void)

{

 unsigned char i=0;

 unsigned char dat = 0;

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

  {

    DQ = 0; // 给脉冲信号

    dat>>=1;

    DQ = 1; // 给脉冲信号

    if(DQ)

    dat|=0x80;

    delay_18B20(4);

  }

  return(dat);

}

/ds18b20写一个字节/

void WriteOneChar(unsigned char dat)

{

  unsigned char i=0;

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

  {

   DQ = 0;

   DQ = dat&0x01;

    delay_18B20(5);

   DQ = 1;

    dat>>=1;

 }

}

/读取ds18b20当前温度/

unsigned char ReadTemperature(unsigned char rs)

{

 unsigned char tt[2];

  delay_18B20(80); 

 Init_DS18B20();

 WriteOneChar(0xCC);   //跳过读序号列号的 *** 作

 WriteOneChar(0x44);  //启动温度转换

  delay_18B20(80); 

 Init_DS18B20();

 WriteOneChar(0xCC);  //跳过读序号列号的 *** 作

 WriteOneChar(0xBE);  //读取温度寄存器等(共可读9个寄存器)前两个就是温度

 tt[0]=ReadOneChar();  //读取温度值低位

 tt[1]=ReadOneChar();  //读取温度值高位

 return(tt);

}

void covert1(void) //将温度转换为LED显示的数据

{

   uchar x=0x00,y=0x00;

   t[0]=pt;

   pt++;

   t[1]=pt;

   if(t[1]&0x080)      //判断正负温度

   {

    TempBuffer1[0]=0x0c;      //c代表负

  t[1]=~t[1];    /下面几句把负数的补码/

  t[0]=~t[0];    /换算成绝对值/

  x=t[0]+1;

  t[0]=x;

  if(x==0x00)t[1]++;

   }

  else TempBuffer1[0]=0; //A代表正

  t[1]<<=4;  //将高字节左移4位

  t[1]=t[1]&0xf0;

  x=t[0];     //将t[0]暂存到X,因为取小数部分还要用到它

  x>>=4;     //右移4位

  x=x&0x0f;     //和前面两句就是取出t[0]的高四位 

  y=t[1]|x;   //将高低字节的有效值的整数部分拼成一个字节

  TempBuffer1[1]=(y%100)/10;

  TempBuffer1[2]=(y%100)%10;

  t[0]=t[0]&0x0f; //小数部分

  TempBuffer1[3]=t[0]10/16;

  //以下程序段消去随机误检查造成的误判,只有连续12次检测到温度超出限制才切换加热装置

 if(currtemp>Tmin)xiaodou1=0;

 if(y<Tmin)

  {

   xiaodou1++;

   currtemp=y;

   xiaodou2=0;

  }

 if(xiaodou1>12)

  {

   out=0;

   flag=1;

   xiaodou1=0;

  }

 if(currtemp<Tmax)xiaodou2=0;

 if(y>Tmax)

  {

   xiaodou2++;

   currtemp=y;

   xiaodou1=0;

  }

 if(xiaodou2>12)

  {

   out=1;

   flag=0;

   xiaodou2=0;

  }

 out=flag;

}

void convert(char tmp)

{

 uchar a;

 if(tmp<0)

 {

  TempBuffer1[0]=0x0c;

  a=~tmp+1;

 }

 else

 {

  TempBuffer1[0]=0;

  a=tmp;

 }

  TempBuffer1[1]=(a%100)/10;

  TempBuffer1[2]=(a%100)%10;

}

void keyscan( )

{

uchar keyin;

 keyin=P1&0x07;

 if(keyin==0x07)return;

 else if(keymd==0)

  {

   dismod++;

   dismod%=3;

   while(keymd==0);

   switch(dismod)

   {

    case 1:

         convert(Tmax);

          TempBuffer1[3]=0x11;

          break;

    case 2:

         convert(Tmin);

          TempBuffer1[3]=0x12;

          break;

    default:

         break;

   }

  }

 else if((keyup==0)&&(dismod==1))

  {

   Tmax++;

   convert(Tmax);

   while(keyup==0);

  }

 else if((keydn==0)&&(dismod==1))

  {

   Tmax--;

   convert(Tmax);

   while(keydn==0);

  }

 else if((keyup==0)&&(dismod==2))

  {

   Tmin++;

   convert(Tmin);

   while(keyup==0);

  }

 else if((keydn==0)&&(dismod==2))

  {

   Tmin--;

   convert(Tmin);

   while(keydn==0);

  }

 xiaodou1=0;

 xiaodou2=0;

}

main()

{

 TMOD=0x01;

 TH0=(65536-5000)/256;

 TL0=(65536-5000)%256;

 TR0=1;

 ET0=1;

 EA=1;

 out=1;

 flag=0;

 ReadTemperature(0x3f);

  delay_18B20(50000); //延时等待18B20数据稳定 

 while(1)

 {

  pt=ReadTemperature(0x7f); //读取温度,温度值存放在一个两个字节的数组中

  if(dismod==0)covert1();

  keyscan();

  delay_18B20(30000);

 }

}

我们在玩一些竞技类手机游戏的时候,不用按键,只通过前后左右倾斜手机即可完成一些高难度动作。那是因为手机内的加速传感器在起作用。加速传感器不仅应用于手机游戏,还在汽车制动检测、地质勘测、地震检测、桥梁大坝的振动检测等很多方面都有突出贡献。那么加速传感器到底是什么呢加速传感器的型号又有哪些想知道就赶快随小编一起来看看吧!

加速传感器简介

加速度传感器,包括由硅膜片、上盖、下盖,膜片处于上盖、下盖之间,键合在一起;一维或二维纳米材料、金电极和引线分布在膜片上,并采用压焊工艺引出导线;工业现场测振传感器,主要是压电式加速度传感器。加速度传感器是一种能够测量加速力的电子设备。加速力就是当物体在加速过程中作用在物体上的力,就好比地球引力,也就是重力。加速力可以是个常量,比如g,也可以是变量。加速度计有两种:一种是角加速度计,是由陀螺仪(角速度传感器)的改进的。另一种就是线加速度计。

加速传感器型号

CMA3000

最新产品,三轴加速度传感器,2g-8g量程,直接数字输出或者模拟输出,2207mm超小尺寸,≤ 70 uA 超低功耗,适合消费电子,医疗器械,运动等各种电池供电的场合。

SCA3060

最新产品,三轴加速度传感器,2g量程,直接数字输出,集成其他系列功能,适合医疗器械,汽车等其他系列应用。

SCA100T-D07

最新产品,双轴加速度传感器,量程达到12g。

SCA1000/20

双轴,量程:17g,X、Y轴或者Z,Y轴,电压输出,25V是零点,11位分辨率,重量12g,9516mm,附带温度输出,05-45V电压输出,分辨率:083mg,温度性能非常稳定,可以和SCA610/620互换。SPI数字输出,SCA1000-N1000070为双轴6g量程加速度传感器。

SCA610

单轴,15g或者17g量程,水平测量,25V对应零点。灵敏度12V/g,非线性40mg,50±30Hz。

SCA620

单轴,测量Z轴加速度,17g或者12g量程,25V对应零点。灵敏度12V/g,05-45V输出。

SCA2100

双轴,高可靠性系列产品。量程2g,SPI输出,频率响应45/50Hz,-40-85度工作温度,33V供电,专为汽车行业提供。

SCA3100

三轴,高可靠性系列产品。量程2g,SPI输出,频率响应45/50Hz,-40-125度工作温度,专为汽车行业提供的数字输出加速度传感器。

SCA820-D04

Z轴,高可靠性系列产品。量程2g,SPI,PWM输出,频率响应45Hz,-40-125度工作温度,专为汽车行业提供的数字输出加速度传感器。

SCA830-D06

Y轴,高可靠性系列产品。量程2g,SPI,PWM输出,频率响应45Hz,-40-125度工作温度,专为汽车行业提供的数字输出加速度传感器。

SCA830-D07

Y轴,高可靠性系列产品。量程1g,SPI,PWM输出,频率响应45Hz,-40-125度工作温度,专为汽车行业提供的数字输出加速度传感器。

介绍完什么是加速传感器以及它的型号,小编还要提醒大家一些要注意的地方。我们在使用加速传感器的时候,最需要的就是它能够精准测量,但往往买来的时候好好的,一到用的时候就不行了。这种情况不要以为是加速传感器坏了,可能是因为我们周围出现了信号干扰。我们这时候要找到干扰源,检查处理并尽量远离它,再行使用。

/   writer:shoppingw   /

#include <reg51h>

#include <intrinsh>

#define uint unsigned int

#define uchar unsigned char

sbit DQ = P3^6;

uchar code DSY_CODE[] =

{ 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00};

uchar code df_Table[] = {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};

uchar CurrentT = 0;

uchar Temp_Value[]={0x11,0x22};

uchar Display_Digit[]={0,0,0,0};

bit DS18B20_IS_OK = 1;

void Delay(uint x)

{

while(--x);

}

uchar Init_DS18B20()

{

uchar status;

DQ = 1;

Delay(8);

DQ = 0;

Delay(90);

DQ = 1;

Delay(8);

DQ = 1;

return status;

}

uchar ReadOneByte()

{

uchar i,dat=0;

DQ = 1;

_nop_();

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

{

  DQ = 0;

dat >>= 1;

DQ = 1;

_nop_();

_nop_();

if(DQ)

dat |= 0X80;

Delay(30);

DQ = 1;

}

return dat;

}

void WriteOneByte(uchar dat)

{

uchar i;

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

{

  DQ = 0;

DQ = dat& 0x01;

Delay(5);

DQ = 1;

dat >>= 1;

}

}

void Read_Temperature()

{

if(Init_DS18B20() ==1 )

DS18B20_IS_OK = 0;

else

{

WriteOneByte(0xcc);

WriteOneByte(0x44);

Init_DS18B20();

WriteOneByte(0xcc);

WriteOneByte(0xbe);

Temp_Value[0] = ReadOneByte();

Temp_Value[1] = ReadOneByte();

DS18B20_IS_OK=1;

}

}

void Display_Temperature()

{

uchar i;

uchar t=150;

uchar ng=0, np=0;

if ( (Temp_Value[1] & 0xf8) == 0xf8)

{

Temp_Value[1] = ~Temp_Value[1];

Temp_Value[0] = ~Temp_Value[0]+1;

if (Temp_Value[0] == 0x00) Temp_Value[1]++;

ng=1;np=0xfd;

}

Display_Digit[0] = df_Table[ Temp_Value[0] & 0x0f ];

CurrentT = ((Temp_Value[0] & 0xf0)>>4) | ((Temp_Value[1] & 0x07)<<4);

Display_Digit[3] = CurrentT / 100;

Display_Digit[2] = CurrentT % 100 / 10;

Display_Digit[1] = CurrentT % 10;

if (Display_Digit[3] == 0)

{

Display_Digit[3] = 10;

np = 0xfb;

if (Display_Digit[2] == 0)

{

Display_Digit[2] = 10;

np = 0xf7;

}

}

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

{

P0=0x39;P2=0x7f;Delay(t);P2=0xFF;

P0=0x63;P2=0xbf;Delay(t);P2=0xff;

P0=DSY_CODE[Display_Digit[0]];

P2=0xDF;Delay(t);P2=0xff;

P0=(DSY_CODE[Display_Digit[1]]) | 0x80;

P2=0xef;Delay(t);P2=0xff;

P0=DSY_CODE[Display_Digit[2]];

P2=0xf7;Delay(t);P2=0xff;

P0=DSY_CODE[Display_Digit[3]];

P2=0xfb; Delay(t); P2=0xff;

if (ng)

{

P0 = 0x40; P2 = np; Delay(t); P2=0xff;

}

}

}

void main()

{

Read_Temperature();

Delay(50000);

Delay(50000);

while(1)

{

  Read_Temperature();

if(DS18B20_IS_OK)

Display_Temperature();

}

}

GSK980TDa 编写程序

用2把刀 T0101 为外圆35车刀

T0202为 315宽 切槽刀

T0303为60°螺纹车刀

G99 M3 S1000 T0101

G0 X478 Z2

G1 Z01 F015

G1 W-601

U142 W-60

W-10

U17

U1 W-1

W-19

G2 X80 W-60 R70 F01

Z-220

U4 F015

U1 W-1

Z- 《?=这里写你的轴的全长》

G0 U5 Z100

T0202

G0 X50 Z2

G1 W-62 F1

X F05

U-5 F01

X50

G0 Z100

T0303

G0 X50 Z20

G92 X473 Z-62 F15

X47

X467

X465

G0 U50 Z100 M30

《程序完毕》 排式刀架与这个程序略有不同 刀号为 T0101 T0102 T0103 是这样的

而且退刀的时候 是先退 X轴 在退 Z 轴 《因为是排式刀架所以退1号刀的时候 其他刀也会一起运动这样退刀是防止撞车,当然刀具摆放的好有可能不会碍事》

根据你提供的代码,我看到 xx 和 yy 是在循环内部定义的数组,而 XX 和 YY 是在循环结束后定义的数组,且是通过将 xx 和 yy 转置得到的。因此,在你的代码中,只能得到最后一次循环的结果。如果你想要得到所有循环的结果,需要将 XX 和 YY 改为矩阵形式的变量,并在循环中不断将每次的结果添加到这些矩阵中。

以下是我帮你修改后的代码示例,可以试试:

clc;

close all;

%% parameter

R0=08; a0=2923; a1=-628; a2=4021; Cth=1324e-13; Tth=5953e-6; Tamb=298;

CC=100;

Vm=030032043; T=7015886849;

%% Jacobian

num_loop = length(CC);

A_matrix = zeros(num_loop, 2, 2); % 定义矩阵形式的变量来存储 A 矩阵

eig_values = zeros(num_loop, 2);

for i = 1:num_loop

C = CC(i,1);

A11 = (-1/C10e9)(1-Vm(a1/(2TVm^05)+a2/T))/(R0exp((a0+a1Vm^05+a2Vm)/T));

A12 = (-1/C10e9)(Vm(a0+a1Vm^05+a2Vm))/(T^2(R0exp((a0+a1Vm^05+a2Vm)/T)));

B11 = (2Vm-Vm^2(a1/(2TVm^05)+a2/T))/(Cth(R0exp((a0+a1Vm^05+a2Vm)/T)));

B12 = ((Vm^2(a0+a1Vm^05+a2Vm))/(T^2R0exp((a0+a1Vm^05+a2Vm)/T))-Tth)/Cth;

A = [A11 A12; B11 B12];

A_matrix(i,:,:) = A; % 将每次计算得到的 A 存储到矩阵中

[V, D] = eig(A);

eig_values(i,:) = diag(D);

end

Re1 = real(eig_values(:,1));

Im1 = imag(eig_values(:,1));

Re2 = real(eig_values(:,2));

Im2 = imag(eig_values(:,2));

% 绘制结果的代码

figure;

subplot(2,2,1); scatter(Re1, Im1, 10, 'filled'); xlabel('Real'); ylabel('Imaginary'); title('Eigenvalue 1');

subplot(2,2,2); scatter(Re2, Im2, 10, 'filled'); xlabel('Real'); ylabel('Imaginary'); title('Eigenvalue 2');

subplot(2,2,3); scatter(Re1, Re2, 10, 'filled'); xlabel('Eigenvalue

O0001 程序名O0001

N10 T0101 选中一号刀并用一号寄存器下的位置

N20 M03 M43 M03主轴正转 M43我猜测应该是一个转速(你的机床是要挂当的那种吧

N30 G00 X55 Z10 G00刀具快速运动目标地址是X55 Z10的位置

N40 G71 U30 R10 G71是粗加工循环的指令 U每次X的进刀量半径值R每次退刀量

N50 G71 P60 Q120 U10 W05 F03 P60指N60即开始循环程序行号 Q120指N120即结束循环程序行号 U10指X向精加工余量10 W05指Z向精加工余量 F进给量数控车床一般用没转进给 即每转进给03

兄弟你要真想读懂程序就去看机床的编程说明书吧 我打字太慢后面的就不逐条解释了 看看相关的书 都有的指令的格式 以及程序的基础知识 祝你成功

以上就是关于51单片机温度报警器原理图和程序有吗全部的内容,包括:51单片机温度报警器原理图和程序有吗、什么是加速传感器 加速传感器型号有哪些、单片机温度检测的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9407491.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存