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

QQ登錄

只需一步,快速開(kāi)始

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

作為一個(gè)初學(xué)者,如何學(xué)好單片機(jī),課堂上的內(nèi)容過(guò)于粗淺 求幫助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:541926 發(fā)表于 2019-5-19 10:58 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
作為一個(gè)初學(xué)者,如何學(xué)好單片機(jī),課堂上的內(nèi)容過(guò)于粗淺

單片機(jī)源程序如下:
  1. /*---------------------------------------------------------------
  2. 項(xiàng)目名稱(chēng):自動(dòng)售水機(jī)系統(tǒng)
  3. ----------------------------------------------------------------*/
  4. #include"reg52.h"                  
  5. #include"pcf8591.h"
  6. #include"iic.h"                                  //iic協(xié)議
  7. #include"ct107.h"                          //CT107單片機(jī)初始化
  8. #include"deplay.h"                          //延時(shí)

  9. #define AddWr 0x90   //寫(xiě)數(shù)據(jù)地址
  10. #define AddRd 0x91   //讀數(shù)據(jù)地址

  11. sbit key6=P3^1;                 //定義按鍵端口
  12. sbit key7=P3^0;

  13. unsigned char code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //數(shù)碼管段選“0~9”
  14. unsigned char code smg_we[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                           //數(shù)碼管位選
  15. unsigned char tab[8]={0,0,5,0,0,0,0,0};                                                                                           //顯示數(shù)組
  16. unsigned int water,total;                                                                                                                   //定義水量,總價(jià)
  17. float price;                                                                                                                                              //定義單價(jià)                                                                  
  18. unsigned char light;                                                                                                                           //定義光照強(qiáng)度變量
  19. bit flag,flag1,flag2;                                                                                                                           //定義標(biāo)志位

  20. unsigned char ReadADC(unsigned char Ch1);                                                                                   //讀AD函數(shù),Ch1為通道號(hào),取值0~3;
  21. void diswork();                                                                                                                                           //數(shù)據(jù)處理函數(shù)

  22. main()
  23. {
  24.         price=0.5;                                            //設(shè)定單價(jià)為0.5元/L
  25.         TMOD=0x11;                                           //設(shè)置定時(shí)器0,1為16位定時(shí)器
  26.         TH0=(65536-50000)/256;                   //設(shè)定定時(shí)器0初值50ms,用于累計(jì)水量
  27.         TL0=(65536-50000)%256;
  28.         TH1=(65536-2000)/256;                   //設(shè)定定時(shí)器0初值2ms,用于掃描數(shù)碼管和L1
  29.         TL1=(65536-2000)%256;
  30.         TR1=1;                                                   //開(kāi)定時(shí)器1
  31.         TR0=1;                                                   //開(kāi)定時(shí)器0
  32.         ET1=1;                                                   //開(kāi)定時(shí)器1中斷允許位
  33.         EA=1;                                                   //開(kāi)總中斷
  34.         ct107_init();
  35.         while(1)                        //停止
  36.         {
  37.          if(!key6)                          //判斷按鍵是否按下
  38.          {
  39.          deplay_50us(200);        //消抖
  40.                  if(!key6)                //確認(rèn)按鍵按下
  41.                  {
  42.                          ET0=0;
  43.                         P2&=0x1f;
  44.                         RELAY=0;        //關(guān)繼電器
  45.                         BUZZ=0;                //避免蜂鳴器的影響
  46.                         P2|=Y5C;
  47.                         P2&=0x1f;
  48.                         flag=1;                //停止標(biāo)志位
  49.                         flag2=0;        //按下停止后把許可啟動(dòng)標(biāo)志位置0,方可進(jìn)入下次啟動(dòng)
  50.                  }
  51.          }
  52.          if(!flag2)                        //許可啟動(dòng)標(biāo)志位為0才可啟動(dòng)
  53.          if(!key7)                        //啟動(dòng)
  54.          {
  55.          deplay_50us(200);
  56.                  if(!key7)
  57.                  {
  58.                          ET0=1;
  59.                         water=0;        //水量清0
  60.                         total=0;        //總價(jià)清0
  61.                         P2&=0x1f;
  62.                         RELAY=1;        //開(kāi)繼電器
  63.                         BUZZ=0;
  64.                         P2|=Y5C;
  65.                         P2&=0x1f;
  66.                         flag=0;                //復(fù)位停止標(biāo)志位
  67.                         flag2=1;        //置位許可啟動(dòng)標(biāo)志位防止再次進(jìn)入啟動(dòng)程序
  68.                  }
  69.          }
  70.         diswork();                        //顯示數(shù)據(jù)處理
  71.         light=ReadADC(1);        //讀AD數(shù)據(jù)(光敏電阻)
  72.         if(light<64)                //判斷電壓是否下于1.25V。1.25*255/5=64
  73.         flag1=1;
  74.         else
  75.         flag1=0;
  76.         }
  77. }

  78. void diswork()
  79. {
  80.         if(flag)           //停止時(shí)顯示總價(jià),啟動(dòng)時(shí)顯示水量
  81.         {
  82.         total=(unsigned int)(water*price);
  83.         tab[4]=total/1000;
  84.         tab[5]=total%1000/100;
  85.         tab[6]=total%100/10;
  86.         tab[7]=total%10;
  87.         }
  88.         else
  89.         {
  90.         tab[4]=water/1000;
  91.         tab[5]=water%1000/100;
  92.         tab[6]=water%100/10;
  93.         tab[7]=water%10;
  94.         }        
  95. }
  96. unsigned char ReadADC(unsigned char Ch1)         //讀通道Ch1的數(shù)據(jù)
  97. {
  98.         unsigned char Data;
  99.         init_iic();
  100.         Start();
  101.         Send(AddWr);
  102.         Ack();
  103.         Send(0x40|Ch1);
  104.         Ack();

  105.         Start();
  106.         Send(AddRd);
  107.         Ack();
  108.         Data=Read();
  109.         Scl=0;
  110.         NoAck();
  111.         Stop();
  112.         return Data;

  113. }

  114. void timeint_0() interrupt 1         //定時(shí)器0中斷用于計(jì)算水量,其中斷優(yōu)先級(jí)比定時(shí)器1中斷高,防止了中斷被打斷,使數(shù)據(jù)更準(zhǔn)確
  115. {
  116.         static unsigned char k;                 
  117.         TH0=(65536-50000)/256;                 //每50ms進(jìn)一次中斷
  118.         TL0=(65536-50000)%256;
  119.         if(k)                                                 //每100ms水量增加10mL
  120.         {
  121.                 k=0;
  122.                 if(water==9999)                        
  123.                 {
  124.                         ET0=0;
  125.                         P2&=0x1f;
  126.                         RELAY=0;
  127.                         BUZZ=0;
  128.                         P2|=Y5C;
  129.                         P2&=0x1f;
  130.                         flag=1;
  131.                         flag2=0;
  132.                 }
  133.                 else
  134.                 water++;
  135.         }
  136.         else
  137.         k++;               
  138. }

  139. void timeint_1() interrupt 3
  140. {                                                                                                                                           //數(shù)碼管和L1掃描函數(shù)
  141.         unsigned char com[8]={0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff};           //用于控制數(shù)碼管的亮滅
  142.         static char i;
  143.         TH1=(65536-2500)/256;                                                                                           //每2ms掃描一次
  144.         TL1=(65536-2500)%256;
  145.         P2&=0x1f;
  146.         P0=0xff;
  147.         P2|=Y7C;
  148.         P2&=0x1f;
  149.         P0=smg_we[i]&com[i];
  150.         P2|=Y6C;
  151.         P2&=0x1f;
  152.         if(i==1|i==5)
  153.         P0=smg_du[tab[i]]&0x7f;                                                                                           //為第二和第六個(gè)數(shù)碼管加小數(shù)點(diǎn)
  154.         else
  155.         P0=smg_du[tab[i]];
  156.         P2|=Y7C;
  157.         P2&=0x1f;
  158.         if(flag1)                                                                                                                   //開(kāi)L1
  159.         {
  160.                 P2&=0x1f;
  161.                 P0=0xfe;
  162.                 P2=Y4C;
  163.                 P2&=0x1f;
  164.         }
  165.         else                                                                                                                           //關(guān)L1
  166.         {
  167.                 P2&=0x1f;
  168.                 P0=0xff;
  169.                 P2=Y4C;
  170.                 P2&=0x1f;
  171.         }                                                                                                                                   
  172.         if(i==7)                                                                                                                   //掃描完8個(gè)數(shù)碼管就清零從新掃描
  173.         {
  174.         i=0;
  175.         }
  176.         else
  177.         i++;


  178. }
復(fù)制代碼

所有資料51hei提供下載:
自動(dòng)售水機(jī).zip (517.53 KB, 下載次數(shù): 4)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表