找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3564|回复: 1
打印 上一主题 下一主题
收起左侧

单片机LED秒表,含源码,仿真原理图

[复制链接]
跳转到指定楼层
楼主
这是使用89C51单片机制作的双数码管秒表,使用按键控制,用户可以自行下载后进行一定的功能扩展,有Proteus的仿真文件和C源代码,分享一下吧。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机代码:
  1. #include<reg51.h>

  2. #include<intrins.h>

  3. #include <string.h>

  4. #include <stdio.h>

  5. #define uchar unsigned char

  6. #define uint  unsigned int

  7. sbit RS=  P2^0  ;                                                

  8.         //液晶显示引脚定义

  9. sbit RW=  P2^1  ;

  10. sbit EN=  P2^2  ;

  11. uint  t=0,dian=0;

  12. uchar LCD_LINE_ONE[16]={"tp1:           "};                //定义显示屏幕

  13. uchar LCD_LINE_TWO[16]={"tp2:           "};

  14. //uchar LCD_LINE_THR[16]={"                "};


  15. int Tm;
  16. int  fushu=0 ;

  17. sbit DQ= P3^3;                                                                             

  18. static unsigned char get_serial[]={                  //获取的八个DS18B20内部RAM64位序列号
  19.   

  20. 224, 0,0,0,  184,  197, 50, 40,
  21.    
  22. 215, 0,0,0,  184,  197, 51, 40
  23.   
  24. //  82, 0,0,0,  184,  197, 52, 40

  25. // 101, 0,0,0,  184,  197,  53,40,
  26.   
  27. //60, 0,0,0,  184,  197,  54,40,
  28.    
  29. //11, 0,0,0,  184,  197,  55,40,
  30.    
  31. //47, 0,0,0,  184,  197,  56,40,
  32.          
  33. //185, 0,0,0,  184,  197,  49,40,

  34. };

  35. void delay( ms )                                          //用于液晶显示的延时函数
  36. {
  37.         

  38.   int i ;
  39.           while(ms--)
  40.           {
  41.                for(i=0 ;i<5 ;i++ )  ;

  42.           }
  43. }

  44. uchar Read_LCD_State()                                  //读取液晶显示的状态
  45. {
  46.          

  47. uchar state;
  48.         RS=0;RW=1;EN=1;delay(1);
  49.         state=P0;
  50.         EN = 0;delay(1);
  51.       

  52.   return state;
  53. }
  54. void LCD_Busy_Wait()                                 //如果忙则等待函数
  55. {
  56.    

  57.       while((Read_LCD_State()&0x80)==0x80);
  58.         delay(5);
  59. }

  60. void Write_LCD_Zhilin(uchar

  61. zl)                          //液晶显示写指令函数
  62. {
  63.         LCD_Busy_Wait();
  64.         

  65. RS=0;RW=0;
  66.         EN=0;
  67.         P0=zl;
  68.         EN=1;
  69.         delay(1);
  70.         EN=0;        
  71. }
  72. void Write_LCD_shuju(uchar date)             //液晶显示写数据函数
  73. {
  74.          LCD_Busy_Wait

  75. ();
  76.         RS=1;RW=0;
  77.         EN=0;
  78.         P0=date;
  79.         EN=1;
  80.         delay(1);
  81.         

  82. EN=0;        
  83. }
  84. void LCD_INIT()                                //液晶显示初始化
  85. {
  86.    

  87. Write_LCD_Zhilin(0x38);          // 显示模式设置
  88.         delay(1);                          

  89.         
  90.         Write_LCD_Zhilin(0x01);          // 显示清屏
  91.         delay(1);              

  92.                   
  93.         Write_LCD_Zhilin(0x06);          // 光标移动设置
  94.         delay

  95. (1);
  96.         Write_LCD_Zhilin(0x0c);          // 开及光标设置
  97.         delay(1);
  98. }
  99. void

  100. Display_LCD_String(uchar p,uchar *s)                  //液晶显示写入函数
  101. {
  102.          uchar i;


  103.        Write_LCD_Zhilin(p|0x80)        ;    //写地址高位为一
  104.         //Write_LCD_Zhilin

  105. (0x40|0x80)        ;
  106.         for(i=0;i<16;i++)
  107.         {
  108.                 Write_LCD_shuju(s

  109. [i]);
  110.                 delay(1);         
  111.         }
  112. }
  113. /***************************************************************************************/
  114. void delays(int us)                                           //用于DS18B20的延时函数
  115. { int

  116. s;
  117. for ( s=0; s<us; s++);
  118. }
  119. void rst(void)                                                

  120. //DS18B20初始化
  121. {
  122. DQ = 1;
  123. delays(2);
  124. DQ = 0;
  125. delays(30); //精确延时 480~960us
  126. DQ = 1;
  127. delays(8);
  128. }
  129. void write(unsigned char ku)                //DS18B20写函数
  130. {
  131. int i=0;
  132.      for (i=0;i<8;i+

  133. +)
  134.     {
  135.                 DQ=0;
  136.                 DQ =ku&0x01;
  137.                 delays(3);
  138.          

  139.        DQ=1;
  140.                 ku>>=1;
  141.     }
  142. }
  143. void match_rom(unsigned char *rom)         

  144. //DS18B20匹配ROM函数
  145. {
  146. unsigned char i;
  147. rst();                                             

  148.             //初始化
  149. write(0x55);                                          //匹配ROM
  150. for

  151. (i=8;i>0;i--)
  152. {
  153.           write(*(rom+i-1));
  154. }

  155. }
  156. unsigned int read(void)                     

  157.     //DS18B20读函数,每次读16位
  158. {
  159.         int i=0;
  160.         unsigned int u=0;
  161.     for

  162. (i=0;i<16;i++)
  163.     {
  164.                 DQ=0;
  165.                 u>>=1;
  166.                 DQ=1;
  167.         

  168.         if(DQ) u|=0x8000;
  169.                 delays(4);
  170.      }
  171.     return (u);
  172. }
  173. int  read0

  174. (unsigned char *seria)        //读取对应温度值并转换函数
  175. {
  176.      int temperature ;
  177.    

  178. unsigned int tp;
  179.     unsigned int lsb;
  180.     rst();                                  //初始化
  181.   

  182.   write(0xCC);                  //跳过RAM
  183.         write(0x44);                  //温度转换
  184.   

  185.       rst();                                  //再次初始化
  186.         write(0xCC);
  187.         

  188. match_rom(seria);    //匹配ROM函数调用
  189.                  write(0xBE);         //读取存储器指


  190.         tp=read();                         //读取温度值
  191.         if((tp&0xf800)==0xf800)   

  192.              //判断正负数
  193.             {
  194.                      fushu=1 ;
  195.                      

  196. tp=~tp+1 ;
  197.                     lsb=(unsigned int)(tp*6.25);
  198.                         

  199. dian=lsb%100;                  //取小数部分
  200.                
  201.                      

  202. temperature=lsb/100;

  203.                 }
  204.      else
  205.             {
  206.                     fushu=0;
  207.    

  208.                 lsb=(unsigned int)(tp*6.25);
  209.                         dian=lsb%100;  
  210.       

  211.          
  212.                      temperature=lsb/100;

  213.              }
  214.      return

  215. (temperature);
  216. }
  217. /*****************************************************************************************

  218. /
  219. void main()
  220. {
  221.       uint i ;
  222.           LCD_INIT();
  223.           EA=0 ;                 //使用

  224. DS18B20禁止任何中断
  225.           while(1)
  226.          {         
  227.               for(i=0;i<2;i++)
  228.    

  229.               {        
  230.                       Tm=read0(get_serial+i*8);
  231.                      

  232.            if(i==0)                                   //判断是第几个的数据
  233.                  

  234.                {
  235.                                            if(fushu==0)                    

  236.                        //判断是否加负号
  237.                                                 

  238. sprintf(LCD_LINE_ONE+5," %d", Tm);
  239.                                            if(fushu==1)


  240.                                                    sprintf(LCD_LINE_ONE+5,"-%d", Tm);
  241.      

  242.                                   sprintf(LCD_LINE_ONE+10,".%d",dian);                //加

  243. 入小数部分
  244.                                            Display_LCD_String

  245. (0x00,LCD_LINE_ONE);
  246.                                  }
  247.                                 if

  248. (i==1)
  249.                                 {  
  250.                                        if

  251. (fushu==0)        
  252.                                                  sprintf(LCD_LINE_TWO

  253. +5," %d", Tm);
  254.                                            if(fushu==1)
  255.                      

  256.                                 sprintf(LCD_LINE_TWO+5,"-%d", Tm);
  257.                         

  258.                sprintf(LCD_LINE_TWO+10,".%d",dian);
  259.                                        

  260.    Display_LCD_String(0x40,LCD_LINE_TWO);
  261.                                 }

  262.                

  263.   }

  264.                
  265.          }
  266. }


复制代码


LEDS.7z

13.02 KB, 下载次数: 11, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:265321 发表于 2017-12-23 19:21 | 只看该作者
没有hex文件
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表