找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 691|回复: 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 单片机教程网

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