|
六位數(shù)碼管單片機(jī)時(shí)鐘用一次不關(guān)機(jī)就有記憶 掉電就沒有記憶,現(xiàn)在想增加1302時(shí)鐘芯片保存記憶,提供源程序給有這方面的師博看看什樣增加1302的程序,修改上傳看看謝謝
/*====================================================================
調(diào)試要求:
1.MCU:AT89S52芯片或AT89C52
2.晶振:12MHz
功能:?jiǎn)?dòng)芯片內(nèi)部計(jì)時(shí)
====================================================================*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dis_bit1=P3^2;//定義數(shù)碼管控制口
sbit dis_bit2=P3^3;//定義數(shù)碼管控制口
sbit dis_bit3=P3^4;//定義數(shù)碼管控制口
sbit dis_bit4=P3^5;//定義數(shù)碼管控制口
sbit dis_bit5=P3^6;//定義數(shù)碼管控制口
sbit dis_bit6=P3^7;//定義數(shù)碼管控制口
sbit led1_bit=P2^5;//定時(shí)LED的控制口
sbit led2_bit=P2^6;//定時(shí)LED的控制口
sbit s1_bit=P2^0; //定義S1控制口
sbit s2_bit=P2^1; //定義S2控制口
sbit s3_bit=P2^2; //定義S3控制口
sbit speak=P2^7; //定義蜂鳴器控制口
#define smg_data P1//定義數(shù)碼管數(shù)據(jù)口
void delay_50us(uint t);//延時(shí)50*T微妙函數(shù)的聲明
void display1(uchar dis_data);//數(shù)碼管1顯示子程序
void display2(uchar dis_data);//數(shù)碼管2顯示子程序
void display3(uchar dis_data);//數(shù)碼管3顯示子程序
void display4(uchar dis_data);//數(shù)碼管4顯示子程序
void display5(uchar dis_data);//數(shù)碼管5顯示子程序
void display6(uchar dis_data);//數(shù)碼管6顯示子程序
void init_t0();//定時(shí)器0初始化函數(shù)
void dis_led();//LED處理函數(shù)
void judge_s1();//S1按鍵處理函數(shù)
void judge_s2();//S2按鍵處理函數(shù)
void judge_s3();//S3按鍵處理函數(shù)
void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1);//顯示子程序
void dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san);//閃爍顯示子程序
void judge_dis();//顯示處理函數(shù)
void judge_clock();//顯示處理函數(shù)
//共陽數(shù)碼管斷碼表
const unsigned char tabl1[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
// 0 1 2 3 4 5
0x82,0xf8,0x80,0x90,0x86,0x87,0xFF,
//6 7 8 9 E T B
0xc6,0xa1,0x8e,0xb6};
// C D F 三
uchar t0_crycle;
uchar hour_count,minute_count,second_count,msecond_count;
uchar clock_hour,clock_minute;
uchar clock_en;//鬧鐘關(guān)閉和開啟的標(biāo)志,1開啟,0關(guān)閉
uchar flag1,zancun1,zancun2,zancun3;//,flag2;
uchar clock_flag;
uint speak_count;
//主程序
void main()
{
P3=0x00;
flag1=0;
zancun3=0;
speak=1;//關(guān)閉蜂鳴器
speak_count=0;
clock_hour=0;
clock_minute=0;
clock_flag=0;
clock_en=0;//開機(jī)時(shí)默認(rèn)關(guān)閉鬧鐘
init_t0();
TR0=1;//
//接下來開始編寫讓數(shù)碼管顯示的程序
while(1)
{
judge_dis();//顯示處理
judge_s1();
judge_s2();
judge_s3();
judge_clock();//鬧鐘處理程序
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0_crycle++;
if(t0_crycle==2)// 0.1秒
{
t0_crycle=0;
msecond_count++;
if(msecond_count==10)//1秒
{
msecond_count=0;
second_count++;
if(second_count==60)
{
second_count=0;
minute_count++;
if(minute_count==60)
{
minute_count=0;
hour_count++;
if(hour_count==24)
{
hour_count=0;
}
}
}
}
}
}
//**************************************************
//顯示處理函數(shù)
void judge_dis()
{
if(flag1==0)
{
dis(hour_count/10,hour_count%10,minute_count/10,minute_count%10,second_count/10,second_count%10);
dis_led();
}
if(flag1!=0)
{
switch(flag1)
{
case 1:
dis(5,10,11,1,12,12);//顯示SET1
led1_bit=1;
led2_bit=1;
break;
case 2:
dis(5,10,11,2,12,12);//顯示SET2
break;
case 3:
dis(5,10,11,3,12,12);//顯示SET3
break;
case 4:
dis(5,10,11,4,12,12);//顯示SET4
break;
case 5:
dis(5,10,11,5,12,12);//顯示SET5
break;
case 6:
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,1);
break;
case 7:
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,2);
break;
case 8:
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,3);
break;
case 9://進(jìn)入修改時(shí)間,時(shí)間分位個(gè)位閃爍
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,4);
break;
case 10://進(jìn)入修改鬧鐘,鬧鐘小時(shí)十位閃爍
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,1);
break;
case 11://進(jìn)入修改鬧鐘,鬧鐘小時(shí)個(gè)位閃爍
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,2);
break;
case 12://進(jìn)入修改鬧鐘,鬧鐘小時(shí)十位閃爍
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,3);
break;
case 13://進(jìn)入修改鬧鐘,鬧鐘小時(shí)個(gè)位閃爍
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,4);
break;
case 14://進(jìn)入修改鬧鐘的開關(guān)
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,6);
break;
default:
break;
}
}
}
//**************************************************
//S1按鍵處理函數(shù)
void judge_s1()
{
s1_bit=1;//置IO為1,準(zhǔn)備讀入收據(jù)
if(s1_bit==0)//判斷是否有按鍵按下
{
delay_50us(1);// 延時(shí),去除機(jī)械抖動(dòng)
if(s1_bit==0)
{
switch(flag1)
{
case 0:
flag1=1;
break;
case 1:
flag1=2;
break;
case 2:
flag1=3;
break;
case 3:
flag1=4;
break;
case 4:
flag1=5;
break;
case 5:
flag1=0;
break;
case 6://在修改時(shí)間小時(shí)十位下按S1鍵
flag1=7;
break;
case 7:
flag1=8;
break;
case 8:
flag1=9;
break;
case 9:
flag1=6;
break;
case 10:
flag1=11;
break;
case 11:
flag1=12;
break;
case 12:
flag1=13;
break;
case 13:
flag1=14;
break;
case 14:
flag1=10;
break;
default:
break;
}
while(s1_bit==0)
{
judge_dis();
}//等待按鍵釋放
}
}
}
//**************************************************
//S2按鍵處理函數(shù)
void judge_s2()
{
s2_bit=1;//置IO為1,準(zhǔn)備讀入收據(jù)
if(s2_bit==0)//判斷是否有按鍵按下
{
delay_50us(1);// 延時(shí),去除機(jī)械抖動(dòng)
if(s2_bit==0)
{
switch (flag1)
{
case 1: //在顯示SET1狀態(tài)下按S2件,進(jìn)入修改時(shí)間
flag1=6;
zancun1=hour_count;
zancun2=minute_count;
break;
case 2://在顯示SET2狀態(tài)下按S2,進(jìn)入設(shè)置鬧鐘
zancun1=clock_hour;
zancun2=clock_minute;
flag1=10;
break;
case 6://修改時(shí)鐘小時(shí)十位狀態(tài)下按S2件
hour_count=zancun1;
minute_count=zancun2;
second_count=0;
flag1=0;
break;
case 7://修改時(shí)鐘小時(shí)個(gè)位狀態(tài)下按S2件
hour_count=zancun1;
minute_count=zancun2;
second_count=0;
flag1=0;
break;
case 8://修改時(shí)鐘分鐘十位狀態(tài)下按S2件
hour_count=zancun1;
minute_count=zancun2;
second_count=0;
flag1=0;
break;
case 9://修改時(shí)鐘分鐘個(gè)位狀態(tài)下按S2件
hour_count=zancun1;
minute_count=zancun2;
second_count=0;
flag1=0;
break;
case 10:
clock_hour=zancun1;
clock_minute=zancun2;
clock_en=zancun3;
flag1=0;
break;
case 11:
clock_hour=zancun1;
clock_minute=zancun2;
clock_en=zancun3;
flag1=0;
break;
case 12:
clock_hour=zancun1;
clock_minute=zancun2;
clock_en=zancun3;
flag1=0;
break;
case 13:
clock_hour=zancun1;
clock_minute=zancun2;
clock_en=zancun3;
flag1=0;
break;
case 14:
clock_hour=zancun1;
clock_minute=zancun2;
clock_en=zancun3;
flag1=0;
break;
default:
break;
}
while(s2_bit==0)
{
judge_dis();
}//等待按鍵釋放
}
}
}
//**************************************************
//S3按鍵處理函數(shù)
void judge_s3()
{
s3_bit=1;//置IO為1,準(zhǔn)備讀入收據(jù)
if(s3_bit==0)//判斷是否有按鍵按下
{
delay_50us(1);// 延時(shí),去除機(jī)械抖動(dòng)
if(s3_bit==0)
{
switch (flag1)
{
case 6://修改時(shí)間小時(shí)的十位數(shù)
zancun1+=10;
if(zancun1>=24)zancun1=zancun1%10;
break;
case 7://修改時(shí)間小時(shí)的個(gè)位數(shù)
zancun1=zancun1/10*10+(zancun1%10+1)%10;
if(zancun1>=24)zancun1=20;
break;
case 8://修改時(shí)間分鐘的十位數(shù)
zancun2+=10;
if(zancun2>=60)zancun2-=60;
break;
case 9://修改時(shí)間分鐘的個(gè)位數(shù)
zancun2=zancun2/10*10+(zancun2%10+1)%10;
break;
case 10://修改鬧鐘小時(shí)的十位數(shù)
zancun1+=10;
if(zancun1>=24)zancun1=zancun1%10;
break;
case 11://修改鬧鐘小時(shí)的個(gè)位數(shù)
zancun1=zancun1/10*10+(zancun1%10+1)%10;
if(zancun1>=24)zancun1=20;
break;
case 12://修改鬧鐘分鐘的十位數(shù)
zancun2+=10;
if(zancun2>=60)zancun2-=60;
break;
case 13://修改鬧鐘分鐘的個(gè)位數(shù)
zancun2=zancun2/10*10+(zancun2%10+1)%10;
break;
case 14:
zancun3^=1;
break;
default:
break;
}
while(s3_bit==0)
{
judge_dis();
}//等待按鍵釋放
}
}
}
//****************************************
//顯示處理函數(shù)
void judge_clock()
{
if(clock_hour==hour_count && clock_minute==minute_count)
{
if(clock_en==1 && clock_flag==0)
{
speak_count=0;//開啟蜂鳴器
clock_flag=1;
speak_count=0;
}
}
else
{
clock_flag=0;
}
if(clock_flag==1 && speak_count<400)
{
if(msecond_count<=5)
{
speak=0;
speak_count++;
}
else
{
speak=1;
}
}
else
{
speak=1;
}
}
//****************************************
////閃爍顯示子程序
void dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san)
{
if(san==1)
{
if(msecond_count<5)
{
display1(s6);
}
}
else
{
display1(s6);
}
if(san==2)
{
if(msecond_count<5)
{
display2(s5);
}
}
else
{
display2(s5);
}
if(san==3)
{
if(msecond_count<5)
{
display3(s4);
}
}
else
{
display3(s4);
}
if(san==4)
{
if(msecond_count<5)
{
display4(s3);
}
}
else
{
display4(s3);
}
if(san==6)
{
if(msecond_count<5)
{
display6(s1);
}
}
else
{
display6(s1);
}
display5(s2);
// display6(s1);
}
//****************************************
//時(shí)鐘顯示程序
void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1)
{
display1(s6);
display2(s5);
display3(s4);
display4(s3);
display5(s2);
display6(s1);
}
//********************************************************************************************
void init_t0()
{
TMOD=0x01;//設(shè)定定時(shí)器工作方式1,定時(shí)器定時(shí)50毫秒
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//允許定時(shí)器0中斷
t0_crycle=0;//定時(shí)器中斷次數(shù)計(jì)數(shù)單元
}
//**************************************************
//LED處理函數(shù)
void dis_led()
{
if(msecond_count<5)
{
led1_bit=1;
led2_bit=1;
}
else
{
led1_bit=0;
led2_bit=0;
}
}
//***************************************************************
//功能:把數(shù)據(jù)1顯示在數(shù)碼管1上
void display6(uchar dis_data)
{
smg_data=tabl1[dis_data];//送顯示斷碼
dis_bit6=0;//鎖存數(shù)據(jù)
delay_50us(40);
dis_bit6=1;
}
//***************************************************************
//功能:把數(shù)據(jù)1顯示在數(shù)碼管1上
void display5(uchar dis_data)
{
smg_data=tabl1[dis_data];//送顯示斷碼
dis_bit5=0;//鎖存數(shù)據(jù)
delay_50us(40);
dis_bit5=1;
}
//***************************************************************
//功能:把數(shù)據(jù)1顯示在數(shù)碼管1上
void display4(uchar dis_data)
{
smg_data=tabl1[dis_data];//送顯示斷碼
dis_bit4=0;//鎖存數(shù)據(jù)
delay_50us(40);
dis_bit4=1;
}//***************************************************************
//功能:把數(shù)據(jù)1顯示在數(shù)碼管1上
void display3(uchar dis_data)
{
smg_data=tabl1[dis_data];//送顯示斷碼
dis_bit3=0;//鎖存數(shù)據(jù)
delay_50us(40);
dis_bit3=1;
}
//***************************************************************
//功能:把數(shù)據(jù)1顯示在數(shù)碼管1上
void display1(uchar dis_data)
{
smg_data=tabl1[dis_data];//送顯示斷碼
dis_bit1=0;//鎖存數(shù)據(jù)
delay_50us(40);
dis_bit1=1;
}
//***************************************************************
//功能:把數(shù)據(jù)1顯示在數(shù)碼管1上
void display2(uchar dis_data)
{
smg_data=tabl1[dis_data];//送顯示斷碼
dis_bit2=0;//鎖存數(shù)據(jù)
delay_50us(40);
dis_bit2=1;
}
//**************************************************************************************************
//函數(shù)名稱:void delay_50US(unsigned int t)
//功能: 延時(shí)50*t(us)
void delay_50us(uint t)
{
unsigned char j;
for(;t>0;t--)
{
for(j=19;j>0;j--);
}
}
|
|