高分!急求89C51单片机简单程序问题。这个小程序有几个问题,麻烦路过的高手看看。 主要是做一个可调时钟
问题1初始时显示正常,按下key1(开始)之后,十位不显示问题2开始后,key2暂停键,要按几次才起作用,不灵敏问题3在开始之后,调时间加减的时候,定时器中断会停止,le...
问题1 初始时显示正常,按下key1(开始)之后,十位不显示
问题2 开始后,key2暂停键,要按几次才起作用,不灵敏
问题3 在开始之后,调时间加减的时候,定时器中断会停止,led1会停止闪烁
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P2^0;//开始
sbit key2=P2^1;//暂停
sbit key3=P2^2;//时间加
sbit key4=P2^4;//时间减
sbit wei1=P1^1;sbit wei2=P1^2;
sbit baojing=P2^7;sbit led1=P1^0;
sbit moshia=P3^4;
sbit moshib=P3^3;
sbit moshifuhe=P3^1;
sbit vcc1=P3^5;//vcc1和vcc2是两个led灯,
sbit vcc2=P3^0;
uchar code table[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint);
void keyscan();
uchar num=30,numt0,numt1;
void delay (uint x)
{
uint j;
while(x--)
{
for(j=110;j>0;j--);
}
}
void display(uchar numdis)
{
uchar shi,ge;
shi=numdis/10;
ge=numdis%10;
wei1=0;
wei2=1;
P0=table[shi];
delay(5);
wei1=1;
wei2=0;
P0=table[ge];
delay(5);
}
void moshi()//通过模式函数,控制两个led灯亮灭
{
while(key2==1)
{
if(moshia==0)//交替闪亮
{
vcc1=1;vcc2=0;
delay(1000);
vcc1=0;vcc2=1;
delay(1000);
}
if(moshib==0)//同时亮同时灭
{
vcc1=1;
vcc2=1;
delay(1000);
vcc1=0;vcc2=0;
delay(1000);
}
if(moshifuhe==0)//一直亮
{
vcc1=1;
vcc2=1;
}
} }
void init()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
led1=0;
}
void keyscan(){
if(key1==0)
{
delay(10);
if(key1==0)
{
while(!key1);
TR0=1;
moshi();
}
}
if(key2==0)
{
delay(10);
if(key2==0);
{
while(!key2);
TR0=0;
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
num=num+5;
if(num==50)
num=0;
while(!key3);
}
}
if(key4==0)
{
delay(10);
if(key4==0)
{
if(num==0)
num=50;
num=num-5;
while(!key4);
}
}
}
void main()
{
init();
while(1)
{
keyscan();
display(num);
if(num==0)
{
TR0=0;
while(1)
{
baojing=0;
delay(1000);
baojing=1;
delay(1000);
}
}
}
}
void T0_time()interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
numt0++;
if(numt0==20)
{
numt0=0;
led1=~led1;
numt1++;
}
if(numt1==60)
{
numt1=0;
num--;
display(num);
}
}
如果可以解决,再加20 ,没多少分了。 展开
问题2 开始后,key2暂停键,要按几次才起作用,不灵敏
问题3 在开始之后,调时间加减的时候,定时器中断会停止,led1会停止闪烁
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P2^0;//开始
sbit key2=P2^1;//暂停
sbit key3=P2^2;//时间加
sbit key4=P2^4;//时间减
sbit wei1=P1^1;sbit wei2=P1^2;
sbit baojing=P2^7;sbit led1=P1^0;
sbit moshia=P3^4;
sbit moshib=P3^3;
sbit moshifuhe=P3^1;
sbit vcc1=P3^5;//vcc1和vcc2是两个led灯,
sbit vcc2=P3^0;
uchar code table[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint);
void keyscan();
uchar num=30,numt0,numt1;
void delay (uint x)
{
uint j;
while(x--)
{
for(j=110;j>0;j--);
}
}
void display(uchar numdis)
{
uchar shi,ge;
shi=numdis/10;
ge=numdis%10;
wei1=0;
wei2=1;
P0=table[shi];
delay(5);
wei1=1;
wei2=0;
P0=table[ge];
delay(5);
}
void moshi()//通过模式函数,控制两个led灯亮灭
{
while(key2==1)
{
if(moshia==0)//交替闪亮
{
vcc1=1;vcc2=0;
delay(1000);
vcc1=0;vcc2=1;
delay(1000);
}
if(moshib==0)//同时亮同时灭
{
vcc1=1;
vcc2=1;
delay(1000);
vcc1=0;vcc2=0;
delay(1000);
}
if(moshifuhe==0)//一直亮
{
vcc1=1;
vcc2=1;
}
} }
void init()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
led1=0;
}
void keyscan(){
if(key1==0)
{
delay(10);
if(key1==0)
{
while(!key1);
TR0=1;
moshi();
}
}
if(key2==0)
{
delay(10);
if(key2==0);
{
while(!key2);
TR0=0;
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
num=num+5;
if(num==50)
num=0;
while(!key3);
}
}
if(key4==0)
{
delay(10);
if(key4==0)
{
if(num==0)
num=50;
num=num-5;
while(!key4);
}
}
}
void main()
{
init();
while(1)
{
keyscan();
display(num);
if(num==0)
{
TR0=0;
while(1)
{
baojing=0;
delay(1000);
baojing=1;
delay(1000);
}
}
}
}
void T0_time()interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
numt0++;
if(numt0==20)
{
numt0=0;
led1=~led1;
numt1++;
}
if(numt1==60)
{
numt1=0;
num--;
display(num);
}
}
如果可以解决,再加20 ,没多少分了。 展开
展开全部
问题一中提到的十位没显示是因为你的程序在运行到那儿时循环等待你的输入,所以无法继续显示十位,这是程序设计的问题,得到这样的结果很正常.还有程序中怎么有两个delay函数和keyscan函数.?至于问题二,可能是延时程序导致的吧,你自己再试试.祝你好运!
追问
多谢回答。你说的等待输入我没看懂。keyscan是按键程序,delay是简单延时。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的按键都得去抖啊,第一个、第二个问题都是没有去抖啊。
追问
去抖了吧,delay(10)不行吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以解决。
楼主的思路不对。
楼主的思路不对。
更多追问追答
追问
这个,应该是什么样的思路?
追答
显示函数,缺少消隐的部分,换下一位时,前一位的数据,会显示在下一位上。
按键消抖、等待释放,都使用了延时函数,此时,显示就停顿了,这不行。
某个灯亮,多少毫秒?此期间,数码显示,也停顿了。
应该使用《显示函数》代替《延时函数》。
另外,几个按键的功能,从程序中,看的比较模糊。
可否用《中文》说明一下?
----
if(key2==0)
{
delay(10);
if(key2==0);----这里多了一个分号
{
while(!key2);
TR0=0;
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询