希望朋友们帮忙,给一下STC89C52单片机 C语言实现数字时钟的程序,初学单片机,请多关照 6个8位数码管显示

如题所述

使用方法:
1.长按SETEN(P3.3,(S3))键1.5s,进入时间设置状态, 首先秒位会闪动
2.按时间+1(P3.4,(S6)),或者时间-1(P3.5,(S9)) 来对闪动的部分进行时间设置
3.再按SETEN键,调整分钟,分钟位会闪烁,重复步骤2,设置好分钟。
4.再按SETEN键,调整小时,小时位会闪烁,重复步骤2,设置好小时。
5.再按SETEN键,又进入到步骤2,如此循环。
6.当设置好时间,再长按SETEN键,即可退出调整状态,正常功能工作。

注意:如果在按键操作中,按键不管是长按还是正常按下,都要在按键释放时,单片机才会去执行相应的操作。否则单片机一直等待按键的释放。

#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define nokey 0xFF

sbit SetEN = P3^3; //(S3)1. 时间设置使能; 2. 时间位切换
sbit ADDT = P3^4; //(S6)时间+
sbit DECT = P3^5; //(S9)时间-

bit Bicker_Floag; //调整时间的时候,闪烁标志位
bit Set_Floag; //设置状态标志位
uchar Count; //50ms计数器
uchar Key_Time; //按键按下时间计数器
uchar Time_item; //时间项标志 0:秒 1:分 2:小时

uchar time_reg[3];
uchar code LEDcode[11]={
0xFC, /*0*/
0x60, /*1*/
0xDA, /*2*/
0xF2, /*3*/
0x66, /*4*/
0xB6, /*5*/
0xBE, /*6*/
0xE0, /*7*/
0xFE, /*8*/
0xF6, /*9*/
0x00};//共阴极代码

void ini()
{
Time_item = 0;
Count = 0;
Key_Time = 0;
Bicker_Floag = 0;
Set_Floag = 0;
time_reg[0] = 0; //秒缓冲区清除
time_reg[1] = 0; //分缓冲区清除
time_reg[2] = 0; //时缓冲区清除
TMOD = 0x01;
TH0 = 0x4C;
TL0 = 0x00;
TR0 = 1;
ET0 = 1;
EA = 1;
}

void delay(uint ms)
{
uchar i;
for(;ms>0;ms--)
{
i=150;
while(i--);
}
}
void display()
{
uchar i,j;
j=0xF8;
for(i=0; i<3; i++)
{
P0 = LEDcode[time_reg[i]%10]; // 低位
P2 &= j; //打开位码
if(Bicker_Floag==1 && Time_item==i) P2 |= 0x07; //关闭显示
delay(2);
P2 |= 0x07; //关闭显示
j++;

P0 = LEDcode[time_reg[i]/10]; // 高位
P2 &= j;
if(Bicker_Floag==1 && Time_item==i) P2 |= 0x07; //关闭显示
delay(2);
P2 |= 0x07;
j++;
}
}

uchar keyscanf()
{
uchar i,key;
Key_Time = 0;
i = P3;
i &= 0x78;
if(i == 0x78) return(nokey);
display(); //去抖动
i = P3;
i &= 0x78;
if(i == 0x78) return(nokey);

key = i;
while(i!=0x78) //等待释放按键
{
i = P3;
i &= 0x78;
display();
if(++Key_Time==255) Key_Time=100;
display();
}

switch(key)
{
case 0x70: return(1);
case 0x68: return(2);
case 0x58: return(3);
case 0x38: return(4);
default: return(nokey);
}
}

void Settime(uchar sn)
{
uchar i;
if(sn==1)
{
if(Key_Time<=20) goto a;
Set_Floag = 1; //进入设置时间标志位
while(1)
{
do
{
i=keyscanf();
display();
}
while(i==nokey);
if(i==1)
{
if(Key_Time>=20) break;
if(++Time_item == 3) Time_item =0;
}
if(i==2)
{
if(Time_item == 2)
{
if(++time_reg[Time_item]==24) time_reg[Time_item]=0;
}
else if(++time_reg[Time_item]==60) time_reg[Time_item]=0;
}
if(i==3)
{
if(time_reg[Time_item]==0)
{
if(Time_item==2) time_reg[Time_item]=24;
else time_reg[Time_item]=60;
}
time_reg[Time_item]--;
}
}
a: Set_Floag = 0; //退出设置时间标志位
Bicker_Floag = 0; //数码管显示闪烁标志位关
}
}

void TIMER0() interrupt 1
{
TR0 = 0;
TH0 = 0x4C;
TL0 = 0x00;
TR0 = 1;
if(!Set_Floag)
{
if(++Count==20)
{
Count = 0;
if(++time_reg[0]==60)
{
time_reg[0] = 0;
if(++time_reg[1] == 60)
{
time_reg[1] = 0;
if(++time_reg[2] == 24)
time_reg[2] = 0;
}
}
}
}
else
{
Count++;
if(Count==1) Bicker_Floag = 0;
if(Count==10) Bicker_Floag = 1; //亮时间
if(Count==12) Count = 0; //灭时间
}
}

void main()
{
ini();
while(1)
{
display();
Settime(keyscanf());
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-10-04
什么意思?

STC89c52单片机设计6位数码管电子钟时钟
{s1num=0;write_com(0x0c);TR0=1;}

stc89c52是stc的哪种型号?
STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的...

求STC89c52详细介绍。说说它与51的区别,以及STC系列单片机的特点,优点...
与51的主要区别是:51只有4K程序存储空间,52有8K51只有128字节数据存储空间,52有256个51只有2个定时器,52有3个。STC单片机是以51内核为主的系列单片机,STC单片机是宏晶生产的单时钟\/机器周期的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8—12倍,内...

...如stc89c52,这样子,麻烦大神帮我一一列一下吧
STC的单片机,FLASH存储器最大可达62K,你这么点小程序算是小菜一碟了。STC89系列的就有62K的,不过,你用不了这么大,也不用买这么大的内存的。如下图,可选一款吧。还是STC89系列,什么也不用改,头文件也不用改,只要你愿意花钱买一片就行。画红圈那一项,就是FLASH内部。不过,你既然选STC...

跪求!!!STC89C52单片机,用八个按键控制分别控制八个LED灯的代码(C语言...
检测端口电平并做如下判断{case 0xfe:P0=dofly_table[1];LED0=0;break;\/\/0xfe = 1111 1110,\/\/说明连接在P3.0端口的按键被按下,显示对应的数字然后跳出循环case 0xfd:P0=dofly_table[2];LED1=0;break;\/\/调用表中的第三个\/\/元素 0xa4 下标 0 才表示数组中的第一个元素case 0xfb:P0=...

【求单片机C语言程序】STC89C52通过两个外部中断P3.2和P3.3,来控制P1....
void INT0_ROUTING() interrupt 0\/\/外部中断0子程序 { P0=0xfe;\/\/LED0点亮 while((P3|0xfb)==0xff);\/\/等待外部中断0口(P3^2松开)delay(10);\/\/延时去抖动 P0=0xff;\/\/LED0熄灭 } void INT0_ROUTING() interrupt 2 { P0=0xfd;\/\/LED1点亮 while((P3|0xf7)==0xff);\/\/等待外部...

寒假打算学习一下单片机,不知道哪个单片机开发板好?
吴鉴鹰单片机开发板 资源介绍 1、一个CH340的USB转UART芯片,实现USB下载程序,为无串口的笔记本电脑提供下载方便。2、板子上电源入口有一个自恢复保险丝,可以有效的保护您的电脑主板和开发板。加上这个保险,作为初学的你,即使不小心短路了,也不会烧主板和单片机。3、板子自带单片机,一个STC89C52RC,...

STC89C52单片机USB转串口下载这个问题怎么解决?望高手帮忙!虽字有点...
1.冷启动:冷启动就是,你先插上串口USB线,先点STC-ISP的程序下载,再按下电源开关;如果已经接通了电源,就按电源关闭MCU供电,再开一次就行了。2.单片机出厂时内部的程序,在你下载程序的时候,可以不用管它的,单片机烧入程序的时候都是从起始地址开始写的,也就是说会把原来的程序覆盖掉,对...

单片机的 分类
(4)OTPROM型\/EPROM型\/FLash ROM型 硬件特征 (1)单片机的体积比较小, 内部芯片作为计算机系统,其结构简单,但是功能完善,使用起来十分方便,可以模块化应用。(2)单片机有着较高的集成度,可靠性比较强,即使单片机处于长时间的工作也不会存在故障问题。(3) 单片机在应用时低电压、低能耗,是人们...

单片机按键程序,按一下让LED点亮几秒,再按一下点亮的时间更长
sbit LED=P1^1;unsigned char SZ[]={3,5,7,9,11,13,15} delay1s();void main(){ while(1){ if(K1==0){LED=0,TR1=1};delay1s();LED=1;} } delay1s(){ while(LED=0){ for(i=0;i<k;i++){ TMOD=0x10;TH1=0x3c;TL1=0xb0;while(!TF1);TF1=0;} } } 思路仅供参考...

相似回答
大家正在搜