提問(wèn)者:kong_g_lee2013-06-08 00:00
俺的程序如下,麻煩各位兄弟姐妹們幫我看看我的程序有沒(méi)有問(wèn)題啊,我檢查N次了實(shí)在找不出那里錯(cuò)了,但下載到板子上數(shù)碼管上一直顯示 00 實(shí)在不知道怎么辦了,現(xiàn)在搞的我對(duì)學(xué)習(xí)單片機(jī)都快興趣了,先送一半分?jǐn)?shù),解決了我把俺在知道上的分全部送給您!。。[脫你們了。(我的
以前做過(guò)顯示用LCD1602的DS1302時(shí)鐘,我就發(fā)一個(gè)DS1302的頭文件給你吧?你好好研究一下它們之間的函數(shù)吧?看懂了DS1302編程基本上難不倒你。你上面給的程序亂七八糟的我不敢恭維,顯示部分電路也不知道什么回事。我也懶得看,下面是比較標(biāo)準(zhǔn)的DS1302頭文件。 /////////////////////////////////////////////////////////////////////////////////////////////////////// //File : DS1302.H //Author : NULL //Created: 2008/6/18 #ifndef __DS1302_A_H__ #define __DS1302_A_H__ //引腳及位的定義 sbit DS1302_CLK = P3^6; //時(shí)鐘引腳 sbit DS1302_IO = P3^4; //數(shù)據(jù)引腳 sbit DS1302_RST = P3^5; //復(fù)位引腳 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; //宏定義便于理解 #define unchar unsigned char #define unint unsigned int #define DS1302_SECOND 0x80 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A #define DS1302_DAY 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C #define DS1302_RAM(X) (0xC0+(X)*2) //用于計(jì)算RAM地址的宏運(yùn)算 //定義時(shí)間類(lèi)型 typedef struct _SYSTEMTIME_ { unchar Second; unchar Minute; unchar Hour; unchar Week; unchar Day; unchar Month; unchar Year; unchar DateString[9]; unchar TimeString[9]; }SYSTEMTIME; //函數(shù)聲明 void DS1302_InputByte(unchar Data); //寫(xiě)入一個(gè)字節(jié)(內(nèi)部函數(shù)) unchar DS1302_OutputByte(void); //讀取一個(gè)字節(jié)(內(nèi)部函數(shù)) void Write1302(unchar Address, unchar Data); //在指定地址寫(xiě)入指定的數(shù)據(jù) unchar Read1302(unchar Address); //讀取DS1302指定地址中的數(shù)據(jù) void DS1302_SetProtect(bit Flag); //DS1302是否寫(xiě)入保護(hù) void DS1302_SetTime(unchar Address, unchar Value);//設(shè)置時(shí)間函數(shù) void DS1302_GetTime(SYSTEMTIME *Time); //讀出時(shí)間 void DateToStr(SYSTEMTIME *Time); //日期轉(zhuǎn)化成字符 void TimeToStr(SYSTEMTIME *Time); //時(shí)間轉(zhuǎn)化成字符 void DS1302_Initial (void); //DS1302初始化 //寫(xiě)入一個(gè)字節(jié)(內(nèi)部函數(shù)) void DS1302_InputByte(unchar Data) { unchar i; ACC = Data; for(i=8; i>0; i--) { DS1302_CLK = 0; DS1302_IO = ACC0; //由低位到高位 DS1302_CLK = 1; //上升沿寫(xiě)入數(shù)據(jù) ACC >>= 1; } } //讀取一個(gè)字節(jié)(內(nèi)部函數(shù)) unchar DS1302_OutputByte(void) { unchar i; for(i=8; i>0; i--) { DS1302_CLK = 0; //下降沿讀出DS1302的數(shù)據(jù) ACC >>= 1; //讀出由低到高位,只能移7次有效位!!! ACC7 = DS1302_IO; //第一個(gè)數(shù)據(jù) DS1302_CLK = 1; } return (ACC); } //在指定地址寫(xiě)入指定的數(shù)據(jù) void Write1302(unchar Address, unchar Data) { DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302_InputByte(Address); DS1302_InputByte(Data); DS1302_CLK = 1; DS1302_RST = 0; } //讀取1302指定地址中的數(shù)據(jù) unchar Read1302(unchar Address) { unchar Data; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; //RST拉高,啟動(dòng)數(shù)據(jù)傳送 DS1302_InputByte(Address|0x01);//讀取指定地址數(shù)據(jù)指令 Data = DS1302_OutputByte(); DS1302_CLK = 1; DS1302_RST = 0; return (Data); } //是否寫(xiě)入保護(hù) void DS1302_SetProtect(bit Flag) { if(Flag) Write1302(0x8E,0x80); //0x8e控制字節(jié)地址,bit7=WP WP=1 禁止數(shù)據(jù)寫(xiě)入DS1302 else Write1302(0x8E,0x00); //WP=0 允許數(shù)據(jù)寫(xiě)入DS1302 } //設(shè)置時(shí)間函數(shù) void DS1302_SetTime(unchar Address, unchar Value) { DS1302_SetProtect(0); Write1302(Address,((Value/10)<<4|(Value%10))); DS1302_SetProtect(1); } //讀出時(shí)間 void DS1302_GetTime(SYSTEMTIME *Time) { unchar ReadValue; ReadValue = Read1302(DS1302_SECOND); Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_MINUTE); Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_HOUR); Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_DAY); Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_WEEK); Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_MONTH); Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_YEAR); Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); } //日期轉(zhuǎn)化成字符 void DateToStr(SYSTEMTIME *Time) { Time->DateString[0] = Time->Year/10 + '0'; Time->DateString[1] = Time->Year%10 + '0'; Time->DateString[2] = '-'; Time->DateString[3] = Time->Month/10 + '0'; Time->DateString[4] = Time->Month%10 + '0'; Time->DateString[5] = '-'; Time->DateString[6] = Time->Day/10 + '0'; Time->DateString[7] = Time->Day%10 + '0'; Time->DateString[8] = '\0'; } //時(shí)間轉(zhuǎn)化成字符 void TimeToStr(SYSTEMTIME *Time) { Time->TimeString[0] = Time->Hour/10 + '0'; Time->TimeString[1] = Time->Hour%10 + '0'; Time->TimeString[2] = ':'; Time->TimeString[3] = Time->Minute/10 + '0'; Time->TimeString[4] = Time->Minute%10 + '0'; Time->TimeString[5] = ':'; Time->TimeString[6] = Time->Second/10 + '0'; Time->TimeString[7] = Time->Second%10 + '0'; Time->TimeString[8] = '\0'; } //初始化DS1302 void DS1302_Initial (void) { unchar Second=Read1302(DS1302_SECOND); if(Second&0x80)//bit7=CH CH=0 振蕩器允許工作,CH=1振蕩器停止工作 DS1302_SetTime(DS1302_SECOND,0); } #endif //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 你把上面保存為DS1302.h,在主程序那里加進(jìn)去就行了。顯示部分的函數(shù)你自己編寫(xiě)一下。
回答者:nvolcano2016-06-08 00:00
1、DS18B20的三個(gè)引腳的功能是什么?答:DS18B20的3個(gè)引腳分別為VCC電源正極、GND電源負(fù)極、DQ數(shù)據(jù)端。2、 DS18B20復(fù)位時(shí)間是多少?答:DS18B20復(fù)位時(shí)間是480us~960us。3、 如何判
提問(wèn)者:Stunseetest2013-03-16
時(shí)序不對(duì) DS18B20 的時(shí)序要求很?chē)?yán)格,稍有不慎就會(huì)讀不出 void delay(uchar k) { while(--k); } void delay1(uint k) { uint i,j
提問(wèn)者:HOUXIOA56784072014-04-24
早早辦護(hù)照取得國(guó)外的邀請(qǐng)函,通過(guò)學(xué)校報(bào)留學(xué)基金委,拿到錄取文件后,就得開(kāi)始做出國(guó)的準(zhǔn)備工作了。我們是三口一起到附近的公安分局出入境接待大廳辦理了護(hù)照。護(hù)照上的照片就在公安局里面照的,他們還不給拷貝,可能就是專(zhuān)用的,好在簽
提問(wèn)者:mzadoj2013-06-17
顯示85就是說(shuō)明你延時(shí)有問(wèn)題,根據(jù)你的晶振在網(wǎng)上找?guī)讉(gè)比較精確的延時(shí),你這樣估計(jì)是不行的
提問(wèn)者:ahusj2013-04-19
時(shí)序不對(duì) DS18B20 的時(shí)序要求很?chē)?yán)格,稍有不慎就會(huì)讀不出 void delay(uchar k) { while(--k); } void delay1(uint k) { uint i,j
提問(wèn)者:fdevb8832014-02-19
去年10月買(mǎi)的F3R,62000包上牌。至今馬上30000公里了,油耗大約0.45-0.6/公里之間,油價(jià)6.3元/升。平時(shí)保養(yǎng)170元,好象雙月?lián)Q的東西多點(diǎn)就貴些,400元左右(也有被4S店忽悠的可能)。我的好象是進(jìn)6
提問(wèn)者:qiyegaige2015-08-27