说明:程序是根据串口时序图做的,在时钟高电平期间读取,不是在时钟下降沿读取。手册上举例说明强调时钟下降沿读取,目前网上程序有这二种。
单片机源程序:
- #include "reg51.h"
- #include "intrins.h" //_nop_();延时函数用
- #define uchar unsigned char //用uchar代替unsigned char,1字节0-255
- #define uint unsigned int //用uint代替nsigned int,2字节0-26653
- sfr P3M0=0XB2;
- sfr P3M1=0XB1;
- sbit SO = P1 ^ 0; //P1.0口与SO相连
- sbit SCK = P1 ^ 1; //P1.1口与SCK相连
- sbit CS = P1 ^ 2; //P1.2口与CS相连
- uint j;
- uint wendu;
- uint Read_AD(); //AD转换数据数据读取,并返回值
- void Display_temp(); //温度显示
- uchar qian = 0, bai = 0, shi = 0, ge = 0, xiao = 0; //初始化LED
- uint temp;
- uchar code tab_1[10] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 }; //共阳LED段码表
- uchar code tab_2[10] = { 0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10 };
- //含小数点共阳段码 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
- uchar code tab_3[4] = { 0x01, 0x02, 0x04, 0x08 }; //位码
- uint Read_AD()// AD转换数据读取子函数,并返回值
- {
- uchar i;
- unsigned int Temp_2;
- Temp_2 = 0;
- CS = 0;
- _nop_();
- for (i = 0; i < 16; i++) //16位数据读取
- {
- Temp_2 <<= 1;//向左移一位
- SCK = 1;//上升沿脉冲
- _nop_();
- _nop_();
- _nop_();
- if (SO == 1) Temp_2 = Temp_2 | 0x01;
- SCK = 0;
- }
- CS = 1;
- SCK = 0;
- Temp_2 = Temp_2 & 0x7FF8; //取3-14位,变换为温度值
- Temp_2 = Temp_2 >>3;
- return (Temp_2);
- }
- void zhuanhuan()
- { uint tempB;
- tempB = (wendu&3)*25;
- wendu=wendu>>2;
- wendu = wendu;
-
- if (wendu >= 999) //最高读取温度设定为999摄氏度
- wendu=999;
- bai = wendu / 100; //取百位数字
- wendu = wendu % 100;
- shi = wendu / 10; //取十位数字
- wendu = wendu % 10;
- ge = wendu %10; //取个位数字
- xiao = tempB / 10;
-
- }
- void Display_temp() //温度显示子函数
- {
- P3 = 0x00;
- P0 = tab_1[bai];
- P3 = tab_3[0];//显示百位数字
- for (j = 300; j > 0; j--) ; //延时
-
- P3 = 0x00;
- P0 = tab_1[shi];
- P3 = tab_3[1];//显示十位数字
- for (j = 300; j > 0; j--) ;
-
- P3 = 0x00;
- P0 = tab_2[ge];
- P3 = tab_3[2]; //显示个位数字
- for (j = 300; j > 0; j--) ;
-
- P3 = 0x00;
- P0 = tab_1[xiao];
- P3 = tab_3[3];//显示小数位
- for (j = 300; j > 0; j--) ;
-
- }
- void main() //主程序
- { unsigned char i;
- P3M0=0X00;
- P3M1=0X0F;
- CS = 1;
- SCK = 0;
- for (j = 300; j > 0; j--) ;
- while (1)
- {
- wendu = Read_AD(); // 热电偶数据读取,返回温度
- zhuanhuan();
- for(i=20;i>0;i--)
- Display_temp(); //温度显示
- }
- }
复制代码
|