谢谢高手们的帮助,问题已解决!! 谢谢!!!![]() |
yf15966844335 发表于 2018-11-11 09:39 time是由key1和key2控制的时间 比如key1是倒计时30秒,key2倒计时50秒 |
| 为什么要在进入while前有一个TR0=0,这是关闭定时器 |
|
修改了你的程序: #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar code table[]={0xc0,0xf9,0xa4, 0xb0,0x99,0x92, 0x82,0xf8,0x80, 0x90}; sbit gew=P2^1; sbit shiw=P2^0; sbit k1=P1^0; sbit k2=P1^1; uchar num,num1,time,shi,ge; uchar t0s; uchar k1zt,k2zt; char miao; /*void Init() //初始化子函数 { TMOD=0X01; //设定定时器0的工作方式为1 TH0=(65536-50000)/256; //定时器装初值一个周期50ms TL0=(65536-50000)%256; //EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器0 }*/ void delay(uint xms) //延时子函数 { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void scankey() //键盘检测子函数 { if(k1==0) //检测键是否被按下 { delay(5); //延时消除抖动 if(k1==0) //重新读取k2的值 { while(!k1); //等待按键释放 { TR0=1; num1=5; //K1为5秒倒计时 k1zt=1;//保存状态 } } } if(k2==0) //检测键是否被按下 { delay(5); //延时消除抖动 if(k2==0) //重新读取k2的值 { while(!k2); //等待按键释放 { TR0=1; num1=10; //K2为10秒倒计时 k2zt=1;//保存状态 } } } } void xianshi(uchar shi,uchar ge) //延时子函数 { //个位显示 gew=1; //打开数码管个位位选 P0=table[ge]; //数码管个位赋值 delay(1); //延时 送入数据的反应时间 gew=0; //关闭数码管个位位选 //delay(1); //十位显示 shiw=1; //打开数码管十位位选 P0=table[shi]; //送入数据 delay(1); shiw=0; //关闭数码管十位位选 //delay(1); } void main() { k1zt=0;k2zt=0;//键状态初始化 while(1) { num++;//循环数 /*if(num==250) //定时器每进行一个周期num加1,运行20个周期即为1s { miao++;//秒减数 if(miao>99){miao=0;num=0;} num=0; }*/ scankey(); //键盘扫描 if(k1zt==1) { k1zt=0; miao=5; } if(k2zt==1) { k2zt=0; miao=10; } if(num==250) // { miao--;if(miao<0){miao=0;} num=0; } num1=miao; shi=num1/10; //两位数分离赋给数码管十位显示 ge=num1%10; //两位数分离赋给数码管个位显示 xianshi(shi,ge); //显示 } } void Timer0()interrupt 1 { TH0=(65536-50000)/256; //定时器重装初值 TL0=(65536-50000)%256; num++; } /*END*/ |
| num1=time;这条语句你看看,是不是错了,我一直没看明白这个语句的意思,time变量是什么,如果你要在加一个led,你可以在定时器中num1==0,后led=0;。 |
dragon19790000 发表于 2018-11-10 23:58 给你改了一下,按键按下时间长短不影响倒计时时间。 #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar code table[]={//共阳数码管段码"0~f-." 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e,0xbf,0x7f}; sbit gew=P2^1; sbit shiw=P2^0; sbit k1=P1^0; sbit k2=P1^1; sbit LED=P3^0; uchar num=0,num1=0; bit sign1=0,sign2=0; void Init() //初始化子函数 { TMOD=0x01; //设定定时器0的工作方式为1 TH0=(65536-50000)/256; //定时器装初值一个周期50ms TL0=(65536-50000)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=0; //关闭定时器0 } void delay(uint xms) //延时子函数 { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void scankey() //键盘检测子函数 { if(k1==0) //检测键是否被按下 { delay(5); //延时消除抖动 if((k1==0)&&(sign1==0)) //重新读取k1的值/自锁值 { sign1=1;//自锁 LED=1;//灭 num1=5; //K1为5秒倒计时 TR0=1;//开定时器 // while(!k1); //等待按键释放 } } else sign1=0;//按键释放 if(k2==0) //检测键是否被按下 { delay(5); //延时消除抖动 if((k2==0)&&(sign2==0)) //重新读取k2的值/自锁值 { sign2=1;//自锁 LED=1;//灭 num1=10; //K2为10秒倒计时 TR0=1;//开定时器 // while(!k2); //等待按键释放 } } else sign2=0;//按键释放 } void main() { Init(); // TR0=0; LED=0;//亮 while(1) { scankey(); //不断键盘扫描 P0=table[num1%10]; //数码管个位赋值 gew=1; //打开数码管个位位选 delay(1); //延时 送入数据的反应时间 gew=0; //关闭数码管个位位选 P0=table[num1/10]; //送入数据 shiw=1; //打开数码管十位位选 delay(1); shiw=0; //关闭数码管十位位选 } } void Timer0()interrupt 1 { TH0=(65536-50000)/256; //定时器重装初值 TL0=(65536-50000)%256; num++; if(num==20) //定时器每进行一个周期num加1,运行20个周期即为1s { num=0; //到1秒,num清0重新开始 num1--; //倒计时1秒 if(num1==0) { TR0=0;//关闭定时器 LED=0;//亮 } // num1=time; // shi=num1/10; //两位数分离赋给数码管十位显示 // ge=num1%10; //两位数分离赋给数码管个位显示 } } |
| 求帮助............. |
| 还想加一个LED,倒计时完毕,LED开启。 |