通过adc0832读取PT100电压值数码管显示-50——100度的范围非常准确,程序及仿真。
仿真原理图如下(proteus7.5仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit cs=P1^2;
- sbit clk=P1^0;
- sbit di=P1^1;
- uchar num,num1,i,a,b,c;
- int wendu;
- sbit we = P2^7; //位定义数码管位选锁存器接口
- sbit du = P2^6; //位定义数码管段选锁存器接口
- //数码管段选表
- uchar code leddata[]={
-
- 0x3F, //"0"
- 0x06, //"1"
- 0x5B, //"2"
- 0x4F, //"3"
- 0x66, //"4"
- 0x6D, //"5"
- 0x7D, //"6"
- 0x07, //"7"
- 0x7F, //"8"
- 0x6F, //"9"
- 0x40, //"-"
- 0x00, //熄灭
- 0x00 //自定义
-
- };
- void delay(uint x)
- {
- uchar y;
- for(;x>0;x--)
- for(y=110;y>0;y--);
- }
- uchar ADC0832()
- {
- cs=1;
- clk=0;
- cs=0;
- di=1;
-
- clk=1;
- clk=0;
- di=1;
- clk=1;
- clk=0;
- di=0;
- clk=1;
- clk=0;
- di=1;
- for(i=0;i<8;i++)
- {
- clk=1;
- clk=0;
- num=num<<1;
- num|=(uchar)di;
- }
- cs=1;
- return num;
- }
- void main()
- {
- while(1)
- {
- ADC0832();
- if(num<=38)
- wendu=num-69;
- if(num>38&&num<=70)
- wendu=num-70;
- if(num>70)
- wendu=num-71;
-
- if(wendu>=0)
- {
- a=wendu/100;
- b=wendu%100/10;
- c=wendu%10;
- if(a>0)
- {
- P0 = 0xfd;//1111 1101 只选通第二位数码管
- we = 1; //打开位选
- we = 0; //关闭位选
-
- P0 = leddata[a]; //显示2
- du = 1;//打开段选
- du = 0; //关闭段选
- delay(2);//延时
- }
- if(a!=0||b>0)
- {
- P0 = 0xfb;// 1111 1011只选通第三位数码管
- we = 1; //打开位选
- we = 0; //关闭位选
-
- P0 = leddata[b]; //显示3
- du = 1;//打开段选
- du = 0; //关闭段选
- delay(2);//延时
- }
- P0 = 0xf7;//1111 0111 只选通第四位数码管
- we = 1; //打开位选
- we = 0; //关闭位选
-
- P0 = leddata[c]; //显示4
- du = 1;//打开段选
- du = 0; //关闭段选
- delay(2);//延时
- }
- else
- {
- num1=abs(wendu);
- a=num1/100;
- b=num1%100/10;
- c=num1%10;
- if(num1>9)
- {
- P0 = 0xfd;//1111 1101 只选通第二位数码管
- we = 1; //打开位选
- we = 0; //关闭位选
-
- P0 = leddata[10]; //显示2
- du = 1;//打开段选
- du = 0; //关闭段选
- delay(2);//延时
- }
- else
- {
- P0 = 0xfb;// 1111 1011只选通第三位数码管
- we = 1; //打开位选
- we = 0; //关闭位选
-
- P0 = leddata[10]; //显示3
- du = 1;//打开段选
- du = 0; //关闭段选
- delay(2);//延时
- }
- if(a>0)
- {
- P0 = 0xfd;//1111 1101 只选通第二位数码管
- we = 1; //打开位选
- we = 0; //关闭位选
-
- P0 = leddata[a]; //显示2
- du = 1;//打开段选
- du = 0; //关闭段选
- delay(2);//延时
- }
- if(a!=0||b>0)
- {
- P0 = 0xfb;// 1111 1011只选通第三位数码管
- we = 1; //打开位选
- we = 0; //关闭位选
-
- P0 = leddata[b]; //显示3
- du = 1;//打开段选
- du = 0; //关闭段选
- delay(2);//延时
- }
- P0 = 0xf7;//1111 0111 只选通第四位数码管
- we = 1; //打开位选
- we = 0; //关闭位选
-
- P0 = leddata[c]; //显示4
- du = 1;//打开段选
- du = 0; //关闭段选
- delay(2);//延时
- }
- }
- }
复制代码
Keil代码与Proteus7.5仿真dsn文件下载:
pt100.zip
(106.81 KB, 下载次数: 427)
|