找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自动售水机代码

[复制链接]
跳转到指定楼层
楼主
ID:785561 发表于 2020-10-8 19:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
main.c
  1. #include <STC15F2K60S2.h>
  2. #include "intrins.h"
  3. #include "iic.h"

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. #define Y4 P2=(P2&0x1f)|0x80;
  7. #define Y5 P2=(P2&0x1f)|0xa0;
  8. #define Y6 P2=(P2&0x1f)|0xc0;
  9. #define Y7 P2=(P2&0x1f)|0xe0;

  10. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
  11. uchar yi,er,san,si,wu,liu,qi,ba;
  12. uchar num;unsigned long int ml; uchar s;unsigned long int die;uchar g;


  13. void allinit(void);
  14. void Timer0Init(void);
  15. void display1(uchar yi,uchar er);
  16. void display2(uchar san,uchar si);
  17. void display3(uchar wu,uchar liu);
  18. void display4(uchar qi,uchar ba);
  19. void keyscan();
  20. void keyscan16();

  21. void delayms(int ms)        //延时函数
  22. {
  23.   int i,j;
  24.   for(i=ms;i>0;i--)
  25.     for(j=845;j>0;j--);
  26. }
  27. void main()
  28. {
  29.   allinit();
  30.   Timer0Init();
  31.   while(1)
  32.   {
  33.      keyscan();          //独立按键
  34. //         keyscan16();          //矩阵按键
  35.      display1(10,0);
  36.          display2(5,0);         
  37.          display3(wu,liu);
  38.          display4(qi,ba);
  39.            if(ml == 99990)
  40.            {
  41.            Y5;P0=0x00;
  42.            ET0=0;EA=0;
  43.            die=ml*5;
  44.            wu=die/100000;
  45.            liu=die%100000/10000;
  46.            qi=die%10000/1000;
  47.            ba=die%1000/100;
  48.            }
  49.          g=pcf8591(1);
  50.          if(g<64)
  51.          {Y4;P0=0xfe;}
  52.          if(g>=64)
  53.          {Y4;P0=0xff;}
  54.   }
  55. }
  56. void allinit(void)
  57. {
  58.   Y5;P0=0x00; //关闭蜂鸣器和继电器
  59.   Y6;P0=0xff; //打开数码管位选
  60.   Y7;P0=0xff; //关闭数码管段选
  61.   Y4;P0=0xff; //关闭led灯
  62. }
  63. void display1(uchar yi,uchar er) //数码管显示
  64. {
  65.    Y6;P0=0x01;Y7;P0=tab[yi];delayms(1);
  66.    Y6;P0=0x02;Y7;P0=tab[er]&0x7f;delayms(1);
  67. }
  68. void display2(uchar san,uchar si)
  69. {
  70.    Y6;P0=0x04;Y7;P0=tab[san];delayms(1);
  71.    Y6;P0=0x08;Y7;P0=tab[si];delayms(1);
  72. }
  73. void display3(uchar wu,uchar liu)
  74. {
  75.    Y6;P0=0x10;Y7;P0=tab[wu];delayms(1);
  76.    Y6;P0=0x20;Y7;P0=tab[liu]&0x7f;delayms(1);
  77. }
  78. void display4(uchar qi,uchar ba)
  79. {
  80.    Y6;P0=0x40;Y7;P0=tab[qi];delayms(1);
  81.    Y6;P0=0x80;Y7;P0=tab[ba];delayms(1);
  82. }
  83. void keyscan(void) //独立按键处理
  84. {
  85.   if(P30==0)
  86.   {
  87.     delayms(5);
  88.         if(P30==0)
  89.         {
  90.          wu=0;liu=0;qi=0;ba=0;
  91.          ET0=1;EA=1;
  92.          Y5;P0=0x10;
  93.         }while(!P30);
  94.   }
  95.   else if(P31==0)
  96.   {
  97.     delayms(5);
  98.         if(P31==0)
  99.         {
  100.            die=ml*5;
  101.            wu=die/100000;
  102.            liu=die%100000/10000;
  103.            qi=die%10000/1000;
  104.            ba=die%1000/100;
  105.            ET0=0;EA=0;
  106.            Y5;P0=0x00;
  107.            ml=0;
  108.         }while(!P31);
  109.   }
  110.   else if(P32==0)
  111.   {
  112.     delayms(5);
  113.         if(P32==0)
  114.         {
  115.            san=5;
  116.         }while(!P32);
  117.   }
  118.   else if(P33==0)
  119.   {
  120.     delayms(5);
  121.         if(P33==0)
  122.         {
  123.            si=6;
  124.         }while(!P33);
  125.   }
  126. }
  127. void keyscan16() //矩阵按键
  128. {
  129.     uchar temp;
  130.        
  131.         P44=0;P42=1;P3=0X7F;
  132.         temp=P3;
  133.         temp=temp&0X0F;
  134.         if(temp!=0x0f)
  135.         {
  136.                 delayms(5);
  137.                 temp=P3;
  138.                 temp=temp&0X0F;
  139.                 if(temp!=0x0f)
  140.                 {
  141.                         temp=P3;
  142.                         switch(temp)
  143.                         {
  144.                                 case 0x7e: num=0;break;
  145.                                 case 0x7d: num=4;break;
  146.                                 case 0x7b: num=8;break;
  147.                                 case 0x77: num=12;break;       
  148.                         }
  149.                         while(temp!=0x0f)
  150.                         {
  151.                                 temp=P3;
  152.                                 temp=temp&0X0F;
  153.                         }
  154.                 }
  155.         }

  156.         P44=1;P42=0;P3=0XBF;
  157.         temp=P3;
  158.         temp=temp&0X0F;
  159.         if(temp!=0x0f)
  160.         {
  161.                 delayms(5);
  162.                 temp=P3;
  163.                 temp=temp&0X0F;
  164.                 if(temp!=0x0f)
  165.                 {
  166.                         temp=P3;
  167.                         switch(temp)
  168.                         {
  169.                                 case 0xBe: num=1;break;
  170.                                 case 0xBd: num=5;break;
  171.                                 case 0xBb: num=9;break;
  172.                                 case 0xB7: num=13;break;       
  173.                         }
  174.                         while(temp!=0x0f)
  175.                         {
  176.                                 temp=P3;
  177.                                 temp=temp&0X0F;
  178.                         }
  179.                 }
  180.         }
  181.        
  182.         P3=0XDF;P44=1;P42=1;
  183.         temp=P3;
  184.         temp=temp&0X0F;
  185.         if(temp!=0x0f)
  186.         {
  187.                 delayms(5);
  188.                 temp=P3;
  189.                 temp=temp&0X0F;
  190.                 if(temp!=0x0f)
  191.                 {
  192.                         temp=P3;
  193.                         switch(temp)
  194.                         {
  195.                                 case 0xDe: num=2;break;
  196.                                 case 0xDd: num=6;break;
  197.                                 case 0xDb: num=10;break;
  198.                                 case 0xD7: num=14;break;       
  199.                         }
  200.                         while(temp!=0x0f)
  201.                         {
  202.                                 temp=P3;
  203.                                 temp=temp&0X0F;
  204.                         }
  205.                 }
  206.         }
  207.        
  208.         P3=0XEF;P44=1;P42=1;
  209.         temp=P3;
  210.         temp=temp&0X0F;
  211.         if(temp!=0x0f)
  212.         {
  213.                 delayms(5);
  214.                 temp=P3;
  215.                 temp=temp&0X0F;
  216.                 if(temp!=0x0f)
  217.                 {
  218.                         temp=P3;
  219.                         switch(temp)
  220.                         {
  221.                                 case 0xEe: num=3;break;
  222.                                 case 0xEd: num=7;break;
  223.                                 case 0xEb: num=11;break;
  224.                                 case 0xE7: num=15;break;       
  225.                         }
  226.                         while(temp!=0x0f)
  227.                         {
  228.                                 temp=P3;
  229.                                 temp=temp&0X0F;
  230.                         }
  231.                 }
  232.         }
  233. }  
  234. void Timer0Init()                //1毫秒@11.0592MHz
  235. {
  236.         AUXR |= 0x80;                //定时器时钟1T模式
  237.         TMOD &= 0xF0;                //设置定时器模式
  238.         TL0 = 0xCD;                //设置定时初值
  239.         TH0 = 0xD4;                //设置定时初值
  240.         TF0 = 0;                //清除TF0标志
  241.         TR0 = 1;                //定时器0开始计时
  242. }
  243. void timer0 () interrupt 1
  244. {
  245.   s++;
  246.   if(s == 10)
  247.   {
  248.     s=0;
  249.         ml++;
  250.         wu=ml/10000;liu=ml%10000/1000;
  251.         qi=ml%1000/100;ba=ml%100/10;
  252.   }
  253. }
复制代码

iic.c
  1. /*
  2.   程序说明: IIC总线驱动程序
  3.   软件环境: Keil uVision 4.10
  4.   硬件环境: CT107单片机综合实训平台 8051,12MHz
  5.   日    期: 2011-8-9
  6. */

  7. #include "reg52.h"
  8. #include "intrins.h"
  9. #include "iic.h"

  10. #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}   


  11. #define SlaveAddrW 0xA0
  12. #define SlaveAddrR 0xA1

  13. //总线引脚定义
  14. sbit SDA = P2^1;  /* 数据线 */
  15. sbit SCL = P2^0;  /* 时钟线 */


  16. //总线启动条件
  17. void IIC_Start(void)
  18. {
  19.         SDA = 1;
  20.         SCL = 1;
  21.         somenop;
  22.         SDA = 0;
  23.         somenop;
  24.         SCL = 0;       
  25. }

  26. //总线停止条件
  27. void IIC_Stop(void)
  28. {
  29.         SDA = 0;
  30.         SCL = 1;
  31.         somenop;
  32.         SDA = 1;
  33. }

  34. //应答位控制
  35. void IIC_Ack(bit ackbit)
  36. {
  37.         if(ackbit)
  38.         {       
  39.                 SDA = 0;
  40.         }
  41.         else
  42.         {
  43.                 SDA = 1;
  44.         }
  45.         somenop;
  46.         SCL = 1;
  47.         somenop;
  48.         SCL = 0;
  49.         SDA = 1;
  50.         somenop;
  51. }

  52. //等待应答
  53. bit IIC_WaitAck(void)
  54. {
  55.         SDA = 1;
  56.         somenop;
  57.         SCL = 1;
  58.         somenop;
  59.         if(SDA)   
  60.         {   
  61.                 SCL = 0;
  62.                 IIC_Stop();
  63.                 return 0;
  64.         }
  65.         else  
  66.         {
  67.                 SCL = 0;
  68.                 return 1;
  69.         }
  70. }

  71. //通过I2C总线发送数据
  72. void IIC_SendByte(unsigned char byt)
  73. {
  74.         unsigned char i;
  75.         for(i=0;i<8;i++)
  76.         {   
  77.                 if(byt&0x80)
  78.                 {       
  79.                         SDA = 1;
  80.                 }
  81.                 else
  82.                 {
  83.                         SDA = 0;
  84.                 }
  85.                 somenop;
  86.                 SCL = 1;
  87.                 byt <<= 1;
  88.                 somenop;
  89.                 SCL = 0;
  90.         }
  91. }

  92. //从I2C总线上接收数据
  93. unsigned char IIC_RecByte(void)
  94. {
  95.         unsigned char da;
  96.         unsigned char i;
  97.        
  98.         for(i=0;i<8;i++)
  99.         {   
  100.                 SCL = 1;
  101.                 somenop;
  102.                 da <<= 1;
  103.                 if(SDA)
  104.                 da |= 0x01;
  105.                 SCL = 0;
  106.                 somenop;
  107.         }
  108.         return da;
  109. }
  110. uchar pcf8591(uchar add)
  111. {
  112.   uchar dat;
  113.   IIC_Start();
  114.   IIC_SendByte(0x90);
  115.   IIC_WaitAck();
  116.   IIC_SendByte(add);
  117.   IIC_WaitAck();
  118.   IIC_Stop();

  119.   IIC_Start();
  120.   IIC_SendByte(0x91);
  121.   IIC_WaitAck();
  122.   dat=IIC_RecByte();

  123.   IIC_Stop();

  124.   return dat;
  125. }
复制代码

iic.h
  1. #ifndef _IIC_H
  2. #define _IIC_H

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. //函数声明
  6. void IIC_Start(void);
  7. void IIC_Stop(void);  
  8. void IIC_Ack(bit ackbit);
  9. void IIC_SendByte(unsigned char byt);
  10. bit IIC_WaitAck(void);  
  11. unsigned char IIC_RecByte(void);
  12. uchar pcf8591(uchar add);

  13. #endif
复制代码



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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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