標(biāo)題: 單片機讀取溫度數(shù)碼管顯示程序,最后一位明顯更亮,求解釋 [打印本頁]
作者: 離子回旋 時間: 2018-11-26 01:29
標(biāo)題: 單片機讀取溫度數(shù)碼管顯示程序,最后一位明顯更亮,求解釋
今天通過DS18B20讀取溫度并通過LED數(shù)碼管顯示,最后一位明顯更亮,為啥呢?
IMG_20181126_004916.jpg (2.53 MB, 下載次數(shù): 31)
下載附件
TX-1C的板子,第四位明顯更亮
2018-11-26 01:28 上傳
下面是我的函數(shù)
分3個文件:頭文件,DS18B20系列子函數(shù)文件,主函數(shù)部分(既數(shù)據(jù)處理和顯示部分)
頭文件:
#ifndef __TEMP_H_
#define __TEMP_H_
#include<reg52.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
sbit DSPORT=P2^2;
void Delay1ms(uint );
uchar Ds18b20Init();
void Ds18b20WriteByte(uchar com);
uchar Ds18b20ReadByte();
void Ds18b20ChangTemp();
void Ds18b20ReadTempCom();
int Ds18b20ReadTemp();
#endif
DS18B20系列子函數(shù)文件
#include"temp.h"
/*******************************************************************************
* : Delay1ms
*******************************************************************************/
void Delay1ms(uint y)
{
uint x;
for( ; y>0; y--)
{
for(x=110; x>0; x--);
}
}
/*******************************************************************************
* : Ds18b20Init
* : ʼ
* :
* : ʼɹ1ʧܷ0
*******************************************************************************/
uchar Ds18b20Init()
{
uchar i;
DSPORT = 0; //-480us~960us
i = 70;
while(i--);
DSPORT = 1;
i = 0;
while(DSPORT)
{
Delay1ms(1);
i++;
if(i>5)//ȴ>5MS
{
return 0;
}
}
return 1;
}
/*******************************************************************************
* : Ds18b20WriteByt
* :
* :
*******************************************************************************/
void Ds18b20WriteByte(uchar dat)
{
uint i, j;
for(j=0; j<8; j++)
{
DSPORT = 0;
i++;
DSPORT = dat & 0x01;
i=6;
while(i--);
DSPORT = 1;
dat >>= 1;
}
}
/*******************************************************************************
* : Ds18b20ReadByte
*******************************************************************************/
uchar Ds18b20ReadByte()
{
uchar byte, bi;
uint i, j;
for(j=8; j>0; j--)
{
DSPORT = 0;
i++;
DSPORT = 1;
i++;
i++;
bi = DSPORT;
byte = (byte >> 1) | (bi << 7);
i = 4;
while(i--);
}
return byte;
}
/*******************************************************************************
* : Ds18b20ChangTemp
* :
* :
*******************************************************************************/
void Ds18b20ChangTemp()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0x44);
// Delay1ms(100);
}
/******************************************************************************* *******************************************************************************/
void Ds18b20ReadTempCom()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0xbe);
}
/******************************************************************************* *******************************************************************************/
int Ds18b20ReadTemp()
{
uchar temp = 0;
uchar tmh, tml;
Ds18b20ChangTemp();
Ds18b20ReadTempCom();
tml = Ds18b20ReadByte();
tmh = Ds18b20ReadByte();
/*temp = tmh;
//temp <<= 8;
temp |= tml;*/
tml>>=4;
tmh<<=4;
temp=tml|tmh;
return temp;
}
主函數(shù)部分
#include "reg52.h"
#include"temp.h"
#define u16 unsigned int
#define u8 unsigned char
sbit numchoose=P2^6;
sbit wela=P2^7;
/*this code is the num form 0 to F in the LED tube*/
u8 duanxuantable[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
char num=0;
u8 DisplayData[8];
//u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*******************************************************************************
* : delay
* i=1時延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/******************************************************************************處理讀取的原碼,使之成為對應(yīng)溫度值 并存儲正負(fù)符號于DisplayData[0]上
*******************************************************************************/
u8 datapros(u8 temp)
{
float tp;
if(temp>127)
{
DisplayData[0] = 0x40;
temp=temp-1;
temp=~temp;
tp=temp;
// temp=tp/2;
temp=tp*0.0625*100+0.5;
}
else
{
DisplayData[0] = 0x00;
tp=temp;
temp=tp*0.625+0.5;
}
return temp;
}
/******************************************************************************函數(shù)名: display
功能:顯示輸入的unsigned char型溫度的數(shù)值在2、3、4位,第一位顯示正負(fù)
輸入: 讀取并處理后的溫度
輸出: 無
*******************************************************************************/
void display(u8 num)
{
u8 weitable[]={0,0,0,0};
weitable[0]=DisplayData[0];
weitable[1]=num/100;
weitable[2]=(num/10)%10;
weitable[3]=num%10;
wela=1;
P0=0xfe;
wela=0;
numchoose=1;
P0=duanxuantable[weitable[0]];
numchoose=0;
delay(50);
wela=1;
P0=0xfd;
wela=0;
numchoose=1;
P0=duanxuantable[weitable[1]];
numchoose=0;
delay(50);
wela=1;
P0=0xfb;
wela=0;
numchoose=1;
P0=duanxuantable[weitable[2]];
numchoose=0;
delay(50);
wela=1;
P0=0xf7;
wela=0;
numchoose=1;
P0=duanxuantable[weitable[3]];
numchoose=0;
delay(50);
}
/*******************************************************************************
* : main
* :
* :
* :
*******************************************************************************/
void main()
{
while(1)
{
/*datapros(Ds18b20ReadTemp()); //ݴ
DigDisplay();
while(1)
{
display(datapros(Ds18b20ReadTemp()));
}
}
}
不知道為什么KEIL上編譯的文件的中文部分下下來就亂碼了。。。。,抱歉
作者: wulin 時間: 2018-11-26 07:36
是因為這個動態(tài)顯示程序有嚴(yán)重缺陷,個位數(shù)碼管顯示的時間比其他位占用時間過長。表面上看各位的延時都一樣,實際在主循環(huán)運行其他程序的時間里個位一直在顯示。顯示程序中的數(shù)據(jù)分解語句也很占用時間,這個時段個位也一直在顯示。
作者: ysandi 時間: 2018-11-26 09:01
用三極管驅(qū)動,會避免這問題。當(dāng)然,用別的IC驅(qū)動會更好。
作者: 離子回旋 時間: 2018-11-26 13:37
理解了,我改了一下程序,確實是這個原因,謝謝大佬
作者: Colin_zhai 時間: 2018-11-26 15:01
1.最后一位和第一位數(shù)碼管之間的延時較大造成的,這么理解,在處理完一次顯示之后,單片機讀取18B20的時間太久
2.建議把void display(u8 num) { …… }內(nèi)最后一個delay(50); 減小或取消,數(shù)碼管的亮度應(yīng)該會比較均勻
作者: DoBee 時間: 2018-11-26 16:11
應(yīng)該是占空比不一樣導(dǎo)致的
作者: 離子回旋 時間: 2018-11-26 16:23
非常感謝您的建議,在一樓點明我的問題后我就做了這樣的嘗試,效果并不明顯。主要是原因是讀取溫度的函數(shù)所需時間太長了,達到了肉眼可見的閃爍的地步。我對主函數(shù)的顯示做了如下修改,使得數(shù)碼管顯示亮度均勻,但是還是有點小瑕疵
void main()
{
u8 temp;
u16 i;
while(1)
{
while(1)
{
display(temp);
temp=datapros(Ds18b20ReadTemp());
for(i=500;i>0;i--)
{
display(temp);
}
}
}
}
那就是讀取溫度函數(shù)運行的時候數(shù)碼管會閃爍一下
作者: 蔣阿九 時間: 2018-11-26 16:45
你把延時設(shè)對了,就可以了!不過也有其他問題(包括你的上拉電阻,自己測一下硬件電路,測完就剩軟件了)
作者: 1435094966 時間: 2021-12-20 09:34
我下載下來怎么數(shù)碼管全亮
作者: lishengaha 時間: 2021-12-21 10:03
你要想一樣亮可以把數(shù)碼管動態(tài)掃描放中斷里
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |