|
本帖最后由 llftom 于 2019-11-22 16:14 编辑
家里面有个定时器,但是每次要对好了开始时间和结束时间有点麻烦,所以自己做个定时器,
刚开始想用stc89c52,后来想了想有点浪费l/O口,又用了stc11f02e。
先从最基本的焊接把数码管线焊接上,一个月之前就开始做了,有好多事耽误制作。
做好了就是下载程序了。
下面是程序,大概只有1K多,写的比较垃圾,没专业学过编程,如果程序有写的不对的地方请指正,谢谢
- #include<STC11F.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit k1=P3^2;
- sbit k2=P3^1;
- sbit k3=P3^0;
- sbit J1=P3^7; //继电器输出
- bit flag=0; //存储标志位
- bit flag1=1; //倒计时结束标志位
- bit flag2=0; //显示小绿灯标志位
- bit flag3=0;
- uchar time,g1=0,timec=0;
- uchar disp[4];
- uint counter=0,a=5000,i=800; //i代表循环快慢,越小循环越快 a代表按键完成到计时开始的延时
- //uchar timec=0;
- uchar code leddata[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
- 0x77, //"A"
- 0x7C, //"B"
- 0x39, //"C"
- 0x5E, //"D"
- 0x79, //"E"
- 0x71, //"F"
- 0x76, //"H"
- 0x38, //"L"
- 0x37, //"n"
- 0x3E, //"u"
- 0x73, //"P"
- 0x5C, //"o"
- 0x40, //"-"
- 0x00, //熄灭
- 0x01, //24
- 0x02, //25
- 0x04, //26
- 0x08, //27
- 0x10, //28
- 0x20 //29
-
- };//0~9
- /*Declare SFR associated with the IAP
- sfr IAP_DATA = 0xC2; //Flash data register
- sfr IAP_ADDRH = 0xC3; //Flash address HIGH
- sfr IAP_ADDRL = 0xC4; //Flash address LOW
- sfr IAP_CMD = 0xC5; //Flash command register
- sfr IAP_TRIG = 0xC6; //Flash command trigger
- sfr IAP_CONTR = 0xC7; //Flash control register
- */
- /*Define ISP/IAP/EEPROM command*/
- #define CMD_IDLE 0 //Stand-By
- #define CMD_READ 1 //uchar-Read
- #define CMD_PROGRAM 2 //uchar-Program
- #define CMD_ERASE 3 //Sector-Erase
- /*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/
- //#define ENABLE_IAP 0x82 //if SYSCLK<20MHz
- #define ENABLE_IAP 0x83 //if SYSCLK<12MHz
- //Start address for STC10/11xx EEPROM
- #define IAP_address 0x0000
- void delayus()//函数功能:延时若干微秒
- {
- _nop_();
- _nop_();
- }
- void delay(uint z) //函数功能:延时若干毫秒
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- }
- void Timer1Init(void) //50毫秒@12.000MHz
- {
- AUXR &= 0xBF; //定时器时钟12T模式
- TMOD &= 0x0F; //设置定时器模式
- TMOD |= 0x10; //设置定时器模式
- TL1 = 0xB0; //设置定时初值
- TH1 = 0x3C; //设置定时初值
- TF1 = 0; //清除TF1标志
- //TR1 = 1; //定时器1开始计时
- }
- /*void Timer0Init(void) //60毫秒@12.000MHz
- {
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0xA0; //设置定时初值
- TH0 = 0x15; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- }
- */
- void timer1_int() interrupt 3
- {
- TF1=0;
- TL1 = 0xB0; //设置定时初值
- TH1 = 0x3C; //50ms
- timec+=1;
- if(timec%10==0)
- flag3= ~flag3;
- if(timec==20)
- {
- counter+=1;
- timec=0;
-
- }
- /*g1++;
- if(g1==25)
- flag3=~flag3;*/
-
- }
- /*void timer0_int() interrupt 1
- {
- TF0=0;
- TL0 = 0xA0; //设置定时初值
- TH0 = 0x15; //设置定时初值 定时60mS
- g1+=1;
- if(g1==40)
- {
- //flag2= ~flag2;
- //g1=0;
- }
- }
- */
- void display()
- {
- P3=P3 | 0x78; //0111 1000
- delay(2);
-
- P1=leddata[disp[3]]; //第4位,
- P3|=0x38;//0011 1000
- P3&=0xBF; //1011 1111
- delay(2);
- _nop_();
- P3|=0x78;
- P1=leddata[disp[2]]; //第3位,
- P3|=0x58;//0101 1000
- P3&=0xDF;//1101 1111
- delay(2);
- _nop_();
- P3|=0x78;
- P1=leddata[disp[1]]; //第2位,
- if(flag2)
- if(flag3)
- P1|=0x80;
- P3|=0x68;//0110 1000
- P3&=0xEF;//1110 1111
- delay(2);
- _nop_();
- P3|=0x78;
- P1=leddata[disp[0]]; //第1位,
- P3|=0x70;//0111 0000
- P3&=0xF7;//1111 0111
- delay(2);
- _nop_();
- P3|=0x78;
- }
- void display1()
- {
-
- }
- void keyscan()
- {
- if(k1==0)
- {
- delay(5);//消抖
- if(k1==0)
- {
-
- while(!k1);
- }
- }
- if(k2==0)
- {
- delay(5);//消抖
- if(k2==0)
- {
- time+=1;
- a=5000;
- if(time>99)
- time=0;
- while(!k2);
- flag=1;
- }
- }
- if(k3==0)
- {
- delay(5);//消抖
- if(k3==0 )//停止计时才有效
- {
- time-=1;
- a=5000;
- if(time<2)
- time=1;
- while(!k3);
- flag=1;
- }
- }
-
- }
- ////////////
- void IapIdle()
- {
- IAP_CONTR = 0; //Close IAP function
- IAP_CMD = 0; //Clear command to standby
- IAP_TRIG = 0; //Clear trigger register
- IAP_ADDRH = 0x80; //Data ptr point to non-EEPROM area
- IAP_ADDRL = 0; //Clear IAP address to prevent misuse
- }
- /*----------------------------
- ----------------------------*/
- uchar IapReadBYTE(uint addr)
- {
- uchar dat; //Data buffer
- IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
- IAP_CMD = CMD_READ; //Set ISP/IAP/EEPROM READ command
- IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
- IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
- IAP_TRIG = 0x5a; //Send trigger command1 (0x5a)
- IAP_TRIG = 0xa5; //Send trigger command2 (0xa5)
- _nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete
- dat = IAP_DATA; //Read ISP/IAP/EEPROM data
- IapIdle(); //Close ISP/IAP/EEPROM function
- return dat; //Return Flash data
- }
- /*----------------------------
- ----------------------------*/
- void IapProgramBYTE(uint addr, uchar dat)
- {
- IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
- IAP_CMD = CMD_PROGRAM; //Set ISP/IAP/EEPROM PROGRAM command
- IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
- IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
- IAP_DATA = dat; //Write ISP/IAP/EEPROM data
- IAP_TRIG = 0x5a; //Send trigger command1 (0x5a)
- IAP_TRIG = 0xa5; //Send trigger command2 (0xa5)
- _nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete
- IapIdle();
- }
- /*----------------------------
- ----------------------------*/
- void IapEraseSector(uint addr)
- {
- IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
- IAP_CMD = CMD_ERASE; //Set ISP/IAP/EEPROM ERASE command
- IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
- IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
- IAP_TRIG = 0x5a; //Send trigger command1 (0x5a)
- IAP_TRIG = 0xa5; //Send trigger command2 (0xa5)
- _nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete
- IapIdle();
- }
- void main()
- {
-
- uchar shi,fen,fshi,ffen,k;
- uint b;
- J1=1;
- Timer1Init();
- ET1=1;
- ET0=1;
- EA=1;
- //IapEraseSector(IAP_address);//清除扇区中的内容,
- //IapProgramBYTE(IAP_address,7);//把设置时间写入扇区,
-
- delayus();
-
- flag2=0;
- time=IapReadBYTE(IAP_address);
- while(a--)
- {
- disp[3]=time%10;
- disp[2]=time/10;
- disp[1]=22; //-
- disp[0]=20; //P
- display();
-
- keyscan();
- delay(5);
- }
- for(b=0;b<1500;b++)
- {
- disp[0]=disp[1]=disp[2]=disp[3]=22;//显示----
- display();
- }
- //delay(30000);
- //while(1);
- if(flag)
- {
- IapEraseSector(IAP_address);//清除扇区中的内容,
- IapProgramBYTE(IAP_address,(uchar)time);//把设置时间写入扇区,
- flag=0;
- }
- TR1 =1;
- ffen =1;
- fshi =1;
- while(flag1)
- {
- flag2=1; //显示小绿灯标志位
- J1=0;
- if(counter==60)
- {
- counter=0;
- ffen++;
- }
- if(ffen==61)
- {
- fshi++;
- ffen=1;
- }
- if(ffen>=time)
- goto page;
-
- shi=time-fshi;
- page:
- fen=60-ffen;
- // fen=60-ffen;
-
- if(fen==0 && shi==0)
- {
- flag1=0;
- flag2=0;
- }
- /*if(shi==0)
- goto page;
- if(ffen==60)
- {
- ffen=1;
- fshi++;
- }
- //fen=60-ffen;
- shi=time-fshi;
- //if(shi==0)
- // shi==0;
- //page:
- // if(ffen==60)
- // fen==60-ffen;
- page:*/
- _nop_();
- _nop_();
- disp[3]=fen%10; //第4位,
- disp[2]=fen/10; //第3位,
- disp[1]=shi%10; //第2位,
- disp[0]=shi/10; //第1位,
-
- display();
- //if(shi==0 && fen==0)
-
-
- }
-
- while(1)
- {
- J1=1;
- //上面显示,
- for(k=0;k<4;k++)
- {
-
- disp[0]=disp[1]=disp[2]=disp[3]=23;
- disp[k]=24;
- for(b=0;b<i;b++)
- display();
- }
- //右面显示,
- disp[3]=25;
- disp[1]=disp[2]=disp[0]=23;
- for(b=0;b<i;b++)
- display();
- disp[3]=26;
- disp[1]=disp[2]=disp[0]=23;
- for(b=0;b<i;b++)
- display();
- //下面显示,
- for(k=0;k<4;k++)
- {
-
- disp[0]=disp[1]=disp[2]=disp[3]=23;
- disp[(3-k)]=27;
- for(b=0;b<i;b++)
- display();
- }
- //左面显示,
- disp[0]=28;
- disp[1]=disp[2]=disp[3]=23;
- for(b=0;b<i;b++)
- display();
- disp[0]=29;
- disp[1]=disp[2]=disp[3]=23;
- for(b=0;b<i;b++)
- display();
-
- }
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|