|
|
不好意思各位,源代碼是這樣!
#include<reg51.h>
#include"DS18B20.h"
#define uchar unsigned char
#define uint unsigned int
void delayms(uint xms); // 延時(shí)函數(shù)
void beep(); // 蜂鳴器響
void display(); //數(shù)碼管顯示計(jì)數(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}; */
//共陽(yáng)數(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 用于定時(shí)器1s中斷 set_place 用于計(jì)算按鍵的次數(shù) 便于選擇調(diào)節(jié)那部分時(shí)間
uchar second = 0, minute = 0, hour = 0; //初始化時(shí)間
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) //按下一次 則定時(shí)器中斷
{
TR0 = 0;
}
if(set_place == 4) // 按下兩次 定時(shí)器從上次狀態(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ù)碼管顯示時(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--);
}
// 定時(shí)器初始化
void timer_init()
{
TMOD = 0x01; //定時(shí)器T0 工作方式1
TH0 = (65536 - 45872) / 256; // 裝初值 50ms
TL0 = (65536 - 45872) % 256;
EA = 1; //開放總中斷
ET0 = 1; //開啟定時(shí)器中段
TR0 = 1; //開啟定時(shí)器0
}
// 50ms中斷
void t0_timer() interrupt 1
{
TH0 = (65536 - 45872) / 256; //裝初值 此時(shí)晶振為11.0592MHz
TL0 = (65536 - 45872) % 256;
count++;
if(count == 20) //1s 時(shí)間到
{
count = 0;
second++;
if(second == 60) // 秒為60 清零 分進(jìn)一
{
second = 0;
minute++;
if(minute == 60) // 分為60 清零 時(shí)進(jìn)一
{
minute = 0;
hour++;
if(hour == 24) // 時(shí)為24清零
{
hour =0;
}
}
}
}
}
void delayms(uint xms) //延時(shí)xms
{
uchar i, j;
for(i = xms; i > 0; i--) // 改變xms的值 可以調(diào)節(jié)延時(shí)時(shí)間
for(j = 110; j > 0; j--);
} |
|