|
直接发包 两个包 ,两个电路有点差别 ,程序是一样的,都proteus图加源代码 ,加生成好的hex、
带小时 分钟时间设置和 12/24 小时显示按钮
基于51单片机和PCF8583的电子钟设计proteus仿真原理图如下(工程文件可到附件下载):
单片机源程序如下:
- //-------------------------------------------------------------------
- //名称:高度仿真数码管电子钟
- //-------------------------------------------------------------------
- //说明:本例在Proteus中选用了高仿真的电子钟元器件,并添加了时分调整
- // 功能,闪烁显示,AM/PM切换,12h/24h制选择等。
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar tCount=0;
- //时钟设置开关及按键
- sbit K1=P0^0; //12h/24h
- sbit K2=P0^1; //设置
- sbit K3=P0^2; //小时加
- sbit K4=P0^3; //时钟加
- //当前时间:时分秒
- uchar current_Time[ ]={12,59,00};
- //时分秒显示缓冲(各占两位),最后的0x00控制AM,PM及发光管闪光等
- uchar disp_Buffer[ ]={0,0,0,0,0,0,0x00};
- //12h,24h,AM,PM及SET控制标志
- uchar f_24=0,f_AM=0,f_set=0;
- //--------------------------------------------------------------------
- //延时
- //--------------------------------------------------------------------
- void DelayMS(uint x)
- {
- uchar i;
- while(--x) for (i=0;i<120;i++);
- }
- //--------------------------------------------------------------------
- //加时
- //--------------------------------------------------------------------
- void Add_Hour()
- {
- //小时数累加
- ++current_Time[0];
- //24小时制时满24归零
- if (f_24 ==1 && current_Time[0] == 24 ) current_Time[0] = 0;
- //12h制满13归1,且取反AM与PM标志
- 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()
- {
- //分钟数累加
- ++current_Time[1];
- if (current_Time[1]==60)
- {
- current_Time[1]=0;
- Add_Hour();
- }
- }
- //--------------------------------------------------------------------
- //根据当前时间刷新时分秒显示缓冲
- //--------------------------------------------------------------------
- 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[:]点亮
- if (tCount==50) //每秒刷新显示缓冲等
- {
- tCount=0;
- disp_Buffer[6] |=0x08; //每1秒 LED[:]关闭
- if (++current_Time[2] == 60) //秒递增
- {
- current_Time[2]=0;
- Add_Miniute();
- }
- Refresh_Disp_Buffer(); //刷新时分秒的显示缓冲
- }
- }
- //--------------------------------------------------------------------
- //显示时间
- //--------------------------------------------------------------------
- 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);
- }
- }
- //--------------------------------------------------------------------
- //时钟调整与设置
- //--------------------------------------------------------------------
- void adjust_and_set_clock()
- {
- //设置状态下,调整时与分,12h/24h制等
- while (K2==0)
- {
- //设置12h/24h制
- if (K1==0) //切换12h/24h制
- {
- f_24=1;disp_Buffer[6]|=0x02;
- }
- else
- {
- f_24=0;disp_Buffer[6]&=0xFD;
- }
- //加小时
- if (K3==0)
- {
- DelayMS(150);//小时增加时会影响am,pm标志,因此这里可调用数
- Add_Hour();
- }
- //加分钟
- if (K4==0)
- {
- DelayMS(150);//因为加分钟的函数会向小时进位,故单独增加
- 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) //显示或关闭"set"
- {
- EX0=0;f_set=1;disp_Buffer[6] |=0x04;
- }
- else
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
高仿真数码管电子钟.rar
(28.92 KB, 下载次数: 59)
高仿真电子钟单片机1.rar
(24.51 KB, 下载次数: 53)
|
评分
-
查看全部评分
|