久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
lcd1602顯示DS1302的時間,咋在47秒和57秒的時候就顯示3.14的符號
[打印本頁]
作者:
dpjwang
時間:
2017-11-21 19:40
標題:
lcd1602顯示DS1302的時間,咋在47秒和57秒的時候就顯示3.14的符號
要是再加個18B20的話,溫度只顯示4個0,單獨顯示溫度又沒問題,不知哪位能指點我這棵小白菜
#include <reg52.H>
#include <lcd1602.H>
#include <ds1302.H>
/*******************************************************************************
* 函數名 :LCDWriteData()
* 函數功能 :1602顯示與時間溫度函數
* 輸入 : 無
* 輸出 : 無
*******************************************************************************/
void LCDWriteData()
{ LCD1602WriteCom(0x80);
LCD1602WriteData('2'); //2
LCD1602WriteData('0'); //0
LCD1602WriteData('0'+TIME[6]/16); //1
LCD1602WriteData('0'+(TIME[6]&0x0f));//7年
LCD1602WriteData('-'); //-
LCD1602WriteData('0'+TIME[4]/16); //0
LCD1602WriteData('0'+(TIME[4]&0x0f));//5月
LCD1602WriteData('-'); //-
LCD1602WriteData('0'+TIME[3]/16); //0
LCD1602WriteData('0'+(TIME[3]&0x0f));//7號
LCD1602WriteCom(0x8b);
LCD1602WriteData('0'+(TIME[5]&0x0f));//星期6
LCD1602WriteCom(0xc0);
LCD1602WriteData('0'+TIME[2]/16); //時
LCD1602WriteData('0'+(TIME[2]&0x0f));
LCD1602WriteData(':');
LCD1602WriteData('0'+TIME[1]/16); //分
LCD1602WriteData('0'+(TIME[1]&0x0f));
LCD1602WriteData(':');
LCD1602WriteData('0'+TIME[0]/16); //秒
LCD1602WriteData('0'+(TIME[0]&0x0f));
}
void main()
{
Ds1302Init(); //1302初始化
LCD1602Init(); //1602初始化
while(1)
{ Ds1302ReadTime(); //讀取時鐘信息
LCDWriteData(); //1602顯示與時間溫度函數
}
}
#include <ds1302.H>
//---DS1302寫入和讀取時分秒的地址命令---//
//---秒分時日月周年 最低位讀寫位;-------//
uchar code READ[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
//---DS1302時鐘初始化2016年5月7日星期六12點00分00秒。---//
//---存儲順序是秒分時日月周年,存儲格式是用BCD碼---//
uchar TIME[7] = {0, 0, 0x12, 0x25, 0x11, 0x06, 0x16};
/*******************************************************************************
* 函 數 名 : Ds1302Write
* 函數功能 : 向DS1302命令(地址+數據)
* 輸 入 : addr,dat
* 輸 出 : 無
*******************************************************************************/
void Ds1302Write(uchar addr, uchar dat)
{
uchar i;
DS1302_RST=0;
_nop_();
DS1302_LCDK=0;
_nop_();
DS1302_RST=1;
_nop_();
for(i=0;i<8;i++)
{
DS1302_IO=addr&0x01;
addr>>=1;
DS1302_LCDK=1;
_nop_();
DS1302_LCDK=0;
_nop_();
}
for(i=0;i<8;i++)
{
DS1302_IO=dat&0x01;
dat>>=1;
DS1302_LCDK=1;
_nop_();
DS1302_LCDK=0;
_nop_();
}
DS1302_RST=0;
_nop_();
}
/*******************************************************************************
* 函 數 名 : Ds1302Read
* 函數功能 : 讀取一個地址的數據
* 輸 入 : addr
* 輸 出 : dat
*******************************************************************************/
uchar Ds1302Read(uchar addr)
{
uchar i,dat ,dat1;
DS1302_RST=0;
_nop_();
DS1302_LCDK=0;
_nop_();
DS1302_RST=1;
_nop_();
for(i=0;i<8;i++)
{
DS1302_IO=addr&0x01;
addr>>=1;
DS1302_LCDK=1;
_nop_();
DS1302_LCDK=0;
_nop_();
}
_nop_();
for(i=0;i<8;i++)
{
dat1=DS1302_IO;
dat=(dat>>1)|(dat1<<7);
DS1302_LCDK=1;
_nop_();
DS1302_LCDK=0;
_nop_();
}
DS1302_RST=0;
_nop_();
DS1302_LCDK=1;
_nop_();
DS1302_IO=0;
_nop_();
DS1302_IO=1;
_nop_();
return dat;
}
/*******************************************************************************
* 函 數 名 : Ds1302Init
* 函數功能 : 初始化DS1302.
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Ds1302Init()
{
uchar i;
Ds1302Write(0x8e, 0x00);
for(i=0;i<7;i++)
{
Ds1302Write(WRITE[i], TIME[i]);
}
Ds1302Write(0x8e, 0x80);
}
/*******************************************************************************
* 函 數 名 : Ds1302ReadTime
* 函數功能 : 讀取時鐘信息
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Ds1302ReadTime()
{
uchar i;
for(i=0;i<7;i++)
{
TIME[i]=Ds1302Read(READ[i]);
}
}
作者:
wc86110
時間:
2017-11-22 00:19
就粘貼出來的源代碼根本與 DS18B20 溫度探頭沒有半毛錢關系。
作者:
HC6800-ES-V2.0
時間:
2017-11-22 08:28
很老的問題了。
1602同時顯示1302和18B20的數據,如果僅僅是兩個程序合并,那是不行的。
看這個:
問題終于解決了,雖然不知道為什么,現在總算實現了同時顯示溫度和時間了。
關鍵點是寫地址讀數據函數,多添加幾條指令,加粗紅色字體代碼,如下:
uint8 read_1302(uint8 addr)//先向1302寫地址,再讀數據
{
uint8 dat;
RST=0;
_nop_();
CLCK=0;
_nop_();
RST=1;
_nop_();
DS1302WriteByte(addr);//寫地址
dat=DS1302RradByte();//讀數據
CLCK=1;
_nop_();
CLCK=0;
_nop_();
RST=0;
_nop_();
RST=1;
_nop_();
_nop_();
IO = 0;
_nop_();
IO = 1;
_nop_();
return dat;
}
這是別人費了功夫找出來的方法。
這是我做的:
同學們,我只需要修改一個地方就可以了。。。
首先,要感謝你,試驗出了正確的結果!
在你的結果基礎之上,我反復閱讀程序,注意到,你的紅色部分程序,其實就是1302的使能為高電平。
所以,最終的結果是:
在1302讀數據之后,將原程序中的使能為低電平去掉,就可以了。
即:
原程序:
unsigned char Ds1302Read(unsigned char addr)//從DS1302讀單字節數據
{
unsigned char n,dat,dat1;//n為8位計數,dat為最終返回的數據
//dat1為接收的一位數據
CE = 0;
_nop_();
SCLK = 0;//先將SCLK置低電平。
_nop_();
CE = 1;//然后將CE置高電平。
_nop_();
for(n=0; n<8; n++)//開始傳送八位地址命令
{
DSIO = addr & 0x01;//數據從低位開始傳送
addr >>= 1;
SCLK = 1;//數據在上升沿時,DS1302讀取數據
_nop_();
SCLK = 0;//DS1302下降沿時,放置數據
_nop_();
}
_nop_();
for(n=0; n<8; n++)//讀取8位數據
{
dat1 = DSIO;//從最低位開始接收
dat = (dat>>1) | (dat1<<7);//此處可以用595的方法判斷是0或是1
SCLK = 1;
_nop_();
SCLK = 0;//DS1302下降沿時,放置數據
_nop_();
}
// CE = 0;
_nop_();//以下為DS1302復位的穩定時間,必須的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
紅色那一條語句,原來有,現在我將它去掉,就好了。其它的什么都不用改。
究其原因,可能是兩器件使能沖突。
解決此問題是今年3月的事兒。我在此論壇至少發了兩次了。
作者:
dpjwang
時間:
2017-11-22 18:06
HC6800-ES-V2.0 發表于 2017-11-22 08:28
很老的問題了。
1602同時顯示1302和18B20的數據,如果僅僅是兩個程序合并,那是不行的。
看這個:
非常感謝,你能在百忙之中幫我從中找到不足之處,按照上面的方法除掉了哪條語句,現在溫度能顯示了,只是,現在溫度的度號和3.14的符號還未能解決,真的非常感謝!我的1602是4位總線型
作者:
1551125514
時間:
2017-11-22 19:28
可能是兩器件使能沖突。
解決此問題是今年3月的事兒。我在此論壇至少發了兩次了。
評分
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
www天天操
|
国产99热精品
|
中文字幕在线一区二区三区
|
天天操网
|
久久一区二区三区四区五区
|
欧美日韩在线一区二区
|
华人黄网站大全
|
日韩在线播放中文字幕
|
久久1区
|
日本不卡一区二区三区
|
欧美aaa级
|
欧美日韩午夜精品
|
91网站视频在线观看
|
欧美激情一区
|
成人免费观看视频
|
免费成人毛片
|
精品一区二区在线观看
|
中文字幕一区在线观看视频
|
欧美伊人久久久久久久久影院
|
久久久精品国产
|
暴草美女
|
亚洲高清久久
|
亚洲精品一区二区
|
欧美日韩亚洲国产
|
91网站在线观看视频
|
国产一级一级
|
中文字幕一二三
|
成人福利视频网站
|
三级视频网站
|
一区二区三区不卡视频
|
亚洲a网
|
97精品国产97久久久久久免费
|
国产精品av久久久久久久久久
|
欧美成人精品一区二区男人看
|
夜夜夜操
|
日本国产一区二区
|
国产精品高潮呻吟
|
欧美极品视频在线观看
|
国产美女在线观看
|
www.久久国产精品
|
狠狠久久综合
|