历史上的今天
今天是:2025年03月31日(星期一)
2018年03月31日 | 基于I2C协议的单片机记录单片机开机次数
2018-03-31 来源:eefocus
在之前我讲过I2C协议,也给出了简单例子,这次利用I2C协议,我们可以做一个小实验,让单片机记录单片机开机次数,也就是机器使用次数。
// 内容:每次开机都将次数加1 并存储到EEPROM。这样就能直观的看到机器的使用 //
// 次数用P1口 LED做为显示,次数大于256是将溢出,按复位模拟开机 //
// 或者直接通过开关开机 //
#include
#include
#define AddWr 0xae //写数据地址,需要参考24c02芯片文档
#define AddRd 0xaf //读数据地址
sbit Sda=P1^2; //定义总线连接端口
sbit Scl=P1^1;
sbit WP=P1^0; //写保护,这里不使用
/*------------------------------------------------
延时程序
------------------------------------------------*/
void mDelay(unsigned char j)
{
unsigned int i;
for(;j>0;j--)
{
for(i=0;i<125;i++)
{;}
}
}
/*------------------------------------------------
启动IIC总线
------------------------------------------------*/
void Start(void)
{
Sda=1;
_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Sda=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
}
/*------------------------------------------------
停止IIC总线
------------------------------------------------*/
void Stop(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Sda=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
}
/*------------------------------------------------
应答IIC总线
------------------------------------------------*/
void Ack(void)
{
Sda=0;
_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
_nop_();_nop_();
}
/*------------------------------------------------
非应答IIC总线
------------------------------------------------*/
void NoAck(void)
{
Sda=1;
_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
_nop_();_nop_();
}
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void Send(unsigned char Data)
{
unsigned char BitCounter=8;
unsigned char temp;
do
{
temp=Data;
Scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
/*------------------------------------------------
读入一个字节并返回
------------------------------------------------*/
unsigned char Read(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8;
Sda=1;
do
{
Scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}
/*------------------------------------------------
写入数据
------------------------------------------------*/
void WrToROM(unsigned char Data[],unsigned char Address,unsigned char Num)
{
unsigned char i;
unsigned char *PData;
PData=Data;
for(i=0;i
{
Start();
Send(AddWr); //写入芯片地址
Ack();
Send(Address+i);//写入存储地址
Ack();
Send(*(PData+i));//写数据
Ack();
Stop();
mDelay(20);
}
}
/*------------------------------------------------
读出数据
------------------------------------------------*/
void RdFromROM(unsigned char Data[],unsigned char Address,unsigned char Num)
{
unsigned char i;
unsigned char *PData;
PData=Data;
for(i=0;i
{
Start(); //写入芯片地址
Send(AddWr);
Ack();
Send(Address+i);//写入存储地址
Ack();
Start();
Send(AddRd); //读入地址
Ack();
*(PData+i)=Read();//读数据
Scl=0;
NoAck();
Stop();
}
}
//以上程序是EEPROM24C02程序部分,IIC协议Scl=0;
/*------------------------------------------------
主程序
------------------------------------------------*/
//下载程序后,记录下LED2~LED9的状态,然后按下复位键(相当于开机),观察LED2~LED9的状态改变
void main()
{
unsigned char Number[1];
unsigned char i;
WP=0;//写保护关掉
RdFromROM(Number,0,1);//调用存储数据 从地址0开始写一个数据
Number[0]++;
WrToROM(Number,0,1);//写入24c02
P1 = ~ Number[0];//在P1口上显示 反向显示 LED亮代表1
while(1)
{
}
}
//用户可以自己把程序移植到数码管显示或者液晶显示 ,可以直观的看到数字 ,也可以定义int类型 用于计数万次以上
史海拾趣
|
各位 高手,在下 寻找有关TSC 7107cpl / 8729BK 资料。用于连接着3位显示数码管的驱动 找到了 英文资料。。。 http://www.alldatasheet.com/view.jsp?Searchword=7107CPL http://www.alldatasheet.com/datash ...… 查看全部问答> |
|
矢野经济研究所预测2008年度消费类加速度传感器市场将比上年增长30.8%,达到2亿7450万个。车载用加速度传感器将比上年增长12.2%,达到 2亿8230万个。这样,消费类加速度传感器和车载用加速度传感器的个数将接近同等规模。另一方面,预计角速度传感 ...… 查看全部问答> |
|
泰为公司(www.telenav.com)招聘iPhone程序员 急聘 Please send your resume to lma@telenav.cn for internal referral. ----------------- We are recruiting C++ SE for iPhone team in urgent. If you have any referral, please forward the resume to me. Many thanks! Here is the adv ...… 查看全部问答> |
|
> 小弟刚接触Wince,装好了VS2005及其SP1,装好了Wince6.0,在VS2005中也出现了PB的插件. 照着网上的一些例子定制后,编译后提示如下: PB Debugger The Kernel Debugger is waiting to connect with target. 点击Targe-Attach Device后出现: ca ...… 查看全部问答> |
|
我是第一次使用MSP430这个MCU,在烧写程序方面发现有两种烧写器。一种是一端接JATG口,另一端接在PC机上的并口,这种好像很便宜。另外一种是通过一个仿真盒接在PC的USB口,这种好像贵些。 请问我只是想往MSP430里烧写代码,用第一种可以吗,第二种 ...… 查看全部问答> |
|
#define OUTMOD_0 (0*0x20u) /* PWM output mode: 0 - output only */ #define OUTMOD_1 (1*0x20u) /* PWM outpu ...… 查看全部问答> |




