- #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]; //数码管清零
- }
- }
- }
- }
- }
- }
复制代码 |