|
直接發(fā)包 兩個(gè)包 ,兩個(gè)電路有點(diǎn)差別 ,程序是一樣的,都proteus圖加源代碼 ,加生成好的hex、
帶小時(shí) 分鐘時(shí)間設(shè)置和 12/24 小時(shí)顯示按鈕
基于51單片機(jī)和PCF8583的電子鐘設(shè)計(jì)proteus仿真原理圖如下(工程文件可到附件下載):
單片機(jī)源程序如下:
- //-------------------------------------------------------------------
- //名稱:高度仿真數(shù)碼管電子鐘
- //-------------------------------------------------------------------
- //說明:本例在Proteus中選用了高仿真的電子鐘元器件,并添加了時(shí)分調(diào)整
- // 功能,閃爍顯示,AM/PM切換,12h/24h制選擇等。
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar tCount=0;
- //時(shí)鐘設(shè)置開關(guān)及按鍵
- sbit K1=P0^0; //12h/24h
- sbit K2=P0^1; //設(shè)置
- sbit K3=P0^2; //小時(shí)加
- sbit K4=P0^3; //時(shí)鐘加
- //當(dāng)前時(shí)間:時(shí)分秒
- uchar current_Time[ ]={12,59,00};
- //時(shí)分秒顯示緩沖(各占兩位),最后的0x00控制AM,PM及發(fā)光管閃光等
- uchar disp_Buffer[ ]={0,0,0,0,0,0,0x00};
- //12h,24h,AM,PM及SET控制標(biāo)志
- uchar f_24=0,f_AM=0,f_set=0;
- //--------------------------------------------------------------------
- //延時(shí)
- //--------------------------------------------------------------------
- void DelayMS(uint x)
- {
- uchar i;
- while(--x) for (i=0;i<120;i++);
- }
- //--------------------------------------------------------------------
- //加時(shí)
- //--------------------------------------------------------------------
- void Add_Hour()
- {
- //小時(shí)數(shù)累加
- ++current_Time[0];
- //24小時(shí)制時(shí)滿24歸零
- if (f_24 ==1 && current_Time[0] == 24 ) current_Time[0] = 0;
- //12h制滿13歸1,且取反AM與PM標(biāo)志
- if (f_24==0 && current_Time[0]==13)
- {
- current_Time[0]=1;
- //將原來的AM與PM位取反
- disp_Buffer[6]=(disp_Buffer[6]&0xFE)|(~(disp_Buffer[6]&0x01)&0x01);
- }
-
- }
- //--------------------------------------------------------------------
- //加分
- //--------------------------------------------------------------------
- void Add_Miniute()
- {
- //分鐘數(shù)累加
- ++current_Time[1];
- if (current_Time[1]==60)
- {
- current_Time[1]=0;
- Add_Hour();
- }
- }
- //--------------------------------------------------------------------
- //根據(jù)當(dāng)前時(shí)間刷新時(shí)分秒顯示緩沖
- //--------------------------------------------------------------------
- void Refresh_Disp_Buffer()
- {
- uchar i;
- //刷新顯示緩沖
- for (i=0;i<3;i++)
- {
- disp_Buffer[2*i] = current_Time[i]/10;
- disp_Buffer[2*i+1] =current_Time[i]%10;
- }
- }
- //--------------------------------------------------------------------
- //外部中斷
- //--------------------------------------------------------------------
- void EX0_INT() interrupt 0
- {
- ++tCount;
- if (tCount==25) disp_Buffer[6] &=0xF7;//每0.5秒 LED[:]點(diǎn)亮
- if (tCount==50) //每秒刷新顯示緩沖等
- {
- tCount=0;
- disp_Buffer[6] |=0x08; //每1秒 LED[:]關(guān)閉
- if (++current_Time[2] == 60) //秒遞增
- {
- current_Time[2]=0;
- Add_Miniute();
- }
- Refresh_Disp_Buffer(); //刷新時(shí)分秒的顯示緩沖
- }
- }
- //--------------------------------------------------------------------
- //顯示時(shí)間
- //--------------------------------------------------------------------
- void Display_Time()
- {
- uchar i;
- for (i=0;i<7;i++)
- {
- P2=(disp_Buffer[i]<<4)|i|0x08; DelayMS(5);
- P2=P2&0xF7; DelayMS(5);
- }
- }
- //--------------------------------------------------------------------
- //時(shí)鐘調(diào)整與設(shè)置
- //--------------------------------------------------------------------
- void adjust_and_set_clock()
- {
- //設(shè)置狀態(tài)下,調(diào)整時(shí)與分,12h/24h制等
- while (K2==0)
- {
- //設(shè)置12h/24h制
- if (K1==0) //切換12h/24h制
- {
- f_24=1;disp_Buffer[6]|=0x02;
- }
- else
- {
- f_24=0;disp_Buffer[6]&=0xFD;
- }
- //加小時(shí)
- if (K3==0)
- {
- DelayMS(150);//小時(shí)增加時(shí)會(huì)影響am,pm標(biāo)志,因此這里可調(diào)用數(shù)
- Add_Hour();
- }
- //加分鐘
- if (K4==0)
- {
- DelayMS(150);//因?yàn)榧臃昼姷暮瘮?shù)會(huì)向小時(shí)進(jìn)位,故單獨(dú)增加
- current_Time[1]=(current_Time[1]+1)%60;
- }
- Refresh_Disp_Buffer();
- Display_Time();
- }
- }
- //---------------------------------------------------------------------
- //按鍵掃描子程序
- //---------------------------------------------------------------------
- void Keyboard_scan()
- {
- if (K1==0) //切換12h/24h制
- {
- f_24=1;disp_Buffer[6]|=0x02;
- }
- else
- {
- f_24=0;disp_Buffer[6]&=0xFD;
- }
- if (K2==0) //顯示或關(guān)閉"set"
- {
- EX0=0;f_set=1;disp_Buffer[6] |=0x04;
- }
- else
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
高仿真數(shù)碼管電子鐘.rar
(28.92 KB, 下載次數(shù): 60)
2017-6-6 23:45 上傳
點(diǎn)擊文件名下載附件
高仿真電子鐘單片機(jī)1.rar
(24.51 KB, 下載次數(shù): 57)
2017-6-6 23:46 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|