久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
數碼管顯示溫度
[打印本頁]
作者:
邱育
時間:
2015-6-17 19:56
標題:
數碼管顯示溫度
希望可以幫我修改,謝謝
問題:用這個程序燒寫到單片機里面結果發現。三位數碼管中總有兩位顯示的時候閃個不停,并且亮度較正常顯示的時候暗。求大神教
數碼管顯示溫度程序如下:
#include<reg52.h> //包含單片機寄存器的頭文件
#include<intrins.h> //包含_nop_()函數定義的頭文件
unsigned char flag,tltemp; //負溫度標志 和臨時暫存變量
unsigned char code s8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//數碼管數字0-9
void delay1ms()
{
unsigned char i,j;
for(i=0;i<4;i++)
for(j=0;j<33;j++)
;
}
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/************************************************************************
以下是DS18B20的操作程序
************************************************************************/
sbit DQ=P3^3;
unsigned char time; //設置全局變量,專門用于嚴格延時
/*****************************************************
函數功能:將DS18B20傳感器初始化,讀取應答信號
出口參數:flag
***************************************************/
bit Init_DS18B20(void)
{
bit flag; //儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在
DQ = 1; //先將數據線拉高
for(time=0;time<2;time++) //略微延時約6微秒
;
DQ = 0; //再將數據線從高拉低,要求保持480~960us
for(time=0;time<200;time++) //略微延時約600微秒
; //以向DS18B20發出一持續480~960us的低電平復位脈沖
DQ = 1; //釋放數據線(將數據線拉高)
for(time=0;time<10;time++)
; //延時約30us(釋放總線后需等待15~60us讓DS18B20輸出存在脈沖)
flag=DQ; //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在)
for(time=0;time<200;time++) //延時足夠長時間,等待存在脈沖輸出完畢
;
return (flag); //返回檢測成功標志
}
/*****************************************************
函數功能:從DS18B20讀取一個字節數據
出口參數:dat
***************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat; //儲存讀出的一個字節數據
for (i=0;i<8;i++)
{
DQ =1; // 先將數據線拉高
_nop_(); //等待一個機器周期
DQ = 0; //單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序
_nop_(); //等待一個機器周期
DQ = 1; //將數據線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備
for(time=0;time<2;time++)
; //延時約6us,使主機在15us內采樣
dat>>=1;
if(DQ==1)
dat|=0x80; //如果讀到的數據是1,則將1存入dat
else
dat|=0x00;//如果讀到的數據是0,則將0存入dat
//將單片機檢測到的電平信號DQ存入r
for(time=0;time<8;time++)
; //延時3us,兩個讀時序之間必須有大于1us的恢復期
}
return(dat); //返回讀出的十六進制數據
}
/*****************************************************
函數功能:向DS18B20寫入一個字節數據
入口參數:dat
***************************************************/
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=0; i<8; i++)
{
DQ =1; // 先將數據線拉高
_nop_(); //等待一個機器周期
DQ=0; //將數據線從高拉低時即啟動寫時序
DQ=dat&0x01; //利用與運算取出要寫的某位二進制數據,
//并將其送到數據線上等待DS18B20采樣
for(time=0;time<10;time++)
;//延時約30us,DS18B20在拉低后的約15~60us期間從數據線上采樣
DQ=1; //釋放數據線
for(time=0;time<1;time++)
;//延時3us,兩個寫時序間至少需要1us的恢復期
dat>>=1; //將dat中的各二進制位數據右移1位
}
for(time=0;time<4;time++)
; //稍作延時,給硬件一點反應時間
}
/*****************************************************
函數功能:做好讀溫度的準備
***************************************************/
void ReadyReadTemp(void)
{
Init_DS18B20(); //將DS18B20初始化
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
delaynms(200); //轉換一次需要延時一段時間
Init_DS18B20(); //將DS18B20初始化
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器,前兩個分別是溫度的低位和高位
}
/*****************************************************
函數功能:顯示溫度的整數部分
入口參數:x
***************************************************/
void display_temp1(unsigned char x)
{
unsigned char k,l; //j,k,l分別儲存溫度的百位、十位和個位
k=(x%100)/10; //取十位
l=x%10; //取個位
P0=0x00;
P0=s8[l]; //將個位數字的字符常量寫入數碼管
P2=0xfd; //將十位數字的字符常量寫入數碼管
delaynms(20); //延時1ms給硬件一點反應時間
P0=0x00;
P0=s8[k];
P2=0xfe;
delaynms(1);
}
/*****************************************************
函數功能:顯示溫度的小數數部分
入口參數:x
***************************************************/
void display_temp2(unsigned char x)
{
P0=0x00;
P0=s8[x];
P2=0xfb;
delaynms(20);
}
/*****************************************************
函
數功能:主函數
***************************************************/
void main(void)
{
unsigned char TL; //儲存暫存器的溫度低位
unsigned char TH; //儲存暫存器的溫度高位
unsigned char TN; //儲存溫度的整數部分
unsigned char TD; //儲存溫度的小數部分
delaynms(5); //延時5ms給硬件一點反應時間
while(1) //不斷檢測并顯示溫度
{
flag=0;
ReadyReadTemp(); //讀溫度準備
TL=ReadOneChar(); //先讀的是溫度值低位
TH=ReadOneChar(); //接著讀的是溫度值高位
TN=TH*16+TL/16; //實際溫度值=(TH*256+TL)/16,即:TH*16+TL/16
//這樣得出的是溫度的整數部分,小數部分被丟棄了
TD=(TL%16)*10/16; //計算溫度的小數部分,將余數乘以10再除以16取整,
//這樣得到的是溫度小數部分的第一位數字(保留1位小數)
display_temp2(TD);
display_temp1(TN); //顯示溫度的整數部
delaynms(1);
}
}
作者:
LGH850
時間:
2024-1-17 08:31
像這種你最好是把整個工程項目打包放上來,要不然沒人愿意幫你一個個看然后自己新建一下工程的,都那么多年了,也沒人回復一個,因為大家都懶得去看,懶得去新建工程。
作者:
Hephaestus
時間:
2024-1-17 13:41
LGH850 發表于 2024-1-17 08:31
像這種你最好是把整個工程項目打包派俠矗蝗幻蝗嗽敢獍錟鬩桓齦隹慈緩笞約盒陸ㄒ幌鹿こ痰模寄敲炊嗄� ...
你已經回復了但是還是沒有任何建設性意見。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
玖玖伊人
|
国产精品一品二区三区的使用体验
|
男女那个视频
|
国产亚洲欧美日韩高清
|
精品免费国产
|
一级做a视频
|
精品国产乱码久久久久
|
午夜久久精品
|
久热中文字幕
|
亚洲另类色综合网站
|
午夜精品久久久久久久99
|
国产精品久久久久久久
|
超碰在线小说
|
国产网站视频
|
成人高潮片免费网站
|
日韩欧美一区二区在线观看
|
91视频亚洲
|
99一区二区
|
国产日韩欧美日韩大片
|
四虎在线免费观看
|
久久精品观看
|
91狠狠操
|
中文字幕一区二区三区在线观看
|
成人在线播放视频
|
色综合色综合
|
久久99深爱久久99精品
|
国产日韩欧美在线
|
欧美一级片在线播放
|
99re这里只有精品6
|
在线a视频
|
av在线免费网站
|
亚洲精品社区
|
欧美区一区二
|
中文字幕在线观看日本
|
国产精品一区二区不卡
|
欧美日韩黄色片
|
特黄av
|
欧美精品入口蜜桃
|
欧美xx孕妇
|
一区二区三区精品
|
国产不卡在线观看
|