油箱油量指示报警
程序清单:
- #include<reg52.h>
- #include<intrins.h>
- typedef unsigned int uint;
- typedef unsigned char uchar;
- sbit Dula=P2^0; //数码管段选使能
- sbit Wela=P2^1; //数码管位选使能
- sbit ADC_CS=P2^5; //ADC0804的片选端
- sbit ADC_RD=P2^6; //ADC0804的读控制
- sbit ADC_WR=P2^7; //ADC0804的开始控制
- sbit BUZZER=P2^3; //蜂鸣器io口
- uchar num=0;
- bit flag=0; //第一次转换成功过标志
- uchar code table[]={ //无小数点共阴数码管编码
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- void delay_tms(uint t); //t毫秒延时函数
- void Display(); //显示函数,以及报警
- void ADC0804(); //ADC0804转换函数
- void TMOD_Init(); //定时器初始化函数
- void main()
- {
- TMOD_Init(); //初始化定时器
- BUZZER=1;
- while(1)
- {
- ADC0804(); //不断地进行数模转化
- }
- }
- void delay_tms(uint t)
- {
- uint x,y;
- for(x=t;x>0;x--)
- for(y=110;y>0;y--);
- }
- void TMOD_Init()
- {
- TMOD=0X01;
- TH0=0xfc;
- TL0=0x18;
- EA=1;
- ET0=1;
- TR0=0;
- }
- void Display()
- {
- uchar i,buf[4];
- uint temp;
- temp=num;
- temp=temp*200/51;
- if(temp<100)
- {
- P3=0XBF;
- TR0=1;
- }
- else if((temp>=100)&&(temp<900))
- {
- P3=0xc1;
- TR0=0;
- }
- else
- {
- P3=0XFE;
- TR0=0;
- }
- buf[0]=table[temp/1000]; //分离数据的百位
- buf[1]=table[temp%1000/100]; //分离数据的十位
- buf[2]=table[temp%100/10]|0x80; //分离数据的各位,并|0x80,使显示小数点
- buf[3]=table[temp%10]; //分离数据的小数点后一位
- for(i=0;i<4;i++)
- {
- Wela=1;
- P0=~(0x01<<i) ; //送位选数据
- Wela=0;
-
- Dula=1;
- P0=buf[i]; //送段选数据
- Dula=0;
- delay_tms(5);
- P0=0XFF; //数码管消隐
- }
- }
- void ADC0804()
- {
- uchar i;
- ADC_CS=0;
- ADC_WR=0;
- _nop_();
- _nop_();
- ADC_WR=1; //启动ADC0804的转化
- if(flag!=0) //如果转化成功
- {
- flag=1;
- for(i=0;i<8;i++)
- Display();
- }
- ADC_RD=0;
- _nop_();
- _nop_();
- num=P1; //读取ADC0804的转化后的数值
- _nop_();
- ADC_RD=1;
- ADC_CS=1;
- flag=1;
- Display();
- }
- void timer() interrupt 1 //中断函数。产生蜂鸣器所需震荡
- {
- TH0=0xfc;
- TL0=0x18;
- BUZZER=~BUZZER;
- }
复制代码 |