本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
没有明白这个动态扫描显示原理 一直很闪烁 求求助大侠
!!!!!!!!!!!!!!!
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar disp_data[4]={0x00,0x00,0x00,0x00}; /*显示寄存器*/
uchar code seg_data[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/*共阳极代码0~9*/
int n=0;
sbit DQ=P3^2; //DS18B20与单片机连接口
uint tvalue_zs, tvalue_xs; //温度值
/***********显示刷新函数******************************/
void t0_isr() interrupt 1
{
TH0=0xa0; //赋定时器初值高8位
TL0=0xfa; //赋定时器初值低8位
P2=disp_data[n];
P3=(0x01<<n)<<4;
n++;
if(n>3)n=0;
}
/******************************ds1820程序***************************************/
void delay_18B20(unsigned int i) //延时(一个机器周期24M晶振05us
{
while(i--);
}
void ds1820rst() /*ds1820复位*/
{
uchar x=0;
DQ = 1; //DQ复位
delay_18B20(40); //延时
DQ = 0; //DQ拉低
delay_18B20(1000); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(400); //等待响应//
}
uchar ds1820rd() /*读数据*/
{
uchar i=0,dat=0;
for(i=8;i>0;i--)
{ DQ = 0; //给脉冲信号
dat>>=1; //往右移一位 //
DQ = 1; //给脉冲信号
if(DQ)dat|=0x80; //“或”运算
delay_18B20(100);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for(i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01; //发送最低位//
delay_18B20(100);
DQ = 1;
wdata>>=1; //往右移一位//
}
}
void read_temp(void)/*读取温度值并转换*/
{
uchar a,b;
ds1820rst(); //复位//
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst(); //复位//
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd(); //低8位
b=ds1820rd(); //高8位
tvalue_zs=((b&0x07)<<4)|(a>>4);//转换数值//
a=a&0x0F; //取出小数部分
tvalue_xs=0;
if(a&0x08)tvalue_xs+=5000;
if(a&0x04)tvalue_xs+=2500;
if(a&0x02)tvalue_xs+=1250;
if(a&0x01)tvalue_xs+=625;
tvalue_zs%=100;
disp_data[3]=seg_data[tvalue_zs/10]; //十位
disp_data[2]=seg_data[tvalue_zs%10]&0x7F; //个位、加小数点
disp_data[1]=seg_data[tvalue_xs/1000]; //十分位
tvalue_xs%=1000;
disp_data[0]=seg_data[tvalue_xs/100]; //百分位
}
/*主函数*/
void main(void)
{
TMOD=0x01; //初始化定时器0为工作方式1
TH0=0xa0; //赋定时器初值高8位
TL0=0xfe; //赋定时器初值低8位
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0开始计时
while(1){
read_temp();//读取温度
}
} |