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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 816|回復: 0
打印 上一主題 下一主題
收起左側

作為一個初學者,如何學好單片機,課堂上的內容過于粗淺 求幫助

[復制鏈接]
跳轉到指定樓層
樓主
ID:541926 發表于 2019-5-19 10:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
作為一個初學者,如何學好單片機,課堂上的內容過于粗淺

單片機源程序如下:
  1. /*---------------------------------------------------------------
  2. 項目名稱:自動售水機系統
  3. ----------------------------------------------------------------*/
  4. #include"reg52.h"                  
  5. #include"pcf8591.h"
  6. #include"iic.h"                                  //iic協議
  7. #include"ct107.h"                          //CT107單片機初始化
  8. #include"deplay.h"                          //延時

  9. #define AddWr 0x90   //寫數據地址
  10. #define AddRd 0x91   //讀數據地址

  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};   //數碼管段選“0~9”
  14. unsigned char code smg_we[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                           //數碼管位選
  15. unsigned char tab[8]={0,0,5,0,0,0,0,0};                                                                                           //顯示數組
  16. unsigned int water,total;                                                                                                                   //定義水量,總價
  17. float price;                                                                                                                                              //定義單價                                                                  
  18. unsigned char light;                                                                                                                           //定義光照強度變量
  19. bit flag,flag1,flag2;                                                                                                                           //定義標志位

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

  22. main()
  23. {
  24.         price=0.5;                                            //設定單價為0.5元/L
  25.         TMOD=0x11;                                           //設置定時器0,1為16位定時器
  26.         TH0=(65536-50000)/256;                   //設定定時器0初值50ms,用于累計水量
  27.         TL0=(65536-50000)%256;
  28.         TH1=(65536-2000)/256;                   //設定定時器0初值2ms,用于掃描數碼管和L1
  29.         TL1=(65536-2000)%256;
  30.         TR1=1;                                                   //開定時器1
  31.         TR0=1;                                                   //開定時器0
  32.         ET1=1;                                                   //開定時器1中斷允許位
  33.         EA=1;                                                   //開總中斷
  34.         ct107_init();
  35.         while(1)                        //停止
  36.         {
  37.          if(!key6)                          //判斷按鍵是否按下
  38.          {
  39.          deplay_50us(200);        //消抖
  40.                  if(!key6)                //確認按鍵按下
  41.                  {
  42.                          ET0=0;
  43.                         P2&=0x1f;
  44.                         RELAY=0;        //關繼電器
  45.                         BUZZ=0;                //避免蜂鳴器的影響
  46.                         P2|=Y5C;
  47.                         P2&=0x1f;
  48.                         flag=1;                //停止標志位
  49.                         flag2=0;        //按下停止后把許可啟動標志位置0,方可進入下次啟動
  50.                  }
  51.          }
  52.          if(!flag2)                        //許可啟動標志位為0才可啟動
  53.          if(!key7)                        //啟動
  54.          {
  55.          deplay_50us(200);
  56.                  if(!key7)
  57.                  {
  58.                          ET0=1;
  59.                         water=0;        //水量清0
  60.                         total=0;        //總價清0
  61.                         P2&=0x1f;
  62.                         RELAY=1;        //開繼電器
  63.                         BUZZ=0;
  64.                         P2|=Y5C;
  65.                         P2&=0x1f;
  66.                         flag=0;                //復位停止標志位
  67.                         flag2=1;        //置位許可啟動標志位防止再次進入啟動程序
  68.                  }
  69.          }
  70.         diswork();                        //顯示數據處理
  71.         light=ReadADC(1);        //讀AD數據(光敏電阻)
  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)           //停止時顯示總價,啟動時顯示水量
  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的數據
  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         //定時器0中斷用于計算水量,其中斷優先級比定時器1中斷高,防止了中斷被打斷,使數據更準確
  115. {
  116.         static unsigned char k;                 
  117.         TH0=(65536-50000)/256;                 //每50ms進一次中斷
  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. {                                                                                                                                           //數碼管和L1掃描函數
  141.         unsigned char com[8]={0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff};           //用于控制數碼管的亮滅
  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;                                                                                           //為第二和第六個數碼管加小數點
  154.         else
  155.         P0=smg_du[tab[i]];
  156.         P2|=Y7C;
  157.         P2&=0x1f;
  158.         if(flag1)                                                                                                                   //開L1
  159.         {
  160.                 P2&=0x1f;
  161.                 P0=0xfe;
  162.                 P2=Y4C;
  163.                 P2&=0x1f;
  164.         }
  165.         else                                                                                                                           //關L1
  166.         {
  167.                 P2&=0x1f;
  168.                 P0=0xff;
  169.                 P2=Y4C;
  170.                 P2&=0x1f;
  171.         }                                                                                                                                   
  172.         if(i==7)                                                                                                                   //掃描完8個數碼管就清零從新掃描
  173.         {
  174.         i=0;
  175.         }
  176.         else
  177.         i++;


  178. }
復制代碼

所有資料51hei提供下載:
自動售水機.zip (517.53 KB, 下載次數: 4)

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩在线一区二区三区 | 欧洲免费毛片 | 精品久久久精品 | 色呦呦在线 | www..99re | 三级成人片 | 国产精品黄色 | 国产精品观看 | 国产精品精品久久久久久 | 成人免费视频在线观看 | 欧美亚洲国产日韩 | 久久日韩粉嫩一区二区三区 | 亚洲人成人一区二区在线观看 | 蜜桃视频在线观看免费视频网站www | 日韩欧美不卡 | 久久久久久久久久一区 | 欧美视频在线看 | av网站免费观看 | 99re免费 | 高清一区二区三区 | 亚洲精品久久久久久国产精华液 | 成人在线精品视频 | 成人免费视频观看视频 | 日韩精品亚洲专区在线观看 | 国产精品一区一区三区 | 色婷婷综合网 | 国产精品激情小视频 | 天天天操操操 | 特级黄一级播放 | 久久久久国产一区二区三区 | 另类 综合 日韩 欧美 亚洲 | 欧美a在线 | 一本久久a久久精品亚洲 | 精品一区二区三区在线视频 | 午夜精品久久久久久久久久久久久 | 国产熟熟 | 日韩精品av| 免费特级黄毛片 | 91社区视频| 成人在线免费观看av | 99热这里有精品 |