版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机的串行扩展技术09介绍介绍单片机系统中常用的单总线、I2C总线以及SPI总线串行扩展技术。09单片机的串行扩展技术01单总线扩展技术02I2C总线扩展技术03SPI总线扩展技术基于DS18B20的温度测量系统设计9.1介绍单总线器件DS18B20的使用。任务要求:设计温度测量系统并实时显示,且具有越线报警功能。基于DS18B20的温度测量系统设计9.1介绍单总线器件按DS18B20的使用。任务要求:设计温度测量系统并实时显示,且具有越线报警功能。一、单总线串行技术简介三、硬件电路设计四、软件设计五、仿真二、DS18B20芯片简介一、单总线串行技术简介单总线技术:只用一条信号线的串行扩展技术。只有一条信号线,既传输时钟信号又传输输入/输出数据。单总线系统中配置的各种器件,都挂接在这根信号线上。单总线协议从芯片都有64位ROM:48位序列号+8位家族代码和8位CRC码。它是器件的地址编号,确保它挂在总线上后,地址唯一地被确定。二、DS18B20芯片简介DS18B20三脚分布实物DS18B20八脚分布实物DQ:数据输入/输出信号线VDD:电源GND:地NC:空引脚①电压范围3.0V~5.5V,在寄生电源方式下可由数据线供电。②测温范围-55℃~+125℃,在-10℃~+85℃时精度为+0.5℃。③微处理器连接时仅需要一条口线即可实现双向通信。④支持多点组网功能,多个DS18B20可以并联在单总线上,实现多点测温。⑤测量结果直接输出数字温度信号,具有极强的抗干扰纠错能力。⑥可编程分辨率为9~12位,可实现高精度测温。⑦在9位分辨率时,最多在93.75ms内把温度转换为数字;12位分辨率时,最多在750ms内把温度值转换为数字,转换速度快。
⑧负压特性。电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。DS18B20温度传感器特性二、DS18B20芯片简介DS18B20典型连接单点DS18B20电路示意图多点DS18B20电路示意图8位产品类型标号DS18B20芯片的48位自身序列号8位CRC码DSI8B20芯片片内都有唯一的64位光刻ROM编码,出厂时已刻好二、DS18B20芯片简介DS18B20芯片的命令当主机需要对单点测温系统进行操作时的步骤:①只要用跳过ROM(0xCC)命令,不需要读取ROM编码以及匹配ROM编码。②执行温度转换和读取命令二、DS18B20芯片简介配置寄存器各位的定义TM位出厂时已被写入0,用户不能改变默认分辨率12位0b0000000000010.0625°C前5位为0时,温度为正值,测得的数值乘以0.0625即可得到实际温度值。前5位为1时,温度为负值,测到的数值取反加1再乘以0.0625才可得到实际温度值【例】读取的DS18B20温度数据为0000011111010000时的实际温度是多少?【例】读取的DS18B20温度数据为1111
110010010000时的实际温度是多少?负号在显示时显示出即可DS18B20温度数据存储格式0000
0011011011110000
001101110000二、DS18B20芯片简介初始化时序DQ=1;延时(不严格);DQ=0;延时(480~960μs);DQ=1;延时(15~60
μs);读DQ返回值延时(60~240
μs);DQ=1;bitinit_DS18B20() //DS18B20初始化{ucharnum;bitflag;
DQ=1;//先拉高for(num=0;num<2;num++);//延时,不严格DQ=0;//拉低for(num=0;num<200;num++);//延时480-960us
DQ=1;//拉高for(num=0;num<20;num++); //等待>60us
flag=DQ;//读DS18B20返回值for(num=0;num<150;num++);//60-240us
DQ=1;
//拉高,返回初始状态returnflag;//返回初始化应答信号}返回值为低电平,检测到DS18B20返回值为高电平,则没有检测DS18B20二、DS18B20芯片简介写入时序DQ=0;延时(>1μs);DQ=0/1;保持(15~60μs);DQ=1;延时(>1μs);
DQ=0;//拉低_nop_(); //延时1us_nop_();//延时1usDQ=1/0;//输出1或0for(num=0;num<20;num++);//15~60usDQ=1; //拉高 _nop_();//延时1us_nop_();//延时1us写1位数据voidDS18B20_WR_CHAR(ucharbyte) {
ucharnum;ucharnum1;for(num1=0;num1<8;num1++){
DQ=0;//拉低
_nop_();//延时1us_nop_();
//延时1us
DQ=byte&0x01;//写入byte的最后1位for(num=0;num<20;num++);//延时
byte>>=1;//把要写入的位
//移入byte最后1位
DQ=1;//拉高
_nop_();//延时1us_nop_();//延时1us
}
}写1个字节函数二、DS18B20芯片简介读数据时序DQ=0;延时(1us);DQ=1;延时(<10us);变量=DQ;延时(>60us);DQ=0; //拉低
_nop_();//延时DQ=1;//释放总线for(num=0;num<1;num++);//<10us
byte=DQ;//读1位数据for(num=0;num<20;num++);//>60us
读1位数据ucharDS18B20_RD_CHAR() {ucharnum;ucharnum1;ucharbyte=0;for(num1=0;num1<8;num1++){DQ=0;//拉低
_nop_();//延时
DQ=1;//释放总线
for(num=0;num<1;num++);//<10us
byte>>=1;if(DQ==1)
byte|=0x80;for(num=0;num<20;num++);//>60us
}returnbyte;}读1个字节函数二、DS18B20芯片简介DS18B20读取温度及处理:①检测DS18B20是否存在;②
发送跳过ROM命令0xCC;③发送启动温度转换0x44;④延时;⑤再判断DS18B20存在;⑥发送跳过ROM命令0xCC;⑦再发送读温度命令0xBE;⑧先读低8位;⑨再读高8位;⑩读完后将低11位的二进制数转化为十进制数再乘以0.0625voidDS18B20_Temperature() //温度读取及处理函数{uchartemperaturel=0;uchartemperatureh=0;if(init_DS18B20()==0){DS18B20_WR_CHAR(0xcc);//跳过ROMDS18B20_WR_CHAR(0x44);//启动温度转换,结果存入内部RAMdelay(1000);if(init_DS18B20()==0)//初始化返回值为0,器件存在{ DS18B20_WR_CHAR(0xcc);//跳过ROMDS18B20_WR_CHAR(0xBE);//发送读温度命令_nop_();
temperaturel=DS18B20_RD_CHAR();//读温度低8位
temperatureh=DS18B20_RD_CHAR();//读温度高8位
Temperature=(temperatureh*256+temperaturel)*0.0625*10+0.5;
//转换乘以10表示小数点后面只//取1位,并四舍五入,温度比正常大10倍
init_DS18B20();//DS18B20初始化} }}三
、硬件电路设计任务要求:设计温度测量系统并实时显示,且具有越线报警功能。四、
软件设计sbitDQ=P1^3;//DS18B20#include<intrins.h>sbitlcdrs=P1^0; sbitlcdrw=P1^1; sbitlcden=P1^2;#defineoutP2四、
软件设计四、
软件设计voidmain(){LCD_init();delay(1000);while(1){if(flag==0) //flag=0,说明DS18B20存在
{
DS18B20_Temperature();
write_cmd(0x80);write_str("Tem:");
write_data((Temperature/100)%10+48);
write_data((Temperature/10)%10+48);write_data('.');
write_data(Temperature%10+48);
write_data(0xdf);//显示“°”
write_data('C');//显示“C”
if(Temperature/10>=25)
{
buzzer=0;
}}}#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineOUTP2//LCD1602数据端sbitlcdrs=P1^0;//LCD命令数据控制sbitlcdrw=P1^1;//LCD1602读写端sbitlcden=P1^2;//LCD1602使能端sbitDQ=P1^3;//DS18B20数据端
sbitbuzzer=P1^4;//蜂鸣器
uintTemperature=0;bitflag;voiddelay(uintz);//延时函数voidLCD_init();//LCD1602初始化voidwrite_cmd(charcmd);//写指令voidwrite_data(uchardat);//写数据voidwrite_str(uchar*str);//写字符串bitinit_DS18B20();//DS18B20初始化voidDS18B20_WR_CHAR(ucharbyte); ucharDS18B20_RD_CHAR();voidDS18B20_Temperature();任务要求:设计温度测量系统并实时显示,且具有越线报警功能。五、仿真1在KeilC中编写、编译代码,生成hex文件。任务要求:设计温度测量系统并实时显示,且具有越线报警功能。五、仿真2在Preteus中绘制电路图,加载hex文件运行。任务要求:设计温度测量系统并实时显示,且具有越线报警功能。基于DS18B20的温度测量系统设计9.1介绍多.c文件编程方法。任务要求:设计温度测量系统并实时显示,且具有越线报警功能。一、多.c文件编程方法二、程序拆解(9.1.2节代码)一、多.c文件编程方法单.C文件编程:将所有功能的程序代码写在一个.c文件中进行调试和编译。(9.1.2节)不足:随硬件模块使用的增多,代码会变得比较大、功能比较复杂。任务要求:设计温度测量系统并实时显示,且具有越线报警功能。一、多.c文件编程方法多.C文件编程:将不同功能的程序分别用不同的.c文件封装,再用.h文件进行外部声明,当在其他项目里需要用到相同功能时,将之前写好的.c和.h文件复制到新项目中。优势:可读性、可移植性和可维护性好。一、多.c文件编程方法多.c文件编程通常要遵循几个原则:①每一个功能的.c文件对应一个同名的.h头文件。②头文件中只能放置接口的声明,不能放置具体的实现。每个.h头文件里都必须声明它对应的.c文件里的所有定义函数和全局变量。③.c文件中应放置函数的实现、变量的赋值、语句的操作等。.c文件中应包含同名.h头文件。④.c文件只要使用其他.c文件的函数,要将对应的.h头文件包含到该.c文件中,⑤声明一个全局变量必须加extern关键字,同时千万不能在声明全局变量的时候赋
初始值。在使用该变量的一个.c文件中进行变量定义及赋初值等操作即可。一、多.c文件编程方法多.C文件的编写步骤:1.首先将程序按功能分块2.在KeilC中新建工程3.新建main.c以及各功能.c和.h文件4.在工程中添加所有的.c文件5.编译二、程序拆解多.C文件的编写步骤:1.首先将程序按功能分块2.在KeilC中新建工程3.新建main.c以及各功能.c和.h文件4.在工程中添加所有的.c文件5.编译①延时程序;②DS18B20温度采集程序;
③LCD1602显示程序;④主程序;将程序按功能分块任务要求:设计温度测量系统并实时显示,且具有越线报警功能。二、程序拆解任务要求:采用单片机设计温度测量系统并实时显示,并具有越线报警功能。(1)编写delay.c和delay.h#ifndefDELAY_H_//⑤#defineDELAY_H_//⑤#defineucharunsignedchar//④#defineuintunsignedint//④voiddelay(uintz);//延时函数//③#endif//⑤delay.h⑤【条件编译】
如果头文件不加条件编译语句⑤,则C51对工程进行编译时,就会对delay.h进行重复编译,头文件的这种重复引用不但增加了编译的工作量,降低编译效率,而且如果在h文件中声明了全局变量,那么编译过程可能会出现变量重复定义的错误。#include<delay.h>//②voiddelay(uintz)//延时函数①{
uintx,y;
for(x=112;x>0;x--)
for(y=z;y>0;y--);}delay.c二、程序拆解(2)编写DS18B20.c和DS18B20.h#include<DS18B20.h>bitflag=0;uintTemperature=0;bitinit_DS18B20() //DS18B20初始化{函数体略}voidDS18B20_WR_CHAR(ucharbyte) {函数体略}ucharDS18B20_RD_CHAR() {函数体略}voidDS18B20_Temperature(){函数体略}#ifndefDS18B20_H_#defineDS18B20_H_#include<reg52.h>#include<delay.h>sbitDQ=P1^3;//DS18B20数据端externuintTemperature;externbitflag;bitinit_DS18B20(); //DS18B20初始化voidDS18B20_WR_CHAR(ucharbyte); //写字节ucharDS18B20_RD_CHAR(); //读字节voidDS18B20_Temperature();//温度处理函数#endifDS18B20.cDS18B20.h任务要求:采用单片机设计温度测量系统并实时显示,并具有越线报警功能。⑤声明一个全局变量必须加extern关键字,同时千万不能在声明全局变量的时候赋
初始值。在使用该变量的一个.c文件中进行变量定义及赋初值等操作即可。②头文件中只能放置接口的声明,不能放置具体的实现。每个.h头文件里都必须声明它对应的.c文件里的所有定义函数和全局变量。二、程序拆解(3)编写LCD1602.c和LCD1602.h#include<LCD1602.h>voidLCD_init()//LCD初始化{函数体略}voidwrite_cmd(charcmd)//写指令{函数体略}voidwrite_data(uchardat)//写数据{函数体略}voidwrite_str(uchar*str)//写字符串{函数体略}#ifndefLCD1602_H_#defineLCD1602_H_#include<reg52.h>#include<delay.h>#defineOUTP2//LCD1602数据端sbitlcdrs=P1^0;//LCD1602命令数据控制端sbitlcdrw=P1^1;//LCD1602读写端sbitlcden=P1^2;//LCD1602使能端voidLCD_init();//LCD1602初始化voidwrite_cmd(ucharcmd);//写指令函数voidwrite_data(uchardat);//写数据函数voidwrite_str(uchar*str);//写字符串函数#endifLCD1602.cLCD1602.h任务要求:采用单片机设计温度测量系统并实时显示,并具有越线报警功能。二、程序拆解(4)编写main.c任务要求:采用单片机设计温度测量系统并实时显示,并具有越线报警功能。#include<reg52.h>#include<LCD1602.h>#include<DS18B20.h> sbitbuzzer=P1^4;//蜂鸣器
voidmain(){
LCD_init();delay(1000);while(1){
if(flag==0) //检测到flag=0,说明DS18B20存在{ DS18B20_Temperature();// write_cmd(0x80); write_str("Tem:"); write_data((Temperature/100)%10+48); write_data((Temperature/10)%10+48); write_data('.'); write_data(Temperature%10+48); write_data(0xdf); write_data('C'); if(Temperature/10>=25)buzzer=0;elsebuzzer=1;}}}④.c文件只要使用其他.c文件的函数,要将对应的.h头文件包含到该.c文件中。09单片机的串行扩展技术01单总线扩展技术02I2C总线扩展技术03SPI总线扩展技术基于AT24C02的存储卡设计仿真实例9.2介绍
I2C器件AT24C02的使用方法。任务要求:设计存储卡,通过按键控制存储卡的读写,并在显示器
上显示写入或读出的内容。基于AT24C02的存储卡设计仿真实例9.2介绍
I2C器件AT24C02的使用方法。任务要求:设计存储卡,通过按键控制存储卡的读写,并在显示器上显示写入或读出的内容。一、
I2C总线扩展技术三、硬件电路设计四、软件设计五、仿真二、AT24C02芯片简介一、
I2C总线扩展技术2根线:数据线SDA,时钟线SCL,主从工作方式
I2C(InterInterfaceCircurt)总线全称为芯片间总线,同步通信。
(一)I2C总线基本结构各I2C器件挂在同一条总线,每个器件都有唯一的地址各I2C器件输出端为漏级开路,故必须接上拉电阻主控器通常由单片机来担当。带有I2C接口单片机可直接与具有I2C接口器件连接,单片机没有I2C接口,可采用I/O口线结合软件实现I2C总线的时序模拟从器件必须带有I2C串行总线接口的器件。(二)I2C总线数据通信格式地址格式(8位)
写入地址为1010
0000读取地址为1010
0001(二)I2C总线数据通信格式voidI2C_init(){SCL=1;delay5us();SDA=1;delay5us();}voidstart(){
SCL=1;SDA=1;delay5us();SDA=0;delay5us();SCL=0;}voidwrite_byte(uchardate){uchari,temp;temp=date;for(i=0;i<8;i++)//每次写1位,8次循环写一个字节{
temp=temp<<1;//左移1位,temp中的最高位移至CY
SCL=0;delay5us();
SDA=CY;//CY再送至SDA总线delay5us();
SCL=1;delay5us();}SCL=0;delay5us();SDA=1;delay5us();}voiddelay5us(){
_nop_(); _nop_();_nop_();_nop_();_nop_();}①总线初始化②起始信号③写一个字节①②③初始化④(二)I2C总线数据通信格式ucharread_byte(){
uchari,k;SCL=0;delay5us();SDA=1;for(i=0;i<8;i++)//每次读1位,8次循环读一个字节{
SCL=1;delay5us();
k=(k<<1)|SDA;//每次从SDA接收的数据都放在变量k的最低位delay5us();
SCL=0;delay5us();}delay5us();returnk;//返回读取的1个字节数据}④读一个字节①②③④初始化(二)I2C总线数据通信格式voidAck(){
uchari;SDA=0;SCL=1;delay5us();while((SDA==1)&&(i<255))i++;SCL=0;delay5us();}⑤应答信号①②③④⑤⑥初始化非应答信号voidNoAck(){SDA=1;SCL=1;delay5us();SCL=0;SDA=0;}voidstop(){
SDA=0;delay5us();SCL=1;delay5us();SDA=1;delay5us();}停止信号二、
AT24C02芯片简介ATMEL公司生产的AT24C系列存储卡,主要型号有AT24C01/02/04/08/16等,其对应的存储容量分别为128*8/256*8/512*8/1024*8/2048*8。二、
AT24C02芯片简介AT24C02的位存储容量为2Kb,字节存储容量为256B,分为32页,每页8B两种寻址方式:芯片寻址和片内子地址寻址0x00~0xFF(256B)(1)芯片地址(2)片内子地址:字节写入时序指定地址读操作时序三、
硬件电路设计任务要求:设计存储卡,通过按键控制存储卡的读写,并在显示器上显示写入或读出的内容。四、软件设计①按下“写入”按键在AT24C02地址0x01里写入5,在1602上显示“write:5” ②按下“读出”按键读取AT24C02地址0x01里数据,在1602上显示“read:”+读出数据③“写入”按键采用外部中断0,“读出”按键采用外部中断1任务要求:通过按键控制存储卡读写,在显示器上显示写入或读出的内容。voidINT_init(){IT0=1;EX0=1;IT1=1;EX1=1;EA=1;}voidINT0_write()interrupt0{flag=1;}voidINT1_read()interrupt2{flag=2;}主程序中判断flag=1,调用在指定地址写入函数,实现在AT24C02的0x01里写入数据0x05;flag=2,读出0x01里的数据写在LCD显示器上。sbitSDA=P1^3;//AT24C02的数据端口接P1.3sbitSCL=P1^4;//AT24C02的时钟端接P1.4四、
软件设计字节写入时序voidwrite_add(ucharaddress,uchardate){
start();
//发送启动信号
write_byte(0xa0);//发送寻址写命令0xA0Ack(); //应答信号
write_byte(address);//发送写入地址Ack(); //应答信号
write_byte(date);//发送欲写入的8位数据Ack(); //应答信号
stop(); //发送停止信号}sbitSDA=P1^3;//AT24C02的数据端口接P1.3sbitSCL=P1^4;//AT24C02的时钟端接P1.4四、
软件设计指定地址读操作时序voidread_add(ucharaddress){uchardate;start();//发送启动信号
write_byte(0xa0);//发送寻址写命令Ack(); //应答信号
write_byte(address);//发送读地址
Ack(); //应答信号start();//发送启动信号
write_byte(0xa1);//发送寻址读命令Ack(); //应答信号
date=read_byte();//读AT24C02地址内容NoAck();//发送非应答信号
stop(); //发送停止信号
returndate;}sbitlcdrs=P1^0; sbitlcdrw=P1^1; sbitlcden=P1^2;#defineoutP2四、
软件设计四、软件设计while(1){if(flag==1){write_add(0x01,0x05);//往AT24C02的地址0x01内写入0x05
write_cmd(0x80);//把光标移到第一行第一个位置
write_str("write:5");//在LCD1602显示“write:5”flag=0;
}
if(flag==2){
readdate=read_add(0x01);//读AT24C02地址0x01里的内容
write_cmd(0xc0);//把光标移到第二行第一个位置
write_str("read:");write_cmd(0xc6);//把光标移到第二行第七个位置
write_data(readdate+0x30);//在LCD1602显示读取的数据flag=0;}}}#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineLCD_OUTP2sbitlcdrs=P1^0;sbitlcdrw=P1^1;sbitlcden=P1^2;sbitSDA=P1^3;sbitSCL=P1^4;ucharreaddate,flag;voidmain(){INT_init();LCD_init();I2C_init();①按下“写入”按键在AT24C02地址01里写入5,在1602上显示“write:5” ②按下“读出”按键读取AT24C02地址01里数据,在1602上显示“read:”+读出数据任务要求:通过按键控制存储卡读写,在显示器上显示写入或读出的内容。五、仿真1在KeilC中编写、编译代码,生成hex文件。五、仿真2在Preteus中绘制电路图,加载hex文件运行。09单片机的串行扩展技术01单总线扩展技术02I2C总线扩展技术03SPI总线扩展技术基于TLC2543的电源电压检测器9.3介绍SPI器件TLC2543的使用方法。任务要求:采用单片机作为控制单元,采用TLC2543检测电源的输出电压,在LCD上显示电源电压,并显示电压的百分比,当低于阈值时报警。基于TLC2543的电源电压检测器9.3
介绍SPI器件TLC2543的使用方法。任务要求:采用单片机作为控制单元,采用TLC2543检测电源的输出电压,在LCD上显示电源电压,并显示电压的百分比,当低于阈值时报警。一、SPI总线扩展技术三、硬件电路设计四、软件设计五、仿真二、TLC2543芯片简介一、SPI总线扩展技术(一)SPI总线的基本结构SPI是Motorola公司推出的一种同步串行通信方式。是一种全双工三线同步总线。SPI接口采用主从模式,主设备(Master)和一个或多个从设备(Slave)主设备SPI接口数量不足或不具备SPI接口,可用单片机的I/0口来模拟SPI时序。所有外围器件的MOSI和MISO数据线和时钟线SCK都挂接在总线上一、
SPI总线扩展技术(二)SPI总线数据通信格式SPI是Motorola公司推出的一种同步串行通信方式。是一种全双工三线同步总线。
单片机在启动一次传送时,
便产生8个时钟,传送给接口芯片作为同步时钟。数据输出通过MOSI线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取,完成一位数据传输。输入原理相同。
SPI工作在主从模式下时,是一个环形总线结构,在SCK的控制下,两个8位双向移位寄存器进行数据交换。在SCK的下降沿数据改变,上升沿一位数据被存入移位寄存器。主器件的SCK引脚提供时钟,数据从MOSI引脚输出,并锁存MISO引脚上输入的数据。从器件的SCK引脚为串行移位时钟的输入,该时钟由主器件提供。一、
SPI总线扩展技术voidSPISendByte(ucharch){ucharidatan=8;//向SDI上发送一个字节CLK=1;//时钟拉高CS=0;//选择从机while(n--){_nop_();_nop_();_nop_();CLK=0;//时钟拉低
SDI=(bit)(ch&0x80);//写入数据:传送位1_nop_();_nop_();_nop_();
ch=ch<<1;//数据左移一位CLK=1;//时钟拉高}}SDICLK
SDO单片机发送一个字节命令字一、
SPI总线扩展技术ucharSPIreceiveByte(){
ucharidatan=8;//读取一个字节
uchartdata=0;CLK=1;//时钟为高
CS=0;//选择从机
while(n--)
{_nop_();_nop_();_nop_();CLK=0;//时钟为低
_nop_();_nop_();_nop_();
tdata=tdata<<1;//左移一位
if(SDO)tdata=tdata|0x01;
//读数据
CLK=1;}return(tdata);}
单片机接收一个字节数据SDICLK
SDO一、
SPI总线扩展技术uintSPIsend_receiveByte(ucharch){uchari,n=12;
uinttdata=0;CLK=0;//时钟为高
CS=0;//选择从机
for(i=0;i<n;i++){
if(SDO)tdata=tdata|0x01;//读入数据
SDI
=(bit)(ch&0x80);//写入命令字
CLK=1;//上跳沿_nop_();_nop_();_nop_();CLK=0;//下跳沿
_nop_();_nop_();_nop_();
ch=ch<<1;//命令字左移一位
tdata<<=1;//读入数据左移一位
}CS=1;
tdata>>=1;//抵消第12次左移
return(tdata);}单片机发送一个字节命令字,并接收12位的数据
SDICLK
SDO二、TLC2543芯片简介TLC2543是美国TI公司生产的SPI接口的逐次逼近式A/D转换器(1)12位分辨率(2)转换时间为10μs(3)11路模拟输入通道,3个内部自测电压通道(4)线性误差+1LSB(max),采样率为66kbps(5)可编程的数据输出长度(6)模拟量输入范围为REF-~REF+二、TLC2543芯片简介TLC2543的命令字D7~D4(通道地址选择):0000~1010分别是11路模拟量AIN0~AIN10D3D2(数据长度):选择转换结果输出位数00:
12
位输
出;01:
8位输出;10:12位输出;11:
16
位输出。D1(数据顺序位):用来选择数据输出顺序。D1
=0高位在前;D1
=1低位在前。D0(数据的极性位):用来选择数据的极性。D0=0无符号数;
D0=1有符号数。二、TLC2543芯片简介TLC2543的时序I/O周期:外部I/OCL0CK定义,延续8、12或16个时钟周期,取决于选定输出数据长度前8个脉冲上升沿,以MSB前导方式从DATAINPUT端输入8位数据到输入寄存器前4位为输入模拟通道地址
第4~8个I/OCLOCK脉冲的下降沿,对所选的信号进行采样(1)DATAINPUT串行输出8位、12位或16位数据。(2)DATAOUTEOC上升沿,输出数据是前1次转换的结果命令字的写入和转换结果的输出是同时进行的,即在读出转换结果的同时也写入下一次的命令字,采集11个数据要进行12次转换。第1次写入的命令字是有实际意义的操作,但是第1次读出的转换结果是无意义的操作,应丢弃;而第11次写入的命令字是无意义的操作,而读出的转换结果是有意义的操作。二、TLC2543芯片简介命令字的写入和转换结果的输出是同时进行的,即在读出转换结果的同时也写入下一次的命令字,采集11个数据要进行12次转换。第1次写入的命令字是有实际意义的操作,但是第1次读出的转换结果是无意义的操作,应丢弃;而第11次写入的命令字是无意义的操作,而读出的转换结果是有意义的操作。uintGetAdcData(ucharchannel)//获取转换结果,channel为通道号0~10{uchartemp;uintReadAdData=0;//存放采集的数据
channel=channel<<4;//命令字(低四位0000,高四位为通道号),
//channel左移4位,将通道号移到高四位,低四位为0000
temp=channel;
ReadAdData=SPIsend_receiveByte(temp);//写入命令字,并读取12位转换结果return(ReadAdData);}0高位在前0012位0无符号0000二、TLC2543芯片简介TLC2543的时序I/O周期:外部I/OCL0CK定义,延续8、12或16个时钟周期,取决于选定输出数据长度前8个脉冲上升沿,以MSB前导方式从DATAINPUT端输入8位数据到输入寄存器前4位为输入模拟通道地址
第4~8个I/OCLOCK脉冲的下降沿,对所选的信号进行采样(1)DATAINPUT串行输出8位、12位或16位数据。(2)DATAOUTEOC上升沿,输出数据是前1次转换的结果转换周期:最后一个I/OCLOCK脉冲下降沿,EOC变低,采样值保持不变,转换周期开始I/O周期和转换周期交替进行,从而可减少外部的数字噪声对转换精度的影响。三、硬件电路设计任务要求:采用单片机作为控制单元,采用TLC2543检测电源的输出电压,在LCD上显示电源电压,并显示电压的百分比,当低于阈值时报警。四、软件设计①循环采集TLC2543的AIN0通道的模拟电压,并在LCD上显示。②显示电压的百分比。③电压低于阈值,红色LED点亮报警,这里阈值设为量程电压的25%。任务要求:采用单片机作为控制单元,采用TLC2543检测电源的输出电压,在LCD上显示电源电压,并显示电压的百分比,当低于阈值时报警。①延时程序;②TLC2543转换程序;③SPI时序程序④LCD1602显示程序;主程序将程序按功能分块多.C文件的编写步骤:1.首先将程序按功能分块2.在KeilC中新建工程3.新建main.c以及各功能.c和.h文件4.在工程中添加所有的.c文件5.编译四、软件设计①循环采集TLC2543的AIN0通道的模拟电压,并在LCD上显示。②显示电压的百分比。③电压低于阈值,红色LED点亮报警,这里阈值设为量程电压的25%。任务要求:采用单片机作为控制单元,采用TLC2543检测电源的输出电压,在LCD上显示电源电压,并显示电压的百分比,当低于阈值时报警。(1)编写delay.c和delay.h#ifndefDELAY_H_#defineDELAY_H_#defineucharunsignedchar#defineuintunsignedintvoiddelay(uintz);//延时函数#endifdelay.h#include<delay.h>voiddelay(uintz)//延时函数{
uintx,y;
for(x=112;x>0;x--)
for(y=z;y>0;y--);}delay.c四、软件设计①循环采集TLC2543的AIN0通道的模拟电压,并在LCD上显示。②显示电压的百分比。③电压低于阈值,红色LED点亮报警,这里阈值设为量程电压的25%。(2)编写LCD1602.c和LCD1602.h#include<LCD1602.h>voidLCD_init()//LCD初始化{函数体略}voidwrite_cmd(charcmd)//写指令{函数体略}voidwrite_data(uchardat)//写数据{函数体略}voidwrite_str(uchar*str)//写字符串{函数体略}#ifndefLCD1602_H_#defineLCD1602_H_#include<reg52.h>#include<delay.h>#defineOUTP2//LCD1602数据端sbitlcdrs=P1^0;//LCD1602命令数据控制端sbitlcdrw=P1^1;//LCD1602读写端sbitlcden=P1^2;//LCD1602使能端voidLCD_init();//LCD1602初始化voidwrite_cmd(ucharcmd);//写指令函数voidwrite_data(uchardat);//写数据函数voidwrite_str(uchar*str);//写字符串函数#endifLCD1602.cLCD1602.h四、软件设计(3)spi.c和spi.h的编写#ifndefspizz_H_#definespizz_H_#include<reg52.h>sbitSDO=P1^3;//TLC2543的DATAOUTsbitSDI=P1^4;//TLC2543的DATAINPUTsbitCS=P1^5;//TLC2543的CSsbitCLK=P1^6;//TLC2543的I/OCLOCKsbitEOC=P1^7;//TLC2543的EOCvoidSPISendByte(ucharch);//发送一个字节ucharSPIreceiveByte();//接收一个字节uintSPIsend_receiveByte(ucharch);//发送接收#endifspi.h#include<spi.h>#include<delay.h>#include<intrins.h>voidSPISendByte(unsignedcharch){函数体略}unsignedcharSPIreceiveByte(){函数体略}uintSPIsend_receiveByte(ucharch)
{函数体略}spi.c(4)TLC2543.c和TLC2543.h的编写①循环采集TLC2543的AIN0通道的模拟电压,并在LCD上显示。②显示电压的百分比。③电压低于阈值,红色LED点亮报警,这里阈值设为量程电压的25%。TLC2543.h#ifndefTLC2543_H_#defineTLC2543_H_#include<reg52.h>#include<delay.h>uintGetAdcData(ucharchannel);//获取转换结果,//channel为通道号voidADCvalToStr(uchar*str,uintval);//标度变换voidADCvalToStrratio(uchar*str,uintval);//电压比#endifvoidADCvalToStr(uchar*str,uintval){unsignedintvalue;
value=val*1.221;//1.221=5000/4095(分辨率12位)str[0]=(value%10000/1000)+'0';str[1]='.';str[2]=(value%1000/100)+'0';str[3]=(value%100/10)+'0';str[4]=value%10+'0';str[5]='V';str[6]='\0';}
voidADCvalToStrratio(uchar*str,uintval){unsignedintvalue;
value=val*1.221/5;str[0]=(value%1000/100)+'0';str[1]=(value%100/10)+'0';str[2]='.';str[3]=value%10+'0';str[4]='%';str[5]='\0';}(4)TLC2543.c和TLC2543.h的编写①循环采集TLC2543的AIN0通道的模拟电压,并在LCD上显示。②显示电压的百分比。③电压低于阈值,红色LED点亮报警,这里阈值设为量程电压的25%。TLC2543.h#ifndefTLC2543_H_#defineTLC2543_H_#include<reg52.h>#include<delay.h>uintGetAdcData(ucharchannel);//获取转换结果,//channel为通道号voidADCvalToStr(uchar*str,uintval);//标度变换voidADCvalToStrratio(uchar*str,uintval);//电压比#endifTLC2543.c#include<TLC2543.h>#include<spi.h>uintGetAdcData(ucharchannel){函数体略}voidADCvalToStr(uchar*str,uintval){函数体略}voidADCvalToStrratio(uchar*str,uintval)
{函数体略}#include<TLC2543.h>#include<spi.h>#include<LCD1602.h>sbitLED=P3^3;unsignedintAdResult;voidmain(){unsignedcharstr[10];LCD_init();//LCD1602初始化
AdResult=GetAdcData(0);//启动0通道转换,第一次转换结果无意义while(1){_nop_();_nop_();_nop_();//延时
AdResult=GetAdcData(0);//读取本次转换结果,同时启动下次转换
while(!EOC);//判是否转换完毕,未转换完则循环等待ADCvalToStr(str,AdResult);//模数转换结果标度变换write_cmd(0x80);//把光标移到第1行第1个位置write_str("AIN0:");//显示“AIN0:”write_cmd(0x86);//把光标移到第1行第7个位置write_str(str);//显示AIN0通道采集电压ADCvalToStrratio(str,AdResult);//计算电压比write_cmd(0xc0);//把光标移到第2行第1个位置write_str("VolRatio:");//显示“VolRatio:”write_cmd(0xCA);//把光标移到第2行第11个位置write_str(str);//显示百分比if(AdResult<1024)LED=0;//小于25%LED亮
}}任务要求:采用单片机作为控制单元,采用TLC2543检测电源的输出电压,在LCD上显示电源电压,并显示电压的百分比,当低于阈值时报警。五、仿真1在KeilC中编写、编译代码,生成hex文件。五、仿真2在Preteus中绘制电路图,加载hex文件运行。本章小结1.单总线(1-Wire)是由美国DALLAS公司研制开发的一种串行协议。只需一条信号线,具有接口线少、控制简单、件封装形式小、抗干扰能力强等优点。DS18B20是单总线数字温度传感器。2.I2C(InterInterfaceCircurt)总线全称为芯片间总线,是近年来微电子通信控制领域广泛采用的一种总线标准,它是同步通信的一种特殊形式,有两条信号线:一条是数据线SDA,另一条是时钟线SCL。3.串行外围设备接口SPI(Serial
Peripheral
Interface)是Motorola公司推出的一种同步串行通信方式。是一种全双工三线同步总线,占用引脚少,简单易用。SPI接口有4条线,分别为MOSI、
MISO、SCL、CS。单片机应用系统综合设计10介绍几个综合设计案例,通过案例的分析,了解单片机应用系统设计的步骤和方法。10单片机应用系统综合设计01步进电机控制器设计02直流电机控制器设计03基于DS1302的电子钟设计04智能循迹避障车设计05遥控机器人设计步进电机控制器仿真实例10.1介绍步进电机的使用方法。任务要求:设计步进电机控制器,通过按键控制电机的正转、反转、停止。步进电机:28BYJ-48永磁式减速步进电机驱动:UNL2003反向驱动器采用3个按键实现电机的正转、反转和停止步进电机控制器仿真实例10.1介绍步进电机的使用方法。任务要求:设计步进电机控制器,通过按键控制电机的正转、反转、停止。一、步进电机简介二、硬件电路设计三、软件设计四、仿真一、步进电机简介步进电机是将脉冲信号转变为角位移或线位移的开环控制元件。相数:电机内部的线圈组数。步距角:控制系统每发一个脉冲信号,电机所转动的角度。拍数:完成一个磁场周期性变化所需脉冲数或导电状态。励磁方式一相励磁:每一瞬间只有一组线圈导通步距角:360°/(8*4)=11.25°齿距角:45°4相4拍齿距角:一个磁场周期,电机所转动的角度。转一圈需要:32拍(32个脉冲)一、步进电机简介步距角:360°/(8*4)=11.25°齿距角:45°二相励磁:每一瞬间有两组线圈同时导通一-二相励磁:每一瞬间一相励磁与二相励磁交替导通步距角:360°/(8*8)=5.625°齿距角:45°转一圈需要:8*8=64拍(64个脉冲)一、步进电机简介减速比:例1:64,电机壳里边的部分转64圈,电机壳外边的部分转1圈。节拍刷新时间:步进电机每2拍之间需要一定的时间。定位:通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;调速:通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。启动频率:P.P.S(每秒脉冲数)每秒给出550个脉冲的情况下电机可以正常启动。节拍刷新时间计算:控制节拍刷新时间大于1.8ms就可以了。1s/550=1.8ms。实际电机转动一圈需要的拍数转子转64圈,输出轴才会转一圈转子转一圈需要64个节拍(4相8拍)电机转一圈:64*64=4096个节拍步距角:360°/(64*64)=5.625°/64约为0.08789°一、步进电机简介转动任意角度步距角:360°/(64*64)=5.625°/64【例10-1】
电机转过90°,则需要的拍数为多少?
【解】
注意:在实际运行中,转动的角度会有一些误差。在没有精密仪器的情况下很难测量出误差。但可以采用多转几圈的方式进行测试。!单片机的I/O口电流驱动能力有限,无法直接驱动步进电机。可以选用专用的电机驱动模块,如L298N、FT5754等;还可采用三极管驱动电路、ULN2003驱动电路等。步进电机的驱动二
、硬件电路设计任务要求:设计步进电机控制器,通过按键控制电机的正转、反转、停止。1~7输入端16~10输出端9公共端接感性负载(电机、电感等)该脚接电源正极;接非感性负载(灯泡、电阻、电容等),该脚不接。UNL2003是反向驱动器:内含7个独立的达林顿管MOTOR-STEPPER(单极性步进电机,代替28BYJ-48)三、
软件设计任务要求:设计步进电机控制器,通过按键控制电机的正转、反转、停止。按键处理:用flag标记哪一个按键按下,根据flag标志实现电机的正转、反转和停止。
用flagmotor做为电机正反转的标志位。voidkeyscan()
{key1=1;
if(key1==0)//
{
delay(10);//延时去抖
if(key1==0)
{
flag=1;//正转按键按下
}
while(!key1);//松手检测
}
key2=1;
if(key2==0)//{
delay(10);//延时去抖
if(key2==0)
{
flag=2;//反转按键按下
}
while(!key2);//松手检测
}key3=1;if(key3==0)//
{
delay(10);//延时去抖
if(key3==0)
{
flag=3;//停止按键按下
}while(!key3);//松手检测
}
}
while(1)
{keyscan();switch(flag)
{case1:TR0=1;
flagmotor=1;//正转1拍
break;
case2:TR0=1;
flagmotor=2;//反转1拍
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化妆品生产车间设备布局规划制度
- 预见性护理与护理实践指南
- 颅脑损伤术后营养与代谢护理
- 分级护理护理管理创新
- 药物应用护理核心知识
- 食管癌康复期的护理要点
- 教资历史高中试题及答案
- 教案-单元一任务3 会议设备-硬件连接
- 风湿免疫科出科考含答案解析
- 电动工具定转子制造工岗前知识理论考核试卷含答案
- 《人工智能安全导论》 课件全套 第1-7章 人工智能安全概述-人工智能在联邦学习领域
- 2025年官方策划婚后财产分配协议书范本
- 2025新 公司法知识竞赛题库与参考答案
- 泵房应急预案
- 编外事业单位考试题目
- 数电票开具项目信息批量导入模板
- 小学生体育锻炼记录表
- 2023年江苏省苏州工业园区部分单位招聘36人笔试参考题库(共500题)答案详解版
- 2023年精益管理专员年度总结及下一年规划
- PPK初始过程能力研究报告表
- 手术室PDCA-提高急诊手术器械物品准备的完善率
评论
0/150
提交评论