//读取adc
u8 Read_ADC(u8 ctrl_byte)
{
u8 temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(ctrl_byte);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
//输出dac
void Write_DAC(u8 value)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(value);
IIC_WaitAck();
IIC_Stop();
}
iic.c
/*
程序说明: IIC总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include "iic.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;
}
//写入eeprom
void Write_EEPROM(u8 add,u8 dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
//读取eeprom
u8 Read_EEPROM(u8 add)
{
u8 temp;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
//读取adc
u8 Read_ADC(u8 ctrl_byte)
{
u8 temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(ctrl_byte);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
//输出dac
void Write_DAC(u8 value)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(value);
IIC_WaitAck();
IIC_Stop();
}
iic.h
#ifndef _IIC_H
#define _IIC_H
#include "sys.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);
//EEPROM
void Write_EEPROM(u8 add,u8 dat);
u8 Read_EEPROM(u8 add);
//ADC
u8 Read_ADC(u8 ctrl_byte);
//DAC
void Write_DAC(u8 value);
#endif
main.c
#include "sys.h"
#include "tim.h"
#include "smg.h"
#include "key.h"
#include "onewire.h"
#include "iic.h"
#include "ds1302.h"
HextoBin led_ctrl,uln_ctrl;//LED,蜂鸣器,继电器控制变量
u16 cnt_key;//三行按键扫描标志位,1ms加一次
u16 cnt_temperature;//温度读取标志位,1ms加一次
u16 cnt_ADC;//ADC读取标志位,1ms加一次
u32 temperature=850000;
u8 start_times = 0;//开机次数
u16 ch1 = 0;//光敏电阻值
u16 ch3 = 0;//分压电阻值
u8 num = 0;
u8 shi,fen,miao;
void System_Init()
{
led_ctrl.hex = 0xff;
Device_Ctrl(0x80,led_ctrl.hex);//关闭LED灯
uln_ctrl.hex = 0x00;
Device_Ctrl(0xa0,uln_ctrl.hex);//关闭蜂鸣器和继电器
}
void SMG_Process()//数码管处理函数
{
smg_buf[0] = smg_duanxuan[shi/10];
smg_buf[1] = smg_duanxuan[shi%10];
smg_buf[2] = ~0xbf;
smg_buf[3] = smg_duanxuan[fen/10];
smg_buf[4] = smg_duanxuan[fen%10];;
smg_buf[5] = ~0xbf;
smg_buf[6] = smg_duanxuan[miao/10];
smg_buf[7] = smg_duanxuan[miao%10];
}
void KEY_Process()//按键处理模块
{
if(cnt_key>=10)
{
cnt_key = 0;
KBD_ThreeLine();
if(Trig_KBD == 0x48)//s5
{
num++;
}
if(Trig_KBD == 0x88)//S4
{
num--;
}
}
}
void DS18B20_Process()
{
if(cnt_temperature>=100)
{
cnt_temperature = 0;
temperature = rd_temperature()*10000;
}
}
void EEPROM_Process()
{
start_times = Read_EEPROM(0x01);
start_times++;
Write_EEPROM(0x01,start_times);
}
void ADC_Process()
{
if(cnt_ADC>=10)
{
cnt_ADC = 0;
Read_ADC(0x41);
ch1 = Read_ADC(0x41);//通道1:光敏电阻值
//ch1 = ch1/51.1f+1;
ch1 = ch1*100/51;
Read_ADC(0x43);
ch3 = Read_ADC(0x43);//通道3:分压电阻值
//ch3 = ch3/51.1f+1;
ch3 = ch3*100/51;
}
}
void Read_Clock()
{
miao = BcdToDec(Read_Ds1302_Byte(0x81));
fen = BcdToDec(Read_Ds1302_Byte(0x83));
shi = BcdToDec(Read_Ds1302_Byte(0x85));
}
void main()
{
System_Init();
EEPROM_Process();
Set_Clock(23,59,55);
Timer2Init();
while(1)
{
SMG_Process();
DS18B20_Process();
ADC_Process();
Read_Clock();
}
}
void Timer2() interrupt 12
{
cnt_key++;cnt_temperature++;cnt_ADC++;
display_bit();
KEY_Process();
}