熱門: 51單片機(jī) | 24小時必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時間: 2015-2-15 16:13
正文摘要:程序是讀DS1302,數(shù)碼管顯示 現(xiàn)在遇到的問題是讀取的數(shù)據(jù)在數(shù)碼管顯示的時候只要前一個數(shù)據(jù)是雙數(shù),后一個數(shù)據(jù)就會變亂碼 例如aa-bb-cc,如果AA是雙數(shù),BB就會亂碼 上個圖 二樓貼程序,是我數(shù)據(jù) ... |
#include <REGX52.H> #include "LCD1602.h" #include "DS1302.h" void Delay1ms(unsigned int count) { unsigned int i,j; for(i=0;i<count;i++) for(j=0;j<120;j++); } main() { SYSTEMTIME CurrentTime; LCD_Initial(); Initial_DS1302(); GotoXY(0,0); Print(" tian ma dian zi"); GotoXY(0,1); Print("Time: "); while(1) { DS1302_GetTime(&CurrentTime); TimeToStr(&CurrentTime); GotoXY(6,1); Print(CurrentTime.TimeString); Delay1ms(400); } } |
人工置頂 |
自頂一下 |
main函數(shù)在這 #include"stc15f2k60s2.h" #include"ds1302.h" #include"intrins.h" #define uchar unsigned char #define uint unsigned int sbit Wr=P3^6; #define rst573 P2&=0x1f//關(guān)閉選中 #define smgY6C P2|=0xc0 //位選 #define smgY7C P2|=0xe0 //段選 #define ledY4C P2|=0x80 //選中LED #define beeY5C P2|=0xa0 //選中蜂鳴器+繼電器 sbit k0=P3^0; sbit k1=P3^1; sbit k2=P3^2; sbit k3=P3^3; //行線 sbit k4=P3^4; sbit k5=P3^5; sbit k6=P4^2; sbit k7=P4^4; uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}; // 全滅+ 1~8wei uchar code wei[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位碼 uchar num=0,time; void CHS_BEEP_close() //關(guān)閉蜂鳴器繼電器 { Wr=0; P2=0x5; P06=1; P04=0; Wr=1; } void delay(uint z)//ms延時函數(shù) { uint x,y; for(x=z;x>0;x--) for(y=1100;y>0;y--); } void display(uchar adt1,uchar adt2,uchar adt3) { P0=0x00; //消影 delay(1); Wr=0; //位選 smgY6C; P0=wei[1]; P2=0x1f; Wr=0; smgY7C; //段選 P0=duan[adt1/10]; P2=0x1f; Wr=1; delay(1); Wr=0; //位選 smgY6C; P0=wei[2]; P2=0x1f; Wr=0; smgY7C; //段選 P0=duan[adt1%10]; P2=0x1f; Wr=1; delay(1); Wr=0; //位選 smgY6C; P0=wei[3]; P2=0x1f; Wr=0; smgY7C; //段選 P0=0xbf; P2=0x1f; Wr=1; delay(1); Wr=0; //位選 smgY6C; P0=wei[4]; P2=0x1f; Wr=0; smgY7C; //段選 P0=duan[adt2/10]; P2=0x1f; Wr=1; delay(1); Wr=0; //位選 smgY6C; P0=wei[5]; P2=0x1f; Wr=0; smgY7C; //段選 P0=duan[adt2%10]; P2=0x1f; Wr=1; delay(1); Wr=0; //位選 smgY6C; P0=wei[6]; P2=0x1f; Wr=0; smgY7C; //段選 P0=0xbf; P2=0x1f; Wr=1; delay(1); Wr=0; //位選 smgY6C; P0=wei[7]; P2=0x1f; Wr=0; smgY7C; //段選 P0=duan[adt3/10]; P2=0x1f; Wr=1; delay(1); Wr=0; //位選 smgY6C; P0=wei[8]; P2=0x1f; Wr=0; smgY7C; //段選 P0=duan[adt3%10]; P2=0x1f; Wr=1; } void keyscan() { if(k0==0){delay(50);if(k0==0)num=0;while(!k0);} if(k1==0){delay(50);if(k1==0)num=1;while(!k1);} } void init_time() { TMOD=0x00; //16位自動重裝定時器 TH0=0xec; //定時5MS TL0=0x78; ET0=1; EA=1; TR0=1; } void main() { init_time(); CHS_BEEP_close(); Ds1302_Init(); Ds1302_Write_Time(); Ds1302_Read_Time(); while(1) { keyscan(); if(num)display(time_buf1[1],time_buf1[2],time_buf1[3]);//顯示年月日 else display(time_buf1[4],time_buf1[5],time_buf1[6]);//顯示時分秒 } } void timer_0() interrupt 1 { time++; if(time==20) //定時讀數(shù)據(jù) { Ds1302_Read_Time(); time=0; } } |
這是DS1302的驅(qū)動文件 #include "ds1302.h" unsigned char time_buf1[8] = {20,15,3,27,18,15,00,5};//空年月日時分秒周 unsigned char time_buf[8]; //空年月日時分秒周 /*------------------------------------------------ 向DS1302寫入一字節(jié)數(shù)據(jù) ------------------------------------------------*/ void Ds1302_Write_Byte(unsigned char addr, unsigned char d) { unsigned char i; RST_SET; //寫入目標(biāo)地址:addr addr = addr & 0xFE; //最低位置零 for (i = 0; i < 8; i ++) { if (addr & 0x01) { IO_SET; } else { IO_CLR; } SCK_SET; SCK_CLR; addr = addr >> 1; } //寫入數(shù)據(jù):d for (i = 0; i < 8; i ++) { if (d & 0x01) { IO_SET; } else { IO_CLR; } SCK_SET; SCK_CLR; d = d >> 1; } RST_CLR;//停止DS1302總線 } /*------------------------------------------------ 從DS1302讀出一字節(jié)數(shù)據(jù) ------------------------------------------------*/ unsigned char Ds1302_Read_Byte(unsigned char addr) { unsigned char i; unsigned char temp; RST_SET; //寫入目標(biāo)地址:addr addr = addr | 0x01;//最低位置高 for (i = 0; i < 8; i ++) { if (addr & 0x01) { IO_SET; } else { IO_CLR; } SCK_SET; SCK_CLR; addr = addr >> 1; } //輸出數(shù)據(jù):temp for (i = 0; i < 8; i ++) { temp = temp >> 1; if (IO_R) { temp |= 0x80; } else { temp &= 0x7F; } SCK_SET; SCK_CLR; } RST_CLR;//停止DS1302總線 return temp; } /*------------------------------------------------ 向DS1302寫入時鐘數(shù)據(jù) ------------------------------------------------*/ void Ds1302_Write_Time(void) { unsigned char i,tmp; for(i=0;i<8;i++) { //BCD處理 tmp=time_buf1[i]/10; time_buf[i]=time_buf1[i]%10; time_buf[i]=time_buf[i]+tmp*16; } Ds1302_Write_Byte(ds1302_control_add,0x00);//關(guān)閉寫保護(hù) Ds1302_Write_Byte(ds1302_sec_add,0x80);//暫停 //Ds1302_Write_Byte(ds1302_charger_add,0xa9);//涓流充電 Ds1302_Write_Byte(ds1302_year_add,time_buf[1]);//年 Ds1302_Write_Byte(ds1302_month_add,time_buf[2]);//月 Ds1302_Write_Byte(ds1302_date_add,time_buf[3]);//日 Ds1302_Write_Byte(ds1302_day_add,time_buf[7]);//周 Ds1302_Write_Byte(ds1302_hr_add,time_buf[4]);//時 Ds1302_Write_Byte(ds1302_min_add,time_buf[5]);//分 Ds1302_Write_Byte(ds1302_sec_add,time_buf[6]);//秒 Ds1302_Write_Byte(ds1302_day_add,time_buf[7]);//周 Ds1302_Write_Byte(ds1302_control_add,0x80);//打開寫保護(hù) } /*------------------------------------------------ 從DS1302讀出時鐘數(shù)據(jù) ------------------------------------------------*/ void Ds1302_Read_Time(void) { unsigned char i,tmp; time_buf[1]=Ds1302_Read_Byte(ds1302_year_add);//年 time_buf[2]=Ds1302_Read_Byte(ds1302_month_add);//月 time_buf[3]=(Ds1302_Read_Byte(ds1302_date_add)); //日 time_buf[4]=Ds1302_Read_Byte(ds1302_hr_add);//時 time_buf[5]=Ds1302_Read_Byte(ds1302_min_add);//分 time_buf[6]=(Ds1302_Read_Byte(ds1302_sec_add))&0x7F;//秒 time_buf[7]=Ds1302_Read_Byte(ds1302_day_add);//周 for(i=0;i<8;i++) { //BCD處理 tmp=time_buf[i]/16; time_buf1[i]=time_buf[i]%16; time_buf1[i]=time_buf1[i]+tmp*10; } } /*------------------------------------------------ DS1302初始化 ------------------------------------------------*/ void Ds1302_Init(void) { RST_CLR;//RST腳置低 SCK_CLR;//SCK腳置低 Ds1302_Write_Byte(ds1302_sec_add,0x00); } |
Powered by 單片機(jī)教程網(wǎng)