(分享设计)有意参加蓝桥杯的童鞋可借鉴参考。
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台(12MHz)
所有资料51hei提供下载:
自动售水机.rar
(36.09 KB, 下载次数: 22)
单片机源程序如下:
- #include "iic.h"
- #define temp P3
- #define uchar unsigned char
- #define uint unsigned int
- sbit d6=P4^2;
- sbit d7=P4^4;
- uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
- uchar code led[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- uchar dispuff[8]={0xc0,0x12,0xc0,0xc0,0xc0,0x40,0xc0,0xc0};
- uchar v0,v1,v2,v3,p0,p1,p2,p3,m0,m1,m2,m3;
- uint p,v;
- uchar buzz,rel,count,light_value;
- uchar start_flag;
- void choose(uchar t)
- {
- switch(t)
- {
- case 4:P2=((P2&=0x1f)|0x80);break;
- case 5:P2=((P2&=0x1f)|0xa0);break;
- case 6:P2=((P2&=0x1f)|0xc0);break;
- case 7:P2=((P2&=0x1f)|0xe0);break;
- case 0:P2&=0x1f;break;
- }
- // _nop_();
- // _nop_();
- // P2=0x00;
- }
- void delay(uint ms)
- {
- uchar i,j;
- while(ms--)
- {
- _nop_();
- _nop_();
- _nop_();
- i=11;
- j=190;
- do
- {
- while(--j);
- } while(--i);
- }
- }
- void display(uchar loc,uchar duan)
- {
- P0=led[loc];choose(6);choose(0);
- P0=duan; choose(7);choose(0);
- }
- void buzzer(uchar t)
- {
- if(t==0)
- {
- P0&=0xbf;choose(5);choose(0);
- }
- if(t==1)
- {
- P0|=0x40;choose(5);choose(0);
- }
- }
- void relay(uchar t)
- {
- if(t==0)
- {
- P0&=0xef;choose(5);choose(0);
- }
- if(t==1)
- {
- P0|=0x10;choose(5);choose(0);
- }
- }
- uchar key_scan(void)
- {
- uchar key_value=16;
- temp=0x0f;d6=0;d7=0;
- if(temp!=0x0f)
- {
- delay(20);
- if(temp!=0x0f)
- {
- switch(temp)
- {
- case 0x0e:key_value=0;break;
- case 0x0d:key_value=4;break;
- case 0x0b:key_value=8;break;
- case 0x07:key_value=12;break;
- }
- temp=0xf0;d6=1;d7=1;
- if(d7==0)key_value+=0;while(d7==0);
- if(d6==0)key_value+=1;while(d6==0);
- if(temp==0xd0)key_value+=2;while(temp==0xd0);
- if(temp==0xe0)key_value+=3;while(temp==0xe0);
- }
- }
- return key_value;
- }
- void show(uchar t)
- {
- if(t==0)
- {
- dispuff[1]=tab[0]+0x80;
- dispuff[2]=tab[5];
- dispuff[3]=tab[0];
- dispuff[4]=tab[v3];
- dispuff[5]=tab[v2]+0x80;
- dispuff[6]=tab[v1];
- dispuff[7]=tab[v0];
- }
- if(t==1)
- {
- dispuff[1]=tab[0]+0x80;
- dispuff[2]=tab[5];
- dispuff[3]=tab[0];
- dispuff[4]=tab[p3];
- dispuff[5]=tab[p2]+0x80;
- dispuff[6]=tab[p1];
- dispuff[7]=tab[p0];
- }
- }
- uchar ad_get(uchar addr)
- {
- uchar dat;
- IIC_Start();
- IIC_SendByte(0x90);IIC_WaitAck();
- IIC_SendByte(addr);IIC_WaitAck();
- IIC_Start();
- IIC_SendByte(0x91);IIC_WaitAck();
- dat=IIC_RecByte();IIC_Ack(0);
- IIC_Stop();
- return dat;
- }
- void Timer1Init(void) //2毫秒@11.0592MHz
- {
- AUXR |= 0x40; //定时器时钟1T模式
- TMOD &= 0x0F; //设置定时器模式
- TL1 = 0x9A; //设置定时初值
- TH1 = 0xA9; //设置定时初值
- EA=1;
- ET1=1;
- TF1 = 0; //清除TF1标志
- TR1 = 1; //定时器1开始计时
- }
- void Timer0Init(void) //2毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL1 = 0x9A; //设置定时初值
- TH1 = 0xA9; //设置定时初值
- EA=1;
- ET0=1;
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- }
- void main()
- {
- uchar value;//s;
- Timer1Init();
- Timer0Init();
- while(1)
- {
- value=key_scan();
- // s=ad_get(0x43);
- // dispuff[0]=tab[s%1000/100];
- // dispuff[1]=tab[s%100/10];
- // dispuff[2]=tab[s%10];
- if(value==0)
- {
- rel=1;start_flag=1;
- }
- if(start_flag==1)show(0);
- if(value==4)
- {rel=0;start_flag=2;
- }
- if(start_flag==2)
- {show(1);
- v0=0;v1=0;v2=0;v3=0;}
- }
- }
- void timer1(void) interrupt 3
- {
- static uchar m=0;
- buzzer(buzz);
- relay(rel);
- display(m,dispuff[m]);
- m++;
- if(m==8)m=0;
- }
- void timer0(void) interrupt 1
- {
- count++;
- light_value=ad_get(0x41);
- if(light_value<64)
- {P0|=0xff;choose(4);P0&=0xfe;choose(0);}
- if(light_value>64)
- {P0=0xff;choose(4);choose(0);}
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
|