找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3052|回复: 2
收起左侧

温度报警器 出现了数码管显示不完全的问题

[复制链接]
ID:369813 发表于 2018-7-11 23:35 | 显示全部楼层 |阅读模式
之前参考别人的帖子做了这个温度报警器,报警功能可以实现,但是出现了数码管显示不完全的问题,本人萌新一枚,希望有大神可以指点一二,谢谢啦!!! 图片1.png


源码如下:
#include<reg51.h>
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint  unsigned int
sbit DQ=P3^6;
sbit sounder=P3^7;
sbit D1=P1^4;        
sbit D2=P1^5;      
uchar temperature1,temperature0,TH,TL;
float tt;                     
int t;                              
uint count0,count1;
int baojing[]={700,-200};   
uchar code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};      
uchar code smg1[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0xF7,0xFC,0xB9,0xDE,0xF9,0xF1};
void delayms(int j)
{
                         int aa,kk;
                         for(aa=0;aa<j;aa++)
                            for(kk=120;kk>0;kk--);
}
void delay5us()     
{
                         _nop_();
}
void delay10us()
{                        
                         _nop_();
                         _nop_();
                         _nop_();
                         _nop_();
                         _nop_();
                         _nop_();
}
void delay102us()     
{
                         delay10us();
                         delay10us();
                         delay10us();
                         delay10us();
                         delay10us();
                         delay10us();
                         delay10us();
                         delay10us();
                         delay10us();
                         delay10us();
}
void delay614us()                 
{
                         delay102us();
                         delay102us();
                         delay102us();
                         delay102us();
                         delay102us();
                         delay102us();
}

uchar init_DS18B20()
{
                         uchar status ;
                         DQ=1;
                         delay10us();      
                         DQ=0;
                         delay614us();
                         DQ=1;              
                         delay10us();
                         delay10us();
                         delay10us();
                         status=DQ;  
                         delay102us();
                         delay102us();
                         delay102us();
                         delay102us();
                         DQ=1;               
                         return status;
}  

uchar DS18B20_readbyte()
{                        
                         uchar i,dat=0;
                         DQ=1;
    _nop_();      
                         for(i=0;i<8;i++)
                         {
                            DQ=0;            
                            _nop_();
                            _nop_();
                            _nop_();
                            dat>>=1;
                            DQ=1;      
                            _nop_();
                            _nop_();
                            if(DQ)dat|=0x80;
                            else
                            dat=dat|0x00;

                            delay102us();
                            delay102us();
                            delay102us();
                            delay102us();  
                            DQ=1;      
                         }
                         return dat;
}

void DS18B20_writebyte(uchar dat)
{
                         uchar i;
                         for(i=0;i<8;i++)
                         {

                            DQ=0;
                            DQ=dat&0x01;   
                            delay10us();
                            delay5us();
                            dat>>=1;         
                            delay10us();
                            delay10us();
                            delay10us();
                            delay10us();
                            delay5us();
                            DQ=1;
                         }
                         DQ=1;                     
}

void  read_temperature()
{
                         if(init_DS18B20()==0)
                         {
                            DS18B20_writebyte(0xcc);   
                            DS18B20_writebyte(0x44);   
                          }
                         if(init_DS18B20()==0)                  
                          {                                 
                            DS18B20_writebyte(0xcc);                    
                            DS18B20_writebyte(0xbe);   
                            temperature0=DS18B20_readbyte();
                            temperature1=DS18B20_readbyte();
                         }

}

void xianshi()
{                        
                         uchar  bai,shi,ge,i;
                         uint wendu;
                         read_temperature();
                         t=temperature1;
                         t<<=8;        
                         t=t|temperature0;
                         tt=t*0.0625;
                         t=tt*10+(t>0?0.5:-0.5);
                         TH=t>=baojing[0]?1:0;      
                         TL=t<=baojing[1]?1:0;
                         wendu=abs(t);
                         bai=wendu/100;
                         shi=wendu/10%10;
                         ge=wendu%10;
                         for(i=0;i<30;i++)            
                         {
                            if(t<0)
                            {
                                   P2=0xfb;
                                   P0=0x40;
                                   delayms(2);
                            }
                            P2=0xff;
                            P2=0xf7;
                            P0=smg[bai];
                            delayms(2);
                            P2=0xef;
                            P0=smg1[shi];
                            delayms(2);
                            P2=0xdf;
                            P0=smg[ge];
                            delayms(2);
                            P2=0xbf;
                            P0=0x63;
                            delayms(2);
                            P2=0x7f;
                            P0=0x39;
                            delayms(2);
                         }
}                           
void main()
{
                         D1=1;
                         D2=1;
                         sounder=0;   
                         P2=0x00;
                         P0=0x00;
                         TMOD=0x11;
                         TH0=-(1000/256);
                         TL0=-(1000%256);
                         TH1=-(1000/256);
                         TL1=-(1000%256);
                         ET0=1;
                         ET1=1;
                         EA=1;
                         TR1=0;
                         TR0=0;
                         read_temperature();
                         while(1)
                         {
                            read_temperature();
                            xianshi();
                            if(TH==1)
                                                                                                                        TR0=1;   
                            else   
                                                                                                                        TR0=0;
                            if(TL==1)
                                                                                                                        TR1=1;
                            else      
                                                                                                                        TR1=0;

                         }
}
void ET0_time1() interrupt 1
{
                         TH0 =-(1000 / 256);
                         TL0 =-(1000 % 256);
                         sounder=~sounder;
                         if(++count0== 400)
                         {
                            count0= 0;
                            if(TH)     D1= ~D1;       else  D1 = 1;
                         }
}                          
void ET1_time1()interrupt 3
{
                         TH1 =-(1000 / 256);
                         TL1 =-(1000 % 256);
                         sounder=~sounder;
                         if(++count1== 400)
                         {
                            count1= 0;
                            if(TL)     D2 = ~D2;      else  D2 = 1;
                         }
}

回复

使用道具 举报

ID:369845 发表于 2018-7-12 00:19 | 显示全部楼层
共阴或者共阳的数码管选错了吧
回复

使用道具 举报

ID:269211 发表于 2018-7-12 17:01 | 显示全部楼层
你的程序是共阴的,你仿真是不是用了共阳的,查一下,或者试一下用共阳的数组
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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