標(biāo)題:
單片機(jī)定時(shí)器控制按鍵秒表程序 暫停之后無法進(jìn)行其他操作
[打印本頁]
作者:
蘇佳楠
時(shí)間:
2022-12-8 17:38
標(biāo)題:
單片機(jī)定時(shí)器控制按鍵秒表程序 暫停之后無法進(jìn)行其他操作
單片機(jī)程序里只定義了一個(gè)按鍵,但是用發(fā)的開發(fā)板做實(shí)物,另一個(gè)按鍵卻可以暫停秒表,暫停之后無法進(jìn)行其他操作,只能按總開關(guān)復(fù)位
51hei圖片20221208173755.jpg
(139.76 KB, 下載次數(shù): 12)
下載附件
2022-12-8 17:38 上傳
#include <stc15.h>
#include "delay.h"
sbit DS = P1^1; //串行數(shù)據(jù)
sbit SH = P1^3; //移位寄存器時(shí)鐘
sbit ST = P1^2; //存儲寄存器時(shí)鐘
sbit K1=P3^2;//按鍵開關(guān)
sbit LED=P5^5;
unsigned char code SEG[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //帶小數(shù)點(diǎn)的 共陽極管碼
unsigned char count,m,n,i,a,b,second,flag;
void Timer0Init(void) //10毫秒@12.000MHz
{
AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0xF0; //設(shè)置定時(shí)初始值
TH0 = 0xD8; //設(shè)置定時(shí)初始值
TF0 = 0; //清除TF0標(biāo)志
}
void Timer2Init(void) //50毫秒@12.000MHz
{
AUXR &= 0xFB; //定時(shí)器時(shí)鐘12T模式
T2L = 0xB0; //設(shè)置定時(shí)初始值
T2H = 0x3C; //設(shè)置定時(shí)初始值
}
//595發(fā)送數(shù)據(jù)
void Send(unsigned char n)//傳送數(shù)據(jù)函數(shù)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(n&0x80)//取數(shù)據(jù)n的最高位
DS=1;
else
DS=0;
n<<=1;//左移數(shù)據(jù)n
SH=0;//移入數(shù)據(jù)
SH=1;
}
}
/*主函數(shù)*/
void main()
{
Send(0xff);Send(0xff);ST=0;ST=1;//一開始熄屏
LED=1;
EA=1;ET0=1;EX0=1;IT0=1;EX1=1;IT1=1;//開INT0.INT1,T0中斷 切INT0,INT1為下降沿有效
IE2|=0X04;//開T2的中斷
PT0=1;//設(shè)T0的優(yōu)先級比INT0高 也就是優(yōu)先級T0>INT0>INT1
Timer0Init();Timer2Init();//定時(shí)器初始化
while(1);
}
//中斷函數(shù)
void INT0(void) interrupt 0
{
Delay10ms();//延時(shí)消抖
if(K1==0)
{
LED=0;
second=0;//為下一次長按進(jìn)行初始化
TR0=1;//定時(shí)器0開始計(jì)時(shí)
i++;//記錄按鍵次數(shù)
}
while(K1==0);//等待按鍵釋放
{
TR0=0;//定時(shí)器0暫停計(jì)時(shí)
LED=1;
}
if(second>50)//表示長按2s
{
AUXR &= ~0x10;//定時(shí)器2暫停計(jì)時(shí)
Send(0xff);Send(0xff);ST=0;ST=1;//熄屏
m=0;n=0;i=0;//重新初始化
flag=1;//長按標(biāo)志位
LED=1;
}
if(i==1)//按下一次 啟動計(jì)時(shí)
{
AUXR |= 0x10;//定時(shí)器2開始計(jì)時(shí)
LED=0;
}
if(i==2)//再按一下暫停計(jì)時(shí)
{
AUXR &= ~0x10;//定時(shí)器2暫停計(jì)時(shí)
LED=1;
}
if(i==3)//按下一次 啟動計(jì)時(shí)
{
AUXR |= 0x10;//定時(shí)器2開始計(jì)時(shí)
LED=0;
i=1;
}
}
void Timer0(void) interrupt 1
{
second++;
}
void Timer2(void) interrupt 12
{
count++;
if((count%2==0)&&flag==0)//計(jì)時(shí)2*50ms=0.1s時(shí)
{
Send(SEG[m]);Send(SEG[n]&0x7f);ST=0;ST=1;//傳送數(shù)據(jù)給數(shù)碼管 m:個(gè)位 n:十位
m++;
if(m%10==0)//m>10時(shí)向n進(jìn)位
{
n++;
m=0;
}
if(n>9)//n>9時(shí)清零
n=0;
}
if(flag==1)
{
flag=0;//為下一次長按進(jìn)行初始化
}
}
作者:
yzwzfyz
時(shí)間:
2022-12-9 08:57
做一個(gè)標(biāo)記:BJ。你的計(jì)時(shí)程序依據(jù)BJ計(jì)時(shí),BJ=1就計(jì)時(shí),BJ=0就不計(jì)時(shí)。
這樣做暫停,只有將BJ清0,即可。不影響其它東東。而恢復(fù)計(jì)時(shí)呢?就將BJ置1。
切記:不要用按鍵直接決定計(jì)時(shí),因?yàn)槟愕墓αΣ粔颍壿嫴磺。用個(gè)BJ做控制,就簡單了,清晰了。
作者:
Longan.Wang
時(shí)間:
2022-12-9 10:01
其它地方?jīng)]去看,你實(shí)現(xiàn)按鍵功能的中斷函數(shù)應(yīng)該可以優(yōu)化一下,也不知道能不能行,但可以試試
void INT0(void) interrupt 0
{
Delay10ms();//延時(shí)消抖
if(K1 == 0) {
LED = 0;
second = 0;//為下一次長按進(jìn)行初始化
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
}
else {
return;
}
//等待按鍵釋放
while(K1 == 0) {
LED = 1;
}
//表示長按2s
if(second > 50) {
AUXR &= ~0x10;//定時(shí)器2暫停計(jì)時(shí)
Send(0xff);
Send(0xff);
ST = 0;
ST = 1; //熄屏
m = 0;
n = 0;
i = 0; //重新初始化
flag = 1; //長按標(biāo)志位
LED = 1;
return;
}
i++; //記錄按鍵次數(shù)
//按下一次 啟動計(jì)時(shí)
if(i == 1) {
AUXR |= 0x10; //定時(shí)器2開始計(jì)時(shí)
LED = 0;
}
//再按一下暫停計(jì)時(shí)
if(i == 2) {
AUXR &= ~0x10; //定時(shí)器2暫停計(jì)時(shí)
LED = 1;
i = 0;
}
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1