哪位大哥,能帮个忙啊,把两个程序合并,万分感谢
第一个电子时钟:::
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit s1=P2^0; //数码管位选控制端
sbit s2=P2^1;
sbit s3=P2^2;
sbit s4=P2^3;
sbit s5=P2^4;
sbit s6=P2^5;
sbit s7=P2^6;
/*k1设置时间,k2定时。k1,k2使用不自动弹起按键。
k3时分秒选择,k4加数字,k5减数字。*/
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
uchar count=0,sec,min,hour,ss=0;s=60,m=60,h=24;
uchar code mum[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管0-9编码
void delayms(uint k) //延时函数
{
uint i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
/*通过count获得hour,min,sec变量值 */
void
timecontrol()
{
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
hour=0;
}
}
}
void display(uchar zs,uchar zm, uchar zh) //数码管显示函数
{
s1=1;
P0=mum[zh/10];
delayms(5);
s1=0;
s2=1;
P0=mum[zh%10]&0x7f; // 时的个位加上小数点
delayms(5);
s2=0;
s3=1;
P0=mum[zm/10];
delayms(5);
s3=0;
s4=1;
P0=mum[zm%10]&0x7f; //分的个位加上小数点
delayms(5);
s4=0;
s5=1;
P0=mum[zs/10];
delayms(5);
s5=0;
s6=1;
P0=mum[zs%10];
delayms(5);
s6=0;
}
void keyscan_settime() //时间设置模块
{
uchar st,mt,ht;
if(k1==0)
{
delayms(10);
if(k1==0)
{
st=sec,mt=min,ht=hour;
TR0=0; //关闭定时器
while(k1==0) //等待用户按键
{
display(st,mt,ht);
if(k3==0)
{
delayms(10);
if(k3==0)
{
while(!k3);
ss++;
if(ss==3) ss=0;
}
}
/*通过ss选择时分秒设置*/
if(k4==0) //加数
{
delayms(10);
if(k4==0)
{
while(!k4);
switch(ss)
{
case 0:st++;if(st==60)st=0;break;
case 1:mt++;if(mt==60)mt=0;break;
case 2:ht++;if(ht==24)ht=0;break;
default :;
}
}
}
if(k5==0) //减数
{
delayms(10);
if(k5==0)
{
while(!k5);
switch(ss)
{
case 0:if(st>0)st--;
else st=0;break;
case 1:if(mt>0)mt--;
else mt=0;break;
case 2:if(ht>0)ht--;
else ht=0;break;
default : ;
}
}
}
}
TR0=1;
sec=st,min=mt,hour=ht;
}
}
display(sec,min,hour);
}
void keyscan_time() //用户定时模块
{
if(k2==0)
{
delayms(10);
if(k2==0)
{
s=sec;m=min;h=hour;
while(k2==0) //开始定时设置
{
display(s,m,h);
if(k3==0)
{
delayms(10);
if(k3==0)
{
while(!k3);
ss++;
if(ss==3) ss=0;
}
}
/*通过ss选择时分秒设置*/
if(k4==0) //加数
{
delayms(10);
if(k4==0)
{
while(!k4);
switch(ss)
{
case 0:s++;if(s==60)s=0;break;
case 1:m++;if(m==60)m=0;break;
case 2:h++;if(h==24)h=0;break;
default :;
}
}
}
if(k5==0) //减数
{
delayms(10);
if(k5==0)
{
while(!k5);
switch(ss)
{
case 0:if(s>0)s--;
else s=0;break;
case 1:if(m>0)m--;
else m=0;break;
case 2:if(h>0)h--;
else h=0;break;
default : ;
} }
}
}
}
}
}
void buz()
{
if((hour==h)&&(min==m)&&(sec==s))
{
s7=0;
delayms(20);
s7=1;
}
}
void main()
{
TMOD=0x01; //定时器0工作在方式1
TH0=(65536-45872)/256; //装初值,50ms
TL0=(65536-45872)%256;
EA=1; //总中断允许
ET0=1; //T0中断允许
TR0=1; //开定时器0
while(1)
{
keyscan_settime();
keyscan_time();
buz();
}
}
void T0_ms() interrupt 1 //中断入口程序
{
TH0=(65536-45872)/256; //重新装初值
TL0=(65536-45872)%256;
count++;
if(count==20) //判定1s时间是否已到
{
count=0;
timecontrol();
}
}
第二个:流水灯(P3口的)
#include<reg51.h> // T0 计数器#define uint unsigned int uint tt, temp;void main(){TMOD=0x01;TH0=(65535-50000)/256; // 50 mSTL0=(65535-50000)%256; EA=1; ET0=1; TR0=1; temp=0x01; tt=0; while(1) { }}void Timer0(void) interrupt 1 // 定时器0 { TH0=(65535-50000)/256; TL0=(65535-50000)%256; if(tt==20) { tt=0; temp=temp<<1; if(temp==0x00) { temp=0x01; } P3=~temp; } }
原电路图再附件,现在电子时钟已经OK了,可是我把两个程序合并并烧入,仿真没有反应啊,(看附件)实物的电路板已经焊接好了。
思路:P1 P2 为电子时钟的,P3为流水灯的。
(
强大点: 上电后,电子时钟运行,而每隔5分钟 流水灯依次点亮(P3.0-P3.7 间隔2秒)再全亮2秒))
(简单点: 上电后,电子时钟运行,流水灯依次点亮(P3.0-P3.7 间隔2秒)再全亮2秒,不断循环)
哪位大哥,能帮个忙啊,把两个程序合并,万分感谢!
2333.jpg (56.34 KB, 下载次数: 0) 22 小时前 上传点击文件名下载附件
捕捉_6.jpg (191.98 KB, 下载次数: 0) 22 小时前 上传点击文件名下载附件
捕捉_5.jpg (126.34 KB, 下载次数: 0) 22 小时前 上传点击文件名下载附件
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit s1=P2^0; //数码管位选控制端
sbit s2=P2^1;
sbit s3=P2^2;
sbit s4=P2^3;
sbit s5=P2^4;
sbit s6=P2^5;
sbit s7=P2^6;
/*k1设置时间,k2定时。k1,k2使用不自动弹起按键。
k3时分秒选择,k4加数字,k5减数字。*/
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
uchar count=0,sec,min,hour,ss=0;s=60,m=60,h=24;
uchar code mum[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管0-9编码
void delayms(uint k) //延时函数
{
uint i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
/*通过count获得hour,min,sec变量值 */
void timecontrol()
{
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
hour=0;
}
}
}
void ledshow() //led显示
{
uchar minsub;
minsub=min%5;
if(minsub==0)
{
switch(sec)
{
case 0:P3=0xfe;break;
case 2:P3=0xfd;break;
case 4:P3=0xfb;break;
case 6:P3=0xf7;break;
case 8:P3=0xef;break;
case 10:P3=0xdf;break;
case 12:P3=0xbf;break;
case 14:P3=0x7f;break;
case 16:P3=0x00;break;
}
}
if(sec>16)
{P3=0xff;}
}
void display(uchar zs,uchar zm, uchar zh) //数码管显示函数
{
s1=1;
P0=mum[zh/10];
delayms(5);
s1=0;
s2=1;
P0=mum[zh%10]&0x7f; // 时的个位加上小数点
delayms(5);
s2=0;
s3=1;
P0=mum[zm/10];
delayms(5);
s3=0;
s4=1;
P0=mum[zm%10]&0x7f; //分的个位加上小数点
delayms(5);
s4=0;
s5=1;
P0=mum[zs/10];
delayms(5);
s5=0;
s6=1;
P0=mum[zs%10];
delayms(5);
s6=0;
}
void keyscan_settime() //时间设置模块
{
uchar st,mt,ht;
if(k1==0)
{
delayms(10);
if(k1==0)
{
st=sec,mt=min,ht=hour;
TR0=0; //关闭定时器
while(k1==0) //等待用户按键
{
display(st,mt,ht);
if(k3==0)
{
delayms(10);
if(k3==0)
{
while(!k3);
ss++;
if(ss==3) ss=0;
}
}
/*通过ss选择时分秒设置*/
if(k4==0) //加数
{
delayms(10);
if(k4==0)
{
while(!k4);
switch(ss)
{
case 0:st++;if(st==60)st=0;break;
case 1:mt++;if(mt==60)mt=0;break;
case 2:ht++;if(ht==24)ht=0;break;
default :;
}
}
}
if(k5==0) //减数
{
delayms(10);
if(k5==0)
{
while(!k5);
switch(ss)
{
case 0:if(st>0)st--;
else st=0;break;
case 1:if(mt>0)mt--;
else mt=0;break;
case 2:if(ht>0)ht--;
else ht=0;break;
default : ;
}
}
}
}
TR0=1;
sec=st,min=mt,hour=ht;
}
}
display(sec,min,hour);
}
void keyscan_time() //用户定时模块
{
if(k2==0)
{
delayms(10);
if(k2==0)
{
s=sec;m=min;h=hour;
while(k2==0) //开始定时设置
{
display(s,m,h);
if(k3==0)
{
delayms(10);
if(k3==0)
{
while(!k3);
ss++;
if(ss==3) ss=0;
}
}
/*通过ss选择时分秒设置*/
if(k4==0) //加数
{
delayms(10);
if(k4==0)
{
while(!k4);
switch(ss)
{
case 0:s++;if(s==60)s=0;break;
case 1:m++;if(m==60)m=0;break;
case 2:h++;if(h==24)h=0;break;
default :;
}
}
}
if(k5==0) //减数
{
delayms(10);
if(k5==0)
{
while(!k5);
switch(ss)
{
case 0:if(s>0)s--;
else s=0;break;
case 1:if(m>0)m--;
else m=0;break;
case 2:if(h>0)h--;
else h=0;break;
default : ;
} }
}
}
}
}
}
void buz()
{
if((hour==h)&&(min==m)&&(sec==s))
{
s7=0;
delayms(20);
s7=1;
}
}
void main()
{
TMOD=0x01; //定时器0工作在方式1
TH0=(65536-45872)/256; //装初值,50ms
TL0=(65536-45872)%256;
EA=1; //总中断允许
ET0=1; //T0中断允许
TR0=1; //开定时器0
P3=0XFF;
while(1)
{
ledshow();
keyscan_settime();
keyscan_time();
buz();
}
}
void T0_ms() interrupt 1 //中断入口程序
{
TH0=(65536-45872)/256; //重新装初值
TL0=(65536-45872)%256;
count++;
if(count==20) //判定1s时间是否已到
{
count=0;
timecontrol();
}
}
一周热门 更多>