久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4120|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www.亚洲精品 | 天天天堂| 欧美精品一二三 | 欧美激情一区二区三区 | 欧美国产精品 | 久操伊人 | 欧美精品久久久 | 一区二区三区高清不卡 | 国产成人精品一区二 | 成人影院在线视频 | 久久精品久久久久久 | 午夜小影院 | 午夜精品一区二区三区在线视频 | 国产精品久久久久久久久久免费看 | 在线免费看黄 | 中文字幕在线观看 | 精品一区二区久久久久久久网站 | 久久免费大片 | 拍真实国产伦偷精品 | 中文字幕成人网 | 久久精品国产一区 | 亚洲高清一区二区三区 | 国产精品国产三级国产aⅴ中文 | 婷婷中文在线 | 欧美乱大交xxxxx另类电影 | 久久久成人网 | 久久久久亚洲精品 | 久久综合一区 | 久久精品久久久久久 | 91成人在线视频 | 天天干夜夜操 | 日韩精品久久一区 | 91美女视频| 欧美日韩综合一区 | 久久久久亚洲精品中文字幕 | 成人深夜福利 | 欧美一区| 国产精品精品久久久久久 | 狠狠做深爱婷婷综合一区 | 免费高潮视频95在线观看网站 | 成人精品一区二区 |