临时记忆篇

温度

#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();
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值