51单片机 时钟程序设计 数码管可闪烁显示数值

/*通过独立键控制调节的时钟。s2控制启动;s3控制暂停;s4控制在暂停的状态下切换时针、分针;s5控制时针、分针的值的增加*/

/* 其中优化完善的功能是:在切换时针、分针的状态下,其数码管能闪烁显示数字*/


#include <reg52.h>
#include <intrins.h>

//宏定义
#define uchar unsigned char
#define uint unsigned int

//数码管显示数字赋值初始化
uchar code leddate[]={

         0X3f,//0
 0X06,//1
 0X5B,//2
 0X4f,//3
 0X66,//4
 0X6d,//5
 0X7d,//6
 0X07,//7
 0X7f,//8
 0X6f, //9

 0Xbf,//0.
 0X86,//1.
 0Xdb,//2.
 0Xcf,//3.
 0Xe6,//4.
 0Xed,//5.
 0Xfd,//6.
 0X87,//7.
 0Xff,//8.
 0Xef //9.
}; 

sbit LED1=P1^0;
sbit wei=P2^7;
sbit duan=P2^6;

sbit s2=P3^0;//启动计时
sbit s3=P3^1;//暂停计时
sbit s4=P3^2;//切换分针、时针调节位
sbit s5=P3^3;//分针或时针 加一

uchar t=0;
uchar s=0;
uchar m=0;
uchar h=0;
uchar te=0;
uchar temp=0; //实现闪烁功能的数值,每temp加一,其数值闪烁一次

//延时
void delay(uchar z){

     uchar x,y;
 for(x=z;x>0;x--)
   for(y=114;y>0;y--)
       _nop_();
}

//定时器初始化
void T_reput(){

     TMOD = 0X11;
TH0=0X4b;
 TL0=0Xfd;
 TH1=0X4b;
 TL1=0Xfd;
 EA=1;//系统开放中断
 ET0=1;//允许T0中断
 ET1=1;//允许T1中断
 TR0=1;//启动时钟 0
 TR1=1;//启动时钟1
}

//秒针
void miao(uchar z){

     uchar shi,ge;
 shi= z/10;//求模
 ge= z%10;//求余

 P0=0Xff;//在位打开之前,先将前一次的P0值(段)清零
 wei=1;  //开启位选开关
 P0=0X7f;
 wei=0;  //关闭位选开关
 duan=1; //开启段选开关
 P0=leddate[ge];
 duan=0;  //关闭段开关

 delay(1); //正常刷新延时

 P0=0Xff;
 wei=1;
 P0=0Xbf;
 wei=0;
 duan=1;
 P0=leddate[shi];
 duan=0;

 delay(1);

}

//分针
void fen(uchar z){

     uchar shi,ge;
 shi= z/10;
 ge= z%10;

 P0=0Xff;
 wei=1;
 P0=0Xdf;
 wei=0;
 duan=1;
 P0=leddate[ge+10];
 duan=0;

 delay(1);

 P0=0Xff;
 wei=1;
 P0=0Xef;
 wei=0;
 duan=1;
 P0=leddate[shi];
 duan=0;

 delay(1);
}

//时针
void hour(uchar z){

     uchar shi,ge;
 shi= z/10;
 ge= z%10;

 P0=0Xff;
 wei=1;
 P0=0Xf7;
 wei=0;
 duan=1;
 P0=leddate[ge+10];
 duan=0;

 delay(1);

 P0=0Xff;
 wei=1;
 P0=0Xfb;
 wei=0;
 duan=1;
 P0=leddate[shi];
 duan=0;

 delay(1);

}


//实现分针、时针调节以及数值闪烁的功能模块
void adjust(){
  
  delay(5);
  while(!s4);  //按键检测
  while(1){

    if(s2 == 0 || s3 == 0)
   break;

//进入时针数字调节环节
     
 while(1){
 
        if(1 == (temp % 2))//实现数码管数字闪烁的关键语句,此处实现时针闪烁
   break;     

    miao(s);
fen(m);
hour(h);

        if(s5 == 0){

   delay(5);//软件防抖
   if(h<23)
      h++;
   while(!s5);//按键检测
}

if(s2 == 0 || s3 == 0)
   break;


if(s4 == 0){
   while(!s4);   

//进入分针数字调节环节
   
   while(1){

   if(s2 == 0 || s3 == 0)
      break;

   if(s4 == 0){
  
 while(!s4); 
    break; //退出分针数字调节环节
  }
 
        while(1){
          
  if(1 == (temp % 2))//实现数码管数字闪烁的关键语句,此处实现分针闪烁
         break;
  
  miao(s);
          fen(m);
  hour(h);

  if(s5 == 0){
  
     delay(5);
 if(m<59)
    m++;
 while(!s5);
  }
  
  if(s4 == 0){
  
    break; //退出分针数字调节环节
  }
  if(s2 == 0 || s3 == 0)
      break;  
}

//分针数码管数字闪烁

while(1){
          
  if(0 == (temp % 2))
         break;
  
  miao(s);
  hour(h);

  if(s5 == 0){
  
     delay(5);
 if(m<59)
    m++;
 while(!s5);
  }
  
  if(s4 == 0){
     
    break; //退出分针数字调节环节
  }
  if(s2 == 0 || s3 == 0)
      break;
     
}
         
       }

//退出分钟数字调节环节
}  

 }

//时针数码管数字闪烁

 while(1){
    
       if(0 == (temp % 2))
      break;

miao(s);
fen(m);

        if(s5 == 0){

   delay(5);//软件防抖
   if(h<23)
      h++;
   while(!s5);//按键检测
}

if(s2 == 0 || s3 == 0)
   break;

if(s4 == 0){    
   while(!s4);

//进入分针数字调节环节
   
   while(1){

   if(s2 == 0 || s3 == 0)
      break;

   if(s4 == 0){
  
 while(!s4); 
    break; //退出分针数字调节环节
  }
 
        while(1){
          
  if(1 == (temp % 2))
         break;
  
  miao(s);
          fen(m);
  hour(h);

  if(s5 == 0){
  
     delay(5);
 if(m<59)
    m++;
 while(!s5);
  }
  
  if(s4 == 0){
   
    break; //退出分针数字调节环节
  }
  if(s2 == 0 || s3 == 0)
      break;  
}

//分针数码管数字闪烁

while(1){
          
  if(0 == (temp % 2)) 
         break;
  
  miao(s);
  hour(h);

  if(s5 == 0){
  
     delay(5);
 if(m<59)
    m++;
 while(!s5);
  }
  
  if(s4 == 0){
  
    break; //退出分针数字调节环节
  }
  if(s2 == 0 || s3 == 0)
      break;
     
}
         
       }

//退出分针数字调节环节


 }
  }
}

void main(){

         T_reput();//定时器初始化

 while(1){
       
   if(s < 60){
 
      miao(s);
 
   }else{
   
      s=0;
  m++;
   }

   if(m<60){
   
      fen(m);
   
   }else{
   
      m=0;
  h++;
   }

   if(h<24){
   
      hour(h);
   
   }else{
   
      h=0;
   }

   if(s2 == 0)
      TR0=1;  //启动计时
   if(s3 == 0)
      TR0=0;  //暂停计时
   if(TR0 == 0){
   
      if(s4 == 0){
 
      delay(5);
             adjust();
      }
      
   }     
 }

}

//T0中断服务函数
void T0_ISR() interrupt 1{

     TH0=0X4b;
 TL0=0Xfd;

 t++;
 if(t == 20){
 
    t=0;
s++;
LED1=~LED1;
 }     
}

//T1中断服务函数
void T1_ISR() interrupt 3{

     TH1=0X4b;
 TL1=0Xfd;

 te++;
 if(te == 13){
 
    te=0;
temp++;
 }
 
 if(temp == 100)
    temp=0;     
}

  • 12
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、设计要求基于小脚丫FPGA开发板和四位数码管实现数字时钟的设计,要求: 1)采用FPGA+按+四位数码管实现数字时钟功能; 2)显示格式:XX:XX:XX (:分:秒),采用24小制; 3)四位数码管显示分秒,可以通过按控制选择显示分界面还是分秒界面。 4)通过按设定初始间。 5)设置在整点12点,通过蜂鸣器响示意整点报。蜂鸣器响维持大概5S; 2、硬件连接FPGA的系统时钟来自于小脚丫FPGA开发板配置的24MHz时钟晶振,连接FPGA的C1引脚。 本设计用到五个个按K1~K5,硬件设计如图1所示,五个按分别连接到FPGA的B8、C8、A10、A11和A12引脚。 图1. 按硬件设计 本设计用到一个蜂鸣器来示意整点报,硬件设计如图1所示,蜂鸣器连接到FPGA的B2引脚。 图2. 蜂鸣器硬件设计 本设计用到四位数码管显示间,四位数码管用两个74HC595驱动,硬件设计如图1所示,74HC595的串行时钟SCK、并行时钟RCK和串行数据DIN分别连接到FPGA的N2、M1和K1引脚上。 图3. 数码管驱动74HC595硬件设计 3、工作原理1)使用计数器做分频处理,得到周期为1秒的脉冲信号; 2)使用三个8bit的BCD码表示时钟、分钟、秒钟的值,其中高4bit表示值的十位,低4bit表示值的个位; 3)正常运行,每来一个1S脉冲信号个位加1,个位满10清零同十位加1,当秒钟满60清零同分钟个位加1,依次进行...直到23:59:59的下一刻全部清零; 4)按K5,模式调节,设计共分4中模式(分秒显示、分秒调节、显示分调节),按动K5依次切换模式; 5)按K2,间调节,当数字时钟针调节、分针调节或秒针调节模式,按动K2调节对应间位; 6)在调分和调分秒两个状态,可以通过K4和K2分别左移右移要调整的位,要调整的位会通过对应位的闪烁来示意。通过K4和 K2左右移动选择好要调整的位以后,就可以通过K1和K3来增大或调小对应的位; 4、代码设计为了实现所需要的功能,我们将整个设计划分不同的模块,如图4所示。 图4. 数字时钟程序设计框架 4.1五位按消抖模块 图5. 五位按消抖模块 Ø输入:五位的按电平信息输入 Ø输出:五位消抖后的脉冲输出 Ø功能:将按按下一次的电平信号,经过消抖后变成一个维持一个时钟周期的脉冲信号; Ø原理: 图6. 按抖动特性 FPGA过20ms检测按是否按下,存储检测到的值,并且按位取反与前一个20ms检测的值相与,得到一个值,如果为1,则判断按按下,否则则无按下。 图7. FPGA按的理解示意图 4.2电子表显示控制模块。 图8. 电子表显示控制模块 Ø输入:五位的按脉冲 Ø输出:十六位的BCD码输出,每四个代表一个十进制数; Ø原理:四位的位闪烁控制信号。某一位为一代表这位对应的数码管的一位进行闪烁显示。(在调整状态下,会让当前调整的哪一位进行闪烁。正常显示状态下seg_flash_data全为零); Ø功能:主要就是一个状态机,通过检查输入的按信息,进行显示状态切换,间调整。四个状态分别为:显示分秒,调分秒,显示,调分;当K5按按下(key_pulse[4])依次跳转,如图9所示。 图 9. 数字时钟状态控制设计 4.3数码管译码模块 图10. 数码管译码模块 Ø输入:四位的BCD码数据 Ø输出:八位的七段数码数据 Ø功能:一个case语句,将输入的四位BCD码转化为七段数码数据; Ø原理:数码管分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳极(COM)需接+5V才能使其工作。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码,共阴极(COM)需接GND才能使其工作。小脚丫拓展板上的数码管如下图所示: 图11. 数码管内部电路 共阴极数码管: 位选为低电平(即0)选中数码管;各段选为高电平(即接+5V)选中各数码段;由0到f的编码为: 4.4四位数码管显示控制模块。 图12. 数码管显示控制模块 Ø输入:四个八位的七段数码管数据和位闪烁控制信号seg_flash_data. Ø输出:需要串行输出给74HC595的十六位数据; Ø功能:模块就是循环的将四位七段数码数据,组合一个十六位的输出数据; 4.5 74HC595驱动功能模块 图13. 74HC595驱动功能模块 Ø输入:十六位的位选段选数据。 1)duan_wei_data[13:0]分别对应: 2)[ X,X,H+,H-,DIG4,DIG3,DIG2,DIG1,DP,G,F,E,D,C,B,A] ; Ø输出:SPI接口输出,串行输出十六位位选段选信号; Ø
单片机电子时钟设计 摘 要 单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注, 应用很广、发展很快。单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低 廉、可靠性高、灵活性好、开发较为容易。由于具有上述优点,在我国,单片机已广泛 地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体 化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。这次毕业 设计通过对它的学习、应用,以AT89S51芯片为核心,辅以必要的电路,设计了一个简易 的电子时钟,它由4.5V直流电源供电,通过数码管能够准确显示间,调整间,从而 到达学习、设计、开发软、硬件的能力。 关词:单片机 AT89S51 电子时钟 数码管 1. 前言 时钟,自从它发明的那天起,就成为人类的朋友,但随着间的推移,科学技术的不 断发展,人们对间计量的精度要求越来越高,应用越来越广。怎样让时钟更好的为人 民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时钟。 现今,高精度的计工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石 英钟都采用了石英技术,因此走精度高,稳定性好,使用方便,不需要经常调校,数 字式电子钟用集成电路计,译码代替机械式传动,用LED显示器代替显示器代替指针 显示进而显示间,减小了计误差,这种表具有,分,秒显示间的功能,还可以 进行和分的校对,片选的灵活性好。 时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个 单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定 信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二 是指系统的标准定时钟,即定间,它通常有两种实现方法:一是用软件实现,即 用单片机内部的可编程定/计数器来实现,但误差很大,主要用在对间精度要求不高 的场合;二是用专门的时钟芯片实现,在对间精度要求很高的情况下,通常采用这种 方法,典型的时钟芯片有:DS1302,DS12887,X1203等都可以满足高精度的要求。 本文主要介绍用单片机内部的定/计数器来实现电子时钟的方法,本设计由单片机A T89S51芯片和LED数码管为核心,辅以必要的电路,构成了一个单片机电子时钟。 2. 方案论证与比较 2.1数字时钟方案 数字时钟是本设计的最主要的部分。根据需要,可利用两种方案实现。 方案一:本方案采用Dallas公司的专用时钟芯片DS12887A。该芯片内部采用石英晶体 振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以 用于显示或设置,使得软件编程相对简单。为保证时钟在电网电压不足或突然掉电等突 发情况下仍能正常工作,芯片内部包含锂电池。当电网电压不足或突然掉电,系统自 动转换到内部锂电池供电系统。而且即使系统不上电,程序不执行,锂电池也能保证 芯片的正常运行,以备随提供正确的间。 方案二:本方案完全用软件实现数字时钟。原理为:在单片机内部存储器设三个字节 分别存放时钟、分、秒信息。利用定时器与软件结合实现1秒定中断,每产生一次 中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1 ;若分值达到60,则清零分字节,并将字节值加1;若值达到24,则将十字节清零。 该方案具有硬件电路简单的特点。但由于每次执行程序定时器都要重新赋初值,所 以该时钟精度不高。而且,由于是软件实现,当单片机不上电,程序不执行时钟将 不工作。 基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。 2.2数码管显示方案 方案一:静态显示。所谓静态显示,就是当显示显示某一字符,相应的发光二极 管恒定的导通或截止。该方式每一位都需要一个8 位输出口控制。静态显示较小的电流能获得较高的亮度,且字符不闪烁。但当所显示 的位数较多,静态显示所需的I/O口太多,造成了资源的浪费。 方案二:动态显示。所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每 一位来说,每隔一段间点亮一次。利用人的视觉暂留功能可以看到整个显示,但必须 保证扫描速度足够快,字符才不闪烁显示器的亮度既与导通电流有关,也于点亮间 与间隔间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口, 降低了能耗。 从节省I/O口和降低能耗出发,本设计采用方案二。 3. 系统设计 3.1总体设计 3.1.1系统说明 利用单片机(AT89S51)制作简易电子时钟,由六个LED数码管分别显示十位、小 个位、分钟十位、分钟个位、秒钟十位、秒钟个位。6个PNP管(9012)分别控制六个 数码管的亮灭,一个按用于
学习单片机100例目录 目录 1 ************************************************************函数的使用和熟悉*************** ************************************************/ 4 实例3:用单片机控制第一个灯亮 4 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 4 实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 5 实例6:使用P3口流水点亮8位LED 5 实例7:通过对P3口地址的操作流水点亮8位LED 6 实例8:用不同数据类型控制灯闪烁间 7 实例9:用P0口、P1 口分别显示加法和减法运算结果 8 实例10:用P0、P1口显示乘法运算结果 9 实例11:用P1、P0口显示除法运算结果 9 实例12:用自增运算控制P0口8位LED流水花样 10 实例13:用P0口显示逻辑"与"运算结果 10 实例14:用P0口显示条件运算结果 11 实例15:用P0口显示按位"异或"运算结果 11 实例16:用P0显示左移运算结果 11 实例17:"万能逻辑电路"实验 11 实例18:用右移运算流水点亮P1口8位LED 12 实例19:用if语句控制P0口8位LED的流水方向 13 实例20:用swtich语句的控制P0口8位LED的点亮状态 13 实例21:用for语句控制蜂鸣器鸣笛次数 14 实例22:用while语句控制LED 16 实例23:用do-while语句控制P0口8位LED流水点亮 16 实例24:用字符型数组控制P0口8位LED流水点亮 17 实例25: 用P0口显示字符串常量 18 实例26:用P0 口显示指针运算结果 19 实例27:用指针数组控制P0口8位LED流水点亮 19 实例28:用数组的指针控制P0 口8 位LED流水点亮 20 实例29:用P0 、P1口显示整型函数返回值 21 实例30:用有参函数控制P0口8位LED流水速度 22 实例31:用数组作函数参数控制流水花样 23 实例32:用指针作函数参数控制P0口8位LED流水点亮 23 实例33:用函数型指针控制P1口灯花样 25 实例34:用指针数组作为函数的参数显示多个字符串 26 实例35:字符函数ctype.h应用举例 27 实例36:内部函数intrins.h应用举例 27 实例37:标准函数stdlib.h应用举例 28 实例38:字符串函数string.h应用举例 29 实例39:宏定义应用举例2 29 实例40:宏定义应用举例2 30 实例41:宏定义应用举例3 30 *************************************************************** **中断、定时器********中断、定时器************ *********中断、定时器*********中断、定时器******** **** ********************************************************/ 31 实例42:用定时器T0查询方式P2口8位控制LED闪烁 31 实例43:用定时器T1查询方式控制单片机发出1KHz音频 31 实例44:将计数器T0计数的结果送P1口8位LED显示 32 实例45:用定时器T0的中断控制1位LED闪烁 33 实例46:用定时器T0的中断实现长间定 34 实例47:用定时器T1中断控制两个LED以不同周期闪烁 34 实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 36 实例49:用定时器T0的中断实现"渴望"主题曲的播放 36 实例50-1:输出50个矩形脉冲 39 实例50-2:计数器T0统计外部脉冲数 40 实例51-2:定时器T0的模式2测量正脉冲宽度 40 实例52:用定时器T0控制输出高低宽度不同的矩形波 41 实例53:用外中断0的中断方式进行数据采集 42 实例54-1:输出负脉宽为200微秒的方波 43 实例54-2:测量负脉冲宽度 43 实例55:方式0控制流水灯循环点亮 44 实例56-1:数据发送程序 45 实例56-2:数据接收程序 47 实例57-1:数据发送程序 47 实例57-2:数据接收程序 49 实例58:单片机向PC发送数据 50 实例59:单片机接收PC发出的数据 51 *****************************************************************数码管显示*****数码管显示******************** 数码管显示****************数码管显示***************************************************/ 52 实例60:用LED数码显示数字5 52 实例61:用LED数码显示器循环显示数字0~9 52 实例62:用数码管慢速动态扫描显示数字"1234" 53 实例63:用LED数码显示器伪静态显示数字1234 54 实例64:用数码管显示动态检测结果 54 实例65:数码秒表设计 56 实例66:数码时钟设计 58 实例67:用LED数码管显示计数器T0的计数值 62 实例68:静态显示数字“59” 63 ******************************************************************** **盘控制*********盘控制*************** ***************盘控制**** *****盘控制**** ****** *****************************************************/ 63 实例69:无软件消抖的独立盘输入实验 64 实例70:软件消抖的独立盘输入实验 64 实例71:CPU控制的独立盘扫描实验 65 实例72:定时器中断控制的独立盘扫描实验 68 实例73:独立盘控制的4级变速流水灯 71 实例74:独立盘的按功能扩展:"以一当四" 73 实例75:独立盘调的数码时钟实验 75 实例76:独立盘控制步进电机实验 79 实例77:矩阵式盘按值的数码管显示实验 82 //实例78:矩阵式盘按音 85 实例79:简易电子琴 86 实例80:矩阵式盘实现的电子密码锁 92 ************************************************************************ **液晶显示LCD*********液晶显示LCD *****液晶显示LCD ************* *******液晶显示LCD*********液晶显示LCD *****液晶显示LCD **** ****** ***********************************************************/ 95 实例81:用LCD显示字符'A' 96 实例82:用LCD循环右移显示"Welcome to China" 99 实例83:用LCD显示检测结果 102 实例84:液晶时钟设计 106 *******************************************************************一些芯片的使用*****24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 红外遥控**********************************************/ 112 实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 112 实例86:将按次数写入AT24C02,再读出并用1602LCD显示 117 实例87:对I2C总线上挂接多个AT24C02的读写操作 124 实例88:基于AT24C02的多机通信 读取程序 129 实例88:基于AT24C02的多机通信 写入程序 133 实例90:DS18B20温度检测及其液晶显示 144 实例91:将数据"0xaa"写入X5045再读出送P1口显示 153 实例92:将流水灯控制码写入X5045并读出送P1口显示 157 实例93:对SPI总线上挂接多个X5045的读写操作 161 实例94:基于ADC0832的数字电压表 165 实例95:用DAC0832产生锯齿波电压 171 实例96:用P1口显示红外遥控器的按值 171 实例97:用红外遥控器控制继电器 174 实例98:基于DS1302的日历时钟 177 实例99:单片机数据发送程序 185 实例100:电机转速表设计 186 模拟霍尔脉冲 192
单片机原理与接口技术课程设计 课程名称: 单片机原理与接口技术 设计题目: 基于51单片机的数字温度计设计 专 业: 信 息 工 程 设 计 者: 指导老师: 摘要 随着现代信息技术的飞速发展和传统工业改造的逐步实现.能够独立工作的温度检测 和显示系统应用于诸多领域。传统的温度检测以热敏电阻为温度敏感元件。热敏电阻的 成本低,但需后续信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有 一定的误差。与传统的温度计相比,这里设计的数字温度计具有读数方便,测温范围广 ,测温精确,数字显示,适用范围宽等特点。选用AT89C51型单片机作为主控制器件,D Sl8B20作为测温传感器通过2位共阴极LED数码管串口传送数据,实现温度显示。通过DS l8B20直接读取被测温度值,进行数据转换,该器件的物理化学性能稳定,线性度较好, 在0 ~100 最大线性偏差小于0.1 。该器件可直接向单片机传输数字信号,便于单片机处 理及控制。另外,该温度计还能直接采用测温器件测量温度,从而简化数据传输与处理 过程。 关字:AT89S52 51单片机 DS18B20 温度计 目 录 1 系统硬件设计方案 - 3 - 1.1 温度传感器介绍 - 3 - 1.2 温度传感器与单片机的连接 - 6 - 1.3 复位信号及外部复位电路 - 7 - 1.4 电源电路 - 7 - 1.5 显示电路 - 8 - 2 软件设计 - 9 - 3 数据测试 - 11 - 4 总结与体会 - 11 - 参考文献 - 13 - 附录1 仿真图 - 14 - 附录2 程序源代码 - 15 - 1 系统硬件设计方案 1.1 温度传感器介绍 AT89C51作为温度测试系统设计的核心器件。该器件是INTEL公司生产的MCS一5l系列单片 机中的基础产品,采用了可靠的CMOS工艺制造技术,具有高性能的8位单片机,属于标准 的MCS—51的CMOS产品。不仅结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,而且 继承和扩展了MCS—48单片机的体系结构和指令系统。单片机小系统的电路图如图2所示。 图1 单片机小系统电路 AT89C51单片机的主要特性: (1)与MCS-51 兼容,4K字节可编程闪烁存储器; (2)灵活的在线系统编程,掉电标识和快速编程特性; (3)寿命为1000次写/擦周期,数据保留间可10年以上; (4)全静态工作模式:0Hz-33Hz; (5)三级程序存储器锁定; (6)128*8位内部RAM,32可编程I/O线; (7)两个16位定时器/计数器,6个中断源; (8)全双工串行UART通道,低功耗的闲置和掉电模式; (9)片内振荡器和时钟电路; DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。可选更小的封装方式,更宽的电 压适用范围。分辨率设定,及用户设定的报警温度存储在EPROM中,掉电后依然保存。 温度传感器DS18B20引脚如图3所示。 8引脚封装 TO-92封装 图2 温度传感器 引脚功能说明: NC :空引脚,悬空不使用; VDD :可选电源脚,电源电压范围3~5.5V。当工作于寄生电源,此引脚必须接地。 DQ :数据输入/输出脚。漏极开路,常态下高电平。 GND :为电源地 DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警 触发器TH和TL、配置寄存器。 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码 。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自 身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作 用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的 。 DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二 进制补码读数形式提供,以0.0625 /LSB形式表达,其中S为符号位。 这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前 面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可 得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可 得到实际温度。 例如+125 的数字输出为07D0H,+25.0625 的数字输出为0191H,- 25.0625 的数字输出为FF6FH,-55 的数字输出为FC90H。 DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的 E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。 暂存存储器包含了

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值