第五届蓝桥杯自动售水机程序
单片机源程序如下:
- #include<STC15F2K60S2.H>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit scl=P2^0;
- sbit sda=P2^1;
- uchar code tab[]={
- 0XC0,0XF9,0XA4,0XB0,
- 0X99,0X92,0X82,0XF8,
- 0X80,0X90,0XFF};
- uchar code dot[]={
- 0x40,0x79,0x24,0x30,
- 0x19,0x12,0x02,0x78,
- 0x00,0x10};
- uchar yi,er,san,si,wu ,liu,qi,ba;
- uchar tt=0;
- uint XL;
- unsigned long int money=0;
- void delayms(int ms); //延时函数
- void allinit(); //初始化函数(关闭蜂鸣器,继电器,数码管)
- void keyscan(); //独立按键扫描程序
- void rel(uchar dong); //
- void display1(uchar yi,uchar er);
- void display2(uchar san,uchar si);
- void display3(uchar wu,uchar liu);
- void display4(uchar qi,uchar ba);
- uchar iicread(uchar add);
- void adrun();
- void Timer0Init(void) //5毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0x00; //设置定时初值
- TH0 = 0x28; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- }
- void main()
- {
- allinit();
- Timer0Init();
- yi=10,er=0,san=5,si=0;
- while(1)
- {
- adrun();
- keyscan();
- display1(yi,er);
- display2(san,si);
- display3(wu,liu);
- display4(qi,ba);
- }
- }
- void time0() interrupt 1
- {
- tt++;
- if(tt==20)
- {
- tt=0;
- XL+=10;
- wu=XL/10000%10;
- liu=XL/1000%10;
- qi=XL/100%10;
- ba=XL/10%10;
- if(XL==9999)
- {
- rel(0);
- money=XL*5;
- wu=money/100000;
- liu=money%100000/10000;
- qi=money%10000/1000;
- ba=money%1000/100;
- XL=0;
- EA=0;ET0=0;
- }
- }
- }
- void keyscan()
- {
- if(P30==0)
- {
- delayms(5);
- if(P30==0)
- {
- rel(2);
- wu=liu=qi=ba=0;
- EA=1;ET0=1;
- }
- while(!P30);
- }
- else if(P31==0)
- {
- delayms(5);
- if(P31==0)
- {
- rel(0);
- money=XL*5;
- wu=money/100000;
- liu=money%100000/10000;
- qi=money%10000/1000;
- ba=money%1000/100;
- XL=0;
- EA=0;ET0=0;
- }
- while(!P31);
- }
- }
- void rel(uchar dong)
- {
- if(dong==0)
- {
- P2=0XA0;P0=0X00; //此处为关闭蜂鸣器和继电器
- }
- else if(dong==1)
- {
- P2=0XA0;P0=0X40; //此处为关闭继电器,打开蜂鸣器
- }
- else if(dong==2)
- {
- P2=0XA0;P0=0X10; //此处为打开继电器,关闭蜂鸣器
- }
- else if(dong==3)
- {
- P2=0XA0;P0=0Xff; //此处为打开蜂鸣器和继电器
- }
- }
- void iicdelay(uchar m)
- {
- do
- {
- _nop_();
- }
- while(m--);
- }
- void iicstrat()
- {
- sda=1;
- _nop_();
- scl=1;
- _nop_();
- sda=0;
- _nop_();
- scl=0;
- _nop_();
- }
- void iicstop()
- {
- sda=0;
- _nop_();
- scl=1;
- _nop_();
- sda=1;
- _nop_();
- }
- void writebyte(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- scl=0;
- sda=dat&0x80;
- scl=1;
- dat<<=1;
- }
- scl=0;
- }
- uchar iicreadbyte()
- {
- uchar dat;
- uchar i;
- for(i=0;i<8;i++)
- {
- scl=1;
- iicdelay(5);
- dat<<=1;
- if(sda)
- {
- dat|=0x01;
- }
- scl=0;
- }
-
- return dat;
- }
- uchar ack()
- {
- scl=1;
- iicdelay(5);
- if(sda==1)
- {
- scl=0;
- iicstop();
- return 0;
- }
- else
- {
- scl=0;
- return 1;
- }
- }
- uchar iicread(uchar add)
- {
- uchar temp;
-
- iicstrat();
- writebyte(0x90);
- ack();
- writebyte(add);
- ack();
- iicstop();
-
- iicstrat();
- writebyte(0x91);
- ack();
- temp=iicreadbyte();
- iicstop();
-
- temp=0.39*temp;
-
- return temp;
- }
- void adrun()
- {
- uchar num;
- num=iicread(0x01);
- if(num<25)
- {
- P2=0x80;
- P0=0xfe;
- }
- else
- {
- P2=0x80;
- P0=0xff;
- }
- }
- void delayms(int ms)
- {
- int i,j;
- for(i=ms;i>0;i--)
- for(j=845;j>0;j--);
- }
- void allinit()
- {
- P2=0XA0;
- P0=0X00;//关闭蜂鸣器,继电器
-
- P2=0X80;
- P0=0XFF;//关闭LED灯
-
- P2=0XC0;
- P0=0XFF;//选择所有数码管
- P2=0XFF;
- P0=0XFF;//关闭所有数码管
- }
- void display1(uchar yi,uchar er)
- {
- P2=0XC0;//打开位选573 U8
- P0=0X01;//选择第一个数码管
- P2=0XFF;//打开段选573 U7
- P0=tab[yi];
- delayms(1);
-
- P2=0XC0;//打开位选573 U8
- P0=0X02;//选择第二个数码管
- P2=0XFF;//打开段选573 U7
- P0=dot[er];
- delayms(1);
- }
- void display2(uchar san,uchar si)
- {
- P2=0XC0;//打开位选573 U8
- P0=0X04;//选择第三个数码管
- P2=0XFF;//打开段选573 U7
- P0=tab[san];
- delayms(1);
-
- P2=0XC0;//打开位选573 U8
- P0=0X08;//选择第四个数码管
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
自动售水机.doc
(44 KB, 下载次数: 28)
|