您现在所在的是:

单片机论坛

回帖:2个,阅读:758 [上一页] [1] [下一页]
700
xilans48
文章数:17
年度积分:50
历史总积分:700
注册时间:2010/10/31
发站内信
发表于:2010/11/12 10:41:29
#0楼
我现在有上位机程序,要求用到AT89C51写一个能实现温度显示的上位机程序
实验要求:串行口连接tx-1c试验板 + 计算机,即可在文本框中显示当前环境温度值。
上位机程序:Private Sub Form_Load()
 MSComm1.Settings = "9600,N,8,1" '波特率9600bit/s,无校验,8位数据,1位停止位
 MSComm1.CommPort = 1 '设定串口,为1为comm1
 MSComm1.InBufferSize = 8 '设置返回接收缓冲区的大小,以字符为单位
 MSComm1.OutBufferSize = 2
 If MSComm1.PortOpen = True Then MSComm1.PortOpen = False '关串口
 MSComm1.RThreshold = 4 ’设置并返回产生oncomm事件的字符数,以字符为单位
 RThreshold
 MSComm1.SThreshold = 1'
 MSComm1.InputLen = 0'设置从接收缓冲区读取的字数,为0读取整个缓冲区
 MSComm1.InputMode = comInputModeText'以文本方度接收
 If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
 MSComm1.InBufferCount = 0'清空接收缓冲区
 Me.Caption = "温度"
 Text1.Text = "00.0"
End Sub
 Private Sub MSComm1_OnComm()
 Dim rec As String
 Select Case MSComm1.CommEvent
 Case comEvReceive
 rec = MSComm1.Input
 Text1.Text = rec
 MSComm1.InBufferCount = 0'清空接收缓冲区
 End Select
End Sub

700
xilans48
文章数:17
年度积分:50
历史总积分:700
注册时间:2010/10/31
发站内信
发表于:2010/11/12 18:01:07
#1楼
哪位高手能帮我把这个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();    // 传送采集的温度
}
}
 }
}
700
xilans48
文章数:17
年度积分:50
历史总积分:700
注册时间:2010/10/31
发站内信
发表于:2010/11/12 23:14:39
#2楼
附件
附件
程序有错误,哪位高手给看看程序错在那里了。

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

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

46.8003