找回密码
 注册会员
搜索附件  
MCU资讯论坛 附件中心 单片机论坛 51单片机论坛 5_48645_23ba27c81bd545f.jpg

5_48645_23ba27c81bd545f.jpg

 

电子钟请教:
各位大师你们好!本人刚学习单片机,很多东西不明白,特来向各位请教!QQ:664967791 lhfplc@126.com
资料说明:时钟电路板是在一收旧贩购得,见图片。上有时钟数码管4位,AT89C52等,12M晶振。
图纸说明:照实物测绘无误,见PDF文件。


问题是:怎样从P0口分离出P0^0,让秒点闪烁。
问题说明:秒点D5、D6由P0口的P0^0控制输出,D5在DIG.3位,D6在DIG.4位,也就是图中的Q3、Q4控制的个位和十位
图片:








程序说明:网上下载,修改如下
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define sled_dm_port P0 /*定义P0口为段码控制口*/
#define sled_wm_port P1 /*定义P1口为位码控制口*/
sbit fm=P1^0; /*蜂鸣器输出声明*/
sbit dula=P1^1; /*运行指示灯声明*/
sbit s1=P2^0; /*设置键声明*/
sbit s2=P2^1; /*加一键声明*/
sbit s3=P2^2; /*减一键声明*/
sbit s4=P2^3; /*闹钟键声明*/

uchar data count; /*50MS信号变量*/
uint data flag_count; /*1MS到5S的变量*/
uchar data flag; /*累加到5S的启动标志位*/
char data sec=0,min=0,hou=12; /*时钟的秒分时计数器*/
char data nz_sec=0,nz_min=0,nz_hou=0; /*闹钟的秒分时计数器*/
uchar data set_count,nz_count,dr; /*设置键按下次数变量,闹钟键按下次数变量,缓冲数组偏移变量*/
uchar data dis_buff[8]; /*段码缓冲数组*/
uchar code num_table[10]={0x10,0xba,0x48,0x44,0x86,0x24,0x20,0x56,0x00,0x04};
/* 0 1 2 3 4 5 6 7 8 9 .*/
uchar data lighten_bit_table[4]={0xfb,0xf7,0xef,0xdf};/*定义每次扫描时需点亮的数码管*/

void TimerValueSet(); /*定时器初始化程序*/
void key_scan(); /*设置键s1和闹钟键s4扫描程序*/
void set_time(); /*时间设置程序*/
void set_disp(); /*时间设置时的显示程序*/
void display(); /*无键按下时的显示程序*/
void set_nz(); /*闹钟设置程序*/
void nzset_disp(); /*闹钟设置时的显示程序*/
void alarm(); /*闹钟报警程序*/
set_add(uchar n); /*按键加1程序*/
set_sub(char n); /*按键减1程序*/
void delay_1ms(uint x); /*1ms为单位的延时程序*/

/*主程序*/
void main()
{
TimerValueSet();
while(1)
{
key_scan();
set_time();
set_nz();
if(set_count==0&nz_count==0)
alarm();
}
}
/*定时器初始化程序*/
void TimerValueSet()
{
TMOD=0x11;
IE=0x8a;
IP=0x08;
TH0=0x4c; /*载入50ms定时初值*/
TL0=0x00;
TH1=0xfc; /*载入1ms定时初值*/
TL1=0x67;
TR0=1;
TR1=1;
}
/*设置键s1和闹钟键s4扫描程序*/
void key_scan()
{
if(s1==0&nz_count==0) /*设置键按下且之前没有按下闹钟键*/
{
delay_1ms(20);
if(s1==0)
{
while(!s1);
set_count++;
if(set_count==3) /*设置键按下3次则清零退出设置*/
set_count=0;
}
}
if(s4==0&set_count==0) /*闹钟键按下且之前没有按下设置键*/
{
delay_1ms(20);
if(s4==0)
{
while(!s4);
nz_count++;
if(nz_count==3) /*闹钟键按下3次则清零退出设置*/
nz_count=0;
}
}
}
/*时间设置程序*/
void set_time()
{
if(set_count!=0)
{
flag=1;
while(s2&s3)
{
key_scan();
if(flag_count>=5000)
{
set_count=0; /*5S内无键按下则退出设置*/
break;
}
}
flag_count=0;
flag=0;
}
if(set_count==1)
{
hou=set_add(hou);
if(hou==24)
hou=0;
hou=set_sub(hou);
if(hou<0)
hou=23;
}
if(set_count==2)
{
min=set_add(min);
if(min==60)
min=0;
min=set_sub(min);
if(min<0)
min=59;
}
}
/*闹钟设置程序*/
void set_nz()
{
if(nz_count!=0)
{
flag=1;
while(s2&s3)
{
key_scan();
if(flag_count>=5000)
{
nz_count=0; /*5S内无键按下则退出闹钟设置*/
break;
}
}
flag_count=0;
flag=0;
}
if(nz_count==1)
{
nz_hou=set_add(nz_hou);
if(nz_hou==24)
nz_hou=0;
nz_hou=set_sub(nz_hou);
if(nz_hou<0)
nz_hou=23;
}
if(nz_count==2)
{
nz_min=set_add(nz_min);
if(nz_min==60)
nz_min=0;
nz_min=set_sub(nz_min);
if(nz_min<0)
nz_min=59;
}
}
/*无键按下时的显示程序*/
void display()
{
dis_buff[1]=num_table[min/10];
dis_buff[0]=num_table[min%10];
dis_buff[3]=num_table[hou/10];
dis_buff[2]=num_table[hou%10];
if(set_count==0&nz_count==0) /*无键按下时的显示*/
{
sled_wm_port=0xff;
if(dr==2&count<10)
sled_dm_port=dis_buff[dr]&0x7f;
else
{ if(dr==3&dis_buff[3]==0xc0) /*若时变量的十位为零是则不显示*/
sled_dm_port=0xff;
else
sled_dm_port=dis_buff[dr];
}
sled_wm_port=lighten_bit_table[dr];
}
if(set_count!=0) /*设置键按下调用设置显示程序*/
set_disp();
if(nz_count!=0) /*闹钟键按下调用闹钟显示程序*/
nzset_disp();
dr++;
if(dr==4) /*将dr改为4,段码缓冲数组元素个数改为4可提高扫描亮度*/
dr=0;
}
/*时间设置时的显示程序*/
void set_disp()
{
if(set_count==1)
{
sled_wm_port=0xff;
switch(dr)
{
case 0:
case 1:sled_dm_port=dis_buff[dr];break;
case 2:if(count<10)sled_dm_port=dis_buff[dr]&0x7f;else sled_dm_port=0x7f;break;
case 3:if(count<10&dis_buff[3]!=0xc0)sled_dm_port=dis_buff[dr];else sled_dm_port=0xff;break;
default:sled_dm_port=0xff;break;
}
sled_wm_port=lighten_bit_table[dr];
}
if(set_count==2)
{
sled_wm_port=0xff;
switch(dr)
{
case 0:
case 1:if(count<10)sled_dm_port=dis_buff[dr];else sled_dm_port=0xff;break;
case 2:sled_dm_port=dis_buff[dr]&0x7f;break;
case 3:if(dis_buff[3]!=0xc0)sled_dm_port=dis_buff[dr];else sled_dm_port=0xff;break;
default:sled_dm_port=0xff;break;
}
sled_wm_port=lighten_bit_table[dr];
}
}
/*闹钟设置时的显示程序*/
void nzset_disp()
{
if(nz_count==1)
{
sled_wm_port=0xff;
switch(dr)
{
case 0: sled_dm_port=num_table[nz_min%10];break;
case 1: sled_dm_port=num_table[nz_min/10];break;
case 2: if(count<10)
sled_dm_port=num_table[nz_hou%10]&0x7f;else sled_dm_port=0xff;break;
case 3: if(count<10&num_table[nz_hou/10]!=0xc0)
sled_dm_port=num_table[nz_hou/10];else sled_dm_port=0xff;break;
default:sled_dm_port=0xff; break;
}
sled_wm_port=lighten_bit_table[dr];
}
if(nz_count==2)
{
sled_wm_port=0xff;
switch(dr)
{
case 0: if(count<10)
sled_dm_port=num_table[nz_min%10];else sled_dm_port=0xff;break;
case 1: if(count<10)
sled_dm_port=num_table[nz_min/10];else sled_dm_port=0xff;break;
case 2: if(count<10)
sled_dm_port=num_table[nz_hou%10]&0x7f;else sled_dm_port=num_table[nz_hou%10];break;
case 3: if(num_table[nz_hou/10]!=0xc0)
sled_dm_port=num_table[nz_hou/10];else sled_dm_port=0xff;break;
default:sled_dm_port=0xff;break;
}
sled_wm_port=lighten_bit_table[dr];
}
}
/*闹钟报警程序*/
void alarm()
{
if(hou==nz_hou&min==nz_min)
{
if(sec%2==0&sec<30)
{
fm=0;
delay_1ms(300);
fm=1;
delay_1ms(100);
fm=0;
delay_1ms(400);
fm=1;
delay_1ms(200);
}
}
}
/*按键加1程序*/
set_add(uchar n)
{
if(s2==0)
{
delay_1ms(20);
if(s2==0)
{
n++;
while(!s2);
}
}
return n;
}
/*按键减1程序*/
set_sub(uchar n)
{
if(s3==0)
{
delay_1ms(20);
if(s3==0)
{
n--;
while(!s3);
}
}
return n;
}
/*定时器T0中断处理*/
void Timer0() interrupt 1
{
TH0=0x4c;
TL0=0x00;
count++;
if(count==20)
{
count=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hou++;
if(hou==24)
hou=0;
}
}
}
}
/*定时器T1中断处理*/
void Timer1() interrupt 3
{
TH1=0xfc;
TL1=0x67;
if(flag)
flag_count++;
display();
}
/*1ms位单位的延时程序*/
void delay_1ms(uint x)
{
uchar i;
while(x--)
for(i=0;i<125;i++);
}
5_48645_23ba27c81bd545f.jpg

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-29 01:42 , Processed in 0.037478 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部