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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2543|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)1602顯示電子時(shí)鐘Proteus仿真程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit LCD_RS = P2^0;
  5. sbit LCD_RW = P2^1;
  6. sbit LCD_EN = P2^2;
  7. sbit LED = P2^4;

  8. bit new_s=0, g = 0,k=0;
  9. char t0, sec = 00, min = 00, hour = 00;
  10. char code LCD_line1[] = "GOOD MORNING!";
  11. char code LCD_line2[] = "Timer: 00:00:00 ";
  12. char Timer_buf[] = "00:00:00";

  13. void delay(uint z)//延時(shí)
  14. {
  15.     uint  x, y;
  16.     for(x = z; x > 0; x--)  
  17.                 for(y = 100; y > 0; y--);
  18. }
  19. void W_LCD_Com(uchar com)   //寫指令   
  20. {
  21.     LCD_RS = 0;
  22.                 LCD_RW = 0;
  23.                 P3 = com;
  24.     LCD_EN = 1;
  25.                 delay(5);
  26.                 LCD_EN = 0;
  27. }


  28. void W_LCD_Dat(uchar dat)//寫數(shù)據(jù)
  29. {
  30.     LCD_RS = 1;
  31.         LCD_RW = 0;
  32.         P3 = dat;
  33.     LCD_EN = 1;
  34.         delay(5);
  35.         LCD_EN = 0;
  36. }

  37. void W_LCD_STR(uchar *s)  //寫字符
  38. {
  39.     while(*s)  W_LCD_Dat(*s++);
  40. }


  41. void W_BUFF(void) //顯示            
  42. {
  43.                 Timer_buf[0] = hour / 10 + 48;
  44.                 Timer_buf[1] = hour % 10 + 48;
  45.                 Timer_buf[3] = min / 10 + 48;
  46.                 Timer_buf[4] = min % 10 + 48;
  47.                 Timer_buf[6] = sec / 10 + 48;
  48.                    Timer_buf[7] = sec % 10 + 48;         
  49.                    W_LCD_Com(0xc0 + 7);
  50.                 W_LCD_STR(Timer_buf);
  51. }


  52. uchar read_key(void)//掃描按鍵
  53. {
  54.     uchar  x1, x2;
  55.     P1 = 255;
  56.     x1 = P1;
  57.     if (x1 != 255) {
  58.       delay(100);
  59.       x2 = P1;
  60.       if (x1 != x2)  
  61.         return 255;
  62.       while(x2 != 255)
  63.         x2 = P1;
  64.       if      (x1 == 0xfe)  return 0;
  65.       else if (x1 == 0xfb)  return 1;
  66.       else if (x1 == 0xfd)  return 2;
  67.       else if (x1 == 0xf7)  return 3;
  68.       else if (x1 == 0xef)  return 4;
  69. else if(x1==0xdf)return 5;
  70.     }
  71.     return 255;
  72. }
  73. void Init()
  74. {
  75.     LCD_RW = 0;
  76.     W_LCD_Com(0x38); //顯示模式
  77.                 delay(50);
  78.   
  79.                 W_LCD_Com(0x0c);
  80.     W_LCD_Com(0x06);//顯示光標(biāo)移動(dòng)位置
  81.     W_LCD_Com(0x01);//清屏
  82.     W_LCD_Com(0x80);//第一行
  83.                 W_LCD_STR(LCD_line1);
  84.     W_LCD_Com(0xC0);//第二行
  85.                 W_LCD_STR(LCD_line2);

  86.     TMOD = 0x01;   //T0定時(shí)方式1
  87.     TH0 = 0x3c;
  88.         TL0= 0xB0;
  89.     TR0 = 1;      
  90.     ET0 = 1;
  91.     EA = 1;
  92. }

  93. void CountDown()
  94. {

  95.   if (k)
  96. while(!(sec==0&&min==0&&hour==0))
  97. {
  98.          if(new_s==1)
  99.         {
  100.            sec--;
  101.            new_s=0;
  102.            sec %=60;
  103.            if(sec<0)
  104.                    sec=58-sec;
  105.         if(sec==59)  
  106.                 {   
  107.                         min--;  min %=60;
  108.                         if(min<0&&hour!=0&&hour>0)
  109.                                 min=58-min;
  110.                   if(min==59)  
  111.                           {
  112.                                   hour--; hour %= 24;
  113.                           
  114.                           }
  115.         
  116.            }
  117.         
  118.         
  119.         W_BUFF();  
  120.       }
  121.           }        
  122.           k=0;
  123. }
  124. void main()
  125. {
  126.     uint i, j;
  127.     uchar Key;
  128.     Init();
  129.     while(1)
  130.         {

  131.       if (new_s)
  132.            {
  133.             new_s=0;sec++;  sec %= 60;
  134.         if(!sec)  
  135.                 {   
  136.                 min++;  min %= 60;
  137.           if(!min)  
  138.                   { hour++; hour %= 24;}
  139.         
  140.            }
  141.         
  142.         
  143.         W_BUFF();  
  144.       }        
  145.           Key = read_key();  
  146.       switch(Key) {      
  147.       case  0: g = 1; break;
  148.       case  1: if(g) {min++;  min %= 60;  W_BUFF(); break;}
  149.       case  2: if(g) {hour++; hour %= 24; W_BUFF(); break;}
  150.       case  3: g = 0; break;
  151.                 case 4:k=1;CountDown();break;
  152.     }
  153.                   
  154.                 }
  155. }

  156. void timer0(void) interrupt 1  
  157. {
  158.                 TH0 = 0x3c;
  159.                 TL0= 0xB0;
  160.     t0++; t0 %= 20;  //20次
  161.     if(t0 == 0){new_s = 1; LED = ~LED;}
  162.     if(g)  LED = 0;
  163.         
  164.   
  165. }
復(fù)制代碼

所有資料51hei提供下載:
電子時(shí)鐘.zip (72.96 KB, 下載次數(shù): 59)


一、 項(xiàng)目要求
1. 能用LED顯示時(shí)間,以“時(shí):分:秒”的形式;2. 能通過(guò)撥動(dòng)按鍵達(dá)到調(diào)時(shí)的目的;3. 能實(shí)現(xiàn)倒計(jì)時(shí)功能。二、 項(xiàng)目開發(fā)環(huán)境1. 硬件環(huán)境:Windows 102. 軟件環(huán)境:Protues 8.6              Keil uVision4三、 項(xiàng)目分析1. 顯示時(shí)間使用的LED可以使用LM016L,時(shí)間顯示的原理可以使用定時(shí)器,定時(shí)器定時(shí)滿1S,秒加1,判斷秒大于59時(shí),分加1,并且秒清0;判斷分大于59時(shí),時(shí)加1,并且分清0;判斷時(shí)大于23時(shí),時(shí)清0。主程序流程圖:3. 倒計(jì)時(shí)設(shè)計(jì)當(dāng)時(shí)間設(shè)定完成后,從當(dāng)前時(shí)間開始倒計(jì)時(shí),當(dāng)秒小于0時(shí),分減1,秒置59,當(dāng)分小于0時(shí),時(shí)減1,分置59,當(dāng)時(shí)小于0時(shí),從00:00:00開始正計(jì)時(shí)。四、 設(shè)計(jì)與實(shí)現(xiàn)1. 設(shè)計(jì)思路1) 首先要將時(shí)間顯示部分的邏輯原理理清楚并畫出仿真圖,考慮按鍵進(jìn)去,并寫出時(shí)間顯示部分的核心代碼;2) 將按鍵的各個(gè)功能理清楚,以及按鍵控制的邏輯思路,編寫出完整的代碼,并進(jìn)行仿真。3) 考慮增添倒計(jì)時(shí)功能,在原有的基礎(chǔ)上增加一個(gè)按鍵,修改仿真圖,并編寫倒計(jì)時(shí)函數(shù)代碼,最后仿真調(diào)試。2. 設(shè)計(jì)和實(shí)現(xiàn)的主要內(nèi)容1) 設(shè)計(jì)實(shí)現(xiàn)一個(gè)以“時(shí):分:秒”形式顯示的電子時(shí)鐘,使用4個(gè)按鍵實(shí)現(xiàn):開始計(jì)時(shí),設(shè)置時(shí),設(shè)置秒,完成時(shí)間設(shè)置功能,最后增添按鍵實(shí)現(xiàn)倒計(jì)時(shí)功能。

五、 總結(jié)
本次課程設(shè)計(jì)仿真電子時(shí)鐘,相對(duì)來(lái)說(shuō),電路比較簡(jiǎn)單,沒(méi)有那么復(fù)雜,仿真圖中需要注意的LM016L這個(gè)LED顯示器件的工作原理,LM016L是1602的一種,它是以ASCII碼為編碼方式,不注意的話,可能會(huì)造成亂碼。LM016L在寫入顯示地址時(shí)要求最高位D7恒定為高電平1,所以實(shí)際寫入的數(shù)據(jù)應(yīng)該加上80H,它在顯示字符時(shí)光標(biāo)自動(dòng)右移,無(wú)須人工干預(yù),它的VL為液晶顯示器對(duì)比度調(diào)整端,我們?cè)诜抡嬷袨樗尤胍粋(gè)滑動(dòng)變阻器。對(duì)于本次課程設(shè)計(jì),其重點(diǎn)在與理清其中的邏輯思路,再來(lái)編寫代碼,使得整個(gè)課程設(shè)計(jì)條理清晰。
本次課程設(shè)計(jì)讓我對(duì)本學(xué)期所學(xué)的單片機(jī)是識(shí)進(jìn)行了一次整合,對(duì)AT89C51單片機(jī)的認(rèn)識(shí)更加的清晰明了。讓我對(duì)單片機(jī)有關(guān)的硬件設(shè)計(jì)產(chǎn)生了濃厚的興趣,特別時(shí)有關(guān)定時(shí)計(jì)數(shù)器的部分。

本次設(shè)計(jì)使用了Keil uVision4和Proteus 8 Professional軟件,讓我對(duì)這兩個(gè)軟件的運(yùn)用更加熟練,更加得心應(yīng)手。讓我認(rèn)識(shí)到了自己本身的不足以及問(wèn)題解決的方法,讓我認(rèn)識(shí)到了實(shí)踐與理論結(jié)合的重要性。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:573789 發(fā)表于 2020-6-9 15:23 | 只看該作者
牛逼頂        
回復(fù)

使用道具 舉報(bào)

板凳
ID:723220 發(fā)表于 2020-8-30 10:13 | 只看該作者
能不能發(fā)一下只有四個(gè)按鈕和排阻只有8個(gè)引腳的程序
回復(fù)

使用道具 舉報(bào)

地板
ID:723220 發(fā)表于 2020-9-1 10:53 | 只看該作者
為什么會(huì)突然卡退,程序到最后算是寫完了嗎?
回復(fù)

使用道具 舉報(bào)

5#
ID:723220 發(fā)表于 2020-9-5 20:15 | 只看該作者
在嗎,可不可以回復(fù)一下,程序運(yùn)行卡退怎么修改
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲第一网站 | 久久久精品一区 | 成人水多啪啪片 | 成人在线一区二区 | 亚洲乱码一区二区三区在线观看 | 精品视频在线观看 | 国产欧美一区二区三区在线播放 | 91亚洲视频在线 | 国产一区二区激情视频 | h视频在线免费观看 | 欧美另类视频在线 | 免费在线播放黄色 | 黄色毛片在线看 | 日韩欧美网 | 情侣酒店偷拍一区二区在线播放 | 亚洲性视频在线 | av在线一区二区三区 | 五月天婷婷久久 | 成人免费视频网站在线看 | 亚洲高清在线视频 | 亚洲成人免费 | 国产一级片一区二区三区 | 91综合在线观看 | 91久久久久久久久久久 | 性xxxxx| 国产精品伦一区二区三级视频 | 精品一二区 | 国产福利在线 | 亚洲精品国产a久久久久久 午夜影院网站 | 伊人一二三 | 免费观看的av | 国产一区久久 | 范冰冰一级做a爰片久久毛片 | 99久久久久久99国产精品免 | av毛片| 精品亚洲国产成av人片传媒 | 亚洲一区精品在线 | 国产成人免费网站 | 午夜视频一区二区三区 | 日韩在线播放中文字幕 | 国产99免费视频 |