找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6736|回复: 0
打印 上一主题 下一主题
收起左侧

蓝桥杯程序 自动售水机单片机程序(15转接板)

[复制链接]
跳转到指定楼层
楼主
ID:202782 发表于 2017-5-20 10:24 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
第五届蓝桥杯自动售水机程序

单片机源程序如下:
  1. #include<STC15F2K60S2.H>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit scl=P2^0;
  6. sbit sda=P2^1;       

  7. uchar code tab[]={
  8. 0XC0,0XF9,0XA4,0XB0,
  9. 0X99,0X92,0X82,0XF8,
  10. 0X80,0X90,0XFF};
  11. uchar code dot[]={
  12. 0x40,0x79,0x24,0x30,
  13. 0x19,0x12,0x02,0x78,
  14. 0x00,0x10};
  15. uchar yi,er,san,si,wu ,liu,qi,ba;
  16. uchar tt=0;
  17. uint XL;
  18. unsigned long int money=0;

  19. void delayms(int ms);                  //延时函数
  20. void allinit();                                  //初始化函数(关闭蜂鸣器,继电器,数码管)
  21. void keyscan();                                  //独立按键扫描程序
  22. void rel(uchar dong);                  //
  23. void display1(uchar yi,uchar er);
  24. void display2(uchar san,uchar si);
  25. void display3(uchar wu,uchar liu);
  26. void display4(uchar qi,uchar ba);
  27. uchar iicread(uchar add);
  28. void adrun();

  29. void Timer0Init(void)                //5毫秒@11.0592MHz
  30. {
  31.         AUXR |= 0x80;                //定时器时钟1T模式
  32.         TMOD &= 0xF0;                //设置定时器模式
  33.         TL0 = 0x00;                //设置定时初值
  34.         TH0 = 0x28;                //设置定时初值
  35.         TF0 = 0;                //清除TF0标志
  36.         TR0 = 1;                //定时器0开始计时
  37. }


  38. void main()
  39. {
  40.         allinit();
  41.         Timer0Init();
  42.         yi=10,er=0,san=5,si=0;
  43.         while(1)
  44.         {
  45.                 adrun();
  46.                 keyscan();
  47.                 display1(yi,er);
  48.                 display2(san,si);
  49.                 display3(wu,liu);
  50.                 display4(qi,ba);
  51.         }
  52. }

  53. void time0() interrupt 1
  54. {
  55.         tt++;
  56.         if(tt==20)
  57.         {
  58.                 tt=0;
  59.                 XL+=10;
  60.                 wu=XL/10000%10;
  61.                 liu=XL/1000%10;
  62.                 qi=XL/100%10;
  63.                 ba=XL/10%10;
  64.                 if(XL==9999)
  65.                 {
  66.                         rel(0);
  67.                         money=XL*5;
  68.                         wu=money/100000;
  69.                         liu=money%100000/10000;
  70.                         qi=money%10000/1000;
  71.                         ba=money%1000/100;
  72.                         XL=0;
  73.                         EA=0;ET0=0;       
  74.                 }
  75.         }
  76. }

  77. void keyscan()
  78. {
  79.         if(P30==0)
  80.         {
  81.                 delayms(5);
  82.                 if(P30==0)
  83.                 {
  84.                         rel(2);
  85.                         wu=liu=qi=ba=0;
  86.                         EA=1;ET0=1;
  87.                 }
  88.                 while(!P30);
  89.         }
  90.         else if(P31==0)
  91.         {
  92.                 delayms(5);
  93.                 if(P31==0)
  94.                 {                       
  95.                         rel(0);
  96.                         money=XL*5;
  97.                         wu=money/100000;
  98.                         liu=money%100000/10000;
  99.                         qi=money%10000/1000;
  100.                         ba=money%1000/100;
  101.                         XL=0;
  102.                         EA=0;ET0=0;       
  103.                 }
  104.                 while(!P31);
  105.         }
  106. }

  107. void rel(uchar dong)                                       
  108. {
  109.         if(dong==0)
  110.         {
  111.                 P2=0XA0;P0=0X00;                                   //此处为关闭蜂鸣器和继电器
  112.         }
  113.         else if(dong==1)
  114.         {
  115.                 P2=0XA0;P0=0X40;                                //此处为关闭继电器,打开蜂鸣器
  116.         }
  117.         else if(dong==2)
  118.         {
  119.                 P2=0XA0;P0=0X10;                                //此处为打开继电器,关闭蜂鸣器
  120.         }
  121.         else if(dong==3)
  122.         {
  123.                 P2=0XA0;P0=0Xff;                                //此处为打开蜂鸣器和继电器
  124.         }
  125. }

  126. void iicdelay(uchar m)
  127. {
  128.         do
  129.         {
  130.                 _nop_();
  131.         }
  132.         while(m--);
  133. }

  134. void iicstrat()
  135. {
  136.         sda=1;
  137.         _nop_();
  138.         scl=1;
  139.         _nop_();
  140.         sda=0;
  141.         _nop_();
  142.         scl=0;
  143.         _nop_();
  144. }

  145. void iicstop()
  146. {
  147.         sda=0;
  148.         _nop_();
  149.         scl=1;
  150.         _nop_();
  151.         sda=1;
  152.         _nop_();
  153. }


  154. void writebyte(uchar dat)
  155. {
  156.         uchar i;
  157.         for(i=0;i<8;i++)
  158.         {
  159.                 scl=0;
  160.                 sda=dat&0x80;
  161.                 scl=1;
  162.                 dat<<=1;
  163.         }
  164.         scl=0;
  165. }

  166. uchar iicreadbyte()
  167. {
  168.         uchar dat;
  169.         uchar i;
  170.         for(i=0;i<8;i++)
  171.         {
  172.                 scl=1;
  173.                 iicdelay(5);
  174.                 dat<<=1;
  175.                 if(sda)
  176.                 {
  177.                         dat|=0x01;
  178.                 }
  179.                 scl=0;
  180.         }
  181.        
  182.         return dat;
  183. }

  184. uchar ack()
  185. {
  186.         scl=1;
  187.         iicdelay(5);
  188.         if(sda==1)
  189.         {
  190.                 scl=0;
  191.                 iicstop();
  192.                 return 0;
  193.         }
  194.         else
  195.         {
  196.                 scl=0;
  197.                 return 1;
  198.         }
  199. }

  200. uchar iicread(uchar add)
  201. {
  202.         uchar temp;
  203.        
  204.         iicstrat();
  205.         writebyte(0x90);
  206.         ack();
  207.         writebyte(add);
  208.         ack();
  209.         iicstop();
  210.        
  211.         iicstrat();
  212.         writebyte(0x91);
  213.         ack();
  214.         temp=iicreadbyte();
  215.         iicstop();
  216.        
  217.         temp=0.39*temp;
  218.        
  219.         return temp;
  220. }

  221. void adrun()
  222. {
  223.         uchar num;
  224.         num=iicread(0x01);
  225.         if(num<25)
  226.         {
  227.                 P2=0x80;
  228.                 P0=0xfe;
  229.         }
  230.         else
  231.         {
  232.                 P2=0x80;
  233.                 P0=0xff;
  234.         }
  235. }

  236. void delayms(int ms)
  237. {
  238.         int i,j;
  239.         for(i=ms;i>0;i--)
  240.                 for(j=845;j>0;j--);
  241. }

  242. void allinit()
  243. {
  244.         P2=0XA0;
  245.         P0=0X00;//关闭蜂鸣器,继电器
  246.        
  247.         P2=0X80;
  248.         P0=0XFF;//关闭LED灯
  249.        
  250.         P2=0XC0;
  251.         P0=0XFF;//选择所有数码管
  252.         P2=0XFF;
  253.         P0=0XFF;//关闭所有数码管
  254. }

  255. void display1(uchar yi,uchar er)
  256. {
  257.                 P2=0XC0;//打开位选573   U8
  258.                 P0=0X01;//选择第一个数码管
  259.                 P2=0XFF;//打开段选573   U7
  260.                 P0=tab[yi];
  261.                 delayms(1);
  262.                
  263.                 P2=0XC0;//打开位选573   U8
  264.                 P0=0X02;//选择第二个数码管
  265.                 P2=0XFF;//打开段选573   U7
  266.                 P0=dot[er];
  267.                 delayms(1);
  268. }       

  269. void display2(uchar san,uchar si)
  270. {
  271.                 P2=0XC0;//打开位选573   U8
  272.                 P0=0X04;//选择第三个数码管
  273.                 P2=0XFF;//打开段选573   U7
  274.                 P0=tab[san];
  275.                 delayms(1);
  276.                
  277.                 P2=0XC0;//打开位选573   U8
  278.                 P0=0X08;//选择第四个数码管
  279. ……………………

  280. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
自动售水机.doc (44 KB, 下载次数: 28)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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