導航:首頁 > 操作系統 > 單片機顯示萬年歷

單片機顯示萬年歷

發布時間:2022-08-29 17:25:32

『壹』 利用單片機編程實現萬年歷 求助~!!!!

很簡單。
你的難點根本不用考慮了,如果你用時鍾晶元,比如DS12887,裡面可以自動計算閏年,內置的鬧鍾指令。

你的要求很容易達到,使用52系列單片機,加上一個並行時鍾晶元DS12887然後接一個點陣液晶。

程序的話很多,就不好寫出了,涉及到時鍾的讀出,然後講讀出的值傳到LCD中。

前幾天做了個簡單的電子鍾。

『貳』 51單片機實現萬年歷

可以實現秒.MS都可以
時鍾晶元用DS12887就可以了,15元左右,挺方便,不用外接其他東西.
不過需要注意一下,好象DS12887的讀引腳是高電平有效,和單片機連的餓時候要接反向器,或者用三極體也行.

『叄』 基於單片機的萬年歷難嗎

不難。
單片機應用技術飛速發展,縱觀我們現在生活的各個領域,從導彈的導航裝置,到飛機上各種儀表的控制,從計算機的網路通訊與數據傳輸,到工業自動化過程的實時控制和數據處理,以及我們生活中廣泛使用的各種智能IC卡、電子寵物等,這些都離不開單片機。單片機是集CPU、RAM、ROM、定時、計數和多種介面於一體的微控制器。
它體積小,成本低,功能強,廣泛應用於智能產業和工業自動化上。電子萬年歷是一種非常廣泛日常計時工具,對現代社會越來越流行。它可以對年、月、日、周日、時、分、秒進行計時,還具有閏年補償等多種功能,而且DS1302的使用壽命長,誤差小。對於數字電子萬年歷採用直觀的數字顯示,可以同時顯示年、月、日、周、時、分、秒和溫度等信息,還具有時間校準等功能。該電路採用AT89S52單片機作為核心,功耗小,能在3V的低壓工作,電壓可選用3~5V電壓供電。

『肆』 設計一個基於單片機的萬年歷程序

#include<reg51.h>
#include"lcd.h"
#include"ds1302.h"

sbitK1=P3^1;
sbitK2=P3^0;
sbitK3=P3^2;
sbitK4=P3^3; //管腳接線
unsignedcharcharacter0[24]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02 ,
0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00,//"月"代碼0x01
0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00,//"日"代碼0x02
};//年
voidInt0Configuration();
voidLcdDisplay();
unsignedcharSetState,SetPlace;
voidDelay10ms(void);//誤差0us
/*******************************************************************************
*函數名:main
*函數功能 :主函數
*輸入:無
*輸出 :無
*******************************************************************************/

voidmain()
{
unsignedchari,h;
Int0Configuration();
LcdInit();
LcdWriteCom(0x40);
for(h=0;h<24;h++)
{
LcdWriteData(character0[h]);
}
LcdWriteCom(0x80);

// Ds1302Init();
while(1)
{
if(SetState==0)
{
Ds1302ReadTime();
}
else
{
if(K1==0) //檢測按鍵K1是否按下
{
Delay10ms(); //消除抖動
if(K1==0)
{
SetPlace++;
if(SetPlace>=7)
SetPlace=0;
}

while((i<50)&&(K1==0)) //檢測按鍵是否松開
{
Delay10ms();
i++;
}
i=0;
}
if(K2==0) //檢測按鍵K2是否按下
{
Delay10ms(); //消除抖動
if(K2==0)
{
TIME[SetPlace]++;
if((TIME[SetPlace]&0x0f)>9) //換成BCD碼。
{
TIME[SetPlace]=TIME[SetPlace]+6;
}
if((TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小時只能到23
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x7)&&(SetPlace==5)) //周只能到7
{
TIME[SetPlace]=1;
}
// if(SetPlace==5) //月只能到12
// {
// TIME[SetPlace]=;
// }
}

while((i<50)&&(K2==0)) //檢測按鍵是否松開
{
Delay10ms();
i++;
}
i=0;

}
}
LcdDisplay();


}

}
/*******************************************************************************
*函數名:LcdDisplay()
*函數功能 :顯示函數
*輸入:無
*輸出 :無
*******************************************************************************/

voidLcdDisplay()
{
LcdWriteCom(0x80+0X40);

LcdWriteCom(0x0f);
LcdWriteCom(0xc0|(2-0x40));
LcdWriteCom(0x0c);
Delay10ms();
LcdWriteData('0'+TIME[2]/16); //時
LcdWriteData('0'+(TIME[2]&0x0f));
LcdWriteData(':');
LcdWriteData('0'+TIME[1]/16); //分
LcdWriteData('0'+(TIME[1]&0x0f));
LcdWriteData(':');
LcdWriteData('0'+TIME[0]/16); //秒
LcdWriteData('0'+(TIME[0]&0x0f));

LcdWriteCom(0x80);
LcdWriteData('2');
LcdWriteData('0');
LcdWriteData('0'+TIME[6]/16); //年
LcdWriteData('0'+(TIME[6]&0x0f));
LcdWriteData(0x00);
LcdWriteData('0'+TIME[4]/16); //月
LcdWriteData('0'+(TIME[4]&0x0f));
LcdWriteData(0x01);
LcdWriteData('0'+TIME[3]/16); //日
LcdWriteData('0'+(TIME[3]&0x0f));
LcdWriteData(0x02);
LcdWriteCom(0x8D);
LcdWriteData('0'+(TIME[5]&0x07)-1); //星期
}
/*******************************************************************************
*函數名:Int0Configuration()
*函數功能 :配置外部中斷0
*輸入:無
*輸出 :無
*******************************************************************************/

voidInt0Configuration()
{
//設置INT0
IT0=1;//跳變沿出發方式(下降沿)
EX0=1;//打開INT0的中斷允許。
EA=1;//打開總中斷
}
/*******************************************************************************
*函數名:Int0()
*函數功能 :外部中斷0中斷函數
*輸入:無
*輸出 :無
*******************************************************************************/

voidInt0()interrupt0
{
Delay10ms();
if(K3==0)
{
SetState=~SetState;
SetPlace=0;
Ds1302Init();
}
}
/*******************************************************************************
*函數名:Delay10ms
*函數功能 :延時函數,延時10ms
*輸入:無
*輸出 :無
*******************************************************************************/
voidDelay10ms(void)//誤差0us
{
unsignedchara,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}

『伍』 基於單片機AT89C51的萬年歷,只需要顯示時間就可以,不加其他的東西

#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
sbit SPK=P3^0;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
uchar Display_Buffer[16]=" ";
uchar Count,hour=12,min=12,sec=12;
bit flag,H_or_M;
uchar display[]="This is colck";
void _delay_ms(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
/**********************************************************************
*函數名稱:LCD_Write_Command
*輸 入:uchar cmd
*輸 出:無
*功 能:向LCD1602寫指令
**********************************************************************/
void LCD_Write_Command(uchar cmd)
{
LCD_RS=0;//根據規定,RS和R/W同時為低電平時,可以寫入指令
LCD_RW=0;
LCD_EN=0;//EN置低電平
P0=cmd;//將數據送入P2口,即寫入指令或地址
LCD_EN=1;//EN置高電平
_delay_ms(1);//稍延時,給硬體反應時間
LCD_EN=0;//當EN由高電平跳變成低電平時,液晶模塊開始執行命令
}
/**********************************************************************
*函數名稱:LCD_Write_Data
*輸 入:uchar dat
*輸 出:無
*功 能:向LCD1602寫數據
**********************************************************************/
void LCD_Write_Data(uchar dat)
{
LCD_RS=1;//RS為高電平,RW為低電平時,可以寫入數據
LCD_RW=0;
LCD_EN=0;//EN置低電平
P0=dat;//將數據送入P0口,即將數據寫入液晶模塊
LCD_EN=1;//EN置高電平
_delay_ms(1);//稍延時,給硬體反應時間
LCD_EN=0;//當EN由高電平跳變成低電平時,液晶模塊開始執行命令
}
/**********************************************************************
*函數名稱:Init_LCD
*輸 入:無
*輸 出:無
*功 能:初始化LCD1602
**********************************************************************/
void Init_LCD(void)
{
LCD_Write_Command(0x38);//顯示模式設置:16×2顯示,5×7點陣,8位數據介面
_delay_ms(1);
LCD_Write_Command(0x06);//顯示模式設置:游標右移,字元不移
_delay_ms(1);
LCD_Write_Command(0x0c);//顯示模式設置:顯示開,無游標,游標不閃爍
_delay_ms(1);
LCD_Write_Command(0x01);//清屏幕指令,將以前的顯示內容清除
_delay_ms(1);
}
/**********************************************************************
*函數名稱:LCD_POS
*輸 入:uchar pos
*輸 出:無
*功 能:字元顯示位置
**********************************************************************/
void LCD_POS(uchar pos)
{
LCD_Write_Command(0x80|pos);//顯示位置的確定方法規定為"80H+地址碼x"
}
/**********************************************************************
*函數名稱:Show_String
*輸 入:uchar *str
*輸 出:無
*功 能:LCD1602顯示字元串處理函數
**********************************************************************/
void Show_String(uchar *str)
{
while(*str!='\0')//只要沒有寫到結束標志,就繼續寫
LCD_Write_Data(*str++);//將字元常量寫入LCD,並指向下一個字元
}
void song(void)
{
uchar i,j,k;
for(i=0;i<200;i++)
{
SPK=~SPK;
for(k=0;k<50;k++);
for(j=0;j<50;j++);
}
}
/////lcd1602液晶顯示//////
void Display_Time(uchar Hour,uchar Min,uchar Sec)
{
Display_Buffer[0]=Hour/10+'0';//小時十位
Display_Buffer[1]=Hour%10+'0';//小時個位
Display_Buffer[2]=':';//顯示:號
Display_Buffer[3]=Min/10+'0';//顯示分鍾十位
Display_Buffer[4]=Min%10+'0';//顯示分鍾個位
Display_Buffer[5]=':';//顯示:號
Display_Buffer[6]=Sec/10+'0';//顯示秒十位
Display_Buffer[7]=Sec%10+'0';//顯示秒個位
LCD_POS(0x40);//顯示在液晶第1行第0列
Show_String(Display_Buffer);
}
/////按鍵處理//////
void Set_time(void)
{
flag=0;
if(key1==0||key2==0||key3==0)//若key1,key2,key3其中有鍵按下,則為真
{
TR0=0;//定時器0停止
flag=1;//按鍵標志位為真
}
while(flag)//判斷那一個按鍵按下
{
if(key1==0)//判斷key1是否按下
{
while(!key1);//等待釋放
H_or_M=!H_or_M;//選擇是修改時還是分鍾
}
else if(key2==0)//判斷key2是否被按下
{
while(!key2);//等待釋放
if(H_or_M)//若H_OR_M為真,則修改小時
{
if(++hour==24)//若小時=24,則小時=0
hour=0;//小時加1
}
else//否則修改分鍾
{
if(++min==60)//若分鍾等於60,則分鍾等於0
min=0;//分鍾加1
}
}
else if(key3==0)//判斷key3是否被按下
{
while(!key3);//等待釋放
if(H_or_M)//若H_OR_M為真,則修改小時
{
if(--hour==0xff) //小時減1,若小時等於-1,則小時等於23
hour=23;
}
else//否則修改分鍾
{
if(--min==0xff)//分鍾減1,若分鍾等於-1,則分鍾等於59
min=59;
}
}
else if(key4==0)//判斷key4是否被按下
{
while(!key4);//等待釋放
flag=0;//按鍵標志清零
TR0=1;//定時器0啟動
}
Display_Time(hour,min,sec);//傳H,M,S值顯示到液晶
}
}
void timer0_init(void)//定時器0初始化
{
TMOD=0x01;//定時器0,方式1
ET0=1;//
EA=1;//總中斷允許
TR0=1;//啟動定時器0
TH0=(65535-50000)/256;//裝高8位初值
TL0=(65535-50000)%256;//裝低8位初值
}
void main(void)//主函數
{
//P0=0xff;
P1=0xff;//埠初始化
P3=0xff;
Init_LCD();//液晶初始化
timer0_init();//定時器0初始化
LCD_POS(0);//顯示在液晶第1行第0列
Show_String(display);
while(1)//無限循環
{
Display_Time(hour,min,sec);//液晶顯示時間
//_delay_ms(500);//延時
Set_time();//時間調整
}
}
void timer0() interrupt 1//定時器0中斷
{
TH0=(65535-50000)/256;//重裝定時器0高8位
TL0=(65535-50000)%256;//重裝定時器0低8位
Count++;//計數加1
if(Count==20)//如果COUNT等於20
{
Count=0;//計數清零
sec++;//秒加1
if(sec==60)//判斷秒是否等於60
{
sec=0;//秒清零
min++;//分鍾加1
if(min==60)//判斷分鍾是否等於60
{
min=0;//若等於60,則清零分鍾
hour++;//小時加1
if(hour==24)//判斷小時是否等於24
{
hour=0;//若小時等於24,則清零小時,分鍾,秒
min=0;
sec=0;
}
song();
}
}
}
}

『陸』 基於單片機的萬年歷怎麼做啊只要求顯示日期和時間電路圖、程序有誰懂的支援下哇.拜託了!

#include <reg52.h>
#include<stddef.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_FLAG
#define LCD1602_PORT P0
sbit lcd1602_rs=P2^0;
sbit lcd1602_e=P2^2;
sbit lcd1602_rw=P2^1;
sbit lcd1602_busy=P0^7;
sbit key_ch=P3^5;
sbit key_add=P3^6;
sbit key_minus=P3^7;
uchar i,sec,min,h,date,month,flag;
uint year;
uchar *chgstr[7]={" ","sec","min","hour","date","min","year"};
uchar j,k,m,n,o,p;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar timestr[10],datestr[10];
void init();
void delay(uint);
void time_display();
void date_display();
void control();
void time();
/*
************************************
* 函數名稱:lcd1602_CheckBusy()
* 函數功能:狀態查詢
************************************
*/
void lcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}
/*
***************************************
* 函數名稱: lcd1602_WriteCmd()
* 函數功能:寫命令
* 入口參數:命令字
* 出口參數:無
***************************************
*/
void lcd1602_WriteCmd(const uchar cmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}
/*
*******************************************
* 函數名稱:lcd1602_WriteData()
* 函數功能:寫數據
* 入口參數:c--待寫數據
* 出口參數:無
*********************************************
*/
void lcd1602_WriteData(const uchar c)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=c;
lcd1602_e=0;
}
/*
***********************************************
* 函數名稱:lcd1602_Init()
* 函數功能:初始化LCD
* 入口參數:無
* 出口參數:無
***********************************************
*/
void lcd1602_Init()
{
lcd1602_WriteCmd(0x38); //顯示模式為8位2行5*7點陣
lcd1602_WriteCmd(0x0c); //display enable,flag enable,flash enable,
lcd1602_WriteCmd(0x06); //flag move to right,screen don't move
lcd1602_WriteCmd(0x01); //clear screen
}
/*
************************************************
* 函數名稱:lcd1602_Display()
* 函數功能: 字元顯示
* 入口參數:ptr--字元或字元串指針
* 出口參數:無
* 說 明:用戶可通過以下方式來調用:
* 1)lcd1602_Display("Hello,world!");
* 2) INT8U 存儲類型 txt[]="要顯示的字元串";
* 或者 INT8U 存儲類型 txt[]={'t','x','t',..,'\0'};
* INT8U *ptr;
* ptr=&txt;
* lcd1602_Display(ptr);
* 或 lcd1602_Display(txt);
* 或 lcd1602_Display(&txt);
************************************************
*/
void lcd1602_Display(const uchar *ptr,uchar line,uchar xaddr)
{
uchar data i=0;
uchar *data q;
q=ptr;
switch(line)
{
case 0:
lcd1602_WriteCmd(0x80+xaddr);
while(q!=NULL && (*q!='\0') && i<16)
{
lcd1602_WriteData(*q);
q++;
i++;
}
break;
case 1:
lcd1602_WriteCmd(0xc0+xaddr);
while(q!=NULL && (*q!='\0') && i<16)
{
lcd1602_WriteData(*q);
q++;
i++;
}
break;
}
}
void main()
{
lcd1602_Init();
init();
while(1)
{
time_display();
date_display();
control();
}
}
void init()
{
i=0;
sec=0;
min=30;
h=7;
date=17;
month=10;
year=2017;
flag=0;
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void time_display()
{
timestr[7]=0x30+sec%10;
timestr[6]=0x30+sec/10;
timestr[5]=':';
timestr[4]=0x30+min%10;
timestr[3]=0x30+min/10;
timestr[2]=':';
timestr[1]=0x30+h%10;
timestr[0]=0x30+h/10;
timestr[8]=0;
lcd1602_Display(timestr,1,3);
}
void date_display()
{
datestr[9]=0x30+date%10;
datestr[8]=0x30+date/10;
datestr[7]=':';
datestr[6]=0x30+month%10;
datestr[5]=0x30+month/10;
datestr[4]=':';
datestr[3]=0x30+year%10;
datestr[2]=0x30+year/10%10;
datestr[1]=0x30+year/100%10;
datestr[0]=0x30+year/1000;
lcd1602_Display(datestr,0,2);
}
void control()
{
if(!key_ch)
{
delay(5);
if(!key_ch)
{
flag++;
TR0=0;
if(flag==7)
{flag=0;TR0=1;lcd1602_Init();}
lcd1602_Display(chgstr[flag],1,12);
}
}
while(!key_ch);
if(flag==1&&key_add==0)
{
while(!key_add);
sec++;
if(sec==60)
sec=0;
}
if(flag==1&&key_minus==0)
{
while(!key_minus);
sec--;
if(sec==-1)
sec=59;
}
if(flag==2&&key_add==0)
{
while(!key_add);
min++;
if(min==60)
min=0;
}
if(flag==2&&key_minus==0)
{
while(!key_minus);
min--;
if(min==-1)
min=59;
}
if(flag==3&&key_add==0)
{
while(!key_add);
h++;
if(h==24)
h=0;
}
if(flag==3&&key_minus==0)
{
while(!key_minus);
h--;
if(h==-1)
h=23;
}
if(flag==4&&key_add==0)
{
while(!key_add);
date++;
if(date==29)
if((year%4!=0)&&(month==2))
date=1;
if(date==30)
if((year%4==0)&&(month==2))
date=1;
if(date==31)
if((month==4)||(month==6)||(month==9)||(month==11))
date=1;
if(date==32)
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
date=1;
}
if(flag==4&&key_minus==0)
{
while(!key_minus);
if(date>1)date--;
}
if(flag==5&&key_add==0)
{
while(!key_add);
month++;
if(month==13)
month=1;
}
if(flag==5&&key_minus==0)
{
while(!key_minus);
month--;
if(month==0)
month=12;
}
if(flag==6&&key_add==0)
{
while(!key_add);
year++;
if(year==99)
year=1;
}
if(flag==6&&key_minus==0)
{
while(!key_minus);
year--;
if(year==0)
year=99;
}
}
void T0_rpt() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
time();
}
void time()
{
if(i==20)
{
i=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
h++;
if(h==24)
{
h=0;
min=0;
sec=0;
date++;
if(date==29)
if((year%4!=0)&&(month==2))
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
}
}
if(date==30)
if((year%4==0)&&(month==2))
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
}
}
if(date==31)
if((month==4)||(month==6)||(month==9)||(month==11))
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
}
}
if(date==32)
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
}
}
}
}
}
}
}

『柒』 單片機萬年歷問題

剛開始顯示時間但是不會動,說明不計時唄,程序有問題呀,這還有啥說的。
現在成這個樣了,成什麼樣了,也沒有圖片,也沒有程序,誰知道什麼樣?

『捌』 單片機萬年歷的c語言程序

呵呵,這個東西我最近做過。也用過DS1302、PCF8563時鍾晶元,還算比較簡單啦。
只不過沒這么多功能,這些日子正想做個跟手錶一樣多的功能。等做完了,發給你把。你加我的網路Hi吧。
我可以幫助你,你先設置我最佳答案後,我網路Hii教你。

『玖』 單片機做萬年歷用數碼管的優缺點

優點,定時精準,缺點,電路復雜成本高。
數碼管萬年歷的設計原理是利用AT89C5單片機內部定時/計數器TO的模式2(8位自動重裝初值)產生一個時間為250us的信號,再計數4000次產生1S的時間後發出中斷,再由單片機進行數據處理後,送人數碼管(共陰極數碼管)顯示(動態顯示)。

『拾』 單片機 編程 萬年歷

單片機的定時不好用的,你這個需要一個DS1302就可以搞定的~!網上有很多關於這個的程序啊~!你用定時器做一個小時鍾還可以,但是做這個只定給用的DS1302或者別的一些晶元。

閱讀全文

與單片機顯示萬年歷相關的資料

熱點內容
演算法創新就業方向 瀏覽:417
演算法最優解作者 瀏覽:863
通達信紅綠寶塔線指標源碼 瀏覽:656
app是什麼東西合法嗎 瀏覽:229
怎麼鎖app視頻教程 瀏覽:841
迅捷pdf注冊碼生成器 瀏覽:744
androidsdkosx 瀏覽:300
壓縮面膜紙熒光 瀏覽:839
app怎麼分身三個 瀏覽:744
電影bt下載源碼 瀏覽:421
iwatch屏幕加密晶元 瀏覽:570
公安主題網站源碼 瀏覽:986
天津市伺服器供應商雲伺服器 瀏覽:115
數控車床子程序編程 瀏覽:110
floydwarshall演算法 瀏覽:717
丟失微信app怎麼找 瀏覽:252
php能寫前端嗎 瀏覽:9
伺服器如何更改raid模式 瀏覽:92
方舟伺服器怎麼導出來 瀏覽:610
手機顯示伺服器異常什麼鬼 瀏覽:381