本帖最后由 华夏哈哈哈 于 2020-3-23 14:47 编辑
- //问题是:当key1,key2按下时,数码管显0000(key1按下)/0100(key2按下),可是目前正常显示没问题,但是摁下key1,key2数码管没有如期的运行,我想请教各位大神,我应该怎么在现有基础上实现 按下key1时,数码管显示0000,按下key2时,数码管显示0100,且对现有程序不产生干扰,谢谢,感激不尽
- //线性区间标度变换公式: y=(115-15)/(243-13)*X+15kpa
- #include <AT89X52.h>
- #include <intrins.h>
- #include <stdio.h>
- #define R24C04ADD 0xA1
- #define W24C04ADD 0xA0
- //ADC0832的引脚
- sbit ADCS =P2^2; //ADC0832 chip seclect
- sbit ADDI =P2^4; //ADC0832 k in
- sbit ADDO =P2^4; //ADC0832 k out
- sbit ADCLK =P2^3; //ADC0832 clock signal
- sbit led=P3^7;//led报警灯
- sbit beep=P1^7;//报警蜂鸣
- sbit a1=P1^0;
- sbit a2=P1^1;
- sbit a3=P1^2;
- sbit a4=P1^3;
- sbit key1=P3^0;
- sbit key2=P3^1;
- sbit c1=P0^0;
- sbit c2=P0^1;
- sbit c3=P0^2;
- sbit c4=P0^3;
- sbit c5=P0^4;
- sbit c6=P0^5;
- sbit c7=P0^6;
- sbit c8=P0^7;
- sbit SDA = P2 ^ 1; //数据线
- sbit SCL = P2 ^ 0; //时钟线
- bit bAck; //应答标志 当bbAck=1是为正确的应答
- unsigned char dispbitcode[8]={0xf7,0xfb,0xfd,0xfe,0xef,0xdf,0xbf,0x7f}; //位扫描
- unsigned char dispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; //共阳数码管字段码
- unsigned char dispbuf[4];
- unsigned int temp;
- unsigned char getdata; //获取ADC转换回来的值
- unsigned char H_count,L_count;
- void delay_0us(void) //12mhz delay 1.01ms
- {
- unsigned char x,y,i;
- for(i=0;i<3;i++)
- x=4;
- while(x--)
- {
- y=30;
- while(y--);
- }
- }
- void display(void) //数码管显示函数
- {
- char k;
- for(k=0;k<4;k++)
- {
- P1 = dispbitcode[k];
- P0 = dispcode[dispbuf[k]];
- if(k==1) //加上数码管的dp小数点
- P0&=0x7f;
- delay_0us();
- if(key1==0,key2==0)
- P0=0xff;
- {
- if(key1==0)
- {
-
- P1=0xfe;//P1.0引脚输出低电平数字1的段码
- P0=0xC0;//数字0的段码
- delay_0us() ;
- P1=0xfd;//P1.1引脚输出低电平,DS1点亮
- P0=0xC0;//数字0的段码
- delay_0us() ;
- P1=0xfb;//P1.2引脚输出低电平,DS2点亮
- P0=0xC0;//数字0的段码?
- delay_0us() ;
- P1=0xf7;//P1.3引脚输出低电平,DS3点亮
- P0=0xC0;//数字0的段码
- delay_0us();
- P1=0xff;
- }
- if(key2==0)
- {
-
- P1=0xfe;//P1.0引脚输出低电平数字1的段码
- P0=0xc0;//数字1的段码
- delay_0us() ;
- P1=0xfd;//P1.1引脚输出低电平,DS1点亮
- P0=0xf9;//数字0的段码
- delay_0us() ;
- P1=0xfb;//P1.2引脚输出低电平,DS2点亮
- P0=0xc0;//数字0的段码?
- delay_0us() ;
- P1=0xf7;//P1.3引脚输出低电平,DS3点亮
- P0=0xc0;//数字0的段码
- delay_0us() ;
- P1=0xff;
- }
-
- }
- }
- }
- /************
- 读ADC0832函数
- ************/
- //采集并返回
- unsigned int Adc0832(unsigned char channel) //AD转换,返回结果
- {
- unsigned char i=0;
- unsigned char j;
- unsigned int dat=0;
- unsigned char ndat=0;
- if(channel==0)channel=2;
- if(channel==1)channel=3;
- ADDI=1;
- _nop_();
- _nop_();
- ADCS=0;//拉低CS端
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿1
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- ADDI=channel&0x1;
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿2
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- ADDI=(channel>>1)&0x1;
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿3
- ADDI=1;//控制命令结束
- _nop_();
- _nop_();
- dat=0;
- for(i=0;i<8;i++)
- {
- dat|=ADDO;//收数据
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次时钟脉冲
- _nop_();
- _nop_();
- dat<<=1;
- if(i==7)dat|=ADDO;
- }
- for(i=0;i<8;i++)
- {
- j=0;
- j=j|ADDO;//收数据
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次时钟脉冲
- _nop_();
- _nop_();
- j=j<<7;
- ndat=ndat|j;
- if(i<7)ndat>>=1;
- }
- ADCS=1;//拉低CS端
- ADCLK=0;//拉低CLK端
- ADDO=1;//拉高数据端,回到初始状态
- dat<<=8;
- dat|=ndat;
- return(dat); //return ad k
- }
- //启动I2C总线,即发送起始条件
- void StartI2C()
- {
- SDA = 1; //发送起始条件数据信号
- _nop_();
- SCL = 1;
- _nop_(); //起始建立时间大于4.7us
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SDA = 0; //发送起始信号
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SCL = 0; //时钟操作
- _nop_();
- _nop_();
- }
- //结束I2C总线,即发送I2C结束条件
- void StopI2C()
- {
- SDA = 0; //发送结束条件的数据信号
- _nop_(); //发送结束条件的时钟信号
- SCL = 1; //结束条件建立时间大于4us
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SDA = 1; //发送I2C总线结束命令
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- //发送一个字节的数据
- void SendByte(unsigned char c)
- {
- unsigned char BitCnt;
- for(BitCnt = 0;BitCnt < 8;BitCnt++) //一个字节
- {
- if((c << BitCnt)& 0x80) SDA = 1; //判断发送位
- else SDA = 0;
- _nop_();
- SCL = 1; //时钟线为高,通知从机开始接收数据
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SCL = 0;
- }
- _nop_();
- _nop_();
- SDA = 1; //释放数据线,准备接受应答位
- _nop_();
- _nop_();
- SCL = 1;
- _nop_();
- _nop_();
- _nop_();
- if(SDA == 1) bAck =0;
- else bAck = 1; //判断是否收到应答信号
- SCL = 0;
- _nop_();
- _nop_();
- }
- //接收一个字节的数据
- unsigned char RevByte()
- {
- unsigned char retc;
- unsigned char BitCnt;
- retc = 0;
- SDA = 1;
- for(BitCnt=0;BitCnt<8;BitCnt++)
- {
- _nop_();
- SCL = 0; //置时钟线为低,准备接收
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SCL = 1; //置时钟线为高使得数据有效
- _nop_();
- _nop_();
- retc = retc << 1; //左移补零
- if (SDA == 1)
- retc = retc + 1; //当数据为1则收到的数据+1
- _nop_();
- _nop_();
- }
- SCL = 0;
- _nop_();
- _nop_();
- return(retc); //返回收到的数据
- }
- //WChipAdd:写器件地址;RChipAdd:读器件地址;InterAdd:内部地址;如写正确则返回数据,
- //否则返回对应错误步骤序号
- //向指定器件的内部指定地址发送一个指定字节
- unsigned char WIICByte(unsigned char WChipAdd,unsigned char InterAdd,unsigned char WIICData)
- {
- StartI2C(); //启动总线
- SendByte(WChipAdd); //发送器件地址以及命令
- if (bAck==1) //收到应答
- {
- SendByte(InterAdd); //发送内部子地址
- if (bAck ==1)
- {
- SendByte(WIICData); //发送数据
- if(bAck == 1)
- {
- StopI2C(); //停止总线
- return(0xff);
- }
- else
- {
- return(0x03);
- }
- }
- else
- {
- return(0x02);
- }
- }
- return(0x01);
- }
- //读取指定器件的内部指定地址一个字节数据
- unsigned char RIICByte(unsigned char WChipAdd,unsigned char RChipAdd,unsigned char InterDataAdd)
- {
- unsigned char TempData;
- TempData = 0;
- StartI2C(); //启动
- SendByte(WChipAdd); //发送器件地址以及读命令
- if (bAck==1) //收到应答
- {
- SendByte(InterDataAdd); //发送内部子地址
- if (bAck ==1)
- {
- StartI2C();
- SendByte(RChipAdd);
- if(bAck == 1)
- {
- TempData = RevByte(); //接收数据
- StopI2C(); //停止I2C总线
- return(TempData); //返回数据
- }
- else
- {
- return(0x03);
- }
- }
- else
- {
- return(0x02);
- }
- }
- else
- {
- return(0x01);
- }
- }
- //报警子函数
- void alarm(void)
- {
-
- if(getdata>=208.611252) //如果当前压力值大于100kpa,
- {
- led=0;
- beep=0; //则启动报警
- }
-
-
- else
- {
- led=1;
- beep=1;
-
- } //关闭报警
-
-
-
- }
- void main(void)
- {
- unsigned int OverCounter = 0;
- unsigned char i;
- bit OverFlg = 0;
- unsigned int temp,ppress = 0;
- float press;
-
- while(1)
-
- {
- display( );
- if(getdata>=208.611252);
- TR0=1;
- getdata=Adc0832(0);
- alarm();
- for(i=0;i<25;i++)
- if(14<getdata<243) //当压力值介于15kpa到115kpa之间时,遵循线性变换
- {
- int vary=getdata; //y=(115-15)/(243-13)*X+15kpa
- press=((10.0/23.0)*vary)+9.5; //测试时补偿值为9.3
- temp=(int)(press*10); //放大10倍,便于后面的计算
- if(temp != ppress)
- {
- ppress = temp;
- OverFlg = 1;
- }
- dispbuf[3]=temp/1000; //取压力值百位
- dispbuf[2]=(temp%1000)/100; //取压力值十位
- dispbuf[1]=((temp%1000)%100)/10; //取压力值个位
- dispbuf[0]=((temp%1000)%100)%10; //取压力值十分位
- display();
-
- }
- }
- }
-
-
-
-
-
-
-
-
-
- void Time0(void) interrupt 1 using 0
- {
- if(getdata>=208.611252);
- beep=~beep; //蜂鸣器状态改变
- if( L_count!=0x00 )
- {
- L_count--; //初值减小
- TH0=H_count; //高位赋初值
- TL0=L_count; //低位赋初值
- return; //返回主函数
- }else H_count--;
-
- if( H_count!=0xfc ) //H_count从0xff降到0Xfc,周期结束
- {
- L_count--;
- TH0=H_count;
- TL0=L_count;
- return;
- }
- else
- {
- if(led==0);
- H_count=0xff;
- L_count=0xa0;
- TH0=H_count;
- TL0=L_count;
- beep=1; //关闭蜂鸣器
- TR0=0; //关闭定时器
- }
- }
-
复制代码
|