![]() |
發(fā)布時間: 2017-5-26 12:58
正文摘要:求助大神,現(xiàn)在這個單片機(jī)代碼只實(shí)現(xiàn)了計時和定時功能,就key 0,1, 2三個有用,我現(xiàn)在想實(shí)現(xiàn)key3(功能待定鍵)按下,就跳轉(zhuǎn)到自己設(shè)定規(guī)定時間,再按下key3又回到初始計時顯示,當(dāng)計時到規(guī)定時間,蜂鳴器一直響。 ... |
不好意思各位,源代碼是這樣! #include<reg51.h> #include"DS18B20.h" #define uchar unsigned char #define uint unsigned int void delayms(uint xms); // 延時函數(shù) void beep(); // 蜂鳴器響 void display(); //數(shù)碼管顯示計數(shù) void key_scan(); // 鍵盤掃描 void timer_init(); // 中斷初始化ˉ sbit key0 = P1^0; // 調(diào)試控制按鍵 sbit key1 = P1^1; // 增加控制 sbit key2 = P1^2; // 減小控制 sbit key3 = P1^3; // 功能待定 sbit buzzer = P1^4; // 蜂鳴器端口 uchar tab[]; uchar code w[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20}; //數(shù)碼管位選 // 數(shù)碼管段選 共陰 /* uchar code table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; */ //共陽數(shù)碼管段碼表 uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x98,0x83,0xc6,0xa1,0x86,0x8e}; uchar count, set_place; // count 用于定時器1s中斷 set_place 用于計算按鍵的次數(shù) 便于選擇調(diào)節(jié)那部分時間 uchar second = 0, minute = 0, hour = 0; //初始化時間 void main() { timer_init(); for(; ;) { key_scan(); display(); } } void beep() { buzzer = 1; delayms(2); buzzer = 0; delayms(2); } // 鍵盤掃描函數(shù) void key_scan() { if(key0 == 0) { delayms(5); if(key0 == 0) { set_place++; while(!key0); beep(); if(set_place == 1) //按下一次 則定時器中斷 { TR0 = 0; } if(set_place == 4) // 按下兩次 定時器從上次狀態(tài)恢復(fù)工作 { set_place = 0; TR0 = 1; } } } if(set_place != 0) { if(key1 == 0) { delayms(5); if(key1 == 0) { while(!key1); // 按鍵釋放 beep(); if(set_place == 1) { second++; if(second == 60) { second = 0; } } if(set_place == 2) { minute++; if(minute == 60) { minute = 0; } } if(set_place == 3) { hour++; if(hour == 24) { hour = 0; } } } } } if(set_place != 0) { if(key2 == 0) { delayms(5); if(key2 == 0) { while(!key2); // 按鍵釋放 beep(); if(set_place == 1) { second--; if(second == -1) { second = 59; } } if(set_place == 2) { minute--; if(minute == -1) { minute = 59; } } if(set_place == 3) { hour--; if(hour == -1) { hour = 23; } } } } } } // 數(shù)碼管顯示時間 void display() { uchar j; P2 = 0x01; P0 = table[hour / 10]; j = 60; while(j--); P2 = 0x02; P0 = table[hour % 10]; j = 60; while(j--); P2 = 0x04; P0 = table[minute / 10]; j = 60; while(j--); P2 = 0x08; P0 = table[minute % 10]; j = 60; while(j--); P2 = 0x10; P0 = table[second / 10]; j = 60; while(j--); P2 = 0x20; P0 = table[second % 10]; j = 60; while(j--); } // 定時器初始化 void timer_init() { TMOD = 0x01; //定時器T0 工作方式1 TH0 = (65536 - 45872) / 256; // 裝初值 50ms TL0 = (65536 - 45872) % 256; EA = 1; //開放總中斷 ET0 = 1; //開啟定時器中段 TR0 = 1; //開啟定時器0 } // 50ms中斷 void t0_timer() interrupt 1 { TH0 = (65536 - 45872) / 256; //裝初值 此時晶振為11.0592MHz TL0 = (65536 - 45872) % 256; count++; if(count == 20) //1s 時間到 { count = 0; second++; if(second == 60) // 秒為60 清零 分進(jìn)一 { second = 0; minute++; if(minute == 60) // 分為60 清零 時進(jìn)一 { minute = 0; hour++; if(hour == 24) // 時為24清零 { hour =0; } } } } } void delayms(uint xms) //延時xms { uchar i, j; for(i = xms; i > 0; i--) // 改變xms的值 可以調(diào)節(jié)延時時間 for(j = 110; j > 0; j--); } |
cjjcjj1 發(fā)表于 2017-5-26 23:16 不好意思是這樣! #include<reg51.h> #include"DS18B20.h" #define uchar unsigned char #define uint unsigned int void delayms(uint xms); // 延時函數(shù) void beep(); // 蜂鳴器響 void display(); //數(shù)碼管顯示計數(shù) void key_scan(); // 鍵盤掃描 void timer_init(); // 中斷初始化ˉ sbit key0 = P1^0; // 調(diào)試控制按鍵 sbit key1 = P1^1; // 增加控制 sbit key2 = P1^2; // 減小控制 sbit key3 = P1^3; // 功能待定 sbit buzzer = P1^4; // 蜂鳴器端口 uchar tab[]; uchar code w[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20}; //數(shù)碼管位選 // 數(shù)碼管段選 共陰 /* uchar code table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; */ //共陽數(shù)碼管段碼表 uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x98,0x83,0xc6,0xa1,0x86,0x8e}; uchar count, set_place; // count 用于定時器1s中斷 set_place 用于計算按鍵的次數(shù) 便于選擇調(diào)節(jié)那部分時間 uchar second = 0, minute = 0, hour = 0; //初始化時間 void main() { timer_init(); for(; ;) { key_scan(); display(); } } void beep() { buzzer = 1; delayms(2); buzzer = 0; delayms(2); } // 鍵盤掃描函數(shù) void key_scan() { if(key0 == 0) { delayms(5); if(key0 == 0) { set_place++; while(!key0); beep(); if(set_place == 1) //按下一次 則定時器中斷 { TR0 = 0; } if(set_place == 4) // 按下兩次 定時器從上次狀態(tài)恢復(fù)工作 { set_place = 0; TR0 = 1; } } } if(set_place != 0) { if(key1 == 0) { delayms(5); if(key1 == 0) { while(!key1); // 按鍵釋放 beep(); if(set_place == 1) { second++; if(second == 60) { second = 0; } } if(set_place == 2) { minute++; if(minute == 60) { minute = 0; } } if(set_place == 3) { hour++; if(hour == 24) { hour = 0; } } } } } if(set_place != 0) { if(key2 == 0) { delayms(5); if(key2 == 0) { while(!key2); // 按鍵釋放 beep(); if(set_place == 1) { second--; if(second == -1) { second = 59; } } if(set_place == 2) { minute--; if(minute == -1) { minute = 59; } } if(set_place == 3) { hour--; if(hour == -1) { hour = 23; } } } } } } // 數(shù)碼管顯示時間 void display() { uchar j; P2 = 0x01; P0 = table[hour / 10]; j = 60; while(j--); P2 = 0x02; P0 = table[hour % 10]; j = 60; while(j--); P2 = 0x04; P0 = table[minute / 10]; j = 60; while(j--); P2 = 0x08; P0 = table[minute % 10]; j = 60; while(j--); P2 = 0x10; P0 = table[second / 10]; j = 60; while(j--); P2 = 0x20; P0 = table[second % 10]; j = 60; while(j--); } // 定時器初始化 void timer_init() { TMOD = 0x01; //定時器T0 工作方式1 TH0 = (65536 - 45872) / 256; // 裝初值 50ms TL0 = (65536 - 45872) % 256; EA = 1; //開放總中斷 ET0 = 1; //開啟定時器中段 TR0 = 1; //開啟定時器0 } // 50ms中斷 void t0_timer() interrupt 1 { TH0 = (65536 - 45872) / 256; //裝初值 此時晶振為11.0592MHz TL0 = (65536 - 45872) % 256; count++; if(count == 20) //1s 時間到 { count = 0; second++; if(second == 60) // 秒為60 清零 分進(jìn)一 { second = 0; minute++; if(minute == 60) // 分為60 清零 時進(jìn)一 { minute = 0; hour++; if(hour == 24) // 時為24清零 { hour =0; } } } } } void delayms(uint xms) //延時xms { uchar i, j; for(i = xms; i > 0; i--) // 改變xms的值 可以調(diào)節(jié)延時時間 for(j = 110; j > 0; j--); } |
不倒翁.WZT 發(fā)表于 2017-5-26 16:54 不好意思是這樣! #include<reg51.h> #include"DS18B20.h" #define uchar unsigned char #define uint unsigned int void delayms(uint xms); // 延時函數(shù) void beep(); // 蜂鳴器響 void display(); //數(shù)碼管顯示計數(shù) void key_scan(); // 鍵盤掃描 void timer_init(); // 中斷初始化ˉ sbit key0 = P1^0; // 調(diào)試控制按鍵 sbit key1 = P1^1; // 增加控制 sbit key2 = P1^2; // 減小控制 sbit key3 = P1^3; // 功能待定 sbit buzzer = P1^4; // 蜂鳴器端口 uchar tab[]; uchar code w[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20}; //數(shù)碼管位選 // 數(shù)碼管段選 共陰 /* uchar code table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; */ //共陽數(shù)碼管段碼表 uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x98,0x83,0xc6,0xa1,0x86,0x8e}; uchar count, set_place; // count 用于定時器1s中斷 set_place 用于計算按鍵的次數(shù) 便于選擇調(diào)節(jié)那部分時間 uchar second = 0, minute = 0, hour = 0; //初始化時間 void main() { timer_init(); for(; ;) { key_scan(); display(); } } void beep() { buzzer = 1; delayms(2); buzzer = 0; delayms(2); } // 鍵盤掃描函數(shù) void key_scan() { if(key0 == 0) { delayms(5); if(key0 == 0) { set_place++; while(!key0); beep(); if(set_place == 1) //按下一次 則定時器中斷 { TR0 = 0; } if(set_place == 4) // 按下兩次 定時器從上次狀態(tài)恢復(fù)工作 { set_place = 0; TR0 = 1; } } } if(set_place != 0) { if(key1 == 0) { delayms(5); if(key1 == 0) { while(!key1); // 按鍵釋放 beep(); if(set_place == 1) { second++; if(second == 60) { second = 0; } } if(set_place == 2) { minute++; if(minute == 60) { minute = 0; } } if(set_place == 3) { hour++; if(hour == 24) { hour = 0; } } } } } if(set_place != 0) { if(key2 == 0) { delayms(5); if(key2 == 0) { while(!key2); // 按鍵釋放 beep(); if(set_place == 1) { second--; if(second == -1) { second = 59; } } if(set_place == 2) { minute--; if(minute == -1) { minute = 59; } } if(set_place == 3) { hour--; if(hour == -1) { hour = 23; } } } } } } // 數(shù)碼管顯示時間 void display() { uchar j; P2 = 0x01; P0 = table[hour / 10]; j = 60; while(j--); P2 = 0x02; P0 = table[hour % 10]; j = 60; while(j--); P2 = 0x04; P0 = table[minute / 10]; j = 60; while(j--); P2 = 0x08; P0 = table[minute % 10]; j = 60; while(j--); P2 = 0x10; P0 = table[second / 10]; j = 60; while(j--); P2 = 0x20; P0 = table[second % 10]; j = 60; while(j--); } // 定時器初始化 void timer_init() { TMOD = 0x01; //定時器T0 工作方式1 TH0 = (65536 - 45872) / 256; // 裝初值 50ms TL0 = (65536 - 45872) % 256; EA = 1; //開放總中斷 ET0 = 1; //開啟定時器中段 TR0 = 1; //開啟定時器0 } // 50ms中斷 void t0_timer() interrupt 1 { TH0 = (65536 - 45872) / 256; //裝初值 此時晶振為11.0592MHz TL0 = (65536 - 45872) % 256; count++; if(count == 20) //1s 時間到 { count = 0; second++; if(second == 60) // 秒為60 清零 分進(jìn)一 { second = 0; minute++; if(minute == 60) // 分為60 清零 時進(jìn)一 { minute = 0; hour++; if(hour == 24) // 時為24清零 { hour =0; } } } } } void delayms(uint xms) //延時xms { uchar i, j; for(i = xms; i > 0; i--) // 改變xms的值 可以調(diào)節(jié)延時時間 for(j = 110; j > 0; j--); } |
你的軟件設(shè)定還有問題,注解部分還是亂碼,解決方法:點(diǎn)擊Edit、點(diǎn)擊Colors&Fonts、點(diǎn)擊8051:Editor C Files、右側(cè)列表中點(diǎn)擊Text、將右側(cè)選項(xiàng)Use Color in Comments前勾選去掉,再試試,正確了在進(jìn)行編程,否則別人看不懂你做了些什么,就不會幫你修改程序。 |
Powered by 單片機(jī)教程網(wǎng)