?? clock_mian.c
字號:
#include<regx51.h>
/*--------------------函數申明------------------------*/
void init(void); //硬件初始化
void init_data(void); //數據初始化
void time(void); //時間計算函數
void stop_watch(void); //秒表函數
void alarm(void) ; //鬧鐘函數
void display(void); //顯示函數
void delay(char n); //延時函數
void un_slop_over(void); //防溢出函數
/*--------------------變量和標志為聲明------------------------*/
/*---------------data[][]數據結構如下: ---------------------------
時間: 小時 分鐘 秒
日期: 年 月 日
鬧鐘: 小時 分鐘 鬧鐘開啟標志位
秒表: 分 秒 0.01s
/*---------------------------------------------------------------*/
unsigned char Data_stor[4][3]; //定義結構體數組分別存放時間,日期,秒表和鬧鐘數據
static unsigned char mode; //模式選擇 0:時間 1:日期 2鬧鐘 3秒表
static char adjustnum; //選擇待調整的項目,值為-1,0,1,2 -1表示不調整
static unsigned char flash; //閃爍定時標志位
static unsigned char alarm_run; //鬧鐘啟動標志
static unsigned char run; //秒表啟動標志
unsigned char count_base = 0 ;
sbit key1 = P1^0; //按鍵入口
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit diode = P2^6; //發光二極管輸出口
sbit alarm_ring = P2^7; //蜂鳴器輸出口
void main()
{
init();
init_data();
display();
}
/***********************************/
/*nms定時*/
void delay(char n)
{
unsigned char i,j;
for(i=0;i<n;i++)
for (j=0;j<254;j++);
}
/***********************************/
/*顯示函數*/
void display()
{
char i;
/*--------------------編碼------------------------------*/
int disp[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*--------------------顯示位選擇------------------------*/
int select[6] = {0x3e,0x3d,0x3b,0x37,0x2f,0x1f};
int display_bit[6]; //儲存顯示數據
while (1)
{
/*--------------------將顯示數據轉換為位---------------*/
display_bit[0] = Data_stor[mode][0]/10;
display_bit[1] = Data_stor[mode][0]%10;
display_bit[2] = Data_stor[mode][1]/10;
display_bit[3] = Data_stor[mode][1]%10;
display_bit[4] = Data_stor[mode][2]/10;
display_bit[5] = Data_stor[mode][2]%10;
for (i=0;i<6;i++){
if ((2*adjustnum==i||2*adjustnum==(i-1))&&flash){
P2 = 0x3f; //調整時屏蔽相應兩位
}
else{
P0 = disp[display_bit[i]];
P2 = select[i];
}
if(mode==0&&(adjustnum == -1)&&flash) //發光二極管閃爍
diode = 1;
else diode = 0;
delay(10);
P2 = 0x3f; //關數碼管使能,消除重影
}
}
}
/***************************************/
/*硬件初始化函數*/
void init()
{
EA =1; //CPU中斷開
ET0 = 1; //開啟定時中斷0 ,1
ET1 = 1;
TMOD = 0x11; //工作方式1
TH0 = (65536-10000)/256; //定時器初始化,T0用于基準時鐘產生,為10ms
TL0 = (65536-10000)%256;
TH1 = (65536-50000)/256; //T1用于調整時的閃爍,為50ms
TL1 = (65536-50000)%256;
TR0 = 1; //計時開始
TR1 = 1;
EX1 = 1; //外部中斷開
// IT1 = 1; //邊沿觸發
alarm_ring = 0; //關閉鬧鐘
}
/***************************************/
/*數據初始化函數*/
void init_data()
{
mode = 0;
adjustnum = -1;
flash = 0;
run = 0;
alarm_run = 0;
Data_stor[0][0] = 0; //時間初始化:00:00:00
Data_stor[0][1] = 0;
Data_stor[0][2] = 0;
Data_stor[1][0] = 0; //日期初始化:00-01-01
Data_stor[1][1] = 1;
Data_stor[1][2] = 1;
Data_stor[2][0] = 0; //鬧鐘初始化:00:00:00
Data_stor[2][1] = 0;
Data_stor[2][2] = 0;
Data_stor[3][0] = 0; //秒表初始化:00:00:00
Data_stor[3][1] = 0;
Data_stor[3][2] = 0;
}
/***************************************/
/*鬧鐘函數*/
void alarm()
{
unsigned char alarm_count = 120; //鬧鐘2min
if(Data_stor[2][1]==Data_stor[0][1] && Data_stor[2][0]==Data_stor[0][0]) {
while(alarm_count){
if(flash){
alarm_ring = 1;
alarm_count--;
}
else alarm_ring = 0;
}
alarm_ring = 0;
}
}
/***************************************/
/*基準時間中斷函數*/
void time_base()interrupt 1
{
TH0 = (65536-10000)/256;
TL0 = (65536-10000)%256;
if (mode==0&&adjustnum>=0)
count_base = 0;
else
count_base++;
if(count_base == 100) //一秒
{
time();
count_base = 0;
}
if(run) stop_watch();
}
/***************************************/
/*按鍵響應中斷函數*/
void key_block()interrupt 2
{
/*--------------------按鍵響應------------------------------*/
if(!key1){
delay(2);
if(!key1){
mode++;
adjustnum =-1;
if(mode == 4) mode = 0;
while(!key1);
}
}
if(!key2){
delay(2);
if(!key2){
adjustnum++;
if (adjustnum == 3)
adjustnum =-1;
if(mode == 3){
if(adjustnum == 0) {
run = !run;
adjustnum = -1;
}
else run = 0;
}
while(!key2);
}
}
if(!key3){
delay(2);
if(!key3){
if (adjustnum>=0&&mode<3){
Data_stor[mode][adjustnum] += 1;
un_slop_over();
alarm_run = Data_stor[2][2];
}
/*--------------------秒表------------------------------*/
/*秒表模式下key2控制開始/繼續和停止/暫停key3控制秒表復位*/
if(mode == 3){
adjustnum = -1;
Data_stor[3][0] = 0;
Data_stor[3][1] = 0;
Data_stor[3][2] = 0;
}
while(!key3);
}
}
}
/***************************************/
/*0.5s延時中斷函數*/
void time_flash()interrupt 3
{
TH1 = (65536-50000)/256;
TL1 = (65536-50000)%256;
flash = !flash;
}
/***************************************/
/*防止數據溢出函數*/
void un_slop_over()
{
/*時間*/
Data_stor[0][0] = Data_stor[0][0]%24; //小時
Data_stor[0][1] = Data_stor[0][1]%60; //分鐘
Data_stor[0][2] = Data_stor[0][2]%60; //秒
/*日期*/
Data_stor[1][0] = Data_stor[1][0]%100; //年
if(Data_stor[1][1] ==13) Data_stor[1][1] = 1; //月
switch(Data_stor[1][1]) //日
{
case 4:
case 6:
case 9:
case 11:
if (Data_stor[1][2] == 31) Data_stor[1][2]= 1;
break;
case 2:{
if (Data_stor[1][0]%4==0&&Data_stor[1][2]==30) Data_stor[1][2] = 1;
if (Data_stor[1][0]%4!=0&&Data_stor[1][2]==29) Data_stor[1][2] = 1;
break;
}
default :
if (Data_stor[1][2] == 32) Data_stor[1][2] = 1;
break;
}
/*鬧鐘*/
Data_stor[2][0] = Data_stor[2][0]%24; //小時
Data_stor[2][1] = Data_stor[2][1]%60; //分鐘
Data_stor[2][2] = Data_stor[2][2]%2; //鬧鐘狀態 1開,0關
}
/***************************************/
/*時間處理函數函數*/
void time()
{
Data_stor[0][2] ++;
if(Data_stor[0][2] == 60){ //一分
Data_stor[0][1]++;
Data_stor[0][2] = 0;
if(alarm_run) alarm();
if(Data_stor[0][1] ==60){ //一小時
Data_stor[0][0]++;
Data_stor[0][1]= 0;
if(Data_stor[0][0] ==24){ //一天
Data_stor[1][2]++;
Data_stor[0][0] = 0;
if(Data_stor[1][2] == 29||Data_stor[1][2] == 30||Data_stor[1][2] == 31||Data_stor[1][2] == 32)
switch(Data_stor[1][1]){ //一月
case 4:
case 6:
case 9:
case 11:
if (Data_stor[1][2] == 31){
Data_stor[1][1]++;
Data_stor[1][2]= 1;
}
break;
case 2:
if (Data_stor[1][0]%4==0&&Data_stor[1][2]==30){
Data_stor[1][1]++;
Data_stor[1][2] = 1;
}
if (Data_stor[1][0]%4!=0&&Data_stor[1][2]==29){
Data_stor[1][1]++;
Data_stor[1][2]= 1;
}
break;
default :
if (Data_stor[1][2] == 32){
Data_stor[1][1]++;
Data_stor[1][2] = 1;
}
break;
}
if (Data_stor[1][1] ==13){
Data_stor[1][0]++;
Data_stor[1][1] = 1;
if (Data_stor[1][0] == 100) Data_stor[1][0] = 0;
}
}
}
}
}
/***************************************/
/*秒表函數*/
void stop_watch()
{
Data_stor[3][2]++;
if (Data_stor[3][2] == 100){
Data_stor[3][1]++;
Data_stor[3][2] = 0;
if (Data_stor[3][1] == 60){
Data_stor[3][0]++;
Data_stor[3][1] = 0;
if (Data_stor[3][0]==100){
alarm_ring = 1; //報警
delay(250);
delay(250);
delay(250);
delay(250);
alarm_ring = 0;
Data_stor[3][0] = 0;
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -