電子日歷功能,在電腦屏幕顯示出來,功能如下:
按下key1鍵,顯示當前的日期:年/月/日;
按下key2鍵,顯示當前的時間:時/分/秒;
按下key3鍵,顯示當前的日期時間:年/月/日時/分/秒;
顯示在數碼管上.
最好選STC89C52的芯片,因為到程序設計的時候,用到了三個定時器,剛剛好夠用;
捕獲.PNG (99.68 KB, 下載次數: 64)
下載附件
仿真原理圖
2021-7-22 22:45 上傳
單片機源程序如下:
- #include "public.h"
- //共陽極數碼管顯示編碼
- u16 code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- //數碼管顯示內容
- bit smg_show_flag = 1;
- bit smg_show_flag1 = 1;
- //數碼管顯示功能,1:數碼管顯示年月日,2:數碼管顯示時分秒,3:串口輸出日期
- u8 smg_show_mode = 1;
- u8 time_buf[50]={0};
- //定義年月日變量
- u16 year = 2021;
- u16 month = 7;
- u16 day = 3;
- //定義時分秒變量
- u16 hour=3,min=12,sec,ssec;
- //延時函數
- void delay(u8 i)
- {
- u8 k;
- for(k=0;k<i;k++);
- }
- /*********************************************************************
- 函數名字:TIM0_IT_Init
- 函數功能:定時器0的中斷初始化函數
- **********************************************************************/
- void Timer0Init(void)
- {
- //1.配置定時器0為工作方式1
- TMOD |= 0x01;
- //2.配置TH和TL確定定時時長,50ms
- //單片機時鐘頻率為12000000Hz,定時器時鐘頻率=單片機時鐘頻率/12=1000000Hz
- //50ms = 50/1000 = 1/20s,所以50ms定時器計數值為1000000/20 = 50000
- //由于定時器是自加計數
- TH0 = (65535-50000) / 256;
- TL0 = (65535-50000) % 256;
- //3.啟動定時器0開始計數
- TR0 = 1;
- //4.清零定時器0的溢出標志位
- TF0 = 0;
- //5.打開定時器0中斷
- ET0 = 1;
- //6.打開全局中斷
- EA = 1;
- }
- //定時器1的初始化函數
- void Timer1Init()
- {
- TMOD|=0X10;
- TH1=0Xd8;
- TL1=0Xf0;
- ET1=1;
- EA=1;
- TR1=1;
- }
- /*********************************************************************
- 函數名字:smg_display_date
- 函數功能:數碼管顯示日期函數
- 參數:顯示的內容標志:1:年,0:月和日
- **********************************************************************/
- void smg_display_date(u8 showflag)
- {
- u8 i;
- if(showflag == 1)
- {
- for(i=0; i<4; i++)
- {
- switch(i)
- {
- //進行數碼管位選1,點亮第1位數碼管
- case 0: WEI1 = 0,WEI2 = 1,WEI3 = 1,WEI4 = 1;SMG_PORT = table[year/1000%10];break;
- //進行數碼管位選2,點亮第2位數碼管
- case 1: WEI1 = 1;WEI2 = 0;WEI3 = 1,WEI4 = 1;SMG_PORT = table[year/100%10];break;
- //進行數碼管位選3,點亮第3位數碼管
- case 2: WEI1 = 1;WEI2 = 1;WEI3 = 0,WEI4 = 1;SMG_PORT = table[year/10%10];break;
- //進行數碼管位選4,點亮第4位數碼管
- case 3: WEI1 = 1;WEI2 = 1;WEI3 = 1,WEI4 = 0;SMG_PORT = table[year%10];break;
- }
- //點亮延時2ms
- delay(2000);
- //關顯示
- SMG_PORT = 0xff;
- }
- }
- else if(showflag == 0)
- {
- for(i=0; i<4; i++)
- {
- switch(i)
- {
- //進行數碼管位選1,點亮第1位數碼管
- case 0: WEI1 = 0,WEI2 = 1,WEI3 = 1,WEI4 = 1;SMG_PORT = table[month/10%10];break;
- //進行數碼管位選2,點亮第2位數碼管
- case 1: WEI1 = 1;WEI2 = 0;WEI3 = 1,WEI4 = 1;SMG_PORT = table[month%10];break;
- //進行數碼管位選3,點亮第3位數碼管
- case 2: WEI1 = 1;WEI2 = 1;WEI3 = 0,WEI4 = 1;SMG_PORT = table[day/10%10];break;
- //進行數碼管位選4,點亮第4位數碼管
- case 3: WEI1 = 1;WEI2 = 1;WEI3 = 1,WEI4 = 0;SMG_PORT = table[day%10];break;
- }
- //點亮延時2ms
- delay(2000);
- //關顯示
- SMG_PORT = 0xff;
- }
- }
- }
- void smg_display_time(u8 showflag1)
- {
- u8 i;
- if(showflag1 == 1)
- {
- for(i=0; i<4; i++)
- {
- switch(i)
- {
- //進行數碼管位選1,點亮第1位數碼管
- case 0: WEI1 = 0,WEI2 = 1,WEI3 = 1,WEI4 = 1;SMG_PORT = table[min/10%10];break;
- //進行數碼管位選2,點亮第2位數碼管
- case 1: WEI1 = 1;WEI2 = 0;WEI3 = 1,WEI4 = 1;SMG_PORT = table[min%10];break;
- //進行數碼管位選3,點亮第3位數碼管
- case 2: WEI1 = 1;WEI2 = 1;WEI3 = 0,WEI4 = 1;SMG_PORT = table[sec/10%10];break;
- //進行數碼管位選4,點亮第4位數碼管
- case 3: WEI1 = 1;WEI2 = 1;WEI3 = 1,WEI4 = 0;SMG_PORT = table[sec%10];break;
- }
- //點亮延時2ms
- delay(2000);
- //關顯示
- SMG_PORT = 0xff;
- }
- }
- else if(showflag1 == 0)
- {
- for(i=0; i<4; i++)
- {
- switch(i)
- {
- //進行數碼管位選1,點亮第1位數碼管
- case 0: WEI1 = 0,WEI2 = 1,WEI3 = 1,WEI4 = 1;SMG_PORT = table[hour/10%10];break;
- //進行數碼管位選2,點亮第2位數碼管
- case 1: WEI1 = 1;WEI2 = 0;WEI3 = 1,WEI4 = 1;SMG_PORT = table[hour%10];break;
- //進行數碼管位選3,點亮第3位數碼管
- case 2: WEI1 = 1;WEI2 = 1;WEI3 = 0,WEI4 = 1;SMG_PORT = table[min/10%10];break;
- //進行數碼管位選4,點亮第4位數碼管
- case 3: WEI1 = 1;WEI2 = 1;WEI3 = 1,WEI4 = 0;SMG_PORT = table[min%10];break;
- }
- //點亮延時2ms
- delay(2000);
- //關顯示
- SMG_PORT = 0xff;
- }
- }
- }
- /*********************************************************************
- 函數名字:USART_Init
- 函數功能:串口初始化函數,沒有開啟串口中斷
- **********************************************************************/
- void USART_Init(void)
- {
- T2MOD =0; //自動重載
- T2CON = 0x30; //T2用做發送接收時鐘
- TH2 = 0xFF; //9600波特率,11.0592Mhz晶振
- TL2 = 0xDC;
- RCAP2H = 0xFF;
- RCAP2L = 0xDC;
- SCON = 0x50; //串口方式1,1個起始位,1個停止位,8位數據,可變波特率
- PCON = 0X00; //波特率不加倍
- TR2 = 1; //啟動T2
- // ES = 1; //開串口中斷
- // EA = 1;
- }
- /*********************************************************************
- 函數名字:Send_Byte
- 函數功能:發送字符函數
- **********************************************************************/
- void Send_Byte(u8 da)
- {
- //發送字符H
- SBUF = da;
- //等待發送完成
- while(TI != 1);
- //清空發送標志位
- TI = 0;
- }
- /*********************************************************************
- 函數名字:Send_Str
- 函數功能:發送封裝發送字符串函數符函數
- **********************************************************************/
- void Send_Str(u8 *str)
- {
- u8 i;
- for(i=0; str[i]!='\0'; i++)
- Send_Byte(str[i]);
- }
- //按鍵函數
- void key_san()
- {
- if(KEY1==0)
- {
- Send_Str(" 當前運行的功能為A\r\n");
- delay(200);
- if(KEY1==0)
- {
- smg_display_date(smg_show_flag);
- }
- }
-
-
- if(KEY2==0)
- {
- Send_Str(" 當前運行的功能為B\r\n");
- delay(200);
- if(KEY2==0)
- {
- smg_display_time(smg_show_flag1);
-
- }
- }
-
-
- if(KEY3==0)
- {
- Send_Str(" 當前運行的功能為C\r\n");
- delay(200);
- if(KEY3==0)
- {
-
- sprintf(time_buf, "當前時間為%d年%d月%d日%d時%d分%d秒\r\n",year,month,day,hour,min,sec);
- Send_Str(time_buf);
-
- }
-
- }
- }
- /*********************************************************************
- 函數名字:timer0_irq
- 函數功能:定時器0的中斷服務函數
- **********************************************************************/
- void timer0_irq(void) interrupt 1
- {
- static u8 i = 0;
- //循環給定時器0裝入初值
- TH0 = (65535-50000) / 256;
- TL0 = (65535-50000) % 256;
- //讓計數值自加
- i++;
- //40*50=2000ms,即2秒的延時
- if(i == 40)
- {
- //清空計數值,讓程序進行下一次1秒的延時
- i = 0;
- //每2秒鐘切換數碼管顯示的內容
- smg_show_flag=~smg_show_flag;
- smg_show_flag1=~smg_show_flag1;
- }
- }
- //定時器1的中斷服務函數
- void Timer0() interrupt 3
- {
- TH1=0Xd8;
- TL1=0Xf0;
- ssec++;
- if(ssec>=100)
- {
- ssec=0;
- sec++;
- if(sec>=60)
- {
- sec=0;
- min++;
- if(min>=60)
- {
- min=0;
- hour++;
- if(hour>=24)
- {
- hour=0;
- }
- }
- }
- }
- }
復制代碼
51hei.png (6.23 KB, 下載次數: 69)
下載附件
2021-7-22 23:33 上傳
仿真工程暫不提供,大家造帖子里面的圖直接畫一個就行了
Keil代碼工程51hei附件下載:
電子日歷代碼.7z
(22.57 KB, 下載次數: 24)
2021-7-22 23:34 上傳
點擊文件名下載附件
代工程碼 下載積分: 黑幣 -5
|