|
用STC單片機制作的一英尺數碼管程序- #include <reg51.h>
- #include <math.h>
- #include "ADC.H"
- #include "ds1302.h"
- bit flag, Bell_Swh=1,Hourb,Minb,Kgb,flag_read,dot_Bell=1,Bell_Swh1=1;//鬧鐘調時閃爍標志位
- bit sec=0,min=0,hour=0,year=0,mon=0,day=0,weekk=0,hour_Bell=0,min_Bell=0,hour_time=0,min_time=0;flag_bell=0,bell_bug = 0; //閃爍標志位
- unsigned char id,id2,d,e,S_1302,S1_1302,H_1302,H_Bell,S_Bell,H_time,S_time; //
- unsigned char disbuff[4] ={0};
- unsigned char time=0;
- unsigned int temp[1];
- unsigned int temp_num = 0;
- unsigned char code LEDData1 [ ] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff }; //正0-9LED數值
- unsigned char code LEDData2 [ ] = { 0xc0,0xcf,0xA4,0x86,0x8B,0x92,0x90,0xc7,0x80,0x82,0xff }; //反0-9LED數值
- void Delayms(unsigned int di) //延時
- {
- unsigned int da,db;
- for(da=0;da<di;da++)
- for(db=0;db<10;db++);
- }
- void Display(void) //掃描方式led1~led4循環點亮
- {
- time++;
- if(time==1)
- {
- if(dot_Bell)
- {
- P2=LEDData1[disbuff[0]]&0x7f;// 0x7F點亮DP小數點
- LED1=0; LED4=1;
- }
- else
- {
- P2=LEDData1[disbuff[0]];
- LED1=0; LED4=1;
- }
- }
- if(time==2)
- {
- if(id>=3)
- {
- P2=(LEDData2[disbuff[1]])&0x7F;
- LED1=1; LED2=0;
- }
- else
- if(flag)
- {
- P2=(LEDData2[disbuff[1]])&0x7F;
- LED1=1; LED2=0;
- }
- else
- {
- P2=LEDData2[disbuff[1]];
- LED1=1; LED2=0;
- }
- }
- if(time==3)
- {
- if(id>=3)
- {
- P2=LEDData1[disbuff[2]]&0x7f;
- LED2=1; LED3=0;
- }
- else
- if(flag)
- {
- P2=LEDData1[disbuff[2]]&0x7f;
- LED2=1; LED3=0;
- }
- else
- {
- P2=LEDData1[disbuff[2]];
- LED2=1; LED3=0;
- }
- }
-
- if(time==4)
- {
- time=0;
- if(disbuff[3]==0)
- {
- P2=LEDData1[10];
- LED3=1; LED4=0;
- }
- else
- {
- P2=LEDData1[disbuff[3]];
- LED3=1; LED4=0;
- }
- }
- }
- /******************************************************************************/
- void Disp(void)//顯示和閃爍函數
- {
- unsigned int i=0;
- unsigned char a=0,b=0,c=0,f=0;
- if(hour==1) //小時閃爍標志位
- {
- if(flag==1)
- {
- b=read_clock(0x85);//讀小時
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
- }
- else
- {
- disbuff[2]=10;
- disbuff[3]=10;
- }
- }
- else
- {
- if(flag_read==1)//250MS 讀一次
- {
- H_1302=read_clock(0x85);//讀小時
- b=read_clock(0x85);//讀小時
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
- }
- }
-
- if(min==1) //分鐘閃爍標志位
- {
- if(flag==1)
- {
- d=read_clock(0x83);//讀分鐘
- e=d;
- d=d>>4;
- e=e&0x0f;
- disbuff[1]=d;
- disbuff[0]=e;
- }
- else
- {
- disbuff[1]=10;
- disbuff[0]=10;
- }
- }
- else
- {
-
- if(flag_read==1) //250MS讀寫一次
- {
- S1_1302=read_clock(0x81);//讀秒
- S_1302=read_clock(0x83);//讀分鐘
- d=read_clock(0x83);//讀分鐘
- e=d;
- d=d>>4;
- e=e&0x0f;
- disbuff[1]=d;
- disbuff[0]=e;
- }
- }
-
- }
- /******************************************************************************/
- void Disp2(void)//顯示和閃爍函數
- {
- unsigned int i=0;
- unsigned char a=0,b=0,c=0,f=0;
- if(hour_Bell==1) //小時閃爍標志位
- {
- if(flag==1)
- {
- b=read_clock(0xc3);//讀小時
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
-
- }
- else
- {
- disbuff[2]=10;
- disbuff[3]=10;
- }
- }
- else
- {
- if(flag_read==1)
- {
- H_Bell=read_clock(0xc3);//讀取鬧鐘的時
- S_Bell=read_clock(0xc5);//讀取鬧鐘的分
- b=read_clock(0xc3);//讀小時
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
- }
- }
-
-
- if(min_Bell==1) //分鐘閃爍標志位
- {
- if(flag==1)
- {
- d=read_clock(0xc5);//讀分鐘
- e=d;
- d=d>>4;
- e=e&0x0f;
- disbuff[1]=d;
- disbuff[0]=e;
- }
- else
- {
- disbuff[1]=10;
- disbuff[0]=10;
- }
- }
- else
- {
-
- if(flag_read==1) //250MS讀寫一次
- {
- d=read_clock(0xc5);//讀分鐘
- e=d;
- d=d>>4;
- e=e&0x0f;
- disbuff[1]=d;
- disbuff[0]=e;
- }
- }
-
- }
- /******************************************************************************/
- void Disp3(void)//顯示和閃爍函數
- {
- unsigned int i=0;
- unsigned char a=0,b=0,c=0,f=0;
- if(hour_time==1) //小時閃爍標志位
- {
- if(flag==1)
- {
- b=read_clock(0xc7);//讀小時
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
-
- }
- else
- {
- disbuff[2]=10;
- disbuff[3]=10;
- }
- }
- else
- {
- if(flag_read==1)
- {
- H_time=read_clock(0xc7);//讀取鬧鐘的時
- S_time=read_clock(0xc9);//讀取鬧鐘的分
-
- if(H_time>S_time)
- {
- unsigned char i;
- i=H_time;
- H_time=S_time;
- S_time=i;
- }
-
- b=read_clock(0xc7);//讀小時
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
-
- }
- }
-
-
- if(min_time==1) //分鐘閃爍標志位
- {
- if(flag==1)
- {
- d=read_clock(0xc9);//讀分鐘
- e=d;
- d=d>>4;
- e=e&0x0f;
- disbuff[1]=d;
- disbuff[0]=e;
- }
- else
- {
- disbuff[1]=10;
- disbuff[0]=10;
- }
- }
- else
- {
-
- if(flag_read==1) //250MS讀寫一次
- {
- d=read_clock(0xc9);//讀分鐘
- e=d;
- d=d>>4;
- e=e&0x0f;
- disbuff[1]=d;
- disbuff[0]=e;
- }
- }
-
- }
- /******************************************************************************/
- void id_case1_key(void)//id為1時的下一級選擇
- {
- if(Add_Key == 0) //增加
- {
- Delay(4000);
- if(Add_Key == 0) {while(Add_Key ==0); Set_time(id,0); }
- //調用Set_time函數
-
- }
-
- }
- /******************************************************************************/
- void id_case2_key(void)//id為1時的下一級選擇
- {
- if(Add_Key == 0) //增加
- {
- Delay(4000);
- if(Add_Key == 0)
- {
- while(Add_Key ==0);
- Set_Bell(id,0);
- }
- // Set_Bell(id,0); //調用Set_Bell函數
- //while(Add_Key ==0);
- }
- }
- void id_AD_scan_key(void)
- {
- if(Add_Key == 0)
- {
- Delay(4000);
- if(Add_Key == 0)
- {
- ET1 = 0;
- id = 0;
- ET0 = 1;
- // return;
- }
- }
- }
- /******************************************************************************
- void id_case3_key(void)//id為1時的下一級選擇
- {
- if(Add_Key == 0) //增加
- {
- Delay(300);
- if(Add_Key == 0)
- {
- dot_Bell=~dot_Bell;
- Bell_Swh=dot_Bell;
- write_clock(0x8e,0x00);//允許寫操作
- write_clock(0xc8,Bell_Swh);
- write_clock(0x8e,0x80);//寫保護,禁止寫操作
- }
- while(Add_Key ==0);
- }
-
- }
- /******************************************************************************/
- void Set_Bell(unsigned char sel, bit sel_1)//根據選擇調整相應項目
- {
- signed char address,item;
- signed char max,mini;
- //if(sel==4) {address=0xc6; max=59;mini=0;} //秒
- if(sel==4) {address=0xc2; max=23; mini=0;} //時
- if(sel==5) {address=0xc4; max=59;mini=0;} //分
- if(sel==6) //標志位
- {
- // address=0xc8;//for read
- // if(Add_Key ==0 || Dec_Key ==0)
- // Bell_Swh=~Bell_Swh;
- // write_clock(address,Bell_Swh);
- //address=0xc8;
- dot_Bell=~dot_Bell;
- Bell_Swh=dot_Bell;
- write_clock(0x8e,0x00);//允許寫操作
- write_clock(0xca,Bell_Swh);
- write_clock(0x8e,0x80);//寫保護,禁止寫操作
- } //開關
- if(sel==7) {address=0xc6; max=23;mini=0;} //分
- if(sel==8) {address=0xc8; max=23; mini=0;} //時
- if(sel==9) //標志位
- {
- // address=0xc8;//for read
- // if(Add_Key ==0 || Dec_Key ==0)
- // Bell_Swh=~Bell_Swh;
- // write_clock(address,Bell_Swh);
- //address=0xc8;
- dot_Bell=~dot_Bell;
- Bell_Swh1=dot_Bell;
- write_clock(0x8e,0x00);//允許寫操作
- write_clock(0xcc,Bell_Swh1);
- write_clock(0x8e,0x80);//寫保護,禁止寫操作
- } //開關
- item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
- if(sel_1==0)
- item++;
- else
- item--;
- if(item>max) item=mini;
- if(item<mini) item=max;
- write_clock(0x8e,0x00);//允許寫操作
- write_clock(address,(item/10)*16+item%10);//轉換成16進制寫入1302
- write_clock(0x8e,0x80);//寫保護,禁止寫操作
- }
- /******************************************************************************/
- void Timer0_Init(void)//定時器0初始化
- {
- /*
- AUXR &= 0x7F; //定時器時鐘12T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0x18; //設置定時初值
- TH0 = 0xFC; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- ET0= 1;*/
-
- /*
- //2毫秒@6.000MHz
- AUXR |= 0x80; //定時器時鐘1T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0x20; //設置定時初值
- TH0 = 0xD1; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- ET0 = 1; //enable timer0 interrupt*/
-
- //2毫秒@12.000MHz
- AUXR |= 0x80; //定時器時鐘1T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0x40; //設置定時初值
- TH0 = 0xA2; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- ET0 = 1; //enable timer0 interrupt
- }
- void Timer1Init(void) //20毫秒@12.000MHz
- {
- AUXR &= 0xBF; //定時器時鐘12T模式
- TMOD &= 0x0F; //設置定時器模式
- TL1 = 0xE0; //設置定時初值
- TH1 = 0xB1; //設置定時初值
- TF1 = 0; //清除TF1標志
- TR1 = 1; //定時器1開始計時
- }
- /******************************************************************************/
- void Timer0(void) interrupt 1 using 1//中斷入口,冒號閃爍
- {
- static unsigned char timecount = 0;//
- timecount++;
- if(timecount > 125)
- {
- flag_read = ~flag_read;
-
- }
- if(timecount > 250)//500MS
- {
- timecount = 0;
- flag = ~flag;
- }
- Display();
- }
- void Timer1(void) interrupt 3 using 1
- {
- temp_num++;
- if(temp_num > 40)
- {
- temp_num = 0;
- }
-
- }
- void ADC_convert(void)
- {
-
- //EA = 0;//關中斷
-
- ET0 = 0;
-
- if(temp_num == 0)
- {
- GetADCResult(6,&temp[0]);
-
- //temp[0] = (unsigned int) ( ( 3950.0 / ( 11.33657 + log( 6.04 * (float)temp[0] / ( 1024.0 - (float)temp[0] ) ) ) - 273.15 ) * 100 );
- temp[0]=(unsigned int) ((1/(log(((float)temp[0]*4700/(1024-(float)temp[0]))/10000)/3950+1/298.15)-273.15)*100);
-
- temp_num = 1;
- }
-
- P2 = LEDData1[temp[0]/1000]; //千位
- LED4 = 0;
- Delayms(50);
- LED4 = 1;
- P2 = (LEDData1[temp[0]%1000/100])&0x7F;//百位
- LED3 = 0;
- Delayms(50);
- LED3 = 1;
- P2 = LEDData2[temp[0]%1000%100/10];//十位
- LED2 = 0;
- Delayms(50);
- LED2 = 1;
-
- P2 = 0xa7;//c
- LED1 = 0;
- Delayms(50);
- LED1 = 1;
-
- // id = 0;
-
- ET1 = 1;//啟動定時器1
-
- }
- /******************************************************************************/
- void main(void)//主函數
- {
- P3M1=0x00;
- P3M0=0x08;
- H_Bell=read_clock(0xc3);//讀取鬧鐘的時
- S_Bell=read_clock(0xc5);//讀取鬧鐘的分
- H_time=read_clock(0xc7);//讀取鬧鐘的時
- S_time=read_clock(0xc9);//讀取鬧鐘的分
-
- dot_Bell= Bell_Swh;
-
- InitADC(); //初始化ADC
- Timer0_Init();//定時器T0初始化
- Timer1Init();
- EA=1;
- while(1)//主循環
- {
- //設置時鐘的初始值,顯示14年4月5號11:59:55
- if(OK_Key == 0 && Add_Key == 0)
- {
- Delay(1000);
- if(OK_Key == 0 && Add_Key == 0)
- {
- while(OK_Key == 0);//等待鍵松開
- Init_1302();
- H_Bell=read_clock(0xc3);//讀取鬧鐘的時
- S_Bell=read_clock(0xc5);//讀取鬧鐘的分
- H_time=read_clock(0xc7);//讀取鬧鐘的時
- S_time=read_clock(0xc9);//讀取鬧鐘的分
- dot_Bell= Bell_Swh;
-
- }
- }
- /*****************************************/
- // MF: //返回主界面
- /*****************************************/
- if (OK_Key == 0) // 設置和選擇項目鍵
- {
- Delay(1000);
- if(OK_Key == 0)
- {
- id++;
- if(id == 2)
- {
- ET1 = 0;
- ET0 = 1;
- }
- if(id>9)id=0;
- }
-
- while(OK_Key == 0);//等待鍵松開
- }
- /***************************************/
- switch( id )
- {
- case 0:
- hour=0;
- min=0;
- Disp( );
- dot_Bell= Bell_Swh;
- break;//正常顯示
- case 1:
- hour=0;
- min=0;
- ADC_convert();
- id_AD_scan_key();
- dot_Bell= Bell_Swh;
- break;//顯示溫度
- case 2:
- hour=1;
- id_case1_key();
- Disp();
- dot_Bell=0;
- break; //小時
- case 3:
- hour=0;
- min=1;
- id_case1_key();
- Disp();
- dot_Bell=0;
- break; //分鐘
- case 4:
- hour_Bell=1;
- id_case2_key();
- Disp2();
- dot_Bell= Bell_Swh;
- break;
- case 5:
- hour_Bell=0;
- min_Bell=1;
- id_case2_key();
- Disp2();
- dot_Bell= Bell_Swh;
- break;
- case 6:
- hour_Bell=0;
- min_Bell=0;
- id_case2_key();
- Disp2();
- dot_Bell= Bell_Swh;
- break;
- case 7:
- hour_time=1;
- id_case2_key();
- Disp3();
- dot_Bell= Bell_Swh1;
- break;
- case 8:
- hour_time=0;
- min_time=1;
- id_case2_key();
- Disp3();
- dot_Bell= Bell_Swh1;
- break;
- case 9:
- hour_time=0;
- min_time=0;
- id_case2_key();Disp3();
- dot_Bell= Bell_Swh1;
- break;
- default:
- break;
- }
- if(Bell_Swh == 1)//鬧鐘為開
- {
-
- if(H_Bell == H_1302)
- {
- if(S_Bell == S_1302) //分相等
- {
-
- if(S1_1302==0) //秒等于0才開鬧鐘
- {
- flag_bell=1;
- }
- if(Add_Key ==0 )//按加退出
- {
- flag_bell=0;
- }
-
- }
- else
- {
- flag_bell=0;
- }
- }
- }//if
- /******************************************************************/
- /* if(Bell_Swh1 == 1)//整點報
- {
- if((H_1302 >=H_time )&&(H_1302<=S_time))
- {
- if( S_1302 == 0 ) //分相等
- {
- if(id != 2)
- {
- if(S1_1302==0x00) //秒等于0才開鬧鐘
- {
- flag_bell=1;
- bell_bug++; //
- if(bell_bug == 2) //整點報時bug修正小函數
- { //
- bell_bug = 0; //
- flag_bell = 0; //
- }
-
- }
- else
- flag_bell=0;
- }
- }
- }
- }//if */
-
-
-
- if(Bell_Swh1 == 1)//整點報
- {
- if((H_1302 >=H_time )&&(H_1302<=S_time))
- {
- if( (S_1302 == 0) && ((S1_1302==0x00)) ) //分相等 //秒等于0才開鬧鐘
- {
- if(id != 2)
- {
- if(id != 3)
- {
- flag_bell=1;
- bell_bug++; //
- if(bell_bug == 2) //整點報時bug修正小函數
- { //
- bell_bug = 0; //
- flag_bell = 0; //
- }
- }
- else
- {
- flag_bell=0;
- }
-
- }
- else
- {
- flag_bell=0;
- }
- }
- else
- {
- flag_bell = 0;
- }
- }
- else
- {
- flag_bell = 0;
- }
- }//if
- if(flag_bell) //
- {
- Bell();
- }
- /******************************************************************/
- }//while
- }//main
復制代碼
|
|