当前位置:文档之家› 51单片机模拟I2C总线的数据传送

51单片机模拟I2C总线的数据传送

51单片机模拟I2C总线的数据传送
51单片机模拟I2C总线的数据传送

51单片机模拟I2C总线的数据传送

学习交流QQ群——126500542(验证信息:千寻琥珀心)本文主要介绍I2C总线的数据传送、数据传输的协议以及传输的格式并对单片机与I2C总线的接口予以说明,并给出单片机口模拟I2C主机的时序,其实时序一看懂了,程序也就出来了。汇编和C.在将单片机模拟I2C之前,先来了解一下I2C。

I2c总线是由一根数据线SDA和一根时钟线SCL组成,他们都是双向传输线,既可用于发送也可用于接收。一般总线挂接在主器件上时处于备用状态即处于空闲状态,要求I2C总是显示为高电平,故需要在电路中对这两总线加上拉电阻。将其拉为高电平,只用当需要关闭I2C总线时,SCL线才会变为低电平。

在I2C总线上,SDA是数据线,SCL为时钟线,注意每传送一位数据,都要有一个对应的SCL线上的脉冲信号。即SDA和SCL是一一对应的,总线又规定,在传送数据的时候,SCL为高电平时要求SDA线上的数据稳定。也就是说当SCL为高电平时,不允许SDA线上的数据发生变化。当SCL线为低电平时,才允许SDA线上的数据发生变化。注意数据传送时,先传送最高位,好I2C总线上的数据信号基本上就这样了,简单的说了一下,下面我们就来看看其他几个信号。起始信号、停止信号、应答信号和非应答信号。起始信号顾名思义,即为发送数据的开始,停止信号即为发送数据的结束。应答信号,由于i2c总线是双总线,数据线只有SDA,所以总线规定,要求每发送完一个字节的数

据,就得产生一个应答信号,但需要注意的是,这里的应答信号不是有从机产生的,而是像起始信号和停止信号一样是由主机产生的。发送设备在应答时钟脉冲高电平期间释放SDA线(高电平),转由接收器控制。接收设备在这个时钟内必须将SDA拉为低电平,以产生有效地应答信号。下面将给出时序图。(简言之就是有主机控制的SDA线转由从机控制,以相应主机数据已成功发送)但是如果从机不能接收下一个字节,(注意此处是下一个字节,说明上一字节已经接收完成并产生应答)比如正在处理一个外部中断,则可以先把SCL线拉低,是主机处于等待状态。当从机准备好时,即中断处理完成时再释放SCL线,是数据传送继续进行。但是当数据传送完但是没有产生应答信号时,如一个从机正在处理一个实时时间,不能接受(或不能产生应答信号时),从机必须使SDA线保持高电平,此时主机产生一个信号,即为非应答信号,是传送异常结束。但是当主机作为接收器时,主机对最后一个字节不予应答(非应答信号),以向从机之处数据传送结束,从机释放SDA线使其变为高电平,使主机产生一个结束信号。

晕,感觉上面写的看着挺乏的,没办法,美工不好,又不是写小说。只以作为一个参考资料罢了。当然主要是为我自己服务。以后用着稍微方便点。虽然不敢说方便。也可稍微加深了一下对I2C的理解与记忆。何乐而不为。

好,下面我们来看看I2C总西安的传输协议。传输协议吗,

一样,顾名思义,任何一事物他都有自己内在的规律,只有理解了这种规律和他们相处才会更融洽些,而不会陌生的很尴尬。在上面我们已经对I2C总线的传输协议小坐了一点介绍,下面我们继续接着,当主机发送一个起始信号后,接着他就得发送数据了,发送的第一个字节数据位寻址字节,此字节决定了选取从机中的哪一个从机,相当于片选信号,在这8位字节中,其中高7位为从机地址,最后一位为读写方向控制位,何为读写方向,简言之就是控制主机是读信息还是写信息,当此位为0时,主机写,当此位为1时,主机读。好,我们还是看看他的高7位吧,当主机发送一个寻址自节后,系统中的每个从机都会将从7位数据与自己的地址进行比较,若相同则从机会应答主机寻址。在这7位数据中,高四位为固有地址,我们是不能对其进行操作编程的,但是后三位是可操作,可编程的。所以可以设置这三位来选择哪个从机被主机选中,这三位的排列方式有2^3=8种,故总线上可挂接8个I2C器件。

对于主控器件也就是主机的读写操作,这里就不做介绍了,您可以根据上述的起始信号、应答信号、非应答信号、停止信号7个位和R/W自行思考(注意每发送完一个字节都要有一个应答位,在发送完寻址字节之后,就是发送数据了,数据为8位。之后也要寻址信号,如果之后不发送数据了,可以直接一停止信号结束,但是如果还想发送或者改变发送方向,可以重新一个起始信号,然后在寻址通过改变R/W来改变传送方向。。。)再次指出

的是如果主机作为接收器件即读取从机的信息,最后一个字节,主机不发送应答信号即发送非应答信号,以向从机说明接收完毕,让从机停止发送。哎,要命啊,没办法,人家规定的,线少了,规矩也就多了。

综上部分描述,以下是别人给出的结论

·无论总线处于何种方式,起始信号、终止信号和寻址字节均由主控器件发送和被控器件接收。

·寻址字节中7位地址为器件地址,即被寻址的被控器件的固有地址,R/W方向由于指定SDA线上数据传送的方向,R/W=0为主控器件写被控器件收,R/W=1为主控器件收被控器件写。

·总线上传输的每个字节后必须跟一个应答或非应答。

感觉上面总结的比较好,几句就概括了我写的大部分内容。可是这几句,呵呵,就这几句,呵呵,几乎没多少用,就像,有钱花不出去一样,不过,没事,留着,总有会用到的。

好,下面我们就来看看各个信号的时序,并给出相应的程序起始信号:

根据上面的时序直接写程序就行了,从SDA开始,假设使用12MHZ晶振,则每个机器周期为1us。则程序如下(一下程序也按此)

STA:

SETB SDA

SETB SCL//SDA起始条件建立为大于4.7US

NOP

NOP

NOP

NOP

NOP

CLR SDA//按时序图拉低

NOP

NOP

NOP

NOP

NOP//SCL在SDA拉低时延时大于4US

CLR SCL

RET

C程序

V oid i2c_start()

{

SDA=1;

SCL=1;

NOP;//此处的NOP将会在最后给出宏定义

SDA=0;

NOP;

SCL=0;

}

停止信号:

汇编:STOP: CLR SDA SETB SCL NOP NOP NOP NOP NOP SETB SDA NOP NOP NOP NOP

NOP

CLR SDA CLR SCL RET

C语言

V oid i2c_stop() {

SDA=0;

SCL=1;

NOP;

SDA=1;

NOP;

SDA=0;

SCL=0;

}

应答信号:

汇编YINGDA:

CLR SDA SETB SCL NOP

NOP

NOP

NOP

NOP

CLR SCL SETB SDA

RET

C语言:

V oid i2c_yingda()

{

SDA=0;

SCL=1;

NOP;

SCL=0;

SDA=1 }

非应发信号:

汇编:FEI:

SETB SDA SETB SCL NOP

NOP

NOP

NOP

NOP

CLR SCL

CLR SDA

C语言:

V oid i2c_fei()

{

SDA=1;

SCL=1;

NOP;

SCL=0;

SDA=0;

}

好,本文到此也就告一段落了,置于下面的发送接收单个字节,发送接收多个字节,以及应答位检测的问题,在这里就不在将程序贴出了,感兴趣的话,可以百度一下,其实上述的时序知道怎么写了,下面的就好做了,就当作为一个作业留给你们了。嘻嘻。如果还有疑问的话,可加上面的QQ群进行讨论。最后我将上面的C语言及汇编时的端口定义一下。当然这只对需要的人的。

SCL BIT 80H.0(即P0.0)

SDA BIT 80H.1(即P0.1)

C部分的定义

#define NOP {_nop_();_nop_();_nop_();_nop_();_nop_();} Sbit SCL=P0^0;

Sbit SDA=P0^1;

其中要向使用_nop_()函数必须得有头文件intrins.h

即要有:#include

基于51单片机的乒乓游戏机设计附Proteus仿真_毕业设计

基于51单片机的乒乓游戏机设计附Proteus仿真 基于51单片机的乒乓游戏机设计附Proteus仿真 目录 1 绪论 (1) 1.1 本设计的研究背景和研究目的 (1) 1.2 国内外研究现状 (1) 1.3 本设计的任务和设计方法 (2) 1.3.1 设计任务 (2) 1.3.2 设计方法 (2) 2 乒乓游戏机设计方案 (3) 2.1 基于单片机的乒乓游戏机设计 (3) 2.1.1 硬件设计 (3) 2.1.2 软件设计 (4) 2.2 基于FPGA的乒乓游戏机设计 (4) 2.3 方案比较与选择 (5) 3硬件电路的设计 (6) 3.1 硬件核心电路选择 (6) 3.1.1 单片机STC89C51简介 (6) 3.1.2 单片机端口分配 (7) 3.2 电源电路的设计 (8) 3.3 时钟电路的设计 (9) 3.4 复位电路的设计 (10) 3.5 按键电路的设计 (10) 3.6 模拟球台电路的设计 (12) 3.6.1 译码器简介 (12) 3.6.2发光二极管简介 (14) 3.6.3 模拟球拍电路的设计 (15) 3.7 显示电路的设计 (15) 3.7.1 LCD1602简介 (15) 3.7.2 显示电路的设计 (16)

3.8 乒乓游戏机总电路的设计 (17) 4 乒乓游戏机的软件设计及编程 (18) 4.1 主程序的设计及功能实现 (19) 4.2 按键组的设计及功能实现 (20) 4.2.1 球拍模拟子程序 (20) 4.2.2 暂停/开始子程序 (20) 4.3 发球程序的设计及功能实现 (21) 4.4 线路程序的设计及功能实现 (21) 4.4.1 线路选择子程序 (21) 4.4.2 LED点阵子程序 (22) 4.5 回球程序的设计及功能实现 (22) 4.6 LCD显示程序设计及功能实现 (23) 4.7 设计源程序 (24) 5 系统调试及分析 (24) 5.1 仿真调试及分析 (24) 5.1.1 Proteus软件简介 (24) 5.1.2 Keil uVision4软件简介 (25) 5.1.3 仿真调试 (25) 5.1.4 仿真调试的结果分析 (28) 5.2 实物调试及分析 (28) 5.2.1 制作实物的过程 (28) 5.2.2 进行实物调试 (28) 5.2.3 实物调试的结果分析 (31) 6 结论与展望 (32) 谢辞(Acknowledge) (33) 参考文献 (34) 附录1:程序 (36) 附录2:元件清单 (51)

51单片机的模拟IIC总线程序

#include /*头文件的包含*/ #include #define uchar unsigned char /*宏定义*/ #define uint unsigned int #define _Nop() _nop_() /*定义空指令*/ /* 常,变量定义区 */ /*端口位定义*/ sbit SDA=P1^3; /*模拟I2C数据传送位*/ sbit SCL=P1^2; /*模拟I2C时钟控制位*/ /*状态标志*/ bit ack; /*应答标志位*/ void Start_I2c() { SDA=1; /*发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop(); /*起始条件建立时间大于4.7us,延时*/ _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /*发送起始信号*/ _Nop(); /* 起始条件锁定时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /*钳住I2C总线,准备发送或接收数据 */ _Nop(); _Nop(); }

void Stop_I2c() { SDA=0; /*发送结束条件的数据信号*/ _Nop(); /*发送结束条件的时钟信号*/ SCL=1; /*结束条件建立时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /*发送I2C总线结束信号*/ _Nop(); _Nop(); _Nop(); _Nop(); } /******************************************************************* 字节数据传送函数 函数原型: void SendByte(uchar c); 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0 假) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。 ********************************************************************/ void SendByte(uchar c) { uchar BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/ { if((c<

利用51单片机实现SPI总线通信

利用51单片机实现SPI总线通信 一:题目及要求 1:基本内容 1.1:理解51单片机和SPI总线通信的特性和工作原理; 1.2:以51单片机为核心分别设计SPI总线通信发送及接收电路; 1.3:熟练应用C语言或汇编语言编写程序; 1.4:应用Protues软件完成仿真,仿真结果需包括示波器波形,通过一定的 方式(如LED灯、LED显示器等)显示发送和接受数据结果; 1.5:下载程序到开发板,实现串口通信功能(选做); 1.6:提交设计报告。 2:基本要求 本设计采用三线式SPI总线,一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO。时钟极性CPOL=0,时钟相位CPHA=0。 二:设计思路 1:掌握51单片机和SPI总线通信的工作原理; 2:利用1中的原理设计SPI总线通信发送和接受电路; 3:编程模拟SPI时序,包括串行时钟、数据输入和输出; 4:利用Protues软件仿真,观察结果; 5:顺利仿真后,下载到开发板实现串行通信功能。 三:设计过程及内容 1:SPI总线简介 SPI ( Serial Peripheral Interface ——串行外设接口) 总线是Motorola公司推出的一种同步串行接口技术。SPI总线系统是一种同步串行外设接口,允许MCU(微控制器)与各种外围设备以串行方式进行通信、数据交换。外围设备包括FLASHRAM、A/ D 转换器、网络控制器、MCU 等。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现

(整理)较为全面的基于PROTEUS仿真51单片机动态数码管课程设计(WORD版)

单片机课程设计 题目动态数码管显示 学院机电工程学院 专业班级电子信息工程12-1班 姓名 组员 指导教师张、王老师 2015 年 5 月30 日

课程设计量化评分标准

目录 一、概述 (1) 1. 单片机简介 (1) 2. Proteus简介 (2) 3. 设计任务与要求 (3) 二、硬件设计 (3) 1. 单片机最小系统设计 (1) 2. 数码管显示部分 (4) 3. 数码管驱动部分 (5) 三、软件设计 (6) 1. 仿真原理图 (6) 2. 仿真参数设置 (6) 3. 仿真结果 (7) 4. 程序流程图 (8) 5. 程序代码.................................................... .9 四、心得体会............................................... (11) 五、参考文献 (12)

精品文档 一、概述 1. 单片机简介 如图1.1和图1.2分别为PDI P封装的AT89C52引脚图和实物图 图1.1 引脚图图1.2 实物图 AT89C52是一个低电压,高性能CMOS8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。 AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。 AT89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。本课程设计中使用的是PDIP封装的AT89C52单片机。 2.Proteus简介 如图1.3为Proteus7.0的工作界面图

基于51单片机的USB键盘设计与实现

三江学院 本科生毕业设计(论文)题目基于51单片机的USB键盘设计与实现高职院院(系)电气工程及其自动化专业 学生姓名梁邱一学号 G105071013 指导教师孙传峰职称讲师 指导教师工作单位三江学院 起讫日期 2013年12月10日至2014年4月12日

摘要 随着计算机技术的不断更新和多媒体技术的快速发展,传统的计算机外设接口因为存在许多缺点已经不能适应计算机的发展需要。比起传统的AT,PS/2,串口,通用串行总线USB,具有速度快,使用方便灵活,易于扩展,支持即插即用,成本低廉等一系列优点,得到了广泛的应用。 本论文阐述了51系列单片机和USB的相关内容,详细介绍了系统的一些功能设计,包括硬件设计和软件设计。在程序调试期间用简单的串口通信电路,通过串口调试助手掌握了USB指令的传输过程,这对整个方案的设计起到了很大的指导作用。论文以单片机最小系统配合模拟键盘组成的USB键盘硬件系统,通过对D12芯片的学习与探索,在其基本命令接口的支持下,结合硬件进行相应的固件程序设计,使其在USB协议下,实现USB模块与PC的数据通信,完成USB键盘的功能模拟。 总结论文研究工作有阐述USB总线的原理、对本设计的系统要求作出了分析、根据要求选定元件和具体编程方案、针对系统所要实现的功能对相关芯片作了详细介绍以及在硬件部分设计了原理图。 关键词:USB;D12;PC

Abstract With the rapid development of computer technology and multimedia technology constantly updated, traditional computer peripheral interface because there are many shortcomings have been unable to meet the development needs of the https://www.doczj.com/doc/922206360.html,pared to traditional AT, PS / 2, serial, Universal Serial Bus USB, with fast, flexible and easy to use, easy to expand, support Plug and Play, a series of advantages, such as low cost, has been widely used. This paper describes the 51 series and USB related content, detailing some of the features of the system design, including hardware and software design.During debugging a simple serial communication circuit, through the serial port debugging assistant master USB transfer instructions, which designed the entire program has played a significant role in guiding.Thesis smallest single-chip system consisting of analog keyboard with a USB keyboard hardware system, by learning and exploration D12 chips, with the support of its basic command interface, in conjunction with the corresponding hardware firmware design, making it in the USB protocol, USB module data communication with the PC, the USB keyboard to complete the functional simulation. This paper summarizes research work has elaborated the principle of the USB bus, the system is designed to require the analysis, components and solutions based on the specific requirements of the selected programming for the system to achieve the function of the relevant chips are described in detail in the hardware part of the design as well as the principle of Figure. Keywords:USB;D12;PC

51单片机+proteus仿真PWM

#include unsigned char flag; unsigned int x; unsigned int y; #define time 800 void main() { EA=1; //开总中断 ET0=1; //定时器T0中断允许 TMOD=0x02; //使用定时器T0的模式2 TH0=0; //定时器T0的高8位赋初值 TL0=0; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 x=time; y=0; while(1)//无限循环等待中断 ; } /************************************************************** 函数功能:定时器T0的中断服务程序 **************************************************************/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数 //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{ if(flag==0) { TH0=256-y; //定时器T0的高8位重新赋初值 TL0=256-y; //定时器T0的高8位重新赋初

P1=1; if((--x)==0) { flag=1; x=time; if((--y)==0) { y=100; } } } if(flag==1) { TH0=y; //定时器T0的高8位重新赋初值 TL0=y; //定时器T0的高8位重新赋初 P1=0; if((--x)==0) { flag=0; x=time; if((--y)==0) { y=100; } } } }

51单片机教程

原作:平凡的单片机

1、何谓单片机一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。 天!PC中的CPU一块就要卖几千块钱,这么多东西做在一起,还不得买个天价!再说这块芯片也得非常大了。不,价格并不高,从几元人民币到几十元人民币,体积也不大,一般用40脚封装,当然功能多一些单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只8只引脚。为什么会这样呢?功能有强弱,打个比方,市场上面有的组合音响一套才卖几百块钱,可是有的一台功放机就要卖好几千。另外这种芯片的生产量很大,技术也很成熟,51系列的单片机已经做了十几年,所以价格就低了。既然如此,单片机的功能肯定不强,干吗要学它呢?话不能这样说,实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用PIII?应用的关键是看是否够用,是否有很好的性能价格比。所以8051出来十多年,依然没有被淘汰,还在不断的发展中。 2、MCS51单片机和8051、8031、89C51等的关系我们平常老是讲8051,又有什么8031,现在又有89C51,它们之间究竟是什么关系? MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031的名称。INTEL 公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,当然,功能或多或少有些改变,以满足不同的需求,其中89C51就是这几年在我国非常流行的单片机,它是由美国ATMEL 公司开发生产的。以后我们将用89C51来完成一系列的实验。 一、单片机的外部结构 拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。1、电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40引脚,负极(地)接20引脚。2、振蒎电路:单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶振,电容,连上就可以了,按图1接上即可。3、复位引脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。4、EA引脚:EA引脚接到正电源端。至此,一个单片机就接好,通上电,单片机就开始工作了。 我们的第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个引脚相连,否则单片机就没法控制它了,那么和哪个引脚相连呢?单片机上除了刚才用掉的5个引脚,还有35个,我们将这个LED和1脚相连。(见图1,其中R1是限流电阻) 按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED才发亮。因此要1脚我们要能够控制,也就是说,我们要能够让1引脚按要求变为高或低电平。即然我们要控制1脚,就得给它起个名字,总不能就叫它一脚吧?叫它什么名字呢?设计51芯片的INTEL公司已经起好了,就叫它P1.0,这是规定,不可以由我们来更改。

51单片机I2C接口实验报告

(预习报告) 一、实验目的 掌握基于MCS-51系统的总线扩展的方法 二、实验内容 1.利用MCS-51系统的P1口模拟总线接口,扩展串口存储器24C16,每次存入1个数据,并反复读回,用示波器测试读回的波形。(分别以数据AAH,55H测试) 2.将MCS-51系统片内存储器的10个数据存入串口存储器24C16并读回,分别设置存入的地址为页地址+00H和页地址+07H。读回为地址页地址+00H,将读回的数据存放在片内存储器,并与发送数据进行比较。 三、硬件原理图 只需将24C16的SCL与P1.1相连,SDA与P1.0相连即可。 24C16资料:

四、程序清单 8-4-1 ACK BIT 10H ;应答位判断标志 SDA BIT P1.0 ;数据线 SCL BIT P1.1 ;时钟线 ORG 0030H SEND: LCALL START ;启动 MOV A,#0A0H ;控制字节为#0A0H LCALL WRBYTE ;发送控制字节 LCALL CACK ;接收应答 JNB ACK,SEND ;收到无效应答,重新发送 MOV A,#30H ;写入的地址为#30H LCALL WRBYTE ;发送地址 LCALL CACK ;接收应答 JNB ACK,SEND ;收到无效应答,重新发送 MOV A,#0AAH ;写入的数据位#0AAH LCALL WRBYTE ;发送数据 LCALL CACK ;接收应答 JNB ACK,SEND ;收到无效应答,重新发送 LCALL STOP ;停止 LCALL DELAY ;发送与接收之间加入一段延时 READ: LCALL START ;启动 MOV A,#0A0H ;控制字节为#0A0H LCALL WRBYTE ;发送控制字节 LCALL CACK ;接收应答 JNB ACK,READ ;收到无效应答,重新启动

单片机常用总线讲解

第8章单片机常用总线讲解 8.1 C总线接口 80C51单片机本身不具有总线接口,但是通过软件进行模拟,可以挂接具有C接口的芯片。 8.1.1 C总线的介绍 串行扩展总线在单片机系统中的应用是目前单片机技术发展的一种趋势。在目前比较流行的几种串行扩展总线中,总线以其严格的规范和众多带接口的外围器件而获得广泛应用。总线是PHILIPS公司推出的芯片间串行传输总线,它由两根线组成,一根是串行时钟线(SCL),一根是串行数据线(SDA)。主控器利用串行时钟线发出时钟信号,利用串行数据线发送或接收数据。总线由主控器电路引出,凡具有接口的电路(受控器)都可以挂接在总线上,主控器通过总线对受控器进行控制。 随着总线研究的深入,总线已经广泛应用于视/音频领域、IC卡行业和一些家电产品中,在智能仪器、仪表和工业测控领域也越来越多地得到应用。 8.1.2 总线的特点 总线的广泛应用是同它卓越的性能和简便的操作方法分不开的。总线的特点主要表现在以下几个方面: 硬件结构上具有相同的硬件接口界面。总线系统中,任何一个总线接口的外围器件,不论其功能差别有多大,都是通过串行数据线(SDA)和串行时钟线(SCL)连接到总线上。这一特点给用户在设计用用系统中带来了极大的便利性。用户不必理解每个总线接口器件的功能如何,只需将器件的SDA和SCL引脚连到总线上,然后对该器件模块进行独立的电路设计,从而简化了系统设计的复杂性,提高了系统抗干扰的能力。 线接口器件地址具有根大的独立性。每个接口芯片具有唯一的器件地址,由于不能发出串行时钟信号而只能作为从器件使用。各器件之间互不干扰,相互之间不能进行通信,各个器件可以单独供电。单片机与器件之间的通信是通过独一无二的器件地址来实现的。 软件操作的一致性。由于任何器件通过总线与单片机进行数据传送的方式是基本一样的, .v .. ..

51单片机行列式键盘的应用proteus仿真+源程序

51单片机行列式键盘的应用proteus仿真本人喜好单片机设计,精通单片机编程和硬件电路设计,在空余之际编一些小程序与大家分享,有哪位路过,请多多指教,希望大家在一起能互相学习,互相进步。这里的程序已经测试通过。发表出来,一来可以帮助同样爱好单片机的朋友们,二来,希望能结交一些同道中人,共同学习。 源程序: #include #include void delayms(unsigned char ms); unsigned char data dis_digit; unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xff}; unsigned char data dis_index; void main() { P2=0xff; P1=0x00; dis_index=0; dis_digit=0x01; while(1) { P2=dis_code[dis_index]; P1=dis_digit; delayms(1); P1=0x00; dis_digit=_crol_(dis_digit,1); dis_index++; dis_index &=0x07; } } void delayms(unsigned char ms) { unsigned char i; while (ms--) {

for(i=0;i<120;i++); } } 仿真图:

如果您想做项目开发,或者是做课题,或者您只是有一个想法,亲联系我们,我们会尽最大努力帮您完成,您的需要就是我们奋斗的方向! 本人有给学生做课程设计的经验,欢迎亲们来本店咨询哦 淘宝店铺地址:https://www.doczj.com/doc/922206360.html, ; https://www.doczj.com/doc/922206360.html, QQ:1203026348;496617571 邮箱:1203026348@https://www.doczj.com/doc/922206360.html, ;496617571@https://www.doczj.com/doc/922206360.html, 电话:小陈:152******** 小张:158******** 阿里旺旺:tb3569_1968 ;zwjyln 我们拥有40G!!超大容量!!!是单片机入门者的首选经典资料!!! 您在单片机方面有任何问题,请及时和我们联系,我们会竭诚为您服务!! 承接单片机项目开发,同时包括软件开发和硬件开发。我们是一组拥有扎实的单片机基础知识的大学生,我们可以给您提供从项目开始到项目的完成整个过程的技术支持,其中包括原理图的设计、电路图的proteus软件仿真、程序的编写以及相关软件的使用等

51单片机I2C总线驱动程序

51单片机I2C总线驱动程序 SI2I2C 总线是PHLIPS 公司推出的一种串行总线,是具备多主机系统所需 的包括总线裁决和高低速器件同步功能的高性能串行总线。I2C 总线只有两根 双向信号线。一根是数据线SDA,另一根是时钟线SCL。 一.I2C 系统结构每个接到I2C 总线上的器件都有唯一的地址。主机与其它器 件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由 总线上接收数据的器件则为接收器。 二.数据位的有效性规定I2C 总线进行数据传送时,时钟信号为高电平期间, 数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线 上的高电平或低电平状态才允许变化。 三.字节传送与应答每一个字节必须保证是8 位长度。数据传送时,先传送最 高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有 9 位)。 四.驱动程序#define uchar unsigned char#define uint unsigned int#define somenop() _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_()sbit SCL=P2;sb it SDA=P2;123451.起始信号和终止信号 SCL 线为高电平期间,SDA 线由高电平向低电平的变化表示起始信号;SCL 线为高电平期间,SDA 线由低电平向高电平的变化表示终止信号。 起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用 的状态;在终止信号产生后,总线就处于空闲状态 void I2C_Start() //起始{SCL=1;somenop();SDA=1;somenop(); SDA=0;somenop();SCL=0;somenop();}void I2C_Stop() //终止{ SDA=0;somenop();SCL=1;somenop();SDA=1;somenop();}12345678910111213141

基于51单片机的计算器(附Proteus仿真图且程序有详细注释)

#include #define uint unsigned int #define uchar unsigned char #define lint unsigned long int uchar SMG[10]={0x3f,0x06,0x5b,0x4f, //数码管取模 0x66,0x6d,0x7d,0x07, 0x7f,0x6f }; uchar DA TA1[8]={0,0,0,0,0,0,0,0}; //第一个数 uchar DA TA2[8]={0,0,0,0,0,0,0,0}; //第二个数 uchar RESUIT[8]={0,0,0,0,0,0,0,0}; //结果 uchar px1=0,px2=0,px3=0,flag=0,flag1=0,flag2=0,flag3=0,f1=0,f2=0,f3=0,f4=0; //各全局变量uchar temp,key; lint x1=0,x2=0,y=0; //输入的数及其结果 void Init(); //系统初始化 void keyscan(); //键盘检测 void delay(uint); //延时 void DataOper(); //数据运算 void DataHandle(); //数据接收 void DisplayHandle(); //显示处理 void display(uchar,uchar); //数码管显示函数 void main() { P2=0x00; while(1) { keyscan(); DataHandle(); DisplayHandle(); } } void Init() //初始化,所有数据归零 { uchar i; px1=0;px2=0;px3=0; flag=0;flag1=0;flag2=0;flag3=0; f1=0;f2=0;f3=0;f4=0; x1=0;x2=0;y=0; for(i=0;i<8;i++) {DA TA1[i]=0;DATA2[i]=0;RESUIT[i]=0;} } void delay(msx) //msx为延时毫秒数 { uint i,j;

I2C总线的单片机C语言实现及其应用

I2C总线的单片机C语言实现及其应用 本文介绍了I2C总线的概念、接口特性和传输时序,提出了一种用51系列单片机的C语言(C51)模拟I 2C总线数据传输的软件方法,并给出了在数字高清晰度电视地面接收机中的应用。 关键词:I2C总线;单片机;C语言;高清晰度电视 1I2C总线概述 I2C(Intel-Integrated Circuit)总线是荷兰的Philips公司于八十年代初推出的一种芯片间串行总线扩展技术。它用两根线(数据线SDA、时钟线SCL)可完成总线上主机与器件的全双工同步数据传送,可极方便地构成多主机系统和外围器件扩展系统。I2C总线支持所有NMOS、CMOS、TTL等工艺制造的器件,其上所有的节点都连到同名的SDA、SCL上。I2C总方法,数据传送都有相同的操作模式,接口电器特性相同且独立,可在系统供电情况下从系统中移去或增加IC芯片,有I2C接口的外围器件都有应答能力,读写片内单元时有地址自动加1功能,易实现多个字节的自动操作。近年来,国际上有关公司制造了多达几百种的I2C总线器件,如8051系列单片机8XC752、LCD驱动器、RAM、I/O接口等芯片都使用了I2C 总线接口。随着数字技术的发展,I2C总线控制系统已经应用于越来越多的电子产品。 2I2C总线的数据传输 2.1接口特性 I2C总线接口的数据线SDA和时钟线SCL必须经过上拉电阻接到正电源VDD上,各个I2C接口电路输出端必须是漏极开路或集电极开路,以便完成“线与”的功能。I2C的SDA和SCL都是双向传输线,当总线空闲时,此两线都是“1”(高电平)。由于不同的器件都会接到I2C总线,逻辑的“0”(低)及“1”(高)的信号电平取决于VDD的电压。总线上能连接的最大器件数取决于其电容容限400PF。 2.2I2C总线上的传输时序 I2C总线上每传输一位数据都有一个时钟脉冲相对应,在标准模式下可达100kbit/s,高速模式下可达400kbit/s,总线上依据器件功能不同可建立简单的主/从关系(master/slave),只有带CPU的器件才可成主控器。图1为I2C总线一次完整的数据传输。SCL为高期间,SDA状态必须稳定,SCL为低时才允许SDA状态变化。SCL保持高电平期间,SDA出现由高至低的转换将启动I2C总线,出现由低至高的转换将停止数据传输。起始和终止信号通常由主控器产生。I2C总线的信号时序有严格规定,本应用采用标准模式,SCL低电平周期≥4.7μs,SCL高电平周期≥4.0μs,START和STOP之间的总线空闲时间≥4.7 μs。 I2C总线上传送的每个字节必须为8位,启动和停止之间可传输的数据字节数不受限制。采用串行传送,首先传送最高位,每传送一个字节后必须跟一个应答位。主控器产生应答所需的时钟脉冲期间,发送器必须释放数据线(SDA为高),以便接收器输出应答位。低电平为应答信号,高电平为非应答信号。非应答信号是当主控器作为接收器时,收到最后一个字节数据后,必须发送一个非应答信号给被控发送器,使被控发送器释放数据线,以便主控器发停止信号,终止数据传送。当从器件不能再接收字节时也会出现 非应答 信号这种情况。 I2C总线上的器件一般有两个地址:受控地址和通用广播访问地址,每个器件有唯一的受控地址用于定点通信,而相同的通用广播访问地址则用于主控方同时对所有器件进行访问。如图1所示,起始信号后主控器发送的第一个字节就是被读器件的受控地址,称作寻址字节。寻址字节由高7位地址和最低1位方向位组成,方向位为“0”表明主控器对被控器的写操作(W),方向位为“1”表明对被控器的读操作(R)。总线上每个器件在起始信号后都把自己的地址与寻址字节的前7位相比较,如相同则器件被选中,产生应

基于proteus的51单片机仿真

基于proteus的51单片机仿真实例七十八、使用BCD译码器实现8位数码管显示应用实例 标签: proteus译码器单片机BCD数码管2010-02-24 16:57 1、在此前有关数码管显示的例子中,单片机必须要发送段码才能够让数码管显示正确的数字。 本例使用7段数码管显示译码器4511,单片机可以直接输出BCD码,4511能够自动将BCD 码转换为数码管的段码。 2、在keil c51中新建工程ex66,编写如下程序代码,编译并生成ex66.hex文件 //使用BCD码译码器控制数码管显示 #include //位码表 unsigned char code bit_buff[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //需要显示的数字 unsigned char code bcd_buff[] = {2,0,1,0,10,2,10,9}; //延时函数 void delayms(unsigned int x) { unsigned char i; while(x--) { for(i = 0;i < 120;i++); } } void main(void) { unsigned char i; while(1) { for(i = 0;i < 8;i++) //显示8位 { P2 = bit_buff[i]; // 位码 P1 = bcd_buff[i]; //需要显示的数字,这里的数字不再是段码,而是BCD码 3、在proteus中新建仿真文件ex66.dsn,电路原理图如下所示

4、将ex66.hex文件载入at89c51中,启动仿真,按动拨码开关,观察运行结果。下图是某一时刻程序运行结果

51单片机的学习经验(附学习总结)

51单片机的学习经验(附学习总结) OFweek工控网讯:作为一名电子技术从业人员,你学过单片机吗?你会运用单片机吗?我想你一定学过,但不一定会运用。因为学习单片机比学习其他学科需要付出更多的努力和代价,不仅要学习理论知识还要练习实际操作,而且主要是在实际操作中才能真正学到单片机技术。此外,学习单片机还需要投入一定的学习成本,随着你学习知识的扩展成本还会增加。 单片机作为一种简单的控制器在生活中有这广泛的应用,当然在工业型单片机在生产中也扮演着很重要的角色,所以对于一个学习自动化的工控人来说,学习单片机是非常有必要的。 单片机的学习经验 1、学习电子技术基础知识,如电路、模拟电路和数字电路。这是学习电类相关专业的基础。 2、学习计算机硬件知识,如计算机的简单组成原理(只需要了解),当然要知道CPU是什么?总线是什么?一些相关概念。 3、程序编写的相关知识,主要是汇编语言和C语言。了解结构化语言的程序设计方法,也就是三种结构(顺序结构、分支结构(或称选择结构)、循环结构),会一些常用的算法。 4、以上是基础,有了这些基础,学习51单片机就只要花几周的时间就能上手。但学习单片机时,主要从单片机的存储器开始,其中特殊功能寄存器是重点,学会之后,就可以学习单片机的基础部分了,主要是四个部分:51单片机I/O口的使用、中断的使用、定时器的使用、外部器件的扩展。这些部分都可以用软件仿真(可以用proteus软件)。 5、可以买一两块廉价的单片机开发板,用廉价的方法(可以用热转印法做PCB板)仿制一些更简单的实验功能板,开始做板时千万不做得太复杂,我带过的很多学生中,有少部分人总是觉得太简单了,做个复杂的,结果做了个把星期,没有成功,最后只有放弃。还有一点很重要,就是用PROTEUS仿真时,最好只做单一功能的仿真,否则可能与实际在硬件上做的结果不一样。 6、从网上下载一些实例进行研究学习,不断提高。 学习单片机的步骤

51单片机I2C标准函数程序

51单片机I2C标准函数程序 #include #include #include typedef unsigned char uchar; typedef unsigned int uint; sbit SDA=P1^1; sbit SCL=P1^0; //===================================================== ========================= void Start()//开始信号 { SDA=1; SCL=1; _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); SCL=0; } /************************************************************ ******************/ void Stop() //停止信号 { SDA=0; SCL=1; _nop_(); _nop_(); SDA=1; _nop_(); _nop_(); SDA=0; SCL=0; } /************************************************************ ******************/ void Ack()//应答信号

{ SDA=0; SCL=1; _nop_(); _nop_(); SCL=0; SDA=1; } /************************************************************ ******************/ void NoAck() //非应答信号 { SDA=1; SCL=1; _nop_(); _nop_(); SCL=0; SDA=0; } /************************************************************ ******************/ bit TestACk()//检查应答信号 { bit Cack=0; SDA=1; SCL=1; Cack=SDA; SCL=0; return(Cack); } /************************************************************ ******************/ void WriteByte(uchar input)//向I2C从设备中写入1字节 { uchar i; for(i=8;i!=0;i--) { SDA=(bit)(inupt&0x80); SCL=1; _nop_(); _nop_();

基于proteus的51单片机仿真实例六十

基于proteus的51单片机仿真实例五十九、1位数码管显示实例 1、数码管实际上是由7个发光二极管组成一个8字形,另外一个发光二极管做成圆点型,这样就构成了一个数码管。所有的8个二级管的正极或者负极都连到一个公共端点上,对于公共端连在正极的数码管,称为共阳极数码管,反之称为共阴极数码管。 根据数码管的内部结构原理,可以很清楚的知道数码管显示数字的原理。 2、由于单片机的IO口的驱动能力有限,而数码管点亮时需要较大的电流,所以在用单片机构成数码管显示系统时,需要增加驱动电路,最简单的驱动电路就是利用三极管的电流放大能力来输出较大的电流, 3、让数码管显示数字的步骤为: 1)使数码管的公共端连到电源(共阳极)或者地(共阴极)上。 2)向数码管的各个段输出不同的电平。 本例使用单个数码管循环显示0-9这10个数字。 4、在keil c51中新建工程ex47,编写如下程序代码,编译并生成ex47.hex文件 #include //包含头文件 //延时函数,延时约200ms void delay(void) { unsigned char i,j; for(i = 0; i < 255;i++) { for(j = 0;j < 255;j++); } } //主函数 void main(void) {

unsigned char i; unsigned char code Tab[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x82,0xf8,0x80,0x90}; //定义数字0-9的段码表 P2 = 0xfe; //P2.0输出低电平,数码管电源导通 while(1) { for(i = 0;i < 10;i++) //循环10次。数码管循环显示数字0-9 { P0 = Tab[i]; //P0口输出数字0-9对应的段码 delay(); //延时 } } } 5、在proteus中新建仿真文件ex47.dsn,电路原理图如下所示: 需要说明的是在proteus中,查找排阻(不带公共端)和数码管的方法。 查询数码管元件时,输入关键字“7seg-com..”后,就可以看到各种数码管的电路符号。根据需要选择相应数码管即可。排阻的查找方法:查找带公共端的排阻时,输入关键字“respack”即可。 不带公共端的排阻,输入关键字“RX8”即可

相关主题
文本预览
相关文档 最新文档