找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2620|回复: 5
收起左侧

关于简单把温度转化成电压,再用数码管显示

[复制链接]
ID:153715 发表于 2017-6-6 15:07 | 显示全部楼层 |阅读模式
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/**********LED定义********/
sbit LED_RED = P3^5;   /*红灯定义*/
sbit LED_GREEN = P3^6; /*绿灯定义*/

/*********74HC139定义******/
sbit LA=P2^0;
sbit LB=P2^1;

/*********ADC0831定义*******/
sbit SCL2=P1^4;               
sbit DO=P1^5;       
sbit CS2=P1^3;       

uchar code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};        /*数码管数值*/
uchar temp;  /*温度*/

/**************延时****************/
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void Display(uint dat) /*显示温度值*/
{
        uchar ge,shi,bai,qian;
        qian = dat/1000%10;
        bai = dat/100%10;
        shi = dat/10%10;
        ge = dat%10;

        LA=0;LB=0;
        P0 = Tab[qian];  
        delay(10);
        LA=1;LB=0;
        P0 = Tab[bai];
        delay(10);
        LA=0;LB=1;
        P0 = Tab[shi];
        delay(10);
        LA=1;LB=1;
        P0 = Tab[ge];
        delay(10);
}

/***********读数模转换数据********************************************************/       

unsigned char ad0831read(void)
{
        unsigned char i=0,tmp=0;
                DO=1;
                CS2=0;
                _nop_();
                _nop_();
                SCL2=0;
                _nop_();
                _nop_();
                SCL2=1;
                _nop_();
                _nop_();
                SCL2=0;
                _nop_();
                _nop_();
                SCL2=1;
                _nop_();
                _nop_();
                SCL2=0;
                _nop_();
                _nop_();//MSB是在第二个下降沿输出的,即0-1-0-1-0
                for(i=0;i<8;i++)//这个地方没有理解,tmp是十进制还是二进制?如果是二进制数,怎么没有转化成十进制的过程?
                {
                        tmp<<=1;
                        if(DO)
                                tmp++;                       
                        SCL2=1;
                        _nop_();
                        _nop_();
                        SCL2=0;
                        _nop_();
                        _nop_();
                }
                CS2=1;
        return tmp;
}

/**********主函数************/

void main()
{
        unsigned long adc;
        while(1)
        {
                adc = ad0831read();                 /*从ADC0831读取量化后的数值*/
                adc = adc = adc*19.607843; /*将量化后的数值转换成实际电压*/
                temp = (adc*40)/1000;        /*根据实际电压换算成温度值*/
                Display(temp);           /*将温度显示在LED上*/
                if(temp > 80)           /*当温度高于80度,红灯亮*/
                {
                        LED_RED = 1;
                        LED_GREEN = 0;
                }
                else                        /*当温度低于80度,绿灯亮,*/
                {
                        LED_RED = 0;
                        LED_GREEN = 1;
                }
                      
        }          
}


回复

使用道具 举报

ID:62223 发表于 2017-6-7 14:40 | 显示全部楼层
不理解的地方可以忽略,编译器编译的时候自动转换成单片机识别的二进制数据格式并执行的,你只需知道他确实会执行那么多个周期就好了
回复

使用道具 举报

ID:111634 发表于 2017-6-7 22:24 | 显示全部楼层
把温度转换为电压的,是电路,而不是程序!!!
回复

使用道具 举报

ID:47286 发表于 2017-6-7 22:57 | 显示全部楼层
无所谓什么进制 是多少就是多少 进制只是显示方式
回复

使用道具 举报

ID:162242 发表于 2017-6-8 13:33 | 显示全部楼层
很好的资料,谢谢
回复

使用道具 举报

ID:209233 发表于 2017-6-8 15:33 | 显示全部楼层
三楼正解
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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