想要用数码管来显示8bit精度的湿度,但不知道哪里错了,显示一直是00,求大佬帮帮忙。s1,s2是两个中断源,中断程序是用来显示我事先设定的湿度阈值的。
单片机源程序如下:
- #include "reg52.H"
- #include <intrins.H>
- #include <stdio.h>
- #define MEASURE_HUMI 0x05
- #define ACK 1
- #define noACK 0
- #define STATUS_RSG_W 0x06
- #define STATUS_RSG_R 0x07
- #define FUNCTION_SET
- #define _7SEG_H_
- sbit DATA=P1^0;
- sbit SCK=P1^1;
- sbit s1=P3^2;
- sbit s2=P3^3;
- sbit s3=P1^2;
- sbit s4=P1^3;
- sbit s5=P1^6;
- sbit s6=P3^4;
- sbit DBPort=0x80;
- sbit led1=P1^4;
- sbit led2=P1^5;
- unsigned char shidu;
- unsigned int a=0x20;
- unsigned int b=0x40;
- unsigned int c[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char d;
- unsigned char e;
- unsigned char f;
- unsigned char g;
- void Delay100ms() //@12.000MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 5;
- j = 144;
- k = 71;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void Disp()
- {
- f=e;
- e=e&0x0F;
- d=c[e];
- P2=d;
- f=f>>4;
- f=f&0x0F;
- f=c[f];
- P0=f;
- }
- void Disp1()
- {
- unsigned char i,j;
- i=g;
- g=g&0x0F;
- j=c[g];
- P2=j;
- i=i>>4;
- i=i&0x0F;
- i=c[i];
- P0=i;
- }
- char write_byte(unsigned char value)
- {
- unsigned char error=0;
- unsigned char i=0;
- for(i=0x80;i>0;i/=2)
- {
- if(i&value)
- DATA=1;
- else
- DATA=0;
- SCK=1;
- _nop_();_nop_();_nop_();
- SCK=0;
- }
- DATA=1;
- SCK=1;
- error=DATA;
- _nop_();_nop_();_nop_();
- SCK=0;
- DATA=1;
- return error;
- }
- char read_byte(unsigned char ack)
- {
- unsigned char i,val=0;
- DATA=1;
- for(i=0x80;i>0;i/=2){
- SCK=1;
- if(DATA)
- val=(val|i);
- _nop_();_nop_();_nop_();
- SCK=0;
- }
- if(ack==1)DATA=0;
- else DATA=1;
- _nop_();_nop_();_nop_();
- SCK=1;
- _nop_();_nop_();_nop_();
- SCK=0;
- _nop_();_nop_();_nop_();
- DATA=0;
- return val;
-
- }
- void qidong(void){
- DATA=1;SCK=0;
- _nop_();
- SCK=1;
- _nop_();
- DATA=0;
- _nop_();
- SCK=0;
- _nop_();
- SCK=1;
- _nop_();
- DATA=1;
- _nop_();
- SCK=0;
- }
- void reset(void){
- unsigned char i;
- DATA=1; SCK=0;
- for(i=0;i<9;i++)
- {SCK=1;
- SCK=0;
- }
- qidong();
- }
- char measure(unsigned char h,unsigned char j,unsigned char k){
- unsigned int i;
- unsigned char error=0;
- qidong();
- error+=write_byte(MEASURE_HUMI);
- for(i=0;i<65535;i++)if(DATA==0)break;
- if(DATA) error+=1;
- h=read_byte(ACK);
- j=read_byte(ACK);
- k=read_byte(noACK);
- return error;
- }
- void int0_isr()interrupt 0
- {
- EA=0;
- g=a;
- Disp1();
- Delay100ms();
- while(s1==1)
- {
- if(s3==0)
- {a++;
- Delay100ms();
- g=a;
- Disp1();
- }
- if(s4==0)
- {
- a--;
- Delay100ms();
- g=a;
- Disp1();
- }
- }
- EA=1;
- IE0=0;
- }
- void int2_isr()interrupt 2
- {
- EA=0;
- g=b;
- Disp1();
- Delay100ms();
- while(s2==0)
- {
- if(s3==0)
- {b++;
- Delay100ms();
- g=b;
- Disp1();
- }
- if(s4==0)
- {
- b--;
- Delay100ms();
- g=b;
- Disp1();
- }
- }
- EA=1;
- IE1=0;
- }
- void shoudong()
- {
- if(s5==0)
- { led1=0;
- Delay100ms();
- while(s5==1)
- {led1=0;
- Disp();
- Delay100ms();
- }
- }
- led1=1;
- if(s6==0)
- { led2=0;
- Delay100ms();
- while(s6==1)
- {led2=0;
- Delay100ms();
- }
- }
- led1=1;
- }
- void main()
- {
- unsigned char error;
- unsigned char hh;
- unsigned check;
- Delay100ms();
- error=0;
- IT0=1;
- IT1=1;
- EA=1;
- EX1=1;
- EX0=1;
- P0=0;
- P2=0;
- reset();
- Delay100ms();
-
- error+=measure(shidu,hh,check);
- if(error=1)reset();
- e=shidu;
- Disp();
- Delay100ms();
-
- while(1){
- shoudong();
- while(shidu>a)
- {
- shoudong();
- led1=0;
- Delay100ms();
- }
- led1=1;
- while(shidu<b)
- {
- shoudong();
- led2=0;
- Delay100ms();
- }
- led2=1;
- }
- }
复制代码
|