搜索
bottom↓
回复: 0

帮帮忙 谢了 谁能翻译成汇编语言

[复制链接]

出0入0汤圆

发表于 2010-12-11 01:24:40 | 显示全部楼层 |阅读模式

原图 (原文件名:DS18B20温度传感器实验.jpg)






/*************************   源程序   ****************************/


#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}

sbit DQ = P3^3;
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;

uchar code Temp_Disp_Title[]={"Current Temp : "};
uchar Current_Temp_Display_Buffer[]={" TEMP:   "};






uchar code Temperature_Char[8] =
{
        0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,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[]={0x00,0x00};
uchar Display_Digit[]={0,0,0,0};
bit DS18B20_IS_OK = 1;

void DelayXus(uint x)
{
        uchar i;
        while(x--)
        {
                 for(i=0;i<200;i++);
        }
}

bit LCD_Busy_Check()
{
        bit result;
        LCD_RS = 0;
        LCD_RW = 1;
        LCD_EN = 1;
        delayNOP();
        result = (bit)(P0&0x80);
        LCD_EN=0;
        return result;
}

void Write_LCD_Command(uchar cmd)
{
        while(LCD_Busy_Check());
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_EN = 0;
        _nop_();
        _nop_();
        P0 = cmd;
        delayNOP();
        LCD_EN = 1;
        delayNOP();
        LCD_EN = 0;
}

void Write_LCD_Data(uchar dat)
{
        while(LCD_Busy_Check());
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_EN = 0;
        P0 = dat;
        delayNOP();
        LCD_EN = 1;
        delayNOP();
        LCD_EN = 0;
}

void LCD_Initialise()
{
        Write_LCD_Command(0x01);
        DelayXus(5);
        Write_LCD_Command(0x38);
        DelayXus(5);
        Write_LCD_Command(0x0c);
        DelayXus(5);
        Write_LCD_Command(0x06);
        DelayXus(5);       
}

void Set_LCD_POS(uchar pos)
{
        Write_LCD_Command(pos|0x80);       
}

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, ng = 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;       
        }
        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;
        Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';
        Current_Temp_Display_Buffer[10] = '.';
        Current_Temp_Display_Buffer[9]  = Display_Digit[1] + '0';
        Current_Temp_Display_Buffer[8]  = Display_Digit[2] + '0';
        Current_Temp_Display_Buffer[7]  = Display_Digit[3] + '0';
        if(Display_Digit[3] == 0)
                Current_Temp_Display_Buffer[7]  = ' ';
        if(Display_Digit[2] == 0&&Display_Digit[3]==0)
                Current_Temp_Display_Buffer[8]  = ' ';
        if(ng)
        {
                 if(Current_Temp_Display_Buffer[8]  == ' ')
                        Current_Temp_Display_Buffer[8]  = '-';
                else if(Current_Temp_Display_Buffer[7]  == ' ')
                        Current_Temp_Display_Buffer[7]  = '-';
                else
                        Current_Temp_Display_Buffer[6]  = '-';
        }
        Set_LCD_POS(0x00);
        for(i=0;i<16;i++)
        {
                Write_LCD_Data(Temp_Disp_Title);        
        }
        Set_LCD_POS(0x40);
        for(i=0;i<16;i++)
        {
                Write_LCD_Data(Current_Temp_Display_Buffer);        
        }               
        Set_LCD_POS(0x4d);
        Write_LCD_Data(0x00);
        Set_LCD_POS(0x4e);
        Write_LCD_Data('C');
}

void main()
{
        LCD_Initialise();
        Read_Temperature();
        Delay(50000);
        Delay(50000);
        while(1)
        {
                 Read_Temperature();
                if(DS18B20_IS_OK)
                        Display_Temperature();
                DelayXus(100);               
        }

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-11 21:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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