蓝桥杯单片机AT24C02

一个简单的示例程序,统计开机次数。代码如下:

#include <STC15F2K60S2.H>
#include <intrins.h>
#include "onewire.h"
#include "iic.h"
u8 flag_display=0;
u8 flag_ds18b20=0;
u8 flag_at=0;
u8 at=0;
u8 temp=0;
u8 a[8]={10,10,10,10,10,10,10,10};
void ctrl(u8 ctrl)
{
    u8 p2data=P2;
	  P2=ctrl<<5|(0x1f&P2);
    P2=0x1f&p2data;	

}
void display(u8 site,u8 light)
{
    P0=0xff;ctrl(7);
    P0=0x01<<site;ctrl(6);
    switch(light)
		{
			case 0:P0=0xc0;break;
			case 1:P0=0xf9;break;
			case 2:P0=0xa4;break;
			case 3:P0=0xb0;break;
			case 4:P0=0x99;break;
			case 5:P0=0x92;break;
			case 6:P0=0x82;break;
			case 7:P0=0xf8;break;
			case 8:P0=0x80;break;
			case 9:P0=0x90;break;
			case 10:P0=0xff;break;
			default:break;		
		
		}			
	  ctrl(7);
}
void get(u8 a0,u8 a1,u8 a2,u8 a3,u8 a4,u8 a5,u8 a6,u8 a7)
{
   a[0]=a0;a[1]=a1;a[2]=a2;a[3]=a3;a[4]=a4;a[5]=a5;a[6]=a6;a[7]=a7;
}
void Process(void)
{
	if(flag_ds18b20==200){flag_ds18b20=0;temp=(int)ds18b20();}
	if(flag_at==200){EA=0;at=atread(0x55);flag_at=0;EA=1;}


}
void Timer2_Isr(void) interrupt 12
{
	flag_ds18b20++;
	flag_display++;
	flag_at++;
	flag_display=flag_display%8;
	display(flag_display,a[flag_display]);
}

void Timer2_Init(void)	
{
	AUXR &= 0xFB;		
	T2L = 0x9C;				
	T2H = 0xFF;				
	AUXR |= 0x10;
	IE2 |= 0x04;	
  EA=1;
}

void main()
{
	P0=0x00;ctrl(5);
	P0=0xff;ctrl(4);
	at=atread(0x55);
	Timer2_Init();
	atwrite(0x55,at+1);
	
  while(1)
	{
	 Process();
   get(10,at%100/10,at%10,10,10,10,temp/10,temp%10);		
	}		
   


}

因为ATREAD、ATWRITE中都包含了延时函数,在每1ms进行一次的定时器2中断影响下读写都会失败,所以设立了FLAG_AT标志位,进行读写前先中断,完成读写后再开启。中断函数被关闭时,由于我们一般对全局变量进行操作,所以读写的暂停基本不造成影响。

代码中,只再PROCESS里不断完成读取数据的操作,并没有完成写的操作,大家可以根据同样的方法对写进行完善。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值