ImageVerifierCode 换一换
格式:DOCX , 页数:52 ,大小:29.09KB ,
资源ID:10494301      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10494301.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(51单片机C语言编程实例2.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

51单片机C语言编程实例2.docx

1、51单片机C语言编程实例2【实例86】总线接口的软件实现/*引脚定义和相关头文件包含*/#includesbit I2C_SDA = P10;sbit I2C_SCL = P11;(1)函数void delay()在C51中使用nop指令,实现一段时间的延时,程序代码如下:void delay( void ) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();(2)函数void i2c_start()void i2c_start( void ) I2C_SDA = 1; I2C_SCL = 1; delay(); I2C_SDA = 0;

2、 delay(); I2C_SCL = 0;(3)函数void i2c_stop()void i2c_stop( void ) I2C_SDA = 0; I2C_SCL = 1; delay(); I2C_SDA = 1; delay(); I2C_SCL = 0;(4)函数void i2c_ ack ()void i2c_ack( void ) I2C_SDA = 0; I2C_SCL = 1; delay(); I2C_SDA = 1; I2C_SCL = 0;(5)void i2c_send_byte()/*输入参数: c */void i2c_send_byte( unsigned c

3、har c ) unsigned char i; for( i=8;i0;i-) if( c & 0x80 ) I2C_SDA = 1; else I2C_SDA = 0; I2C_SCL = 1; delay(); I2C_SCL = 0; c = c0;i-) r = r1; /*左移补0*/ I2C_SCL = 1; delay(); if( I2C_SDA ) r = r | 0x01 ; /*当数据线为高时,数据位为1*/ I2C_SCL = 0; return r; 【实例87】SPI总线接口的软件实现程序中端口宏定义如下: #include #include#define WRE

4、N 0x06/*设置写使能锁存器*/#define WRDI 0x04/*复位写使用锁存器*/#define RSDR 0x05/*读状态寄存器*/#define WRSR 0x01/*写状态寄存器(看门狗和块锁)*/#define READ 0x03/*/读操作指令 0000 A8 011*/#define WRITE 0x02/*写操作指令 0000 A8 010*/#define WIP 0x01/*状态寄存器中写操作是否忙*/*各引脚定义*/sbit X5045_SO = P11;sbit X5045_SI = P16;sbit X5045_SCK= P14;sbit X5045_CS

5、 = P12;(1)函数void write_byte()/*入口:byte,要写入的8位数据*/void write_byte( unsigned char byte ) unsigned char i; unsigned char tmp; for(i=0;i8;i+) X5045_SCK = 0; tmp = byte & 0x80; if( tmp = 0x80) /*与0X80比较判断最高数据位是否为1*/ X5045_SI=1; _nop_(); else X5045_SI=0; _nop_(); X5045_SCK = 1; byte = byte0;i-) byte = byt

6、e 255 ) read_cmd = READ|0X08; /*如果超出了一页,则名字字节A8为1*/ else read_cmd = READ; addr_tmp = (unsigned char) (addr&0xff ) ; x5045_start(); write_byte( read_cmd ); write_byte( addr_tmp ); tmp = read_byte(); x5045_end(); return tmp;(7)函数void write_addr_data()/*入口地址:addr,要写入数据的地址*/void write_addr_data( unsigne

7、d int addr,unsigned char edata ) unsigned char tmp,addr_tmp; unsigned char cmd_tmp; /*写使能操作*/ x5045_start(); write_byte( WREN ); x5045_end(); /*地址和写操作指令调节*/ if( addr 255 ) cmd_tmp = WRITE | 0x08; else cmd_tmp = WRITE; addr_tmp = (unsigned char )( addr & 0xff ); /*向指定地址写入数据*/ x5045_start(); write_byt

8、e( cmd_tmp ); write_byte( addr_tmp ); write_byte( edata ); x5045_end(); /*检查写操作是否完成*/ do x5045_start(); write_byte( RSDR ); tmp = read_byte(); x5045_end(); while( tmp & WIP ) ;(8)函数void reset_wdt()void reset_wdt( void ) X5045_CS = 0; _nop_(); _nop_(); X5045_CS = 1; nop_(); _nop_();【实例88】1-WIRE总线接口的软

9、件实现(1)函数void _1wire_init()/*包含头文件*/#include#include/*引脚定义*/sbit DQ = P12;/*函数名称:单总线初始化*/void init( void ) unsigned char i; DQ = 1; DQ = 0; for( i = 200;i0;i-) _nop_(); /*延时约600s*/ DQ = 1; for( i = 10;i0;i-) _nop_(); /*延时约30s */ while( DQ=1 ); for( i = 100;i0;i-) _nop_(); /*延时约300s*/ DQ = 1;(2)函数void

10、 write_bit_1()void write_bit_1(void) unsigned char i; DQ = 1; DQ = 0; for( i = 25;i0;i-) _nop_(); /*延时约90s */ DQ = 1;(3)函数void write_bit_0()void write_bit_0(void) unsigned char i; DQ = 1; DQ = 0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); DQ = 1; for( i = 25;i0;i-) _nop_(); /* 延时约90s */(4

11、)另外仔细观察1-WIRE总线的写时序图,可将写“1”和写“0”合为一个函数。void write_bit( bit D ) unsigned char i; DQ = 1; DQ = 0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); DQ = D for( i = 25;i0;i-) _nop_(); /*延时约90us */ DQ = 1;(5)函数bit read_bit()bit read_bit( void ) unsigned char i; DQ = 0; for( i=0;i5;i+)_nop_(); if( DQ

12、 = 1 ) return 1; else return 0; (6)函数void write_byte()void write_byte( unsigend char byte) unsigned char i; unsigned char tmp; tmp = byte&0x01 for( i=0;ii; /*将要写的数据字节右移i位*/ tmp &= 0x01; /*得到数据字节的第i位*/ write_bit( (bit)tmp ); (7)函数unsigned char read_byte()unsigned char read_byte( void ) unsigned char

13、i; unsigned char tmp; . tmp = 0; /*将返回值初始化为0*/ for(i=0;i8;i+) if( read_bit() ) /*如果当前读取的数据位为1*/ tmp = tmp | (0x01i); /*将返回字节对应的数据位置为1*/ for( i=0;i20;i+) _nop_(); /*等待时序结束*/【实例89】单片机外挂CAN总线接口SJA1000_Config_Normal() BTR0=0x00; BTR1=0x14; /*设置为1M波特率通信*/ SJAEntryResetMode(); /*进入复位模式*/ WriteSJAReg(REG_C

14、AN_CDR,0xc8); /*配置时钟分频寄存器,选择PeliCAN模式*/ WriteSJAReg(REG_CAN_MOD,0x05); /*配置模式寄存器,选择双滤波、自发自收模式*/ WriteSJARegBlock(16,Send_CAN_Filter,8); /*配置验收代码/屏蔽寄存器 */ WriteSJAReg(REG_CAN_BTR0,BTR0); /*配置总线定时器0x00 */ WriteSJAReg(REG_CAN_BTR1,BTR1); /*配置总线定时器0x14 */ WriteSJAReg(REG_CAN_OCR,0x1a); /*配置输出管脚,推挽输出。*/

15、SJAQuitResetMode(); /*退出复位模式,进入工作模式 */报文发送程序如下所示:/*=*/*函数原型: bit BCAN_DATA_WRITE(unsigned char *SendDataBuf) */*参数说明: 特定帧各式的数据 */*返回值: */* 0 ; 表示将数据成功的送至发送缓冲区 */* 1 ; 表示上一次的数据正在发送, */*说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动 */* SJA1000发送。 */* 特定帧格式为:开始的两个字节存放 描述符 ,以后的为数据 */* 描述符包括11位长的ID(标志符)1位RTR4位描述

16、数据长度的DLC共16位 */*注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。 */* 不指示SJA1000将该数据正确发送到CAN总线上完毕与否 */*=*/ bit BCAN_DATA_WRITE(unsigned char *SendDataBuf) unsigned char TempCount; SJA_BCANAdr = REG_STATUS; /*访问地址指向状态寄存器*/ if(*SJA_BCANAdr&0x08) = 0) /*判断上次发送是否完成*/ return 1; if(*SJA_BCANAdr&0x04)=0) /*判断发送缓冲区是否锁定*

17、/ return 1; SJA_BCANAdr = REG_TxBuffer1; /*访问地址指向发送缓冲区1*/ if(SendDataBuf1&0x10)=0) /*判断RTR,从而得出是数据帧还是远程帧*/ TempCount =(SendDataBuf1&0x0f)+2; /*输入数据帧*/ else TempCount =2; /*远程帧*/ memcpy(SJA_BCANAdr,SendDataBuf,TempCount); return 0;报文接收程序如下所示:/*=*/*函数原型: bit BCAN_DATA_WRITE(unsigned char *SendDataBuf)

18、 */*参数说明: 特定帧各式的数据 */*返回值: */* 0 ; 表示将数据成功的送至发送缓冲区 */* 1 ; 表示上一次的数据正在发送, */*说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动 */* SJA1000发送。 */* 特定帧格式为:开始的两个字节存放 描述符 ,以后的为数据 */* 描述符包括11位长的ID(标志符)1位RTR4位描述数据长度的DLC共16位 */*注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。 */* 不指示SJA1000将该数据正确发送到CAN总线上完毕与否 */*=*/ bit BCAN_DATA_

19、WRITE(unsigned char *SendDataBuf) unsigned char TempCount; SJA_BCANAdr = REG_STATUS; /*访问地址指向状态寄存器*/ if(*SJA_BCANAdr&0x08) = 0) /*判断上次发送是否完成*/ return 1; if(*SJA_BCANAdr&0x04)=0) /*判断发送缓冲区是否锁定*/ return 1; SJA_BCANAdr = REG_TxBuffer1; /*访问地址指向发送缓冲区1*/ if(SendDataBuf1&0x10)=0) /*判断RTR,从而得出是数据帧还是远程帧*/ T

20、empCount =(SendDataBuf1&0x0f)+2; /*输入数据帧*/ else TempCount =2; /*远程帧*/ memcpy(SJA_BCANAdr,SendDataBuf,TempCount); return 0;【实例90】单片机外挂USB总线接口unsigned char code DeviceDescriptor= 18, /*bLength,长度(18字节)*/ 1, /*bDescriptorType,描述符类型,1代表设备描述符*/ 0x10,1, /*bcdUSB,USB规范版本1.1,以BCD码表示*/ 0, /*bDeviceClass,设备类码

21、*/ 0, /*bDeviceSubClass,设备子类码*/ 1, /*bDeviceProtocol,设备协议*/ 16, /*bMaxPacketSize0,最大封包大小*/ 0xff,0xff, /*idVendor,制造商ID,每个厂商有不同的ID,这里未定义*/ 0,1, /*idProduct,产品ID,每个厂商为自己生产的不同产品定义*/ 0,0, /*bcdDevice,发行序号,以BCD码表示*/ 1, /*iManufacturer,制造商的字符串描述符索引*/ 2, /*iProduct,产品的字符串描述符索引*/ 0, /*iSerialNumber,设备序号的字符串

22、描述符索引*/ 1, /*bNumConfigurations,配置描述符的个数*/;CH375初始化程序如下:#define CH375HM_INT_EN EX0/* 单片机的INT0引脚的中断使能 */#define CH375HM_INT_FLAG IE0/*单片机的INT0引脚的中断标志 */*其他程序代码*/*假定CH375模块的INT#引脚连接到单片机的INT0引脚*/IT0 = 1;/*置CH375模块中断信号为下降沿触发,实际上,电平触发方式也可以*/CH375HM_INT_FLAG = 0;/*清中断标志*/CH375HM_INT_EN = 1;/*允许CH375模块中断*/CH375提供的开放的命令库函数如下:#define CH375HM_INDEX_WR( Index ) CH375HM_INDEX = (Index);/* 写索引地址 */#define CH375HM_DATA_WR( Data ) CH375HM_DATA = (Data);/* 写数据 */#define CH375HM_DATA_RD( ) ( CH375HM_DATA )/* 读数据 */*其他程序代码*/

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1