找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1998|回复: 6
收起左侧

大佬帮忙看看怎么改计算器单片机程序

[复制链接]
ID:909090 发表于 2021-5-13 11:35 | 显示全部楼层 |阅读模式
1黑币
       在网上找的程序,有一个地方不是很明白,改了半天一直出错,求大佬们帮帮忙,晚上做梦都在想。。程序上我会标出不明白的地方希望有大佬解答。一共有两个问题,红色部分标出了,还有一个用大号字体说明了。

单片机源程序如下:
#include  <reg51.h>        //头文件
#include<math.h>
#define uchar unsigned char                                                                                           //宏定义
#define uint unsigned int
sbit STAR=P2^4;
sbit EOC=P2^6;
sbit CLOCK=P2^5;
sbit OE=P2^7;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
uchar getdata;
double change;
long int temp;        
uchar code table1[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,
                                                    0x6F,0X77,0x40};//0-9,-,无小数点
uchar code table2[]={0xbF,0x86,0xdB,0xcF,0xe6,0xeD,0xfD,0x87,0x7fF,
                                                    0xeF};//0-9,小数点
uchar dispbuf[6];

/****************************************************************************************/
//延时函数:带有入口参数m,代表ms毫秒
//
/****************************************************************************************/
void delay_ms(uchar m)
{
        unsigned int i,j;
        for(i=0;i<m;i++)
        {
                for(j=0;j<123;j++)
                {;}
        }
}
/****************************************************************************************/
//
//数码管显示程序
/****************************************************************************************/
void display()
{
        P0=table1[dispbuf[3]];//显示百位
        P20=0;
        P21=1;
        P22=1;
        P23=1;

        delay_ms(8);
        P0=0X00;
        P0=table1[dispbuf[2]];//显示十位
        P20=1;
        P21=0;
        P22=1;
        P23=1;
        delay_ms(8);
        P0=0X00;
        P0=table2[dispbuf[1]];//显示个位
        P20=1;
        P21=1;
        P22=0;
        P23=1;
        delay_ms(8);
        P0=0X00;
        P0=table1[dispbuf[0]];//显示小数位
        P20=1;
        P21=1;
        P22=1;
        P23=0;
        delay_ms(8);
        P0=0X00;
}
/****************************************************************************************/
//
//计算温度
/****************************************************************************************/
void PT100()                                                        
{
double deal,U;//
        U=5.0/255.0*getdata;                                                      红色部分不是很明白其中的意思
        deal=U*20*10;
        temp=(long int)deal;                                       
        if(U<5.2&&U>0)

        {   
    dispbuf[0]=temp%10;
                dispbuf[1]=temp/10%10;
                dispbuf[2]=temp/100%10;
                dispbuf[3]=temp/1000;        
        }
        else
{
                 
                 dispbuf[0]=temp%10;
                dispbuf[1]=temp/10%10;
                dispbuf[2]=temp/100%10;
                dispbuf[3]=11;
         
          /*dispbuf[0]=0;
                dispbuf[1]=0;
                dispbuf[2]=0;
                dispbuf[3]=0;*/        
         
  }
               
display();
}

/****************************************************************************************/
//
//
/****************************************************************************************/
main()
{
        TMOD = 0x10;                                        //定时器0,工作在定时器方式
        TH1        = (65536-200)/256;                //0x3c
        TL1 = (65536-200)%256;                //0xb0
        EA = 1;                                                        //开总中断
        ET1 = 1;                                                //打开(允许)定时器1中断
        TR1 =1;                                                        //开始(启动)定时
  while(1)
        {
          STAR=0;
                OE=0;
                STAR=1;
                STAR=0;
                while(EOC==0)
                {
                  OE=1;
                        delay_ms(10);
                        getdata=P1;
                        OE=0;
                        PT100();                        
                }
        }
}
/****************************************************************************************/
//
//
/****************************************************************************************/
void t1(void) interrupt 3        using 0 //0:int0 1: t0 2: int1 3:t1 4:串行口
{
        TH1        = (65536-200)/256;                //0x3c
        TL1 = (65536-200)%256;                //0xb0
        CLOCK=~CLOCK;//给ADC0808一个时钟脉冲(0.2ms)              
}

_N6GBL{E8776)I8ZIT[C]A3.png
计算部分的程序麻烦大佬帮我改一下,值小于0之后,数码管一直显示-25.6,负数就一直不变。


大佬们帮我解答一下吧,我太难了。

回复

使用道具 举报

ID:827243 发表于 2021-5-13 12:45 | 显示全部楼层
U=5.0/255.0*getdata;  应该是转化getdata到 0-5的值 ,可能是电压。不可能小于零,你小于零的数怎么来的?
deal=U*20*10; 就不清楚想干什么了。
回复

使用道具 举报

ID:909090 发表于 2021-5-13 13:57 | 显示全部楼层
本帖最后由 十青学狗 于 2021-5-13 13:58 编辑

5_`SM(8@LC9U4]`03PCJJP3.png C:\Users\86157\Desktop
回复

使用道具 举报

ID:909090 发表于 2021-5-13 14:03 | 显示全部楼层
daemondong 发表于 2021-5-13 12:45
U=5.0/255.0*getdata;  应该是转化getdata到 0-5的值 ,可能是电压。不可能小于零,你小于零的数怎么来的? ...

大佬我是网上找的代码,这块就是不明白,我想改一下,改半天老出错,我把电路图贴下面回复了,能帮我看看这块怎么改合适么。就是基于51单片机的PT100温度仿真。
回复

使用道具 举报

ID:88256 发表于 2021-5-13 14:26 | 显示全部楼层
红色的 if(U<5.2&&U>0)是判断语句,表示当U大于0并且U小于5.2时执行:
{   
    dispbuf[0]=temp%10;
                dispbuf[1]=temp/10%10;
                dispbuf[2]=temp/100%10;
                dispbuf[3]=temp/1000;        
        }


如果U小于或者等于0,或者U大于、等于5.2,则执行:


{
                 
                 dispbuf[0]=temp%10;
                dispbuf[1]=temp/10%10;
                dispbuf[2]=temp/100%10;
                dispbuf[3]=11;
         
          /*dispbuf[0]=0;
                dispbuf[1]=0;
                dispbuf[2]=0;
                dispbuf[3]=0;*/        
         
  }


所以,当U不符合要求时,dispbuf[3]=11;   显示的当然是一个负号
回复

使用道具 举报

ID:909090 发表于 2021-5-13 14:44 | 显示全部楼层
hhdsdy 发表于 2021-5-13 14:26
红色的 if(U0)是判断语句,表示当U大于0并且U小于5.2时执行:
{   
    dispbuf[0]=temp%10;

我那个PT100温度小于0,只显示-25.6,不管温度是负多少,数码管一直显示-25.6不变
回复

使用道具 举报

ID:466730 发表于 2021-5-13 14:52 | 显示全部楼层
ADC0808应该是AD转换芯片吧,转换的结果刚好对应给P1口,赋值给getdata,然后红色部分再把AD转换为电压,然后把电压放大,最后应该少了个放大后的电压转温度的查表吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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