main.c:
#include <STC15F2K60S2.H>
#include "SwitchHC573.h"
#include "iic.h"
unsigned char Daun[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};//无点
unsigned char DaunDot[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//0-9//含小数点
unsigned char date;
unsigned int V;
void DelaySMG(unsigned int t)
{
while(t--);
}
void ShowSMG_Byte(unsigned char dat ,unsigned char Pos)
{
SwitchHC573(6);
P0 = 0x01<<Pos;
SwitchHC573(7);
P0 = dat;
}
void ShowSMG_AD()
{
//date = ADC_Read(0x43);//RB2
date = ADC_Read(0x41);//光敏
V = date * 5 * 10/255;
ShowSMG_Byte( DaunDot[V/10],0);
DelaySMG(1000);
ShowSMG_Byte( Daun[V%10],1);
DelaySMG(1000);
ShowSMG_Byte( Daun[16],2);
DelaySMG(1000);
ShowSMG_Byte( Daun[16],3);
DelaySMG(1000);
ShowSMG_Byte( Daun[16],4);
DelaySMG(1000);
ShowSMG_Byte( Daun[date/100],5);
DelaySMG(1000);
ShowSMG_Byte( Daun[date%100/10],6);
DelaySMG(1000);
ShowSMG_Byte( Daun[date%10],7);
DelaySMG(1000);
}
void main()
{
InitSys();
while(1)
{
ShowSMG_AD();
}
}
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 char ADC_Read(unsigned char adder)
{
unsigned char temp;
IIC_Start();//IIC总线起始信号
IIC_SendByte(0x90);//PCF8591的写设备地址
IIC_WaitAck();//等待应答
IIC_SendByte(adder);//写入控制字节
IIC_WaitAck();
IIC_Stop();//IIC总线停止信号
IIC_Start();//IIC总线起始信号
IIC_SendByte(0x91);//PCF8591的写设备地址
IIC_WaitAck();//等待应答
temp = IIC_RecByte();//读取PCF8591通道(1或3)的数据
IIC_SendAck(0);//产生非应答信号
IIC_WaitAck();//等待应答
IIC_Stop();//IIC总线停止信号
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 char ADC_Read(unsigned char adder);
#endif
SwitchHC573.c
#include <STC15F2K60S2.H>
//锁存器选择
void SwitchHC573(unsigned char wei)
{
switch(wei)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;//控制LED
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 = (P2 & 0x1f) | 0x00;//无操作
break;
}
}
//初始化系统
void InitSys()
{
SwitchHC573(4);
P0 = 0xff;
SwitchHC573(5);
P0 = 0x00;
SwitchHC573(6);
P0 = 0x00;
SwitchHC573(7);
P0 = 0xff;
SwitchHC573(0);
}
SwitchHC573.h
#ifndef __SWITCHHC573_H
#define __SWITCHHC573_H
void SwitchHC573(unsigned char wei);//锁存器选择
void InitSys();//初始化系统
#endif