標題: 基于51單片機定時器的時鐘,關于程序按鍵不受控制問題? [打印本頁]
作者: king@ 時間: 2016-11-2 11:15
標題: 基于51單片機定時器的時鐘,關于程序按鍵不受控制問題?
本帖最后由 king@ 于 2016-11-2 11:15 編輯
#include <reg52.h>
sbit WEI = P1^6;
sbit DU = P1^7;
sbit BEEP = P1^4;
sbit KEY1 = P3^4;
sbit KEY2 = P3^5;
sbit KEY3 = P3^6;
sbit KEY4 = P3^7;
void xiaoying();
void di();
void keyscan();
/* ***************************************************** */
// 宏定義
/* ***************************************************** */
#define uInt32 unsigned long int
#define uInt16 unsigned int
uInt16 s=0;m=0;h=0;
uInt32 num=0;
void DelayMS(uInt16 ValMS)
{
uInt16 uiVal,ujVal;
for(uiVal = 0; uiVal < ValMS; uiVal++)
for(ujVal = 0; ujVal < 113; ujVal++);
}
unsigned char Bit_Tab[] =
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位選數組
unsigned char DISP_smg[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/* ***************************************************** */
// 函數名稱:Timer0Init()
// 函數功能:定時器0初始化設置
// 入口參數:無
// 出口參數:無
/* ***************************************************** */
void Timer0Init(void)
{
TMOD = 0x01; // 設置定時器1工作在模式1下
TH0 = 0xDC;
TL0 = 0x00; // 賦初始值
EA = 1; // 開總中斷
ET0 = 1; // 開定時器1中斷
TR0 = 1; // 開定時器0
}
/* ***************************************************** */
// 函數名稱:main()
// 函數功能:定時器初始化后進入死循環,等定時器中斷
// 入口參數:無
// 出口參數:無
/* ***************************************************** */
void main(void)
{
Timer0Init();
while(1)
{
void keyscan();
h= num /3600;
m=(num%3600)/60;
s=(num%3600)%60;
if(s>59)
{
di();
s=0;
m=m+1;
}
if(m>59)
{
di();
m=0;
h=h+1;
}
if(h>23)
h=0;
xiaoying();
WEI = 1;
P0 = Bit_Tab[5];
WEI = 0;
DU = 1;
P0 = 0x40;
DelayMS(2);
xiaoying();
WEI = 1;
P0 = Bit_Tab[2];
WEI = 0;
DU = 1;
P0 = 0x40;
DelayMS(2);
xiaoying();
WEI = 1;
P0 = Bit_Tab[7];
WEI = 0;
DU = 1;
P0 = DISP_smg[s%10];
DelayMS(2);
xiaoying();
WEI = 1;
P0 = Bit_Tab[6];
WEI = 0;
DU = 1;
P0 = DISP_smg[s/10];
DelayMS(2);
xiaoying();
WEI = 1;
P0 = Bit_Tab[4];
WEI = 0;
DU = 1;
P0 = DISP_smg[m%10];
DelayMS(2);
xiaoying();
WEI = 1;
P0 = Bit_Tab[3];
WEI = 0;
DU = 1;
P0 = DISP_smg[m/10];
DelayMS(2);
xiaoying();
WEI = 1;
P0 = Bit_Tab[1];
WEI = 0;
DU = 1;
P0 = DISP_smg[h%10];
DelayMS(2);
xiaoying();
WEI = 1;
P0 = Bit_Tab[0];
WEI = 0;
DU = 1;
P0 = DISP_smg[h/10];
DelayMS(2);
}
}
/* ***************************************************** */
// 函數名稱:Timer0_ISR()
// 函數功能:定時器中斷服務,控制LED閃爍
// 入口參數:無
// 出口參數:無
/* ***************************************************** */
void Timer0_ISR(void) interrupt 1
{
static uInt16 uiCounter = 0; //只做一次定義
TH0 = 0xDC;
TL0 = 0x00; //定時器賦初值
uiCounter++; //記錄中斷次數
if(100 == uiCounter)
{
uiCounter = 0;
num=num+1;
}
}
void xiaoying()
{
DU=1;
P0=0x00;
DU=0;
}
void di()
{
BEEP=0;
DelayMS(100);
BEEP=1;
}
void keyscan()
{
unsigned char flag;
if(KEY1==0)
{
DelayMS(5);
if(KEY1==0)
{
di();
TR0=~TR0;
flag=~flag;
while(!KEY1);
}
}
if(flag)
{
if(KEY2==0)
{
DelayMS(5);
if(KEY2==0)
{
di();
s=s+1;
if(s==60)
s=0;
while(!KEY1);
}
}
if(KEY3==0)
{
DelayMS(5);
if(KEY3==0)
{
di();
m=m+1;
if(m==60)
m=0;
while(!KEY3);
}
}
if(KEY4==0)
{
DelayMS(5);
if(KEY4==0)
{
di();
h=h+1;
if(h==24)
s=0;
while(!KEY4);
}
}
}
}
不知道為什按鍵不受控,達不到效果,想要按鍵KEY1第一次按數碼暫停,KEY2控制秒加,KEY3控制分加,KEY4控制時加,第二次按KEY1數碼管繼續計時,按鍵這部分程序寫到這里不知道為什么數碼管不受按鍵控制?求大神指導一下。
-
CPU.png
(120.88 KB, 下載次數: 62)
下載附件
2016-11-2 11:09 上傳
-
按鍵.png
(41.79 KB, 下載次數: 90)
下載附件
2016-11-2 11:10 上傳
-
蜂鳴器.png
(29.58 KB, 下載次數: 72)
下載附件
2016-11-2 11:10 上傳
-
數碼管.png
(146.82 KB, 下載次數: 70)
下載附件
2016-11-2 11:10 上傳
作者: zl2168 時間: 2016-11-2 11:57
這個問題以前好像拿出來過,有許多人解答了,怎么又拿出來?
作者: king@ 時間: 2016-11-2 13:34
我以前又不會按鍵,應該不會發過用按鍵控制數碼管類似的問題
作者: king@ 時間: 2016-11-2 14:31
之前是沒用中斷,現在這個新寫的程序應該是不一樣的。
作者: lhs117 時間: 2016-11-2 16:09
好文章
作者: lhs117 時間: 2016-11-2 16:10
好文章!
作者: 1281280722 時間: 2016-11-2 16:12
if(100 == uiCounter) 這個是什么鬼。明顯錯誤啊。
作者: king@ 時間: 2016-11-2 17:48
T0定時器中斷的時間0.01S,累計100次也就是1S數碼管計數一次.
作者: xiaokaixin 時間: 2016-11-3 14:15
程序中間可能有問題
作者: xiaokaixin 時間: 2016-11-3 14:16
程序中間可能有問題
作者: king@ 時間: 2016-11-3 16:50
xiaokaixin 發表于 2016-11-3 14:15
程序中間可能有問題
能不能再具體一點?
作者: zl2168 時間: 2016-11-3 17:17
錯到沒錯,但易被人疑成“鬼”。有人說如果寫成if( uiCounter ==100) ,有可能會誤寫成if( uiCounter =100)。
作者: zl2168 時間: 2016-11-3 17:21
多認真研讀正確的程序,有利于打好基礎,少寫出問題程序。
作者: zl2168 時間: 2016-11-3 17:26
正確的程序很多,看看中斷、鍵盤、顯示,正確的的鏈接方法和思路,可避免出錯,少走彎路。不要老是糾結于錯誤的程序,忙于讓“大神”診斷,浪費時間。
作者: zl2168 時間: 2016-11-3 18:04
學習的過程是研讀、理解、模仿、創新。前3個階段,未扎實基礎,就想步入創新階段,反而欲速而不達。
作者: zl2168 時間: 2016-11-3 18:07
本帖最后由 zl2168 于 2016-11-3 18:29 編輯
給你介紹2本能達到上述要求的書,張志良編著的:
《80C51單片機實用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于學習51單片機原理,便于閱讀理解,便于自學。
《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。
51單片機仿真設計實例教程仿真文件.rar
(4.88 MB, 下載次數: 13)
2016-11-3 18:23 上傳
點擊文件名下載附件
100案例幾乎能覆蓋你學習單片機的絕大部分問題。
看看100案例目錄吧!肯定有你可參考模仿的電路與程序。
注意!這100案例,每個都可演示觀看,程序句句有注釋,而且簡潔,易于理解,便于自學。
你自己模仿的程序,再keil+proteus仿真,能看到出錯在哪里,不用求“大神”診斷。
目錄.rar
(11.45 KB, 下載次數: 15)
2016-11-3 18:09 上傳
點擊文件名下載附件
作者: zl2168 時間: 2016-11-3 18:20
真誠地希望廣大單片機初學者改變學習方法,少走彎路,增強效果。
作者: lids 時間: 2016-12-15 14:19
這是我做時鐘的按鍵程序,你可以參考一下。主要是選擇按鍵的次數要用一個變量來表示,比如knum=0,knum=2。
void keyscan() //按鍵掃描函數
{
if(s3==0) //選擇按鍵按下
{
delay(10);
if(s3==0)
{
while(!s3)
display(shi,fen,miao); //加上這句,按鍵按下就不會閃
knum++;
if(knum==1) //分閃爍
{
write_1302(0x8e,0x00); //保護取消
write_1302(write_miao,0x80);
}
if(knum==3) //時鐘啟動
{
knum=0;
write_1302(write_miao,0x00);
write_1302(0x8e,0x80); //保護啟動
}
}
}
if(knum==1) //分鐘調節
{
if(s1==0) //加
{
delay(10);
if(s1==0)
{
while(!s1)
display(shi,fen,miao); //加上這句,按鍵按下就不會閃
fen++;
fen=fen/10*16+fen%10; //轉為16進制
if(fen==0x60)
fen=0x00;
write_1302(write_fen,fen); //寫入1302
read_sf(); //讀出時間,然后顯示
}
}
if(s2==0)
{
delay(10);
if(s2==0)
{
while(!s2)
display(shi,fen,miao); //加上這句,按鍵按下就不會閃
fen--;
fen=fen/10*16+fen%10; //轉為16進制
if(fen==-1)
fen=0x59;
write_1302(write_fen,fen);
read_sf();
}
}
}
if(knum==2)
{
if(s1==0)
{
delay(10);
if(s1==0)
{
while(!s1)
display(shi,fen,miao); //加上這句,按鍵按下就不會閃
shi++;
shi=shi/10*16+shi%10; //轉為16進制
if(shi==0x24)
shi=0x00;
write_1302(write_shi,shi);
read_sf();
}
}
if(s2==0)
{
delay(10);
if(s2==0)
{
while(!s2)
display(shi,fen,miao); //加上這句,按鍵按下就不會閃
shi--;
shi=shi/10*16+shi%10; //轉為16進制
if(shi==-1)
shi=0x23;
write_1302(write_shi,shi);
read_sf();
}
}
}
}
作者: 12132434awea 時間: 2016-12-15 17:13
好文章
作者: xiaoer 時間: 2016-12-15 21:38
我感覺問題在于flag變量,
uchar flag初值確定就是0?
你試試bit flag=0;
作者: jwd202 時間: 2016-12-15 21:59
同求學習
作者: hf51hei 時間: 2018-1-23 10:52
學習時鐘、中斷,也遇到此問題。
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
97精品超碰一区二区三区
|
在线观看www
|
久久综合狠狠综合久久综合88
|
爱爱爱av|
日韩视频中文字幕
|
亚洲视频免费观看
|
午夜丁香视频在线观看
|
成人在线播放
|
交专区videossex农村
|
国产一级特黄aaa大片评分
|
久久午夜精品
|
99精品99久久久久久宅男
|
韩国毛片一区二区三区
|
丁香综合
|
欧美网站一区二区
|
欧美精品中文字幕久久二区
|
91精品国产一二三
|
国产97视频在线观看
|
黑人精品欧美一区二区蜜桃
|
国产99久久|
亚洲五码在线
|
91久久久久久久久久久久久
|
亚洲国产高清在线
|
鸡毛片|
男人亚洲天堂
|
九一视频在线播放
|
国产亚洲精品久久久久久牛牛
|
伊人伊成久久人综合网站
|
亚洲日本免费
|
美女午夜影院
|
日韩欧美在线不卡
|
免费看国产一级特黄aaaa大片
|
国产99久久
|
91成人小视频
|
日韩在线
|
视频二区国产
|
国产精品久久久久久久免费观看
|
日韩精品一区二区三区中文字幕
|
欧美日韩国产一区二区
|
国产精品视频在线免费观看
|
久久三区
|