如果有用请点赞,还会继续更新的
题目:
源代码:
main.c
#include"reg52.h"
#include"intrins.h"
#include"iic.h"
char code xianshi[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x7F};
int guang=0;
int shuiniang=0;
int smg_mode=0;
int money=0;
sbit S7=P3^0;
sbit S6=P3^1;
sfr AUXR=0x8e;
void choose_573(int n)
{
switch(n)
{
case(0):P2=(P2&0x1f)|0x00;break;
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;
}
}
void init_system()
{
choose_573(4);
P0=0xff;
choose_573(5);
P0=0x00;
choose_573(0);
P0=0xff;
}
void guang_ming()
{
guang=read_guang();
guang=(guang*1.96);
}
void work()
{
if(guang>=125)
{
choose_573(4);
P0=0xff;
choose_573(0);
P0=0xff;
}
if(guang<125)
{
choose_573(4);
P0=0xfe;
choose_573(0);
P0=0xff;
}
}
//==================================按键
void Delay5ms() //@11.0592MHz
{
unsigned char i, j;
i = 54;
j = 199;
do
{
while (--j);
} while (--i);
}
void key_board()
{
if(S7==0)
{
Delay5ms();
if(S7==0)
{
smg_mode=1;
shuiniang=0;
money=0;
}
while(!S7);
}
if(S6==0)
{
Delay5ms();
if(S6==0)
{
money=shuiniang*5;
smg_mode=0;
}
}
}
//==================================
//==================================定时器出水
void Timer0Init(void) //5毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x28; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
int nn;
void Timer0Init_server() interrupt 1
{
if(smg_mode==1)
{
nn++;
if(nn>=200)
{
if(shuiniang<999)
{
shuiniang=shuiniang+1;
}
else
{
smg_mode=0;
money=4995;
}
nn=0;
}
}
}
//==================================
//==================================数码管
void Delay300us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 4;
j = 54;
do
{
while (--j);
} while (--i);
}
void SMG(int wei,int number)
{
choose_573(6);
P0=0x80>>(wei-1);
choose_573(7);
P0=xianshi[number];
choose_573(0);
P0=0xff;
}
void SMG_display()
{
if(smg_mode==0)
{
SMG(1,money%10);
Delay300us();
SMG(2,(money%100)/10);
Delay300us();
SMG(3,(money%1000)/100);
Delay300us();
SMG(3,12);
Delay300us();
SMG(4,(money%10000)/1000);
Delay300us();
SMG(5,0);
Delay300us();
SMG(6,5);
Delay300us();
SMG(7,0);
Delay300us();
SMG(7,12);
Delay300us();
SMG(8,10);
Delay300us();
}
if(smg_mode==1)
{
SMG(1,0);
Delay300us();
SMG(2,shuiniang%10);
Delay300us();
SMG(3,(shuiniang%100)/10);
Delay300us();
SMG(3,12);
Delay300us();
SMG(4,(shuiniang%1000)/100);
Delay300us();
SMG(5,0);
Delay300us();
SMG(6,5);
Delay300us();
SMG(7,0);
Delay300us();
SMG(7,12);
Delay300us();
SMG(8,10);
Delay300us();
}
}
//==================================
void main()
{
init_system();
Timer0Init();
while(1)
{
guang_ming();
SMG_display();
key_board();
work();
}
}
iic.c
/*
程序说明: IIC总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include "reg52.h"
#include "intrins.h"
#define DELAY_TIME 5
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
sbit SDA = P2^1; /* 数据线 */
sbit SCL = P2^0; /* 时钟线 */
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
//总线启动条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
//总线停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//发送应答
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit; // 0:应答,1:非应答
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//等待应答
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
unsigned int read_guang()
{
unsigned int temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x01);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
iic.h
#ifndef _IIC_H
#define _IIC_H
void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendAck(bit ackbit);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
unsigned int read_guang();
#endif
**
码字不容易,点个赞再走!!!!
**