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

QQ登錄

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

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

藍(lán)橋杯程序 自動(dòng)售水機(jī)單片機(jī)程序(15轉(zhuǎn)接板)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:202782 發(fā)表于 2017-5-20 10:24 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
第五屆藍(lán)橋杯自動(dòng)售水機(jī)程序

單片機(jī)源程序如下:
  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);                  //延時(shí)函數(shù)
  20. void allinit();                                  //初始化函數(shù)(關(guān)閉蜂鳴器,繼電器,數(shù)碼管)
  21. void keyscan();                                  //獨(dú)立按鍵掃描程序
  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;                //定時(shí)器時(shí)鐘1T模式
  32.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  33.         TL0 = 0x00;                //設(shè)置定時(shí)初值
  34.         TH0 = 0x28;                //設(shè)置定時(shí)初值
  35.         TF0 = 0;                //清除TF0標(biāo)志
  36.         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  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;                                   //此處為關(guān)閉蜂鳴器和繼電器
  112.         }
  113.         else if(dong==1)
  114.         {
  115.                 P2=0XA0;P0=0X40;                                //此處為關(guān)閉繼電器,打開(kāi)蜂鳴器
  116.         }
  117.         else if(dong==2)
  118.         {
  119.                 P2=0XA0;P0=0X10;                                //此處為打開(kāi)繼電器,關(guān)閉蜂鳴器
  120.         }
  121.         else if(dong==3)
  122.         {
  123.                 P2=0XA0;P0=0Xff;                                //此處為打開(kāi)蜂鳴器和繼電器
  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;//關(guān)閉蜂鳴器,繼電器
  246.        
  247.         P2=0X80;
  248.         P0=0XFF;//關(guān)閉LED燈
  249.        
  250.         P2=0XC0;
  251.         P0=0XFF;//選擇所有數(shù)碼管
  252.         P2=0XFF;
  253.         P0=0XFF;//關(guān)閉所有數(shù)碼管
  254. }

  255. void display1(uchar yi,uchar er)
  256. {
  257.                 P2=0XC0;//打開(kāi)位選573   U8
  258.                 P0=0X01;//選擇第一個(gè)數(shù)碼管
  259.                 P2=0XFF;//打開(kāi)段選573   U7
  260.                 P0=tab[yi];
  261.                 delayms(1);
  262.                
  263.                 P2=0XC0;//打開(kāi)位選573   U8
  264.                 P0=0X02;//選擇第二個(gè)數(shù)碼管
  265.                 P2=0XFF;//打開(kāi)段選573   U7
  266.                 P0=dot[er];
  267.                 delayms(1);
  268. }       

  269. void display2(uchar san,uchar si)
  270. {
  271.                 P2=0XC0;//打開(kāi)位選573   U8
  272.                 P0=0X04;//選擇第三個(gè)數(shù)碼管
  273.                 P2=0XFF;//打開(kāi)段選573   U7
  274.                 P0=tab[san];
  275.                 delayms(1);
  276.                
  277.                 P2=0XC0;//打開(kāi)位選573   U8
  278.                 P0=0X08;//選擇第四個(gè)數(shù)碼管
  279. ……………………

  280. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

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


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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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