温度
#include "reg52.h"
#include "onewire.h"
typedef unsigned int ui;
typedef unsigned char uc;
ui temp=0;
uc duanma[18] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};//分别是0-9(对应下标),A-F,“-”,“.”
uc duanma2[10] =
{0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
void init138(uc n)
{
switch(n)
{
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;
case 0:P2=(P2&0X1F)|0X00;break;
}
}
void delay(uc n)
{
while(n--);
}
void smg_bit(uc pos,uc value)
{
init138(6);
P0=0X01<<pos;
init138(7);
P0=value;
delay(200);
init138(7);
P0=0XFF;
init138(0);
}
void smg_display()
{
smg_bit(5,duanma[temp/100]);
smg_bit(6,duanma2[temp%100/10]);
smg_bit(7,duanma[temp%10]);
}
void Init_ds()
{
uc LSB,MSB; //LSB低八位,MSB高八位
//温度转换
init_ds18b20(); //初始化DS18B20
Write_DS18B20(0xcc); //跳过ROM
Write_DS18B20(0x44); //开始温度转换
//读温度
init_ds18b20(); //初始化DS18B20
Write_DS18B20(0xcc); //跳过ROM
Write_DS18B20(0xbe); //开始读温度
//读温度
LSB = Read_DS18B20(); //读取低八位数据
MSB = Read_DS18B20(); //读取高八位数据
temp = ((MSB<<8)|LSB)*0.625;
smg_display();
}
void main()
{
// initsys();
while(1)
{
Init_ds();
}
}
#ifndef __ONEWIRE_H__
#define __ONEWIRE_H__
#include <reg52.h>
sbit DQ = P1^4;
void Write_DS18B20(unsigned char dat);
unsigned char rd_temperature(void);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
#endif
#include "onewire.h"
#include "reg52.h"
//单总线内部延时函数
void Delay_OneWire(unsigned int t)
{
while(t--);
}
//单总线写操作
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(50);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(50);
}
//单总线读操作
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(50);
}
return dat;
}
//DS18B20初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(120);//12
DQ = 0;
Delay_OneWire(800);//80
DQ = 1;
Delay_OneWire(100); //10
initflag = DQ;
Delay_OneWire(50);//5
return initflag;
}
时钟
#include "reg52.h"
#include "ds1302.h"
typedef unsigned int ui;
typedef unsigned char uc;
uc time[7]={0x24,0x59,0x23,0x18,0x04,0x06,0x20};
uc code duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};//分别是0-9(对应下标),A-F,“-”,“.”
void write_1302()
{
uc i,add;
add=0x80;
Write_Ds1302_Byte(0x8e,0x00);//允许向内存写入数据
for(i=0;i<7;i++)
{
Write_Ds1302_Byte(add,time[i]);
add+=2;
}
Write_Ds1302_Byte(0x8e,0x80);
}
void read_1302()
{
uc i,add;
add=0x81;
for(i=0;i<7;i++)
{
time[i]=Read_Ds1302_Byte(add);
add+=2;
}
}
void init138(uc n)
{
switch(n)
{
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 initsys()
{
init138(5);
P0=0X00;
init138(4);
P0=0XFF;
}
void delay(uc n)
{
while(n--);
}
void smg_bit(uc pos,uc value)
{
init138(6);
P0=0X01<<pos;
init138(7);
P0=value;
delay(200);
P0=0XFF;
}
void smg_display()
{
smg_bit(0,duanma[time[2]/16]);
smg_bit(1,duanma[time[2]%16]);
smg_bit(2,duanma[16]);
smg_bit(3,duanma[time[1]/16]);
smg_bit(4,duanma[time[1]%16]);
smg_bit(5,duanma[16]);
smg_bit(6,duanma[time[0]/16]);
smg_bit(7,duanma[time[0]%16]);
}
void main()
{
initsys();
write_1302();
while(1)
{
read_1302();
smg_display();
}
}
/*
程序说明: DS1302驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include <reg52.h>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}
#ifndef __DS1302_H
#define __DS1302_H
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
#endif
频率
#include "reg52.h"
typedef unsigned char uc;
typedef unsigned int ui;
ui count_f=0;
ui dat_f=0;
uc count_t=0;
uc code duanma[18] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};//分别是0-9(对应下标),A-F,“-”,“.”
void delay(ui n)
{
while(n--);
}
void init138(uc n)
{
switch(n)
{
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;
case 0:P2=(P2&0X1F)|0X00;break;
}
}
void initsys()
{
init138(5);
P0=0X00;
init138(4);
P0=0XFF;
}
void smg_bit(uc pos,uc value)
{
init138(6);
P0=0X01<<pos;
init138(7);
P0=value;
delay(200);
P0=0XFF;
}
void init_timer()
{
TH0=0XFF;
TL0=0XFF;
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
TMOD=0X16;
ET0=1;
ET1=1;
EA=1;
TR0=1;
TR1=1;
}
void service1() interrupt 1
{
count_f++;
}
void service3() interrupt 3
{
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
count_t++;
if(count_t==20)
{
dat_f=count_f;
count_f=0;
count_t=0;
}
}
void smg_display()
{
smg_bit(0,duanma[15]);
if(dat_f>9999)
{
smg_bit(3,duanma[dat_f/10000]);
}
if(dat_f>999)
{
smg_bit(4,duanma[(dat_f/1000)%10]);
}
if(dat_f>99)
{
smg_bit(5,duanma[(dat_f/100)%10]);
}
if(dat_f>9)
{
smg_bit(6,duanma[(dat_f/10)%10]);
}
smg_bit(7,duanma[dat_f%10]);
}
void main()
{
initsys();
init_timer();
while(1)
{
smg_display();
}
}
光敏
#include "reg52.h"
#include "iic.h"
typedef unsigned char uc;
typedef unsigned int ui;
uc code duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};//分别是0-9(对应下标),A-F,“-”,“.”
void delay(ui n)
{
while(n--);
}
void init138(uc n)
{
switch(n)
{
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 initsys()
{
init138(5);
P0=0X00;
init138(4);
P0=0XFF;
}
void smg_bit(uc pos,uc value)
{
init138(6);
P0=0x01<<pos;
init138(7);
P0=value;
delay(200);
P0=0XFF;
}
uc light_read(uc add)
{
uc temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_Stop();
return temp;
}
void smg_display()
{
uc temp=light_read(0x01);
smg_bit(0,duanma[temp/100]);
smg_bit(1,duanma[(temp/10)%10]);
smg_bit(2,duanma[temp%10]);
}
void main()
{
initsys();
while(1)
{
smg_display();
}
}
/*
程序说明: 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;
}
#include "reg52.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);
#endif
DAC
void read_DAC(uint dat)
{
IIC_Start();
IIC_SendByte(0x90); //写设备地址
IIC_WaitAck();
IIC_SendByte(0x40); //写控制字
IIC_WaitAck();
IIC_SendByte(dat); //dat为要转换的数字量
IIC_WaitAck();
IIC_Stop();
}
AT24C02
AT24C02
EEPROM(寄存器)
/*
EEPROM_write(0X01, 126);
delayms(5) //延时5ms
EEPROM_read(0X01)
*/
//读取阈值
uchar EEPROM_read(uchar add)
{
uchar temp;
IIC_Start();
IIC_SendByte(0XA0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0XA1);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_Stop();
return temp;
}
//写入阈值
void EEPROM_write(uchar add, uchar dat)
{
IIC_Start();
IIC_SendByte(0XA0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
简:EEPROM读:光敏9换A
写:发送A0 add dat
中断
Void init_INT0()
{
IT0=1;//下降沿触发
EX0=1;
EA=1
}
Void serviceINT0() interrupt 0
{
自由添加//尽量少做事情
}
定时
Void initimer0()
{
TMOD=0X01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
ET0=1;
EA=1;
TR0=1;
}
Void servicetimer() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;********************特别注意PWM时50000为100,其中DUTY为高电平占的比例,再在按键扫描中首下打开定时器TR0
+服务函数
}
串口
头部sfr AUXR=0X8E;
void InitUart()
{
TMOD = 0X20;
TH1 = 0XFD;
TL1 = 0XFD;
TR1 = 1;
SCON = 0X50;
AUXR = 0X00;
ES = 1;
EA = 1;
}
void SendByte(uchar dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
void ServiceUart() interrupt 4
{
if(RI == 1)
{
RI = 0;
urdat = SBUF;
SendByte(urdat + 1);
}
}
字符串传输
uchar command = 0;
void ServiceUart() interrupt 4
{
if(RI == 1)
{
command = SBUF;
RI = 0;
}
}
void SendByteUart(uchar dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
void SendStringUart(uchar *str)
{
while(*str != '\0')
{
SendByteUart(*str);
str++;
}
}
//*******************************
void Working()
{
SelectHC138(4);
if(command != 0)
{
switch(command & 0xf0) //提取高四位
{
case 0xA0:
P0 = (P0 | 0X0F) & (~command | 0XF0); //保留高4位,反转低四位
command = 0X00;
break;
case 0xB0:
P0 = (P0 | 0XF0) & (~command << 4| 0X0F);
command = 0X00;
break;
case 0xC0:
SendStringUart("The System is Runing……\r\n");
command = 0X00;
break;
}
}
}
头文件模块化设计
#ifndef
#define
..........
#endif
超声波
#include<REG52.h>
#include <intrins.h>
sbit TX=P1^0;//1.0发送
sbit RX=P1^1;//1.1接收
unsigned char code LED[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xFF,0xbf };//数码管
unsigned char LEDbuff[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; //数码管缓冲区
bit TXD_falg=0;//发送数据判断标志位
unsigned int cnt=0,dist=0,t=0;//用来计时,0.5s获取一次超声波的距离
sfr AUXR=0X8E;
void Timer0Init(); //定时器0,1ms
void Initial(); //模块初始化
void Distance(); //测距离
void main()
{
Timer0Init();
Initial(); //初始化函数
while(1)
{
Distance();
}
}
void Initial() //初始化函数
{
P2 = (P2&0x1F)|0x80;
P0 = 0xFF; //初始化LED
P2 = (P2&0x1F)|0xA0;
P0 = 0x00; //初始化继电器和蜂鸣器
P2 = (P2&0x1F)|0xC0;
P0 = 0xFF;
P2 = (P2&0x1F)|0xE0;
P0 = 0xFF; //初始化数码管
}
void Delay10us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 27;
while (--i);
}
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;
ET0 = 1;
}
void Display()
{
LEDbuff[7] = LED[10];
LEDbuff[6] = LED[10];
LEDbuff[5] = LED[10];
LEDbuff[4] = LED[10];
LEDbuff[3] = LED[10];
if(dist==999)
{
LEDbuff[2] = LED[11];
LEDbuff[1] = LED[11];
LEDbuff[0] = LED[11];
}
else
{
LEDbuff[2] = LED[dist/100%10]+0x80;
LEDbuff[1] = LED[dist/10%10];
LEDbuff[0] = LED[dist%10];
}
}
void TXD_Sonic()
{
unsigned char i;
TH1=TL1=TF1=0;
for(i=0;i<8;i++) //发送超声波的次数在8-15次均可
{
TX=1; //高低电平变化,持续时间10us即可
Delay10us();
TX=0;
Delay10us();
}
}
void Distance()
{
if(TXD_falg==1) //如果标志位为一,然后我们获取一次数据
{
TXD_falg=0; //标志位清零,然后重新计时,用来更新下一次数据
TH1=TL1=TF1=0;
TXD_Sonic(); //发送超声波,等待接收获取时间
TR1=1; //将定时器1打开,开始计时
while((TF1==0)&&(RX==1)); //如果TF1=1或者RXD=0就可以跳出循环,即接收到超声波信号或者超时导致中断溢出就跳出循环
TR1=0; //定时器1关闭,防止计时持续增加导致测距出错
if(TF1==1)
{
dist=999;
}
else
{
t=TH1;
t=t<<8|TL1;
// dist=(340*(t/1000000))*100/2;
dist=(unsigned int)(t*0.017);
}
}
}
void InterruptTimer0() interrupt 1
{
static unsigned char i=0;
switch(i)
{
case 0:P2 = 0xC0;P0=0x80;P2=0xE0;P0=LEDbuff[0];P2=0x00;i++;break;
case 1:P2 = 0xC0;P0=0x40;P2=0xE0;P0=LEDbuff[1];P2=0x00;i++;break;
case 2:P2 = 0xC0;P0=0x20;P2=0xE0;P0=LEDbuff[2];P2=0x00;i++;break;
case 3:P2 = 0xC0;P0=0x10;P2=0xE0;P0=LEDbuff[3];P2=0x00;i++;break;
case 4:P2 = 0xC0;P0=0x08;P2=0xE0;P0=LEDbuff[4];P2=0x00;i++;break;
case 5:P2 = 0xC0;P0=0x04;P2=0xE0;P0=LEDbuff[5];P2=0x00;i++;break;
case 6:P2 = 0xC0;P0=0x02;P2=0xE0;P0=LEDbuff[6];P2=0x00;i++;break;
case 7:P2 = 0xC0;P0=0x01;P2=0xE0;P0=LEDbuff[7];P2=0x00;i=0;break;
default : break;
}
cnt++;
if(cnt>=500) {TXD_falg=1;Display();cnt = 0; }
}
AT24C02
#include "reg52.h"
#include "iic.h"
typedef unsigned char uc;
typedef unsigned int ui;
uc dat1=0;
uc dat2=0;
uc dat3=0;
uc code duanma[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xbf};
void delay(ui n)
{
while(n--);
}
void init138(uc n)
{
switch(n)
{
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 initsys()
{
init138(5);
P0=0X00;
init138(4);
P0=0XFF;
}
void smg_bit(uc pos,uc value)
{
init138(6);
P0=0X01<<pos;
init138(7);
P0=value;
delay(200);
P0=0xff;
}
void smg_display()
{
smg_bit(0,duanma[dat1/10]);
smg_bit(1,duanma[dat1%10]);
smg_bit(2,duanma[16]);
smg_bit(3,duanma[dat2/10]);
smg_bit(4,duanma[dat2%10]);
smg_bit(5,duanma[16]);
smg_bit(6,duanma[dat3/10]);
smg_bit(7,duanma[dat3%10]);
}
void write(uc add,uc dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
uc read(uc add)
{
uc 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;
}
void read_write()
{
dat1=read(0x01);
dat2=read(0x03);
dat3=read(0x05);
dat1+=1;
dat2+=2;
dat3+=3;
if(dat1>10)
{
dat1=0;
}
if(dat2>20)
{
dat2=0;
}
if(dat3>30)
{
dat3=0;
}
write(0x01,dat1);delay(10000);
write(0x03,dat2);delay(10000);
write(0x05,dat3);delay(10000);
}
void main()
{
initsys();
read_write();
while(1)
{
smg_display();
}
}
/*
程序说明: 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;
}
#include "reg52.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);
#endif
智能照明器
#include "reg52.h"
#include "iic.h"
typedef unsigned char uc;
typedef unsigned int ui;
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit L5=P0^4;
sbit L6=P0^5;
sbit L7=P0^6;
sbit L8=P0^7;
uc rd1=0;
uc rd1_old=0;
uc level=0;
uc level_old=0;
sbit s5=P3^2;
sbit s4=P3^3;
uc code duanma[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xbf};
void delay(ui n)
{
while(n--);
}
void init138(uc n)
{
switch(n)
{
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 initsys()
{
init138(5);
P0=0X00;
init138(4);
P0=0XFF;
}
void smg_bit(uc pos,uc value)
{
init138(6);
P0=0X01<<pos;
init138(7);
P0=value;
delay(200);
P0=0XFF;
}
void read_rd1()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x01);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
rd1=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
}
void led_level()
{
init138(4);
read_rd1();
if(rd1>200&&rd1<=250)
{
P0=0XFE;
level=5;
}
else if(rd1>150&&rd1<=200)
{
P0=0Xfc;
level=4;
}
else if(rd1>100&&rd1<=150)
{
P0=0Xf0;
level=3;
}
else if(rd1>50&&rd1<=100)
{
P0=0Xc0;
level=2;
}
else if(rd1>0&&rd1<=50)
{
P0=0X00;
level=1;
}
}
void write_24c02(uc add,uc dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
uc read_24c02(uc add)
{
uc 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;
}
void smg_new()
{
smg_bit(0,duanma[16]);
smg_bit(1,duanma[level]);
smg_bit(2,duanma[16]);
smg_bit(5,duanma[rd1/100]);
smg_bit(6,duanma[rd1/10%10]);
smg_bit(7,duanma[rd1%10]);
}
void old()
{
smg_bit(0,duanma[16]);
smg_bit(1,duanma[level_old]);
smg_bit(2,duanma[16]);
smg_bit(5,duanma[rd1_old/100]);
smg_bit(6,duanma[rd1_old/10%10]);
smg_bit(7,duanma[rd1_old%10]);
}
void scankey()
{
if(s4==0)
{
delay(200);
if(s4==0)
{
write_24c02(0x01,level);
delay(200);
write_24c02(0x02,rd1);
while(s4==0)
{
smg_new();
}
}
}
if(s5==0)
{
delay(200);
if(s5==0)
{
level_old=read_24c02(0x01);
delay(200);
rd1_old=read_24c02(0x02);
while(s5==0)
{
smg_old();
}
}
}
}
void main()
{
initsys();
while(1)
{
led_level();
smg_new();
scankey();
}
}
DAC(与通道同时存在)
void Read_DAC(float dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x43);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}