1602显示温度计程序.rar
(28.2 KB, 下载次数: 104)
单片机源程序如下:
- #include<AT89x51.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- //******************adc0832****************************//
- //AD
- sbit CLK=P2^1;
- sbit CS=P2^2;
- sbit DO=P2^3;
- sbit DI=P2^3;
-
- //继电器
-
- sbit jidian=P3^3;
- sbit jidguan=P3^0;
-
- //数码管显示
- sbit fist=P2^7;
- sbit seconed=P2^6;
- sbit three=P2^5;
- sbit forth=P2^4;
- sbit k1=P3^4;
- sbit k2=P3^5;
- sbit k3=P3^6;
- sbit k4=P3^7;
- //char CC[]="11001001";
- uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
- uchar temp;
- int y,a=-13;
- uint vvv,i;
- //通道的选择:0x02就是单通道0;0x03就是单通道1;
- //0x00就是双通道ch0="+"; ch0="-"
- //0x01就是双通道ch0="-"; ch0="+"
- //*****************************************************//
- void delay(int tt)
- {
- while(tt--)
- {for(i=0;i<120;i++);}
- }
- void startADC()
- {
- CS=1;
- _nop_();
- _nop_();
- CLK=0;
- _nop_();
- _nop_();
- CS=0;
- _nop_();
- _nop_();
- DI=1;
- _nop_();
- _nop_();
- CLK=1;
- _nop_();
- _nop_();
- DI=0;
- _nop_();
- _nop_();
- CLK=0;
- _nop_();
- _nop_();
- }
- void choiceADC(uint CH)//CH为0选择通道ch0,为1,选择ch1进行AD转换
- {
- startADC();
- if(CH==0)
- {
- DI=1;
- _nop_();
- CLK=1;//上升沿DI=1
- _nop_();
- CLK=0;//1个下降沿DI=1
- _nop_();
- DI=0;
- _nop_();
- CLK=1;
- _nop_();
- CLK=0;//第3个上升沿DI=0
- _nop_();
- }
- else
- {
- CLK=0;
- _nop_();
- DI=1;
- _nop_();
- CLK=1;//上升沿DI=1
- _nop_();
- CLK=0;//1个下降沿DI=1
- _nop_();
- DI=1;
- _nop_();
- CLK=1;//第3个上升沿DI=0
- _nop_();
- }
- /********通道选择结束开始读取转换后的二进制数****/
- CLK=1;
- _nop_();
- CLK=0;//下降沿读数,一下进行判断和处理,共8次
- for(i=0;i<8;i++)
- {
- DI=1;
- if(DO)
- {
- temp |=0x01;
- }
- else
- {
- temp &=0xfe;
- }
- CLK=0;
- _nop_();
- CLK=1;
- temp=temp<<1;
- }
- // vvv=temp;
- // if(temp<62) vvv=30;
- // else if(temp>62&&temp<68) vvv=50;
- // else if(temp>68&&temp<70) vvv=100;
- // else if(temp>70&&temp<80) vvv=101;
- // else if(temp>80) vvv=102;
- y=a/6*(temp+16)+434;
-
- }
- void display(uint dat)
- {
- //P2=0x80;
- fist=0; delay(1); fist=1;
- seconed=0; three=0; forth=0;
- P0=tab[dat/1000];
- //delay(1);
- //P0=0xff;
- //P2=0x40;
- seconed=0; delay(1); seconed=1;
- fist=0; three=0; forth=0;
- P0=tab[dat%1000/100];
- //delay(1);
- //P0=0xff;
- //P2=0x20;
- three=0; delay(1); three=1;
- fist=0; seconed=0; forth=0;
- P0=tab[dat%100/10];
- //delay(1);
- //P0=0xff;
- //P2=0x10;
- forth=0; delay(1); forth=1;
- fist=0; seconed=0; three=0;
- P0=tab[dat%10];
- //delay(1);
- //P0=0xff;
- }
-
- void main()
- { int i;
- jidian=0;jidguan=0;
- P0=0xff;
- while(1){
- choiceADC(0);
- delay(1);
- display(temp);
- if(k3==0){i=1;
- while(i)
- {
- choiceADC(0);
- delay(1);
-
-
-
-
-
- // if(k1==0)
- // {
- // delay(50);
- // if(k1==0)
- // {temp++;
- // if(temp>255) {temp=0;}
- // while(!k1);//
- // }
- // }
- //
- // if(k2==0)
- // {
- // delay(500);
- // if(k2==0)
- // {temp--;
- // if(temp<0) {temp=255;}
- // while(!k2);//
- //
- // }
- // }
-
- display(y);
- if(y<30) { jidian=0;jidguan=0;P1=0xfe; } //慢 1盏绿灯亮
- else if(y>32) {jidian=1;jidguan=1;P1=0xda; } //快 3盏绿灯亮
-
- if(k4==0) {i=0;jidian=0;jidguan=1;P1=0xf7;}//开关停止,红灯亮
- }
- }
- }
- }
复制代码
|