晶振11.0592M/********************************************************************/
/*******************I2C模拟通信及AT24C02底层驱动程序****************/
/********************************************************************/
//AT24C02
//delayus: 延时约5us
void delayus()
{
;;
}
//i2c:init I2C总线初始化
void i2c_init()
{
SCL = 1;
delayus();
SDA = 1;
delayus();
}
//lcd:start 起始信号
void start()
{
SCL = 1;
SDA = 1;
delayus();
SDA = 0;
delayus();
}
//i2c:stop 停止信号
void stop()
{
SCL = 1;
SDA = 0;
delayus();
SDA = 1;
delayus();
}
//i2c:ack 从机应答信号
void ack()
{
uchar i = 0;
//在SCL = 1时,读取SDA的数据判忙
SCL = 1;
delayus();
while((SDA == 1)&& i < 250)
i++;
//判忙之后,等待发送数据/命令
SCL = 0;
delayus();
}
//nack: 主机非应答信号
void nack()
{
//主机发送非应答信号1
SCL = 1;
delayus();
SDA = 1;
delayus();
//等待发送数据/命令
SCL = 0;
delayus();
}
//write:byte 写一个字节数据
void write_byte(uchar date)
{ //从最高位发送
uchar i, temp;
temp = date;
for(i = 0; i < 8; i++)
{
temp <<= 1;
SCL = 0;
delayus();
SDA = CY;
delayus();
SCL = 1;
delayus();
SCL = 0;
delayus();
}
//等待从机应答
SCL = 0;
delayus();
SDA = 1;//置1,等待从机应答0
delayus();
}
//read:byte 读一个字节数据
uchar read_byte()
{
uchar i, j, k;
SCL = 0;
delayus();
for(i = 0; i < 8; i++)
{
SCL = 1;
delayus();
j = SDA;
k = (k << 1) | j;
delayus();
SCL = 0;
delayus();
}
delayus();
return (k);
}
//write:AT24C02 写AT24C02
void write_c02(uchar address, uchar date)
{
start();
write_byte(write_add);
ack();
write_byte(address);
ack();
write_byte(date);
ack();
stop();
delay(12);
}
//read:AT24C02 读AT24C02
uchar read_c02(uchar add)
{
uchar date = 0;
start();
write_byte(write_add);
ack();
write_byte(add);
ack();
start();
write_byte(read_add);
ack();
date = read_byte();
nack();
return (date);
}
关键字:单片机 I2C驱动 子程序
引用地址:单片机I2C驱动子程序
/*******************I2C模拟通信及AT24C02底层驱动程序****************/
/********************************************************************/
//AT24C02
//delayus: 延时约5us
void delayus()
{
;;
}
//i2c:init I2C总线初始化
void i2c_init()
{
SCL = 1;
delayus();
SDA = 1;
delayus();
}
//lcd:start 起始信号
void start()
{
SCL = 1;
SDA = 1;
delayus();
SDA = 0;
delayus();
}
//i2c:stop 停止信号
void stop()
{
SCL = 1;
SDA = 0;
delayus();
SDA = 1;
delayus();
}
//i2c:ack 从机应答信号
void ack()
{
uchar i = 0;
//在SCL = 1时,读取SDA的数据判忙
SCL = 1;
delayus();
while((SDA == 1)&& i < 250)
i++;
//判忙之后,等待发送数据/命令
SCL = 0;
delayus();
}
//nack: 主机非应答信号
void nack()
{
//主机发送非应答信号1
SCL = 1;
delayus();
SDA = 1;
delayus();
//等待发送数据/命令
SCL = 0;
delayus();
}
//write:byte 写一个字节数据
void write_byte(uchar date)
{ //从最高位发送
uchar i, temp;
temp = date;
for(i = 0; i < 8; i++)
{
temp <<= 1;
SCL = 0;
delayus();
SDA = CY;
delayus();
SCL = 1;
delayus();
SCL = 0;
delayus();
}
//等待从机应答
SCL = 0;
delayus();
SDA = 1;//置1,等待从机应答0
delayus();
}
//read:byte 读一个字节数据
uchar read_byte()
{
uchar i, j, k;
SCL = 0;
delayus();
for(i = 0; i < 8; i++)
{
SCL = 1;
delayus();
j = SDA;
k = (k << 1) | j;
delayus();
SCL = 0;
delayus();
}
delayus();
return (k);
}
//write:AT24C02 写AT24C02
void write_c02(uchar address, uchar date)
{
start();
write_byte(write_add);
ack();
write_byte(address);
ack();
write_byte(date);
ack();
stop();
delay(12);
}
//read:AT24C02 读AT24C02
uchar read_c02(uchar add)
{
uchar date = 0;
start();
write_byte(write_add);
ack();
write_byte(add);
ack();
start();
write_byte(read_add);
ack();
date = read_byte();
nack();
return (date);
}
推荐阅读最新更新时间:2024-03-16 14:00
基于AVR单片机PWM功能的数控恒流源研制
随着电子技术的深入发展,各种智能仪器越来越多,涉及领域越来越广,而仪器对电源的要求也越来越高。现今,电源设备有朝着数字化方向发展的趋势。然而绝大多数数控电源设计是通过高位数的A/D和D/A芯片来实现的,这虽然能获得较高的精度,但也使得成本大为增加。本文介绍一种基于AVR单片机PWM功能的低成本高精度数控恒流源,能够精确实现0~2A恒流。 系统框图 图1为系统的总体框图。本系统通过小键盘和LCD实现人机交流,小键盘负责接收要实现的电流值,LCD 12864负责显示。AVR单片机根据输入的电流值产生对应的PWM波,经过滤波和功放电路后对压控恒流元件进行控制,产生电流,电流再经过采样电阻到达负载。同时,对采样电阻两端信号进行差分和
[单片机]
赛普拉斯推出全新Traveo MCU解决方案
美国加利福尼亚州圣何塞市 赛普拉斯半导体(NASDAQ:CY)今日宣布其单电源供电Traveo汽车微控制器(MCU)家族的新系列S6J342xxx现已开始提供样品。全新S6J342xxx系列可为汽车车身电子系统应用提供安全高速的联网服务;其支持用于车内高速网络服务的控制器局域网络灵活数据率( Controller Area Network Flexible Data-rate ,简称CAN FD)标准,允许海量数据在多个CAN节点间进行交换;该MCU系列产品采用增强型安全硬件扩展(enhanced Secure Hardware Extension,简称eSHE),能够防止未经授权的电子控制单元(ECU)连接,从而保护车内网络的数据
[汽车电子]
基于PIC16F876A单片机的轨道压力测试仪的实现
轨道电路是信号联锁的室外重要设备,起着保证行车和调车作业安全的作用。它能监督检查某一固定区段内的线路(包括站线)是否有列车运行、调车作业或车辆占用的情况,并能显示该区段内的钢轨是否完整。它是以钢轨为导线,轨缝间用接续线连续起来,一端接电源,另一端连接受电器,通过轨道电流来工作。 轨道电路能否正常工作直接影响到列车的安全行驶,因此,对轨道电路的检测尤为重要,目前市场上的检测设备还很少,而且普遍存在功耗大,价格昂贵,体积大等不足。为此,本文通过对轨道电路分析研究,设计一种高精度的压力测试仪器来模拟火车对轨道的压力,从而验证轨道电路的性能。 系统的组成及其工作原理 本系统以PIC16F876A单片机为核心,通过软件编
[测试测量]
单片机开发中应掌握的基本技巧
在单片机应用开发中,代码的使用效率问题、单片机抗干扰性和可靠性等问题仍困扰着工程师。为帮助工程师解决单片机设计上的难题,现根据论坛中的讨论归纳出单片机开发中应掌握的几个基本技巧。 一、 如何提高C语言编程代码的效率 邓宏杰指出,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。 如果使用C编程时,要达到最高的效率,最好熟悉所使用的C编译器。先试验一下每条C语言编译以后对应的汇编语言的语句行数,这样就可以很明确的知道效率。在今后编程的时候,使用编译效率最高的语句。 他指出,各家的C编译器都会有一定的差异,故编译效率也会有所不同,优秀的嵌入式系统C编译器代码长度和执行时间仅比以汇编语言编写的同样功
[单片机]
用单片机实现SRAM工艺FPGA的加密应用
摘要:首先对采用SRAM工艺的FPGA的保密性和加密方法进行原理分析,然后提出一种实用的采用单片机产生长伪随机码实现加密的方法,并详细介绍具体的电路和程序。
关键词:静态随机存储器(SRAM) 现场可编程门阵列(FPGA) 加密
在现代电子系统设计中,由于可编程逻辑器件的卓越性能、灵活方便的可升级特性,而得到了广泛的应用。由于大规模高密度可编程逻辑器件多采用SRAM工艺,要求每次上电,对FPGA器件进行重配置,这就使得可以通过监视配置的位数据流,进行克隆设计。因此,在关键、核心设备中,必须采用加密技术保护设计者的知识产权。
1 基于SRAM工艺FPGA的保密性问题
通常,采用SRAM工艺的FPGA芯片的的配置方法主要
[单片机]
AVR单片机控制发光二极管
点亮ARV单片机开发板上的一个LED灯 原理图: 分析:上面的截图就是单片机和LED灯的连接原理图,其中J6是一个排阻,起到限流的作用,防止LED电流过大而烧坏。 排阻的内部就是一组并联的电阻: bubuko.com,布布扣 提示: 算一下这个排阻的电阻的大小,二极管的工作电流是3mA,工作电压时1.7V,VCC的电压时5V。所以电阻上的电流是3mA,电压是3.3V,所以电阻的阻值是1.1KΩ。 因为所有的二极管都是通过一个限流电阻共阳极的,所以只需要在Q端给一个低电平就能点亮这个发光二极管。Q端的电平通过一个573锁存器受控于D端的电平高低,也就是单片机的PB端口。这样我们就能通过写程序控制PB端口的高低
[单片机]
用单片机+DAC0832来解码wav音乐C51程序
本程序是从国外一个论坛下载的用51单片机+dac0832 播放wav音乐,音乐数据可以从串行输入,如果声音很小的话可以把数据接入功放的输入端.完整的程序源代码从这里下载 http://www.51hei.com/f/waefd.rar 下面是main文件: /*************************************************************** name : main.c desctiption : mp3 main file for testing serial port author : coolfire update : 6/17/07 /*************
[单片机]
AVR,51单片机IO结构
AVR的IO是真正双向IO结构,由于大部分网友都是从标准51转过来的,受标准51的准双向IO和布尔操作概念影响,没能掌握AVR的IO操作,所以有必要撰文说明一下 其实采用真正双向IO结构的新型MCU很多,常用的有 增强型51,PIC,AVR等 先简单的回顾一下标准51的准双向IO结构 这种准双向IO结构的特点是 1 输出结构类似 OC门,输出低电平时,内部NMOS导通,驱动能力较强(800uA);输出高电平靠内部上拉电阻,驱动能力弱(60uA)。 2 永远有内部电阻上拉(P0口除外),高电平输出电流能力很弱,所以即使IO口长时间短路到地也不会损坏IO口 (同理,IO口低电平输出能力较强,作低电平输出
[单片机]
小广播
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐
最新单片机文章
更多精选电路图
更多热门文章
更多每日新闻
更多往期活动
厂商技术中心