51操作各种demo 驱动

这篇博客详细介绍了如何在51单片机上操作和驱动24C02 EEPROM、DS12C887时钟芯片、DS18B20温度传感器,以及通用EEPROM模块。通过实例展示了12T和1T单片机对接DS18B20的实现过程,提供了丰富的实践经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


24C02

bit  write=0;           //写24C02的标志;
sbit sda=P2^0;                         
sbit scl=P2^1;
void delay0()
{ ;; }
void start()  //开始信号
{	
	sda=1;
	delay0();
	scl=1;
	delay0();
	sda=0;
	delay0();
}
void stop()   //停止
{
	sda=0;
	delay0();
	scl=1;
	delay0();
	sda=1;
	delay0();
}
void respons()  //应答
{
	uchar i;
	scl=1;
	delay0();
	while((sda==1)&&(i<250))i++;
	scl=0;
	delay0();
}
void init_24c02()//IIC初始化函数
{
	sda=1;
	delay0();
	scl=1;
	delay0();
}
void write_byte(uchar date)//写一个字节函数
{
	uchar i,temp;
	temp=date;
	for(i=0;i<8;i++)
	{
		temp=temp<<1;
		scl=0;
	    delay0();
		sda=CY;
		delay0();
		scl=1;
		delay0();
	}
	scl=0;
	delay0();
	sda=1;
	delay0();
}
uchar read_byte()//读一个字节函数
{
	uchar i,k;
	scl=0;
	delay0();
	sda=1;
	delay0();
	for(i=0;i<8;i++)
	{
		scl=1;
		delay0();	
		k=(k<<1)|sda;
		scl=0;
		delay0();	
	}
	return k;
}
void write_add(uchar address,uchar date)//指定地址写一个字节
{
	start();
	write_byte(0xa0);
	respons();
	write_byte(address);
	respons();
	write_byte(date);
	respons();
	stop();
}
char read_add(uchar address)//指定地址读一个字节
{
	uchar date;
	start();
	write_byte(0xa0);
	respons();
	write_byte(address);
	respons();
	start();
	write_byte(0xa1);
	respons();
	date=read_byte();
	stop();
	return date;
}

DS12C887

#include<reg52.h>
#include<define.h>
void delay(uint z)//延时函数
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}
void di() //蜂鸣器报警声音
{
	beep=0;
	delay(100);
	beep=1;
}
void write_com(uchar com)
{//写液晶命令函数
	rs=0;
	lcden=0;
	P0=com;
	delay(3);
	lcden=1;
	delay(3);
	lcden=0;	
}
void write_date(uchar date)
{//写液晶数据函数
	rs=1;
	lcden=0;
	P0=date;
	delay(3);
	lcden=1;
	delay(3);
	lcden=0;	
}
void init()
{//初始化函数
	uchar num;
	EA=1;//打开总中断
	EX1=1;//开外部中断1
	IT1=1;//设置负跳变沿触发中断
	flag1=0;//变量初始化
	t0_num=0;
	s1num=0;
	week=1;
	dula=0;//关闭数码管显示
	wela=0;
	lcden=0;
	rd=0;
/*以下几行在首次设置DS12C887时使用,以后不必再写入
	write_ds(0x0A,0x20);//打开振荡器
	write_ds(0x0B,0x26);//设置24小时模式,数据二进制格式
						//开启闹铃中断
	set_time();//设置上电默认时间
-----------------------------------------------------*/
	write_com(0x38);//1602液晶初始化
	write_com(0x0c);
	write_com(0x06);
	write_com(0x01);
	write_com(0x80);
	for(num=0;num<15;num++)//写入液晶固定部分显示
		{
			write_date(table[num]);
			delay(1);
		}
	write_com(0x80+0x40);
	for(num=0;num<11;num++)
		{
			write_date(table1[num]);
			delay(1);
		}
}
void write_sfm(uchar add,char date)
{//1602液晶刷新时分秒函数4为时,7为分,10为秒
	char shi,ge;
	shi=date/10;
	ge=date%10;
	write_com(0x80+0x40+add);
	write_date(0x30+shi);
	write_date(0x30+ge);
}
void write_nyr(uchar add,char date)
{//1602液晶刷新年月日函数3为年,6为分,9为秒
	char shi,ge;
	shi=date/10;
	ge=date%10;
	write_com(0x80+add);
	write_date(0x30+shi);
	write_date(0x30+ge);
}
void write_week(char we)
{//写液晶星期显示函数
	write_com(0x80+12);
	switch(we)
	{
		case 1:	write_date('M');delay(5);
				write_date('O');delay(5);
				write_date('N');
				break;
		case 2:	write_date('T');delay(5);
				write_date('U');delay(5);
				write_date('E');
				break;
		case 3:	write_date('W');delay(5);
				write_date('E');delay(5);
				write_date('D');
				break;
		case 4:	write_date('T');delay(5);
				write_date('H');delay(5);
				write_date('U');
				break;
		case 5:	write_date('F');delay(5);
				write_date('R');delay(5);
				write_date('I');
				break;
		case 6:	write_date('S');delay(5);
				write_date('A');delay(5);
				write_date('T');
				break;
		case 7:	write_date('S');delay(5);
				write_date('U');delay(5);
				write_date('N');
				break;
	}
}
void keyscan()
{
	if(flag_ri==1)
	{//这里用来取消闹钟报警,任一键取消报警
		if((s1==0)||(s2==0)||(s3==0)||(s4==0))
		{	
			delay(5);
			if((s1==0)||(s2==0)||(s3==0)||(s4==0))
			{
				while(!(s1&&s2&&s3&&s4));
                di();
				flag_ri=0;//清除报警标志
			}	 	
		}
	}	
	if(s1==0)//检测S1
	{
		delay(5);
		if(s1==0)
		{	
			s1num++;//记录按下次数
			if(flag1==1)
				if(s1num==4)
					s1num=1;
			flag=1;
			while(!s1);di();
			switch(s1num)
			{//光标闪烁点定位
				case 1: write_com(0x80+0x40+10);
					    write_com(0x0f);
						break;
				case 2: write_com(0x80+0x40+7);
						break;
				case 3: write_com(0x80+0x40+4);
						break;
				case 4: write_com(0x80+12);
						break;
				case 5: write_com(0x80+9);
						break;
				case 6: write_com(0x80+6);
						break;
				case 7: write_com(0x80+3);
						break;
				case 8: s1num=0;
						write_com(0x0c);
						flag=0;
						write_ds(0,miao);
						write_ds(2,fen);
						write_ds(4,shi);
						write_ds(6,week);
						write_ds(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值