标题:
自动售水机代码
[打印本页]
作者:
17803856022
时间:
2020-10-8 19:22
标题:
自动售水机代码
main.c
#include <STC15F2K60S2.h>
#include "intrins.h"
#include "iic.h"
#define uchar unsigned char
#define uint unsigned int
#define Y4 P2=(P2&0x1f)|0x80;
#define Y5 P2=(P2&0x1f)|0xa0;
#define Y6 P2=(P2&0x1f)|0xc0;
#define Y7 P2=(P2&0x1f)|0xe0;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
uchar yi,er,san,si,wu,liu,qi,ba;
uchar num;unsigned long int ml; uchar s;unsigned long int die;uchar g;
void allinit(void);
void Timer0Init(void);
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);
void keyscan();
void keyscan16();
void delayms(int ms) //延时函数
{
int i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void main()
{
allinit();
Timer0Init();
while(1)
{
keyscan(); //独立按键
// keyscan16(); //矩阵按键
display1(10,0);
display2(5,0);
display3(wu,liu);
display4(qi,ba);
if(ml == 99990)
{
Y5;P0=0x00;
ET0=0;EA=0;
die=ml*5;
wu=die/100000;
liu=die%100000/10000;
qi=die%10000/1000;
ba=die%1000/100;
}
g=pcf8591(1);
if(g<64)
{Y4;P0=0xfe;}
if(g>=64)
{Y4;P0=0xff;}
}
}
void allinit(void)
{
Y5;P0=0x00; //关闭蜂鸣器和继电器
Y6;P0=0xff; //打开数码管位选
Y7;P0=0xff; //关闭数码管段选
Y4;P0=0xff; //关闭led灯
}
void display1(uchar yi,uchar er) //数码管显示
{
Y6;P0=0x01;Y7;P0=tab[yi];delayms(1);
Y6;P0=0x02;Y7;P0=tab[er]&0x7f;delayms(1);
}
void display2(uchar san,uchar si)
{
Y6;P0=0x04;Y7;P0=tab[san];delayms(1);
Y6;P0=0x08;Y7;P0=tab[si];delayms(1);
}
void display3(uchar wu,uchar liu)
{
Y6;P0=0x10;Y7;P0=tab[wu];delayms(1);
Y6;P0=0x20;Y7;P0=tab[liu]&0x7f;delayms(1);
}
void display4(uchar qi,uchar ba)
{
Y6;P0=0x40;Y7;P0=tab[qi];delayms(1);
Y6;P0=0x80;Y7;P0=tab[ba];delayms(1);
}
void keyscan(void) //独立按键处理
{
if(P30==0)
{
delayms(5);
if(P30==0)
{
wu=0;liu=0;qi=0;ba=0;
ET0=1;EA=1;
Y5;P0=0x10;
}while(!P30);
}
else if(P31==0)
{
delayms(5);
if(P31==0)
{
die=ml*5;
wu=die/100000;
liu=die%100000/10000;
qi=die%10000/1000;
ba=die%1000/100;
ET0=0;EA=0;
Y5;P0=0x00;
ml=0;
}while(!P31);
}
else if(P32==0)
{
delayms(5);
if(P32==0)
{
san=5;
}while(!P32);
}
else if(P33==0)
{
delayms(5);
if(P33==0)
{
si=6;
}while(!P33);
}
}
void keyscan16() //矩阵按键
{
uchar temp;
P44=0;P42=1;P3=0X7F;
temp=P3;
temp=temp&0X0F;
if(temp!=0x0f)
{
delayms(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0x7e: num=0;break;
case 0x7d: num=4;break;
case 0x7b: num=8;break;
case 0x77: num=12;break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0X0F;
}
}
}
P44=1;P42=0;P3=0XBF;
temp=P3;
temp=temp&0X0F;
if(temp!=0x0f)
{
delayms(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xBe: num=1;break;
case 0xBd: num=5;break;
case 0xBb: num=9;break;
case 0xB7: num=13;break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0X0F;
}
}
}
P3=0XDF;P44=1;P42=1;
temp=P3;
temp=temp&0X0F;
if(temp!=0x0f)
{
delayms(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xDe: num=2;break;
case 0xDd: num=6;break;
case 0xDb: num=10;break;
case 0xD7: num=14;break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0X0F;
}
}
}
P3=0XEF;P44=1;P42=1;
temp=P3;
temp=temp&0X0F;
if(temp!=0x0f)
{
delayms(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xEe: num=3;break;
case 0xEd: num=7;break;
case 0xEb: num=11;break;
case 0xE7: num=15;break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0X0F;
}
}
}
}
void Timer0Init() //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void timer0 () interrupt 1
{
s++;
if(s == 10)
{
s=0;
ml++;
wu=ml/10000;liu=ml%10000/1000;
qi=ml%1000/100;ba=ml%100/10;
}
}
复制代码
iic.c
/*
程序说明: IIC总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include "reg52.h"
#include "intrins.h"
#include "iic.h"
#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_();}
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
sbit SDA = P2^1; /* 数据线 */
sbit SCL = P2^0; /* 时钟线 */
//总线启动条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
somenop;
SDA = 0;
somenop;
SCL = 0;
}
//总线停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
somenop;
SDA = 1;
}
//应答位控制
void IIC_Ack(bit ackbit)
{
if(ackbit)
{
SDA = 0;
}
else
{
SDA = 1;
}
somenop;
SCL = 1;
somenop;
SCL = 0;
SDA = 1;
somenop;
}
//等待应答
bit IIC_WaitAck(void)
{
SDA = 1;
somenop;
SCL = 1;
somenop;
if(SDA)
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byt&0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
somenop;
SCL = 1;
byt <<= 1;
somenop;
SCL = 0;
}
}
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++)
{
SCL = 1;
somenop;
da <<= 1;
if(SDA)
da |= 0x01;
SCL = 0;
somenop;
}
return da;
}
uchar pcf8591(uchar add)
{
uchar dat;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat=IIC_RecByte();
IIC_Stop();
return dat;
}
复制代码
iic.h
#ifndef _IIC_H
#define _IIC_H
#define uchar unsigned char
#define uint unsigned int
//函数声明
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Ack(bit ackbit);
void IIC_SendByte(unsigned char byt);
bit IIC_WaitAck(void);
unsigned char IIC_RecByte(void);
uchar pcf8591(uchar add);
#endif
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1