中国自动化学会专家咨询工作委员会指定宣传媒体
免费注册 登录 广告服务 | 客服中心
您现在所在的是:

电脑编程

抖音 德嘉 泓格论坛 FLIR红外热像论坛
工控论坛首页 电脑编程 → 浏览主题: 哪位高手能帮我把这个C程序生成c51的程序。我编译的时候老是提示内存不足。谢谢了!
发表新帖 回复该主题
回帖:4个,阅读:1643 [上一页] [1] [下一页]
* 帖子主题:

哪位高手能帮我把这个C程序生成c51的程序。我编译的时候老是提示内存不足。谢谢了!

分享到
700
xilans48
文章数:17
年度积分:50
历史总积分:700
注册时间:2010/10/31
发站内信
发表于:2010/11/12 18:03:26
#0楼
哪位高手能帮我把这个C程序生成c51的程序。我编译的时候老是提示内存不足。谢谢了!
      DS18B20温度采集系统程序

   通过DD18B20读取温度,数码管显示温度值,并由串口
传送到上位机再执行相应操作。
**********************************************************/
#include <reg51.h>

#define XTAL 11059200    // CUP 晶振频率
#define baudrate 9600    // 通信波特率

#define uchar unsigned char
#define uint unsigned int

sbit DQ = P3^3;          // 定义DS18B20端口DQ
sbit BEEP = P3^7;

unsigned char presence ;
unsigned char code  LEDData1[ ] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff};
unsigned char code  LEDData[ ]   = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
                                   0x80,0x90,0xff};
unsigned char data  temp_data[2] = {0x00,0x00};
unsigned char data  display[5] =   {0x00,0x00,0x00,0x00,0x00};
unsigned char code  ditab[16] =    {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                                   0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
void beep();
sbit DIN = P0^7; // 小数点
bit  flash=0;    // 显示开关标记
bit  flag_zf=0;   // 正负温度标志

/**********************************************************/
void Delay(unsigned int num)// 延时函数
{
  while( --num );
}

/**********************************************************/
uchar Init_DS18B20(void) // 初始化ds1820
{
 
    DQ = 1;      // DQ复位
    Delay(8);    // 稍做延时

    DQ = 0;      // 单片机将DQ拉低
    Delay(90);   // 精确延时 大于 480us

    DQ = 1;       // 拉高总线
    Delay(8);

    presence = DQ;    // 如果=0则初始化成功 =1则初始化失败
    Delay(100);
    DQ = 1;
   
    return(presence); // 返回信号,0=presence,1= no presence
}
/**********************************************************/
uchar 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(4);
  }

   return (dat);
}
/**********************************************************/
void WriteOneChar(unsigned char dat)// 写一个字节
{
  unsigned char i = 0;

  for (i = 8; i > 0; i--)
  {
    DQ = 0;
    DQ = dat&0x01;
    Delay(5);

    DQ = 1;
    dat>>=1;
  }
}

/*********************************************************/
void Read_Temperature(void)// 读取温度
{
  Init_DS18B20();

  if(presence==1)        
   {
 beep();
 flash=1;
}                        // DS18B20不正常,蜂鸣器报警
   else
   {
     flash=0;
     WriteOneChar(0xCC);  // 跳过读序号列号的操作
     WriteOneChar(0x44);  // 启动温度转换

     Init_DS18B20();
     WriteOneChar(0xCC);  // 跳过读序号列号的操作
    WriteOneChar(0xBE);  // 读取温度寄存器

     temp_data[0] = ReadOneChar();   // 温度低8位
     temp_data[1] = ReadOneChar();   // 温度高8位
   }
}

/*********************************************************/
void Disp_Temperature()// 显示温度
{
  unsigned char  n=0;
   if(temp_data[1]>7)                  //当温度高八位中的高五位全为O
     { flag_zf=1;                     // 所测温度为负时,要进行转换
       temp_data[1]=!( temp_data[1]);
   temp_data[0]=!( temp_data[0]);
temp_data[0]= temp_data[0]+1;
if(temp_data[0]=0)
{ temp_data[1]= temp_data[1]+1;}
}
Else
 {flag_zf=0}                //判断测得的温度数据是正还是负,如果为正,不做任何
//理

display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]];     // 查表得小数位的值

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
display[3]=display[4]/100;
display[1]=display[4]%100;
display[2]=display[1]/10;
display[1]=display[1]%10;
    if(flag_zf=1)
        {p0=0xbf;
         P2=0x02;
         Delay(300);}      //温度为负数时第二个数码管显示负号

  if(!display[3])          // 高位为0,不显示
  {
    display[3]=0x0a;              
    if(!display[2])      // 次高位为0,不显示
     display[2]=0x0a;
  }

P0 = 0xc6;    // 显示 C
P2 = 0xfe;    // 位选线为P2.7口,LED为共阳极显示,当位选线为低电平时选通
Delay(300);

P0 = 0x9c;    // 显示 °  
P2 = 0xfd;   // 选中P2.6口
Delay(300);

P0 =LEDData[display[0]] ;  // 显示小数位
P2 = 0xfb;      //p2.5
Delay(300);

P0 =LEDData1[display[1]];  // 显示个位
P2 = 0xf7;
Delay(300);

P0 =LEDData[display[2]];  // 显示十位
P2 = 0xef;      
Delay(300);

P0 =LEDData[display[3]];  // 显示百位
P2 = 0xdf;
Delay(300);

P2 = 0xff;                // 关闭显示
}

/*********************************************************/
void beep(void)
{
   unsigned char i;
   for (i=0;i<100;i++)
   {
      Delay(60);
      BEEP=!BEEP;                // BEEP取反
   }
   BEEP=1;                        // 关闭蜂鸣器
}

/*********************************************************/
void init(void)
{
EA  = 1;                           // "中断总允许"

   TMOD = 0x20;   // 定时器1工作于8位自动重载模式, 用于产生波特率

TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));   // 定时器0赋初值

SCON = 0x50;   // 设定串行口工作方式
PCON &= 0x00;   // 波特率不倍增

TR1 = 1;    // 启动定时器1
IE = 0x00;    // 禁止任何中断
}

/*********************************************************/
void send_char(void)
// 传送十六位的温度数据,低位在前
{
unsigned i=0;

while (i < 2)
{
 SBUF = temp_data[i];
 while (!TI);        // 等特数据传送
 TI = 0;             // 清除数据传送标志
 i++;
}
}

/*********************************************************/
void main(void)
{
uchar receive;
  init();
  while(1)
  {
    Read_Temperature();                  // 读取温度
 if (flash==0)            
 {
  Disp_Temperature();              // 显示温度
 }
 else
 {
  P2 = 0x00 ;                      // DS18B20不正常,关闭显示
 }
 if (RI)               // 是否有数据到来
 {
  RI = 0;
  receive = SBUF;

  if (receive == 49)             // 是否开始采集温度
  {
   send_char();       // 传送采集的温度
  }
 }
 }
}

16067
xilinxue
文章数:2441
年度积分:50
历史总积分:16067
注册时间:2007/12/27
发站内信
发表于:2010/11/13 7:31:11
#1楼
这个你要把整个工程文件放上来才好
匿名用户
文章数:N/A
年度积分:0
历史总积分:0
注册时间:2010/9/13
发站内信
发表于:2010/12/27 14:59:53
#2楼
机器视觉
该用户被锁定,回复内容不予显示!
745
qinta1919
文章数:10
年度积分:50
历史总积分:745
注册时间:2010/3/7
发站内信
发表于:2011/2/27 19:36:22
#3楼
C51
现在可以编译成功 你试试
 #include <reg51.h>

#define XTAL 11059200    // CUP 晶振频率
#define baudrate 9600    // 通信波特率

#define uchar unsigned char
#define uint unsigned int

sbit DQ = P3^3;          // 定义DS18B20端口DQ
sbit BEEP = P3^7;

unsigned char presence ;
unsigned char code  LEDData1[ ] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff};
unsigned char code  LEDData[ ]   = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
                                   0x80,0x90,0xff};
unsigned char data  temp_data[2] = {0x00,0x00};
unsigned char data  display[5] =   {0x00,0x00,0x00,0x00,0x00};
unsigned char code  ditab[16] =    {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                                   0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
void beep();
sbit DIN = P0^7; // 小数点
bit  flash=0;    // 显示开关标记
bit  flag_zf=0;   // 正负温度标志

/**********************************************************/
void Delay(unsigned int num)// 延时函数
{
  while( --num );
}

/**********************************************************/
uchar Init_DS18B20(void) // 初始化ds1820
{
 
    DQ = 1;      // DQ复位
    Delay(8);    // 稍做延时

    DQ = 0;      // 单片机将DQ拉低
    Delay(90);   // 精确延时 大于 480us

    DQ = 1;       // 拉高总线
    Delay(8);

    presence = DQ;    // 如果=0则初始化成功 =1则初始化失败
    Delay(100);
    DQ = 1;
   
    return(presence); // 返回信号,0=presence,1= no presence
}
/**********************************************************/
uchar 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(4);
  }

   return (dat);
}
/**********************************************************/
void WriteOneChar(unsigned char dat)// 写一个字节
{
  unsigned char i = 0;

  for (i = 8; i > 0; i--)
  {
    DQ = 0;
    DQ = dat&0x01;
    Delay(5);

    DQ = 1;
    dat>>=1;
  }
}

/*********************************************************/
void Read_Temperature(void)// 读取温度
{
  Init_DS18B20();

  if(presence==1)        
   {
 beep();
 flash=1;
}                        // DS18B20不正常,蜂鸣器报警
   else
   {
     flash=0;
     WriteOneChar(0xCC);  // 跳过读序号列号的操作
     WriteOneChar(0x44);  // 启动温度转换

     Init_DS18B20();
     WriteOneChar(0xCC);  // 跳过读序号列号的操作
    WriteOneChar(0xBE);  // 读取温度寄存器

     temp_data[0] = ReadOneChar();   // 温度低8位
     temp_data[1] = ReadOneChar();   // 温度高8位
   }
}

/*********************************************************/
void Disp_Temperature()// 显示温度
{
  unsigned char  n=0;
   if(temp_data[1]>7)                  //当温度高八位中的高五位全为O
     { flag_zf=1;                     // 所测温度为负时,要进行转换
       temp_data[1]=!( temp_data[1]);
   temp_data[0]=!( temp_data[0]);
temp_data[0]= temp_data[0]+1;
if(temp_data[0]==0)
{ temp_data[1]= temp_data[1]+1;}
}
else
 {flag_zf=0;}                //判断测得的温度数据是正还是负,如果为正,不做任何
//理

display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]];     // 查表得小数位的值

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
display[3]=display[4]/100;
display[1]=display[4]%100;
display[2]=display[1]/10;
display[1]=display[1]%10;
    if(flag_zf=1)
        {P0=0xbf;
         P2=0x02;
         Delay(300);}      //温度为负数时第二个数码管显示负号

  if(!display[3])          // 高位为0,不显示
  {
    display[3]=0x0a;              
    if(!display[2])      // 次高位为0,不显示
     display[2]=0x0a;
  }

P0 = 0xc6;    // 显示 C
P2 = 0xfe;    // 位选线为P2.7口,LED为共阳极显示,当位选线为低电平时选通
Delay(300);

P0 = 0x9c;    // 显示 °  
P2 = 0xfd;   // 选中P2.6口
Delay(300);

P0 =LEDData[display[0]] ;  // 显示小数位
P2 = 0xfb;      //p2.5
Delay(300);

P0 =LEDData1[display[1]];  // 显示个位
P2 = 0xf7;
Delay(300);

P0 =LEDData[display[2]];  // 显示十位
P2 = 0xef;      
Delay(300);

P0 =LEDData[display[3]];  // 显示百位
P2 = 0xdf;
Delay(300);

P2 = 0xff;                // 关闭显示
}

/*********************************************************/
void beep(void)
{
   unsigned char i;
   for (i=0;i<100;i++)
   {
      Delay(60);
      BEEP=!BEEP;                // BEEP取反
   }
   BEEP=1;                        // 关闭蜂鸣器
}

/*********************************************************/
void init(void)
{
EA  = 1;                           // "中断总允许"

   TMOD = 0x20;   // 定时器1工作于8位自动重载模式, 用于产生波特率

TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));   // 定时器0赋初值

SCON = 0x50;   // 设定串行口工作方式
PCON &= 0x00;   // 波特率不倍增

TR1 = 1;    // 启动定时器1
IE = 0x00;    // 禁止任何中断
}

/*********************************************************/
void send_char(void)
// 传送十六位的温度数据,低位在前
{
unsigned i=0;

while (i < 2)
{
 SBUF = temp_data[i];
 while (!TI);        // 等特数据传送
 TI = 0;             // 清除数据传送标志
 i++;
}
}

/*********************************************************/
void main(void)
{
uchar receive;
  init();
  while(1)
  {
    Read_Temperature();                  // 读取温度
 if (flash==0)            
 {
  Disp_Temperature();              // 显示温度
 }
 else
 {
  P2 = 0x00 ;                      // DS18B20不正常,关闭显示
 }
 if (RI)               // 是否有数据到来
 {
  RI = 0;
  receive = SBUF;

  if (receive == 49)             // 是否开始采集温度
  {
   send_char();       // 传送采集的温度
  }
 }
 }
}
27482
guanyumou 版主
文章数:10490
年度积分:665
历史总积分:27482
注册时间:2008/7/13
发站内信
2018论坛优秀版主
2018春节活动(三)
2017论坛优秀版主
2017国庆活动(二)
2017春节活动(三)
发表于:2012/1/2 13:44:16
#4楼
我试过了 内存选的小了 改一下存储模式就OK
基于各种组态软件\触摸屏\PLC\单片机\变频器Modbus TCP\RTU\ASCII通信编程服务,需要请直接
联系!腾讯扣扣149034219
工控学堂推荐视频:

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

109.2007