I²C(Inter IC Bus)是由 Philips 推出的数据总线协议。
#include
void display(unsigned int n)
{
unsigned char i;
char table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
P2 = 0 << 2;
P0 = table[n%10];
for (i=0;i<25;i++);
P0 = 0;
P2 = 1 << 2;
P0 = table[n/10%10];
for (i=0;i<25;i++);
P0 = 0;
P2 = 2 << 2;
P0 = table[n/100%10];
for (i=0;i<25;i++);
P0 = 0;
P2 = 3 << 2;
P0 = table[n/1000%10];
for (i=0;i<25;i++);
P0 = 0;
}
// IIC bus
sbit SCL=P2^1;
sbit SDA=P2^0;
// 4 keys
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
void delay(unsigned int i)
{
while(i--);
}
void I2cStart()
{
SDA = 1;
delay(5);
SCL = 1;
delay(5);
SDA = 0;
delay(5);
}
void I2cStop()
{
SDA = 0;
delay(5);
SCL = 1;
delay(5);
SDA = 1;
}
void I2cSendByte(unsigned char n)
{
signed char i;
for (i=7;i>=0;i--)
{
SCL = 0;
delay(5);
SDA = 0x01 & (n>>i);
delay(5);
SCL = 1;
delay(5);
}
SCL = 0;
delay(5);
SDA = 1;
delay(5);
SCL = 1;
delay(5);
while((SDA==1)&&(i++<255));
SCL = 0;
delay(5);
}
unsigned char I2cReadByte()
{
unsigned char i,k;
SCL = 0;
delay(5);
SDA = 1;
delay(5);
for (i = 0; i < 8; ++i)
{
SCL = 1;
delay(5);
k <<= 1;
k |= SDA;
SCL = 0;
delay(5);
}
delay(5);
return k;
}
int main()
{
unsigned char num=0;
while (1)
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
I2cStart();
I2cSendByte(0xa0); // set chip
I2cSendByte(1); // set address 1
I2cSendByte(num); // set value
I2cStop();
}
while(!k1);
} else if(k2==0) {
delay(1000);
if(k2==0)
{
I2cStart();
I2cSendByte(0xa0); // set chip 0xa0
I2cSendByte(1); // set address 1
I2cStart();
I2cSendByte(0xa1); // set chip 0xa1
num=I2cReadByte(); // read byte
I2cStop();
}
while(!k2);
} else if(k3==0) {
delay(1000);
if(k3==0)
num++; // add 1
while(!k3);
} else if(k4==0) {
delay(1000);
if(k4==0)
num=0; // set 0
while(!k4);
}
display(num);
}
return 0;
}
关键字:C51 I²C通信
引用地址:
C51进行I²C通信
推荐阅读最新更新时间:2024-03-16 16:23
如何在C51文件和汇编语言文件中相互调用?
如何在C51文件和汇编语言文件中相互调用对方文件中的函数? 答:汇编语言文件中对于函数的调用方法,与调用汇编语言中的函数一样,如: LCALL DISPLAY 在C语言文件中调用汇编语言中的函数,必须先声明再调用。声明格式如下: extern 返回值类型 函数名(参数表); 例如: extern unsigned char right_shift ( char, char );
[单片机]
Keil C51中函数指针的使用
函数指针在C语言中应用较为灵活。在单片机系统中,嵌入式操作系统、文件系统和网络协议栈等一些较为复杂的应用都大量地使用了函数指针。Keil公司推出的C51编译器是事实上80C51 C编程的工业标准,它针对8051系列CPU硬件在标准ANSI C的基础上进行了扩展;但由于编译器及8051体系结构的限制,造成了在使用函数指针时有很多与ANSI C不同的地方。下面举例说明在不同的情形下函数指针的使用。以下代码均在Keil μVision3、v8.08 C51、默认优化等级的开发环境下验证通过。 1、指向固定地址的指针 在程序设计中,常需要跳转到某一特定的地址上执行,如引导程序的设计。可通过如下C语言实现: int mai
[单片机]
C51单片机学习笔记之中断系统
简介 什么是中断 在CPU 运行主程序时,暂停去处理别的程序,然后再回来处理主程序,这就是中断。 中断源 共8个,外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3。 中断寄存器 ps:优先级从高到低。 TCON寄存器 TF0(TF1)——计数溢出标志位,当计数器计数溢出时,该位置1。 TR0(TR1)——定时器运行控制位 当TR0(TR1)=0 停止定时器/计数器工作 当TR0(TR1)=1 启动定时器/计数器工作 IE0(IE1)——外部中断请求标志位 IT1(IT0)——外部中断触发方式选择位 IE寄存器 EA:中断的总开关,E
[单片机]
Hash查找法在Keil C51中的实现
摘要:散列(hash)是一种重要的存储方法,也是一种常见的查找方法。它是指在记录的存储位置和它的关键字之间建立一个确定的对应关系。本文以射频卡门禁控制器为例,说明用射频卡卡号作为关键字,用Hash查找法确定此卡能否开门,并给出对应的Keil C51程序。 单片机应用系统中,经常要涉及到数据的存储和查找。以射频卡门禁系统为例,见图1。系统由51系列单片机、射频卡(RF卡)读卡电路、存储单元24C256、继电器等部分组成。其基本原理为:用户刷卡后,RF卡读卡电路读出卡号,通过I/O口线送入单片机。单片机收到卡号后,在存储单元中查找此卡是否允许开门。如允许,则命令继电器动作,打开电磁门锁:如不允许,则返回。 iframe id="
[单片机]
Keil c51的应用及特性解析
Keil c51号称作为51系列单片机最好的开发环境,大家一定都很熟悉。它的一些普通的特性大家也都了解,(书上也都说有)如:因为51内的RAM很小,C51的函数并不通过堆栈传递参数(重入函数除外),局部变量也不存储在堆栈中,而是存在于固定的RAM中及寄存器中。那么看一下下面的程序。 void fun1(unsigned char i) { } 正常情况参数i通过R7传入函数,那么它的实际地址在什么地方呢?就是R7吗?回答这个问题之前我们先来了解keil c51的几个有趣的特性(不考虑重入函数)。 一、函数在调用前定义与在调用后定义产生的代码是有很大差别的(特别是在优化级别大于3级时)。(本人也不太清楚为什么,大概因为在
[单片机]
stc电子表c51程序V2.0
电路很简单我就不画了,是stc系列的单片机做的,显示部分就是2个74hc573芯片连到P1口,然后用p3.0控制段选,按键的定义程序里有说明。很容易就能搭出来,下图是效果图,自己用万用板焊的,技术不行。到处都是飞线呵呵,请大家多多指教 程序的c51语言完整版本的下载地址: http://www.51hei.com/f/biaoc4.rar #include stc90.h #define uchar unsigned char #define uint unsigned int uchar d0,ss,gs,sf,gf,sm,gm; uchar e1,e2,e3,e4,e5,e6; uchar s1,q1; uchar
[单片机]
STC89C52R并行驱动LCD12864(asm/c51)
/*已实验论证 AT89C52与LCD12864 未用BF(忙信号)查询,延时1ms 不能进行BF查询*/ rs bit p2.4 rw bit p2.5 e bit p2.6 psb bit p2.1 res bit p2.3 com equ 30h date equ 31h org 0000h sjmp main org 0030h main:mov p0,#00h mov p2,#10000111b lcall delay setb res mov sp,#60h lcall init lcall page1 clr p1.7 sjmp $ init:mov com,#00110000b;基本
[单片机]