|
- #include<reg52.h> //庫文件
- #define uchar unsigned char//宏定義無符號字符型
- #define uint unsigned int //宏定義無符號整型
- /********************************************************************
- 初始定義
- *********************************************************************/
- code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //顯示段碼 數碼管字跟
- uchar wei[4]={0XFB,0XF7,0XEF,0XdF};
- sbit zjwd=P3^6; //增加溫度
- sbit jswd=P3^7; //減少溫度
- uchar a=0;
- uchar b=0;
- uchar f=2;
- uchar g=1;
- uchar a1=0;
- uchar a2=0; //位的控制端
- uchar c=0;
- uint CLK;
- uint d=0;
- uint e=0;
- /********************************************************************
- 延時函數
- *********************************************************************/
- void delay()//延時3ms
- {
- uchar i,j;
- for(i=0;i<80;i++)
- {
- for(j=13;j>0;j--);
- { ;
- }
- }
- }
- void timer0( ) interrupt 1 //定時器0工作方式1
- {
- TH0=(65536-50000)/256; //重裝計數初值
- TL0=(65536-50000)%256; //重裝計數初值
- if(CLK==15)
- {
- CLK=0;
- d=d+1;
- }
- else
- {
- CLK=CLK+1; //取反
- }
- }
- void tingzhi() //降溫按健是否按下
- {
- if(jswd)
- {
- a2=1;
- }
- if(a2)
- {
- if(!jswd)
- {
- a2=0;
- }
- }
- }
- void kaishi()
- {
- if(zjwd)
- {
- a1=1;
- }
- if(a1)
- {
- if(!zjwd)
- {
- a1=0;//標志位
- d=0; //公里數設為0
- f=1; //將開始標志位設1
- EA=1;
- ET0=1;
- while(f==1)
- {
- P3=0XFF;//全部不顯示
- b=d/1000;
- P0=seg7code[b];
- P3=wei[0];//第一個數碼管陽極高電平點亮
- delay();//延時3ms
- P3=0XFF; //全部不顯示
- b=d%1000/100;
- P0=seg7code[b];
- P3=wei[1];//第二個數碼管陽極高電平點亮
- delay();//延時3ms
- P3=0XFF; //全部不顯示
- b=d%100/10;
- P0=seg7code[b];
- P3=wei[2];//第三個數碼管陽極高電平點亮
- delay();//延時3ms
- P3=0XFF; //全部不顯示
- b=d%10;
- P0=seg7code[b];
- P3=wei[3];//第四個數碼管陽極高電平點亮
- delay(); //延時3ms
- tingzhi();
- if(a2==0)//如果停止鍵按下。退出顯示循環
- {f=0;}
- }
- }
- }
- }
- void xianshichushi()
- {
- while(1)
- {
- P3=0XFF;//全部不顯示
- P0=seg7code[0];
- P3=wei[0];//第一個數碼管陽極高電平點亮
- delay();//延時3ms
- P3=0XFF; //全部不顯示
- P0=seg7code[0];
- P3=wei[1];//第二個數碼管陽極高電平點亮
- delay();//延時3ms
- P3=0XFF; //全部不顯示
- P0=seg7code[0];
- P3=wei[2];//第三個數碼管陽極高電平點亮
- delay();//延時3ms
- P3=0XFF; //全部不顯示
- P0=seg7code[0];
- P3=wei[3];//第四個數碼管陽極高電平點亮
- delay(); //延時3ms
- kaishi() ;
- if(!a1)
- break;
- }
- }
- /********************************************************************
- 主函數
- *********************************************************************/
- void main()
- {
- TMOD=0X01; //定時器中斷0
- CLK=0; //脈沖信號初始值為0
- TH0=(65536-50000)/256; //定時時間高八位初值
- TL0=(65536-50000)%256; //定時時間低八位初值
- EA=1; //開CPU中斷
- ET0=1; //開T/C0中斷
- TR0=1;
- xianshichushi(); //數碼管顯示初始化
- while(1)
- {
- kaishi();//開始計費鍵是否按下
- if(f==0)//是否按下停止按鍵
- {
- CLK=0; //脈沖信號初始值為0
- TH0=(65536-50000)/256; //定時時間高八位初值
- TL0=(65536-50000)%256; //定時時間低八位初值
- EA=0; //關CPU中斷
- ET0=0; //關T/C0中斷
- if(d==1||d==0)//是否為一公里以內
- {
- e=3;//收費7元
- }
- else
- {
- e=(d-1)*5+3;
- }
- while(f==0)
- {
- P3=0XFF;//全部不顯示
- b=e/1000;
- P0=seg7code[b];
- P3=wei[0];//第一個數碼管陽極高電平點亮
- delay();//延時3ms
- P3=0XFF; //全部不顯示
- b=e%1000/100;
- P0=seg7code[b];
- P3=wei[1];//第二個數碼管陽極高電平點亮
- delay();//延時3ms
- P3=0XFF; //全部不顯示
- b=e%100/10;
- P0=seg7code[b];
- P3=wei[2];//第三個數碼管陽極高電平點亮
- delay();//延時3ms
- P3=0XFF; //全部不顯示
- b=e%10;
- P0=seg7code[b];
- P3=wei[3];//第四個數碼管陽極高電平點亮
- delay(); //延時3ms
- if(zjwd)
- {
- a1=1;
- }
- if(a1)
- {
- if(!zjwd)
- {
- a1=0;//標志位
- f=1; //將開始標志位設1
- P0=seg7code[0]; //數碼管清零
- }
- }
- }
- }
- }
- }
復制代碼 |
|