闲来无事,鼓捣起18B20测温,用数码管显示,可惜数码管有闪烁。反复试验,发现在定时中断中设置标志,数码管根据标志定时扫描,完全摒弃delay(uint ms)类软件延时,数码管也不闪烁。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #include"DS18B20.h"
- sfr AUXR = 0x8E; //0000,0000 辅助寄存器
- sbit digt1=P2^0;
- sbit digt2=P2^1;
- sbit digt3=P2^2;
- sbit digt4=P2^3;
- uchar DS18B20_IS_OK;
- uchar delay_5mS_OK;
- uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
- uchar Display_Digit[];
- void delay(uchar ms);
- void Timer0_Init(); //定时器初始化
- void display(); //数码管扫描显示
- void main()
- {
- P0=0XFF;
- P2=0X00;
- delay(100);
- Timer0_Init();
- while(1)
- {
- display(); //显示
- Read_Temperature(); //读取温度
- if(DS18B20_IS_OK)
- Display_Temperature();
- delayus(3);
- }
- }
- void Timer0_Init() //定时器初始化
- {
- AUXR &= 0x7F; //定时器时钟12T模式,5mS
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0x00; //设置定时初值
- TH0 = 0xEE; //设置定时初值
- TR0 = 1; //定时器0开始计时
- ET0 = 1;
- EA = 1;
- }
- void Timer0() interrupt 1 //定时器中断
- {
- TL0 = 0x00; //重设定时初值
- TH0 = 0xEE;
- delay_5mS_OK =1;
- }
- void display() //数码管扫描
- {
- static uchar stat=0;
- if(delay_5mS_OK==0) //5mS未到,退出
- return;
- switch(stat)
- {
- case 0:
- digt4=1;
- P0=0xff; //先送FF,关闭显示,以消除残影
- P0=table[Display_Digit[0]];
- if(table[Display_Digit[0]]==0x40) //温度为负数
- {
- if(table[Display_Digit[1]]!=0x3f) //十位非“0”
- digt1=0; //第一位显示符号
- }
- delay(3);
- stat++;
- break;
-
- case 1:
- digt1=1;
- P0=0xff;
- P0=table[Display_Digit[1]];
- if(table[Display_Digit[1]]==0x3f) //十位是“0”,显示符号
- {
- P0=table[Display_Digit[0]];
- }
- digt2=0;
- delay(3);
- stat++;
- break;
- case 2:
- digt2=1;
- P0=0xff;
- P0=table[Display_Digit[2]]+0X80; //个位加上小数点
- digt3=0;
- delay(3);
- stat++;
- break;
-
- case 3:
- digt3=1;
- P0=0xff;
- P0=table[Display_Digit[3]]; //小数位
- digt4=0;
- delay(3);
- stat=0;
- break;
- }
- delay_5mS_OK=0;
- }
- void delay(uchar ms)
- {
- uchar i;
- while(ms--)
- {
- for(i=0;i<120;i++);
- }
- }
复制代码
所有资料51hei提供下载:
18B20测温数码管温度.rar
(38.19 KB, 下载次数: 48)
|