找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1039|回复: 3
收起左侧

51单片机与90614测温与舵机!2个程序如何组合在一起?

[复制链接]
ID:847479 发表于 2020-11-25 03:00 | 显示全部楼层 |阅读模式
我现在两个程序,一个51单片机与90614的(包括了蜂鸣器报警),一个控制舵机的!
两个程序我想合在一起,温度正常,控制舵机旋转90度!
我试了半天!总是有错误!求助大佬帮我把两个程序合在一起!
这是第一个的程序:
#include"reg52.h"
#include"intrins.h"
#define  uint  unsigned int
#define  uchar unsigned char
#define  Nack_counter  10
uchar num;
signed char alarm=38; //默认为38摄氏度报警
signed char tempalarm=0;
unsigned char szl[3];
//************** 端口定义**************
//LCD 控制线接口
uchar flag1;
sbit  RS=P0^7;
sbit  RW=P0^6;
sbit  LCDE=P0^5;
//按键接口
sbit key1=P0^0;
sbit key2=P0^1;
sbit key3=P0^2;
//蜂鸣器报警接口
sbit buzzer= P1^5;         
//mlx90614 端口定义
sbit  SCL=P1^6;//时钟线
sbit  SDA=P1^7;//数据线
//************ 数据定义****************
bdata uchar flag;//可位寻址数据
sbit bit_out=flag^7;
sbit bit_in=flag^0;
uchar DataH,DataL,Pecreg,t,num;
//************ 函数声明*****************************************
void   start_bit();                 //MLX90614 发起始位子程序
void   stop_bit();                 //MLX90614·发结束位子程序
uchar  rx_byte(void);              //MLX90614 接收字节子程序
void   send_bit(void);             //MLX90614·发送位子程序
void   tx_byte(uchar dat_byte);     //MLX90614 接收字节子程序
void   receive_bit(void);           //MLX90614接收位子程序
void   delay(uint N);              //延时程序
uint   memread(void);             //读温度数据
void   init1602(void);            //LCD 初始化子程序
void   chk_busy_flg(void);         //LCD 判断忙子程序
void   dis_cmd_wrt(uchar cmd);     //LCD 写命令子程序
void   dis_dat_wrt(uchar dat);       //LCD 写数据子程序
void   display(uint Tem);           // 显示子程序
void   baojing(void);                                  //报警子程序

//*************主函数*******************************************
void main()
{
uint Tem,k;  //函数部分
SCL=1;
SDA=1;
_nop_(); _nop_();_nop_();_nop_();
SCL=0;
delay(1000);
SCL=1;
init1602();
while(1)
{            if(!key1)
  {
     delay(4000);
         if(!key1&&alarm<125)
         {        delay(4000);
            alarm++;
                delay(4000);
     }
  }
   if(!key3)
   {  
     delay(4000);
     if(!key3&&alarm>0)
         {  
            delay(4000);
          alarm--;
          delay(4000);
         }
   }
         dis_cmd_wrt(0x80);   
     dis_dat_wrt('T');
         dis_dat_wrt(':');
         dis_cmd_wrt(0x80+0x40);   
     dis_dat_wrt('E');
         dis_dat_wrt(':');
     szl[0]=alarm/100+0x30;
         szl[1]=alarm%100/10+0x30;
         szl[2]=alarm%100%10+0x30;
             dis_cmd_wrt(0x80+0x43);
                 for(k=0;k<3;k++)
                 {
                  dis_dat_wrt(szl[k]);
                  delay(10);
                 }
         dis_cmd_wrt(0x80+0x48);   
     dis_dat_wrt(0xdf);
         dis_dat_wrt('C');
     dis_cmd_wrt(0x88);   
     dis_dat_wrt(0xdf);
         dis_dat_wrt('C');
   Tem=memread();
   display(Tem);
   delay(20);
   tempalarm=num;
   baojing();  
}
}
//*************报警控制*******************************************
void baojing(void)
{  
  if(tempalarm>=alarm)//报警判断
  {
        for(t=0;t<100;t++)
        {      
        buzzer=0;//打开报警蜂鸣器
        delay(2000);
        buzzer=1;
        delay(2000);
        }
  }   
}
void delay_nms(unsigned int n)
{
        unsigned int j=0;
        unsigned char i=0;
        for(j=0;j<n;j++)
        {
                for(i=0;i<120;i++)
                {
                        _nop_();
                }
        }
}

//*********输入转换并显示*********
void display(uint Tem)
{
uint T,a,b;
T=Tem*2;
if(!key2)
{
    delay(20);
        if(!key2)
         {  
           delay(20);
           T=(0.1923*(T*0.01-273.15)+29.9250)*100+27315;  //è?ì?ì???213¥
         
          }
  }
  dis_cmd_wrt(0x83);  //初始化显示位置
if(T>=27315)
{
   T=T-27315;
   a=T/100;
   num=a;
   b=T-a*100;
//---------------------------
   if(a>=100)
   {
    dis_dat_wrt(0x30+a/100);
    a=a%100;
    dis_dat_wrt(0x30+a/10);
    a=a%10;
    dis_dat_wrt(0x30+a);
   }
   else if(a>=10)
   {
    dis_dat_wrt(0x30+a/10);
    a=a%10;
    dis_dat_wrt(0x30+a);
   }
   else
   {
    dis_dat_wrt(0x30+a);
   }
   dis_dat_wrt(0x2e);// 显示点
   //---------------------------
  if(b>=10)
  {
    dis_dat_wrt(0x30+b/10);
    b=b%10;  
  }
  else
  {
    dis_dat_wrt(0x30);  
  }


}
//==========
else
{
  T=27315-T;
  a=T/100;
  num=a;
  b=T-a*100;
  dis_dat_wrt(0x2d);
//--------------------------
  if(a>=10)
  {
    dis_dat_wrt(0x30+a/10);
    a=a%10;
    dis_dat_wrt(0x30+a);
  }
  else
  {
    dis_dat_wrt(0x30+a);
  }
    dis_dat_wrt(0x2e);//显示点
//--------------------------
  if(b>=10)
  {
    dis_dat_wrt(0x30+b/10);
    b=b%10;
    dis_dat_wrt(0x30+b);
  }
  else
  {
    dis_dat_wrt(0x30);
    dis_dat_wrt(0x30+b);
  }

}
}

//************************************
void   start_bit(void)
{
   SDA=1;
   _nop_();_nop_();_nop_();_nop_();_nop_();
   SCL=1;
   _nop_();_nop_();_nop_();_nop_();_nop_();
   SDA=0;
   _nop_();_nop_();_nop_();_nop_();_nop_();
   SCL=0;
   _nop_();_nop_();_nop_();_nop_();_nop_();

}
//------------------------------
void   stop_bit(void)
{

   SCL=0;
   _nop_();_nop_();_nop_();_nop_();_nop_();
   SDA=0;
   _nop_();_nop_();_nop_();_nop_();_nop_();
   SCL=1;
   _nop_();_nop_();_nop_();_nop_();_nop_();
   SDA=1;
}
//--------- ·发送一个字节---------
void  tx_byte(uchar dat_byte)
{
   char i,n,dat;
   n=Nack_counter;
TX_again:
   dat=dat_byte;
   for(i=0;i<8;i++)
   {
     if(dat&0x80)
      bit_out=1;
     else
      bit_out=0;
     send_bit();
     dat=dat<<1;
   }

      receive_bit();
   if(bit_in==1)
   {
    stop_bit();
    if(n!=0)
    {n--;goto Repeat;}
    else
     goto exit;
   }
   else
    goto exit;
Repeat:
    start_bit();
    goto TX_again;
exit: ;
}
//-----------发送一个位---------
void  send_bit(void)
{
  if(bit_out==0)

  SDA=0;
  else
  SDA=1;
  _nop_();
  SCL=1;
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
  SCL=0;
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
}
//---------- 接收一个字节--------
uchar rx_byte(void)
{
  uchar i,dat;
  dat=0;
  for(i=0;i<8;i++)
  {
    dat=dat<<1;
    receive_bit();
    if(bit_in==1)
    dat=dat+1;
  }
  send_bit();
  return dat;
}

//----------接收一个位----------
void receive_bit(void)
{
  SDA=1;bit_in=1;
  SCL=1;
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
  bit_in=SDA;
  _nop_();
  SCL=0;
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
}
//------------延时--------------
void   delay(uint N)
{
  uint i;
  for(i=0;i<N;i++)  
     _nop_();
}
//------------------------------
uint memread(void)
{
  start_bit();
  tx_byte(0xB4);  //Send SlaveAddress ==============================
  tx_byte(0x07);  //Send Command
  //------------
  start_bit();
  tx_byte(0x01);
  bit_out=0;
  DataL=rx_byte();
  bit_out=0;
  DataH=rx_byte();
  bit_out=1;
  Pecreg=rx_byte();
  stop_bit();
  return(DataH*256+DataL);
}
//******************LCD 显示子函数***********************
void init1602(void)        //初始化LCD
{
   dis_cmd_wrt(0x01);
   dis_cmd_wrt(0x0c);
   dis_cmd_wrt(0x06);
   dis_cmd_wrt(0x38);

   }

void chk_busy_flg(void) //LCD 忙标志判断
{
   flag1=0x80;
  while(flag1&0x80)
{
   P2=0xff;
   RS=0;
   RW=1;
   LCDE=1;
   flag1=P2;
   LCDE=0;
}
}

void dis_cmd_wrt(uchar cmd)    // 写命令子函数
{
   chk_busy_flg();
   P2=cmd;
   RS=0;
   RW=0;
   LCDE=1;
   LCDE=0;
}

void dis_dat_wrt(uchar dat) // 写数据子函数
{
  chk_busy_flg();
  if(flag1==16)
  {
   P2=0XC0;
   RS=0;
   RW=0;
   LCDE=1;
   LCDE=0;
  }
   P2=dat;
   RS=1;
   RW=0;
   LCDE=1;
   LCDE=0;
}

这是第二个的舵机的程序:
#include <reg52.h>
sbit PWM = P0^1;  //设定PWM输出的I/O端口
unsigned char count=0;
unsigned char PWM_count=3;//1—0度,2-45度,3-90度,4-135度,5-180度
unsigned char a=0;

void Timer_init()
{
TMOD=0X01;//T0定时方式
TH0=0Xfe;
TL0=0X33;//计数初值设置为0.5ms
ET0=1;
TR0=1;
EA=1;
}
void Timer()interrupt 1
{
TR0=0;
TH0=0Xfe;
TL0=0X33;
if(count<=PWM_count)
{
   PWM=1;
}
else
{
   PWM=0;
}
count++;
if(count>=40)
{
  count=0;
  a++;
}
TR0=1;
}

void main()
{
Timer_init();

while(1)
{
  if(a==0)
  {
   PWM_count=1;
  }
  if(a==36)
  {
   PWM_count=3;
  }
  if(a==100)
  a=0;
}
}
回复

使用道具 举报

ID:328014 发表于 2020-11-25 03:25 | 显示全部楼层
回复

使用道具 举报

ID:258566 发表于 2020-11-25 08:17 | 显示全部楼层
void Timer()interrupt 1{    TR0=0;    TH0=0Xfe;    TL0=0X33;    if(count<=PWM_count)    {        PWM=1;    }    else    {        PWM=0;    }    count++;    if(count>=40)    {        count=0;        a++;    }    TR0=1;}void main(){    uint Tem,k;  //函数部分    SCL=1;    SDA=1;    _nop_();    _nop_();    _nop_();    _nop_();    SCL=0;    delay(1000);    SCL=1;    init1602();    Timer_init();    while(1)    {        if(a==0)        {            PWM_count=1;        }        if(a==36)        {            PWM_count=3;        }        if(a==100)            a=0;        if(!key1)        {            delay(4000);            if(!key1&&alarm<125)            {                delay(4000);                alarm++;                delay(4000);            }        }        if(!key3)        {            delay(4000);            if(!key3&&alarm>0)            {                delay(4000);                alarm--;                delay(4000);            }        }        dis_cmd_wrt(0x80);        dis_dat_wrt('T');        dis_dat_wrt(':');        dis_cmd_wrt(0x80+0x40);        dis_dat_wrt('E');        dis_dat_wrt(':');        szl[0]=alarm/100+0x30;        szl[1]=alarm%100/10+0x30;        szl[2]=alarm%100%10+0x30;        dis_cmd_wrt(0x80+0x43);        for(k=0; k<3; k++)        {            dis_dat_wrt(szl[k]);            delay(10);        }        dis_cmd_wrt(0x80+0x48);        dis_dat_wrt(0xdf);        dis_dat_wrt('C');        dis_cmd_wrt(0x88);        dis_dat_wrt(0xdf);        dis_dat_wrt('C');        Tem=memread();        display(Tem);        delay(20);        tempalarm=num;        baojing();    }}
回复

使用道具 举报

ID:847479 发表于 2020-11-25 12:49 来自手机 | 显示全部楼层
51hei团团 发表于 2020-11-25 03:25
程序合并:http://www.51hei.com/bbs/dpj-157117-1.html

感谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表