找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2664|回复: 8
收起左侧

主函数无法调用其他.c里的函数

[复制链接]
ID:99938 发表于 2016-1-6 16:25 | 显示全部楼层 |阅读模式
#include <reg52.h>
#include <intrins.h>
#include <sys\sys.h>
#include <lcd\lcd.h>
#include <font\font.h>
#include<DS1302\DS1302.h>
#include<DS18B20\DS18B20.h>

void main(void)
{
    P2=0xff;
        P3=0xff;
        P1=0xff;       
    Lcd_Init();
        LCD_Clear(WHITE);
    BACK_COLOR=BLACK;;POINT_COLOR=WHITE;
    Initial();       
    ds_reset();                                                 // 函数运行到这里,就没反映了
    write_byte(0xcc);                                        //
    write_byte(0x44);                                    //
    while(1)
       {
           key1scan();
           key2scan();
           key3scan();
           read_temp();      //
           work_temp();   //
           wendu=wendudisplay();
            miao=read1302(read_second);
            fen=read1302(read_minute);
            shi=read1302(read_hour);
            ri=read1302(read_day);
            nian=read1302(read_year);
            yue=read1302(read_month);
            week=read1302(read_week);
                 LCD_ShowString(0,0,"day:"); LCD_ShowString(48,17,"-"); LCD_ShowString(72,17,"-");
                 LCD_ShowString(17,17,"20");LCD_Show2Num(32,17,nian,2);LCD_Show2Num(56,17,yue,2); LCD_Show2Num(80,17,ri,2);
                 LCD_ShowString(0,34,"time:"); LCD_ShowString(48,51,":"); LCD_ShowString(72,51,":");
                 LCD_Show2Num(32,51,shi,2);LCD_Show2Num(56,51,fen,2); LCD_Show2Num(80,51,miao,2);
                 LCD_ShowString(0,68,"week:"); LCD_Show2Num(56,85,week,2);
                 LCD_ShowString(0,102,"wendu:");
                 LCD_Show2Num(56,119,wendu,4);LCD_ShowString(88,119,"C");
                }
}


下面是DS18B20

#include<reg52.h>
#include <intrins.h>
#include <sys\sys.h>
#include<DS18B20\DS18B20.h>
uchar dispaly[7];
uchar temp_data[2]={0x00,0x00};
//---------------------------------------------------DS1820复位函数-----------------------------------------------
void ds_reset(void)
{
        char aa=1;
        while(aa)
        {
                 while(aa)
                {
                    DQ=1;
                        _nop_();
                        _nop_();
                        DQ=0;
                        delay1(80);
                        DQ=1;
                        delay1(9);
                        aa=DQ;
                  }
                          delay1(64);
                         aa=~DQ;  
        }
        DQ=1;
}
//-------------------------------------------------DS1820写函数---------------------------------------------------
void write_byte(uchar value)
{
        uchar i;
        for(i=8;i>0;i--)
{
        DQ=1;_nop_();_nop_();
          DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
        DQ=value&0x01;
          delay1(9);
    value>>=1;
}
        DQ=1;
        delay1(1);
}
//------------------------------------------------DS1820读函数---------------------------------------------------
uchar read_byte(void)
{
        uchar i;
        uchar value1=0;
for(i=8;i>0;i--)
{
        DQ=1;_nop_();_nop_();
        value1>>=1;
        DQ=0;
        _nop_();_nop_();_nop_();_nop_();
        DQ=1;
        _nop_();_nop_();_nop_();_nop_();
        if(DQ)
        value1|=0x80;
        delay1(9);
}
        DQ=1;
        return(value1);
}
//-----------------------------------------------读取温度---------------------------------------------------------
void read_temp()
{
        ds_reset();
        write_byte(0xcc);
        write_byte(0xbe);
        temp_data[0]=read_byte();
        temp_data[1]=read_byte();
        ds_reset();
        write_byte(0xcc);
        write_byte(0x44);
}
//----------------------------------------------温度处理----------------------------------------------------------
void work_temp()
{
        uchar n=0;
if(temp_data[1]>127)
        {
        temp_data[1]=(256-temp_data[1]);                        //负值
        temp_data[0]=(256-temp_data[0]);
        n=1;
        }
        dispaly[6]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
        dispaly[5]=dispaly[6]/100;                                //百位
        dispaly[4]=dispaly[6]%100;                                //
        dispaly[2]=dispaly[4]/10;                                //十位
        dispaly[1]=dispaly[4]%10;                                //个位       
        switch        (temp_data[0]&0x0f)                                //小数位
        {
        case 0x0f:dispaly[0]=9;break;
        case 0x0e:dispaly[0]=9;break;
        case 0x0d:dispaly[0]=8;break;
        case 0x0c:dispaly[0]=8;break;
        case 0x0b:dispaly[0]=7;break;
        case 0x0a:dispaly[0]=6;break;
        case 0x09:dispaly[0]=6;break;
        case 0x08:dispaly[0]=5;break;
        case 0x07:dispaly[0]=4;break;
        case 0x06:dispaly[0]=4;break;
        case 0x05:dispaly[0]=3;break;
        case 0x04:dispaly[0]=3;break;
        case 0x03:dispaly[0]=2;break;
        case 0x02:dispaly[0]=1;break;
        case 0x01:dispaly[0]=1;break;
        case 0x00:dispaly[0]=1;break;
        default:break;
        }
if(n)                                                                                //负值时显示aa,正直显示dd
        {
        dispaly[3]=0x11;                                                //
        }
else         dispaly[3]=0x22;


}


uchar  wendudisplay(void)
{
   float   degree;
   degree=dispaly[2]*16+dispaly[1]+dispaly[0];
   return  degree;
}

回复

使用道具 举报

ID:96682 发表于 2016-1-6 17:40 | 显示全部楼层
要么全部的都写在一起,要么分开写然后合并,显然上面的不符合规范。
回复

使用道具 举报

ID:33984 发表于 2016-1-6 18:30 | 显示全部楼层
好像是DS18B20进入了死循环  while(aa)
回复

使用道具 举报

ID:102073 发表于 2016-1-6 19:19 | 显示全部楼层
本帖最后由 ckpcmpkun 于 2016-1-6 19:22 编辑

void ds_reset(void)
{
        char aa=1;
        while(aa)   
        {
                 while(aa) // aa始终为1 死循环
                {
                    DQ=1;
回复

使用道具 举报

ID:99938 发表于 2016-1-6 20:09 | 显示全部楼层
plnh8258 发表于 2016-1-6 18:30
好像是DS18B20进入了死循环  while(aa)

那应该怎么改?这是送的教程里的资料,能显示出温度,但我单独列出来使用时,就不行了
回复

使用道具 举报

ID:99938 发表于 2016-1-6 20:10 | 显示全部楼层
ckpcmpkun 发表于 2016-1-6 19:19
void ds_reset(void)
{
        char aa=1;

那应该怎么改?这是送的教程里的资料,能显示出温度,但我单独列出来使用时,就不行了
回复

使用道具 举报

ID:99938 发表于 2016-1-6 20:10 | 显示全部楼层
#include<reg52.h>
#define  uint unsigned int
#define  uchar  unsigned char
uchar code seg[]={
0xC0,0xCF,0xA4,0xB0,
0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,
0xC6,0xA1,0x86,0x8E,
0x89,0x86,0xc3,0xc0};
uchar seg1[10]={0x40,0x4F,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//----------------------------------------------------温度传感器(或者温湿度)----------------------------------------
sbit    DQ=P3^5;
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------按键引脚定义---------------------------------------------------
sbit        KEY0=P3^6;
sbit        KEY1=P3^7;
//----------------------------------------------------数码管位控制---------------------------------------------------
sbit        led1=P2^2;
sbit        led0=P2^3;
sbit        led2=P2^1;
sbit        led3=P2^0;
sbit        led4=P2^4;           //指示灯LED2,低电平时亮,高电平时暗   
sbit        led5=P2^7;                         //指示灯LED1,低电平时亮,高电平时暗        
sbit    BELL=P2^6;
sbit  DIS1=P2^0;
sbit  DIS2=P2^1;
sbit  DIS3=P2^2;
sbit  DIS4=P2^3;
//---------------------------------------------------------------------------------------------------------------
uchar temp_data[2]={0x00,0x00};
uchar dispaly[7];
void delay1(uint i)
{
        for(;i>0;i--);   
}
//---------------------------------------------------DS1820复位函数-----------------------------------------------
void ds_reset(void)
{
        char temp=1;
        while(temp)
        {
                 while(temp)
                {
                    DQ=1;
                        _nop_();
                        _nop_();
                        DQ=0;
                        delay1(80);
                        DQ=1;
                        delay1(9);
                        temp=DQ;
                  }
                          delay1(64);
                         temp=~DQ;  
        }
        DQ=1;
}
//-------------------------------------------------DS1820写函数---------------------------------------------------
void write_byte(uchar value)
{
        uchar i;
        for(i=8;i>0;i--)
{
        DQ=1;_nop_();_nop_();
          DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
        DQ=value&0x01;
          delay1(9);
    value>>=1;
}
        DQ=1;
        delay1(1);
}
//------------------------------------------------DS1820读函数---------------------------------------------------
uchar read_byte(void)
{
        uchar i;
        uchar value1=0;
        for(i=8;i>0;i--)
        {
                DQ=1;_nop_();_nop_();
                value1>>=1;
                DQ=0;
                _nop_();_nop_();_nop_();_nop_();
                DQ=1;
                _nop_();_nop_();_nop_();_nop_();
                if(DQ)
                value1|=0x80;
                 delay1(9);
        }
        DQ=1;
        return(value1);
}
//-----------------------------------------------读取温度---------------------------------------------------------
void read_temp()
{
        ds_reset();
        write_byte(0xcc);
        write_byte(0xbe);
        temp_data[0]=read_byte();
        temp_data[1]=read_byte();
        ds_reset();
        write_byte(0xcc);
        write_byte(0x44);
}
//----------------------------------------------温度处理----------------------------------------------------------
void work_temp()
{
        uchar n=0;
if(temp_data[1]>127)
        {
        temp_data[1]=(256-temp_data[1]);                        //负值
        temp_data[0]=(256-temp_data[0]);
        n=1;
        }
        dispaly[6]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
        dispaly[5]=dispaly[6]/100;                                //百位
        dispaly[4]=dispaly[6]%100;                                //
        dispaly[2]=dispaly[4]/10;                                //十位
        dispaly[1]=dispaly[4]%10;                                //个位       
        switch        (temp_data[0]&0x0f)                                //小数位
        {
        case 0x0f:dispaly[0]=9;break;
        case 0x0e:dispaly[0]=9;break;
        case 0x0d:dispaly[0]=8;break;
        case 0x0c:dispaly[0]=8;break;
        case 0x0b:dispaly[0]=7;break;
        case 0x0a:dispaly[0]=6;break;
        case 0x09:dispaly[0]=6;break;
        case 0x08:dispaly[0]=5;break;
        case 0x07:dispaly[0]=4;break;
        case 0x06:dispaly[0]=4;break;
        case 0x05:dispaly[0]=3;break;
        case 0x04:dispaly[0]=3;break;
        case 0x03:dispaly[0]=2;break;
        case 0x02:dispaly[0]=1;break;
        case 0x01:dispaly[0]=1;break;
        case 0x00:dispaly[0]=1;break;
        default:break;
        }
if(n)                                                                                //负值时显示aa,正直显示dd
        {
        dispaly[3]=0x11;                                                //
        }
else         dispaly[3]=0x22;
}
//-----------------------------------------------温度显示---------------------------------------------------------
void disdignit()
{
        char i;
        for(i=0;i<3;i++)
                {
                        P0=0xC6;
                        led0=0;
                        delay1(40);
                        led0=1;
                        P0=seg[dispaly[0]];
                        led1=0;
                        delay1(40);

                        led1=1;
                        P0=seg1[dispaly[1]];
                        led2=0;
                        delay1(40);

                        led2=1;
                        P0=seg[        dispaly[2]];
                        led3=0;
                        delay1(40);
                        led3=1;
                }
}
void main()
{
        ds_reset();
                write_byte(0xcc);
                write_byte(0x44);
                P0= 0xbf;
                  while(1)
                  {
                    read_temp();
                        work_temp();
                         disdignit();
                  }

}




这是能正常显示出来的
回复

使用道具 举报

ID:33984 发表于 2016-1-6 20:45 | 显示全部楼层
本帖最后由 plnh8258 于 2016-1-6 20:48 编辑

你的头文件有点乱,检查头文件,刚才又看了下,它是进不了死循环的。
回复

使用道具 举报

ID:102073 发表于 2016-1-7 09:19 | 显示全部楼层
shenjinliang 发表于 2016-1-6 20:10
那应该怎么改?这是送的教程里的资料,能显示出温度,但我单独列出来使用时,就不行了

void ds_reset(void)
{
        char temp=1;
        while(temp)
        {
                 while(temp)
                {
                    DQ=1;
                        _nop_();
                        _nop_();
                        DQ=0;
                        delay1(80);
                        DQ=1;
                        delay1(9);
                        temp=~DQ;  //  加一个取反
                  }
                          delay1(64);
                         temp=~DQ;  
        }
        DQ=1;
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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