51单片机ADS1118程序

合集下载

单片机电子广告牌系统设计(原理图+源程序+论文)

单片机电子广告牌系统设计(原理图+源程序+论文)

单片机电子广告牌系统设计(原理图+源程序+论文)基于51单片机制作的电子广告牌系统设计原理图:论文预览:源程序如下:1.#include <reg51.h>2.3.#define uint unsigned int4.#define uchar unsigned char5.//#define x1 0x80 //第一行坐标6.#define x2 0x88 //第三行坐标7.#define x3 0x90 //第二行坐标8.//#define x4 0x98 //第四行坐标9.10.#define comm 0 //指令标志11.#define dat 1 //数据标志12.13.sbit cs = P0^0; //高电平为数据,低电平为指令14.sbit std = P0^1; //数据输出位15.sbit sclk = P0^2; //时钟16.sbit psb = P0^3; //H=并口; L=串口;17.sbit rst = P0^4; //Reset Signal 低电平有效18.19.20.uchar code tab[]={21."计算机发送数据:"22.};23.uchar code num[]={24."0123456789ABCDEF"25.};26.uchar buffer[6]; //接收数据缓冲区27.uchar display[12]; //显示数据缓冲器28.uchar k=0;29.30.void wr_lcd (uchar dat_comm,uchar content); // 串行传输数据31.void delay (uint us); // 延时32.void init_lcd(void); //初始化lcd33.void init_serial(void); // 初始化串行中断34.void chn_disp(uchar code *chn,uchar j); //显示汉字或字符35.void convert(uchar *point); // 数据转换36.void chn_disp1(void); // 显示串口送入数据37.void clrram(void); // 清DDRAM38.39.40./******************主程序******************/41.void main()42.{43.SP=0x5f;44.init_serial(); //初始化串口45.init_lcd(); //初始化LCD46.clrram(); //清屏47.chn_disp(tab,0); //显示第1行"计算机发送数据:"48.while(1)49.{50.if(k==6) //6个数据已接收到51.{52.k=0;53.convert(buffer);//转换接收数据缓冲区数据54.chn_disp1(); //显示6个接收数据55.}56.}57.}58.59./****************初始化lcd****************/60.void init_lcd(void)61.{62.rst=1; //液晶复位端无效63.psb=0; //串行输出64.wr_lcd (comm,0x30); //基本指令动作65.wr_lcd (comm,0x01); //清屏,地址指针指向00H66.delay (100);67.wr_lcd (comm,0x06); //光标的移动方向68.wr_lcd (comm,0x0c); //开显示,关游标69.}70./****************初始化串行中断****************/71.void init_serial(void)72.{73.SCON = 0x50; //8位串行口模式1,允许接收,REN=174.TMOD|= 0x20; //定时器1工作在模式275.TH1 = 0xfd; //波特率位9600,晶振频率位11.0592MHz76.TL1 = 0xfd;77.ES = 1; //使能串行口中断78.EA = 1; //使能全局中断79.TR1 = 1; //启动定时器180.}81./****************串口中断服务程序****************/82.void serial_IT(void) interrupt 483.{84.if(RI==1)85.{86.RI=0;87.buffer[k++]=SBUF;//将串口接收数据送入接收数据缓冲区88.}89.}90.91./**************显示汉字或字符**************/92.void chn_disp(uchar code *chn,uchar j)93.{94.uchar i;95.wr_lcd (comm,0x30); //基本指令动作96.wr_lcd (comm,0x80); //设定DDRAM地址至00H97.for (i=0;i<16;i++)98.wr_lcd (dat,chn[j*16+i]);//显示第j行字符99.}100.101./******************数据转换*******************/102.void convert(uchar *point)103.{104.uchar i,j1,j2;105.for(i=0;i<6;i++) //将接收数据缓冲区数据变为10进制数并存入显示数据缓冲区106.{107.j1=point[i]/16; //高4位108.j2=point[i]%16; //低4位109.display[2*i]=num[j1]; //换算成显示码110.display[2*i+1]=num[j2];111.}112.}113.114./**************显示串口送入数据**************/115.void chn_disp1(void)116.{117.uchar i;118.wr_lcd(comm,0x30); //基本指令动作119.wr_lcd(comm,x3); //设定DDRAM地址至10H120.for(i=0;i<3;i++)121.{122.wr_lcd(dat,display[2*i]); //将显示码送入第二行显示123.wr_lcd(dat,display[2*i+1]);124.wr_lcd(comm,x3+2*i+2);125.}126.wr_lcd(comm,x2); //设定DDRAM地址至08H127.for(i=0;i<3;i++)128.{129.wr_lcd(dat,display[2*i+6]);//将显示码送入第三行显示130.wr_lcd(dat,display[2*i+7]);131.wr_lcd(comm,x2+2*i+2);132.}133.}134.135./******************清DDRAM******************/136.void clrram(void)137.{138.wr_lcd (comm,0x30); //基本指令动作139.wr_lcd (comm,0x01); //清除显示,并将DDRAM清零140.delay (180);141.}142.143./****************** ******************/144.void wr_lcd(uchar dat_comm,uchar content)145.{146.uchar a,i,j;147.delay(50);148.a=content; //指令码或数据码149.cs=1; //发送数据150.sclk=0;151.std=1; //发送5个"1",作为数据起始位152.for(i=0;i<5;i++)153.{154.sclk=1;155.sclk=0;156.}157.std=0; //发送第6位,R/W=0,写数据158.sclk=1;159.sclk=0;160.if(dat_comm) //发送第7位RS161.std=1; //若为高电平,发送数据162.else163.std=0; //若为低电平,发送指令164.sclk=1;165.sclk=0;166.std=0; //发送第8位"0"167.sclk=1;168.sclk=0;169.for(j=0;j<2;j++) //将数据位分两个字节发送170.{171.for(i=0;i<4;i++)//发送数据高4位或低4位172.{173.a=a<<1;174.std=CY;175.sclk=1;176.sclk=0;177.}178.std=0;179.for(i=0;i<4;i++)//发送4位"0"180.{181.sclk=1;182.sclk=0;183.}184.}185.}186.187./******************延时******************/188.void delay(uint us) //delay time189.{190.while(us--);191.}192.193.复制代码单片机电子广告牌系统设计(电路原理图+单片机源程序+论文)下载:。

ADS1115源程序

ADS1115源程序
void AD_delaynms(uint n); AD_val(void);
/*******************************************
函数名称:AD_delaynms
功 能:延时约 n ms
参 数:无
#define SDA_val (P1IN & BIT7) //SDA的位值
#define TRUE 1
#define FALSE 0
/*******************************************
函数名称:delay
功 能:延时约5us的时间
函数名称:read1byte
功 能:从IIC总线读取一个字节
参 数:无
返回值 :读取的数据
********************************************/
uint read1byte(void)
{
uint rdata = 0x00,i;
uchar flag;
返回值 :无
********************************************/
void AD_delaynms(uint n)
{
uint i,j;
for(j=0;j<n;j++)
for(i=150;i>0;i--);
}
/*******************************************
{
if(wdata & 0x80) write1();
else write0();
wdata <<= 1;

ADS1115 MSP430 程序

ADS1115 MSP430 程序

#include <msp430x16x.h>#include "delay.h"typedef unsigned char uchar;typedef unsigned int uint;typedef unsigned long int ulong;#define SCL_OUT P2DIR |= BIT0;#define SDA_OUT P2OUT |= BIT1;#define SDA_IN P2OUT &= ~BIT1;#define SCL_0 P2OUT &= ~BIT0;#define SCL_1 P2OUT |= BIT0;#define SDA_0 P2OUT &= ~BIT1;#define SDA_1 P2OUT |= BIT1;#define channel_0 0 //表示选择通道0#define channel_1 1 //表示选择通道1#define channel_2 2 //表示选择通道2#define channel_3 3 //表示选择通道2uchar Initdata[4]={0};uchar send_data[15]={0};/****************************************************************************** *****************函数名称:StartAD1com()函数功能:开始ADC通信入口参数:出口参数:备注:******************************************************************************* *****************/void StartAD1com(){SDA_0; //*********SCL_1;delay_us(100);SDA_1;delay_us(20);SDA_0;delay_us(20);SCL_0;delay_us(10);}/****************************************************************************** *****************函数名称:StopAD1com()函数功能:停止ADC通信入口参数:出口参数:备注:******************************************************************************* *****************/void StopAD1com(){SDA_0;delay_us(10);SCL_1;delay_us(20);SDA_1;delay_us(10);// SCL_0; //**************// delay_us(20);}/***************************************************************************函数名称:Send1_Byte(uchar byte)函数功能:单字节SPI传输入口参数:uchar byte出口参数:备注:*****************************************************************************/ void Send1_Byte(uchar byte){uchar i;for(i=0;i<8;i++){SDA_0; //*******************if (( byte << i) & 0x80 ) SDA_1;delay_us(5);SCL_1;delay_us(10);SCL_0;delay_us(10);}delay_us(5);SDA_1;delay_us(5);SCL_1;delay_us(10);SCL_0;delay_us(10);}/***********************************/void Confige1115A(uchar channel_Co){uchar i=0;uchar channel;switch (channel_Co){case 0: //0通道channel=0xC0;break;case 1: //1通道channel=0xD0;break;case 2: //2通道channel=0xE0;break;case 3: //3通道channel=0xF0;break;default:break;}Initdata[0] =0x90; // 地址+写命令Initdata[1] =0x01; // 指向配置寄存器//Initdata[2] =0x82; // 配置字高字节Initdata[2]= channel + 0X06; // 配置字高字节Initdata[3] =0xE3; // 配置字低字节P2DIR |= 0x02; // SDA脚设置推挽SCL_1; //********** StartAD1com();for(i=0;i<4;i++){Send1_Byte(Initdata[i]);delay_us(20);}StopAD1com();P2DIR &= ~0x02; // SDA1脚设置漏开******************}/****************************************************************************** *****************函数名称:Read1_Byte()函数功能:读取一个字节入口参数:出口参数:备注:******************************************************************************* *****************/uchar Read1_Byte(){uchar temp=0;uchar i;P2DIR &= ~0x02; // SDA1脚设置漏开for(i=0;i<8;i++){temp=temp<<1; //shift left to receive next bitSCL_0;//set clock highdelay_us(10);SCL_1;_NOP();delay_us(5);if(P2IN&0x02)//check if Data=high 如果有数据到来temp|=0x01;//yes - set bit high_NOP();delay_us(10);}SCL_0;delay_us(5);P2DIR |= 0x02; // SDA1脚设置推挽SDA_0;delay_us(5);SCL_1;delay_us(20);SCL_0;delay_us(5);SDA_1;P2DIR &= ~0x02; // SDA1脚设置漏开return temp;}/****************************************************************************** *****************函数名称:Pointregister1()函数功能:指向转换结果寄存器入口参数:无出口参数:备注:******************************************************************************* *****************/void Pointregister1(void){uchar i=0;P2DIR |= 0x02; // SDA1脚设置推挽SCL_0; //*************StartAD1com();for(i=0;i<2;i++){Send1_Byte(Initdata[i]);delay_us(20);}StopAD1com();delay_us(10);}/****************************************************************************** *****************函数名称:Read1115A()函数功能:读AD转换结果入口参数:无出口参数:备注:******************************************************************************* *****************/uint Read1115A(void){uchar ResultL,ResultH;uint Result;Initdata[0] =0x91; // 地址+读命令P2DIR |= 0x02; // SDA1脚设置推挽SCL_1;StartAD1com();delay_us(10);Send1_Byte(Initdata[0]);P2DIR &= ~0x02; // SDA1脚设置漏开delay_us(20);ResultH = Read1_Byte();delay_us(10);ResultL=Read1_Byte();StopAD1com();Result=ResultH+ResultL;return Result;}/*****模拟量采集转化为数字量*****************/uint Ad_1115A(uchar channel_Ad){uint result_gd;Confige1115A(channel_Ad);delay_ms(1);Pointregister1();delay_us(10);result_gd=Read1115A(); //结果存储AD转化值return result_gd;}。

ADS1110在C51中的应用

ADS1110在C51中的应用

串行A/D转换器ADS1110及其在AT89C51单片机中的应用1、引言AT89C51单片机系统经常使用A/D转换器。

虽然并行A/D转换器速度高、转换通道多,但其价格高,占用单片机接口资源比串行A/D转换器多。

工业检测控制及智能化仪器仪表中经常采用串行A/D转换器。

ADS1110是一种精密、可连续自校准的串行A/D转换器,带有差分输入和高达16位的分辨率,其串行接口为I2C总线。

AT89C51单片机通过软件模拟I2C总线实现与ADS1110的连接。

2、ADS1110的特点与内部结构2.1ADS1110的特点完整的数据采集系统和小型SOT23-6封装;片内基准电压:精度2.048V+0.05%;片内可编程增益放大器PGA;片内振荡器;16位分辨率;可编程的转换速率15次/秒~240次/秒;I2C总线接口(8个有效地址);电源电压2.7V~5.5V;低电流消耗240μA。

2.2ADS1110的引脚功能ADS1110串行A/D转换器采用6引脚贴片封装,其引脚排列如图1所示。

VDD:电源端,通常接+5V;GND:模拟地和数字地;VIN+、VIN-:采样模拟信号输入端,其范围为2.048V~2.048V;SCL:I2C总线时钟线;SDA:I2C总线数据线。

2.3ADS1110的内部结构ADS1110是由带有可调增益的△-∑型转换器内核、2.048V的电压基准、时钟振荡器和I2C总线接口组成。

其内部结构如图2所示。

ADS1110的A/D转换器内核是由差分开关电容△-∑调节器和数字滤波器组成。

调节器测量正模拟输入和负模拟输入的压差,并将其与基准电压相比较。

数字滤波器接收高速数据流并输出代码,该代码是一个与输入电压成比例的数字,即A/D转换后的数据。

ADS1110片内电压基准是 2.048V。

ADS1110只能采用内部电压基准该基准,不能测量,也不用于外部电路。

ADS1110片内集成时钟振荡器用于驱动△-∑调节器和数字滤波器。

ADS1118笔记

ADS1118笔记

ADS1118笔记前半部分为转载。

转自https:///humphreyandkate/article/details/104 731073?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param 后半部分为自己记的东西ADS1118基本功能ADS1118是TI的16位ADC,内置1MHz晶振和参考电压源,转换速度8~860次每秒可调,量程±0.256V到±6.144V可调,可选单端输入或差分输入,内部集成温度传感器。

ADS1118寄存器ADS1118的寄存器非常简单,只有2个16bit的寄存器。

其中一个为只读寄存器,保存ADC转换后的值;另一个为配置寄存器,配置采集通道、正负量程、采集模式、采集速率、采集源(电压或温度)等。

ADS1118的转换寄存器ADS1118的转换寄存器长度为16位,以补码的形式编码,用来保存每次AD转换后的结果。

ADS1118的配置寄存器位名字读写类型初始值描述15 SS 读0h 单次转换开始,只用于单次转换模式,没有转换时写位 名字 读写类型初始值 描述 写 入1表示开始转换,写入0没有作用,正在转换时写入1也没有作用,此位永远读取为014~12 MUX 读写 0h 选择电压的输入通道: 000=Ain0+ Ain1-(差分);001=Ain0+ Ain3-(差分);010=Ain1+ Ain3-(差分);011=Ain2+ Ain3-(差分);100=Ain0+(单端);101=Ain1+(单端);110=Ain2+(单端);111=Ain3+(单端) 单端输入负参考为GND11~9 PGA 读写 2h 量程选择:000=±6.144V ;001=±4.096V ;010=±2.048V ;011=±1.024V ;100=±0.512V ;101=110=111=±0.256V;8 MODE 读写 1h 选择转换模式,0=连续转换模式,1=单次转换模式(单次转换完成后变为掉电状态)7~5 DR 读写 4h 转换速率:000=8;001=16;010=32;011=31;100=128;101=250;110=475;111=860(次每秒)4TS_MODE 读写 0h 0=采集电压;1=采集内部温度传感器 3 PULLUP_EN 读写 1h 控制是否使能DOUT/DRDY 引脚的内部弱上拉:0=不上拉,1=上拉(推荐)2~1 NOP 读写 1h 确定此次参数设置是否有效:01=设置生效,其他皆为使ADS1118忽略此次设置0 保留只读 1h 保留位,写0或写1没有任何影响,读取永远为1 ADS1118读写时序分析ADS1118共有两种读写模式:32-Bit 模式和16-Bit 模式,两种模式均为高位在前。

ADS1118 TI官方

ADS1118 TI官方
7.1 绝对最大额定值 ......................................................... 5 7.2 ESD 额定值 ............................................................... 5 7.3 建议的工作条件 ......................................................... 5 7.4 热性能信息 ................................................................ 5 7.5 电气特性.................................................................... 6 7.6 时序要求:串行接口.................................................. 8 7.7 开关特性:串行接口.................................................. 8 7.8 典型特性.................................................................... 9 8 参数测量信息 ......................................................... 15 8.1 噪声性能.................................................................. 15 9 详细说明................................................................. 16 9.1 概要 ......................................................................... 16 9.2 功能框图.................................................................. 16

ADS1115程序代码参赛必备

ADS1115程序代码参赛必备#include "ads1115.h"#include "ap_i2c.h"static void Confige1115 (unsigned char port);static void PointRegister (void);static void ReadData (unsigned char chn, unsigned char cnt);unsigned char WriteIntBuf[4], WritepointBuf[2], count = 6,ReadBuffer[64];;void delay (unsigned int delay){while(delay--);}/************************************************************** **************** ** Function Name : Confige1115* Description : 延迟时间* Input : None* Output : None* Return : None* Attention :获取ADS1115模拟转换结果*************************************************************** **************** /void Get_ATOD (unsigned char channel,unsigned char cnt) {static unsigned char chn;chn = channel;Confige1115(channel);delay(1000);PointRegister();delay(1000);ReadData(chn,cnt);delay(1000);}/************************************************************** **************** ** Function Name : Confige1115* Description : 延迟时间* Input : None* Output : None* Return : None* Attention :配置ADS1115*************************************************************** **************** /static void Confige1115 (unsigned char port){static unsigned char chnel, i;switch (port){case 0: //0通道chnel=0xC2;break;case 1: //1通道chnel=0xD2;break;case 2: //2通道chnel=0xE2;break;case 3: //3通道chnel=0xF2;break;default:break;}WriteIntBuf[0] = CMD_Write;WriteIntBuf[1] = CMD_CONF_REG;WriteIntBuf[2] = chnel;WriteIntBuf[3] = CONF_L;if(!(TWI_START())){for(i=0;i<4;i++){TWI_SendByte(WriteIntBuf[i]);delay(20);}}TWI_STOP();}/************************************************************** **************** ** Function Name : PointRegister* Description : 延迟时间* Input : None* Output : None* Return : None* Attention :指向ADS1115指针寄存器用于准备读取数据*************************************************************** **************** /static void PointRegister (void){unsigned char i;WritepointBuf[0] = CMD_Write;WritepointBuf[1] = CMD_POINT_REG;if(!(TWI_START())){for(i=0;i<2;i++){TWI_SendByte(WritepointBuf[i]);delay(20);}}TWI_STOP();}/************************************************************** **************** ** Function Name : I2C_delay* Description : 延迟时间* Input : None* Output : None* Return : None* Attention : CH1 PA4 CH2 PA7 CH3 PA6 CH4 PA5*************************************************************** **************** /static void ReadData (unsigned char chn,unsigned char cnt) {switch(chn){case 0: //0通道if(!(TWI_START())){ if(count == 0xff)count = 6;TWI_SendByte(CMD_Read);delay(20);ReadBuffer[cnt * 8] = TWI_ReceiveByte();TWI_SendACK();ReadBuffer[(cnt * 8) + 1] = TWI_ReceiveByte();TWI_SendACK();TWI_STOP();ReadBuffer[56]|=(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) << count);}break;case 1: //1通道if(!(TWI_START())){ TWI_SendByte(CMD_Read);delay(20);ReadBuffer[(cnt * 8) + 2] = TWI_ReceiveByte();TWI_SendACK();ReadBuffer[(cnt * 8) + 3] = TWI_ReceiveByte();TWI_SendACK();TWI_STOP();ReadBuffer[57]|=(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7) << count);}break;case 2: //2通道if(!(TWI_START())){TWI_SendByte(CMD_Read);delay(20);ReadBuffer[(cnt * 8) + 4] = TWI_ReceiveByte();TWI_SendACK();// I2C_delay(20);ReadBuffer[(cnt * 8) + 5] = TWI_ReceiveByte();TWI_SendACK();TWI_STOP();ReadBuffer[59]|=(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) << count);}break;case 3: //3通道if(!(TWI_START())){TWI_SendByte(CMD_Read);delay(20);// I2C_delay(20);ReadBuffer[(cnt * 8) + 6] = TWI_ReceiveByte();TWI_SendACK();// I2C_delay(20);ReadBuffer[(cnt * 8) + 7] = TWI_ReceiveByte();TWI_SendACK();TWI_STOP();ReadBuffer[58]|=(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) << count--);}break;default:break;}/* if(chn == 0)if(count == 0xff)count = 6;// if(!(TWI_START())){TWI_SendByte(CMD_Read);ReadBuffer[cnt * 8] = TWI_ReceiveByte();TWI_SendACK();ReadBuffer[(cnt * 8) + 1] = TWI_ReceiveByte();TWI_SendACK();TWI_STOP();}ReadBuffer[56]|=(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) << count);}if(chn == 1){// if(!(TWI_START())){TWI_SendByte(CMD_Read);ReadBuffer[(cnt * 8) + 2] = TWI_ReceiveByte();TWI_SendACK();ReadBuffer[(cnt * 8) + 3] = TWI_ReceiveByte();TWI_SendACK();TWI_STOP();}ReadBuffer[57]|=(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) << count);}if(chn == 2)// if(!(TWI_START())){TWI_SendByte(CMD_Read);ReadBuffer[(cnt * 8) + 6] = TWI_ReceiveByte();TWI_SendACK();// I2C_delay(20);ReadBuffer[(cnt * 8) + 7] = TWI_ReceiveByte();TWI_SendACK();TWI_STOP();}ReadBuffer[59]|=(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) << count);}if(chn == 3){// if(!(TWI_START())){TWI_SendByte(CMD_Read);// I2C_delay(20);ReadBuffer[(cnt * 8) + 4] = TWI_ReceiveByte();TWI_SendACK();// I2C_delay(20);ReadBuffer[(cnt * 8) + 5] = TWI_ReceiveByte();TWI_SendACK();TWI_STOP();}ReadBuffer[58]|=(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7) << count--);}*///===================================== ============================///#ifndef __ADS1115_H#define __ADS1115_H#include "stm32f10x_i2c.h"#include "stm32f10x_gpio.h"#define CMD_Write 0x90#define CMD_Read 0x91#define CMD_CONF_REG 0x01#define CMD_POINT_REG 0x00#define CONF_L 0xe3void Get_ATOD (unsigned char channel,unsigned char cnt); #endif。

ADS1115程序

ADS1115程序#include "HEAD.h"void main( void ){uchar Value;// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;int_clk();Write_COnfig(0x40,0xE3); //写配置寄存器Value=Read_Conversion_MSB();LCD_show_DA(Value);}void Write_Byte(uchar Data) //所有写时间片操作至少需要60us {uchar i=0;SCL_0;SCL_OUT; //时钟信号为输出SDA_0;SDA_OUT; //数据信号为输出delay_us(5);for(i=0;i<8;i++){SCL_0;delay_us(5);if(Data&0x80==1)SDA_1;elseSDA_0;delay_us(1);SCL_1;delay_us(2);Data<<=1;}SCL_0;delay_us(5);SDA_0;delay_us(1);SCL_1;delay_us(2);}uchar Read_Byte(void) {uchar i = 0;uchar Data=0;SCL_0;SCL_OUT; //时钟信号为输出SDA_1;SDA_IN; //数据信号为输入for(i=0; i<8; i++){Data<<=1;SCL_0;delay_us(5);if(1==SDA_PIN)Data|=0x01;delay_us(1);SCL_1;delay_us(2);}SCL_1;delay_us(5);return Data;}void Write_COnfig(uchar MSB,uchar LSB) //写配置寄存器{Write_Byte(ADDRESS_WRITE);Write_Byte(POINT_Config_register);Write_Byte(MSB); Write_Byte(LSB);}void Write_Lo_Thresh(uchar LSB) //写低阀值寄存器{Write_Byte(ADDRESS_WRITE);Write_Byte(POINT_Lo_register);Write_Byte(LSB);}void Write_Hi_Thresh(uchar MSB) //写高阀值寄存器{Write_Byte(ADDRESS_WRITE);Write_Byte(POINT_Hi_register);Write_Byte(MSB);}void Read_Conversion(void) //指向转换寄存器{Write_Byte(ADDRESS_READ);Write_Byte(POINT_Conversion_register);}uchar Read_Conversion_MSB(void) //只读转换寄存器高8位{uchar MSB;Read_Conversion(); //指向转换寄存器Write_Byte(ADDRESS_READ);MSB=Read_Byte();delay_us(20);return MSB;}uint Read_Conversion_M_L(void) //读转换寄存器高,低8位{uint M_L_SB;uchar LSB,MSB;Read_Conversion(); //指向转换寄存器Write_Byte(ADDRESS_READ);MSB=Read_Byte();LSB=Read_Byte();M_L_SB=(uint)MSB<<8+LSB;delay_us(20);return M_L_SB;}。

基于51的ads1115程序编写

/*------------------------------------------------------------------------------------------------------------------------------------------*/ /*--*************************功能:【ADS1115单端输入检测电压】********************--*/ /*--*************************CPU:【STC12C5A60S2】*******************************--*/ /*--*************************ADC芯片:【ADS1115(2差分输入或4单端输入)】***********--*/ /*--*************************液晶:【LCD1602】************************************--*/ /*--*************************ADC与单片机连接:【SCL:P1.0 , SDA:P1.1】*******************--*/ /*--*************************检测范围:【0.00~4.99V】*********************************--*/ /*----------------------------------------------------------------------------------------------------------------------------------------*/ #include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define _Nop() _nop_()/*------------------------以下为LCD1602显示模块端口定义及函数声明-----------------------*/sbit lcd_rs_port = P1^7; /*定义LCD控制端口*/sbit lcd_rw_port = P1^6;sbit lcd_en_port = P2^4;#define lcd_data_port P0unsigned char num_char_table[] = {"0123456789ABCDEF"};unsigned char Lcd_Dis1_table[] = {"Volt: V "}; //电压显示框架unsigned char pos_char_table[] = {" 67.9AB V "}; //电压显示位置void lcd_delay(uchar ms); //LCD1602 延时void lcd_busy_wait(); //LCD1602 忙等待void lcd_command_write(uchar command); //LCD1602 命令字写入void lcd_system_reset(); //LCD1602 初始化void lcd_char_write(uchar x_pos,y_pos,lcd_dat); //LCD1602 字符写入void lcd_bad_check(); //LCD1602 坏点检查void Num_to_Disp(uint Num); //LCD1602 数据处理void LcdDisp(uint num); //LCD1602 数据显示void delay_1ms(uchar x); //LCD1602 延时1ms/*------------------------以下为ADS1115模块端口定义及函数声明--------------------------*/sbit SCL = P1^0;sbit SDA = P1^1;#define TRUE 1#define FALSE 0unsigned int Config;unsigned char Writebuff[4],Readbuff[3];unsigned int Result[2];int D_ADS; //转换的数字量#define Accuracy 32768 //定义ADC精度,ADS1115单端输入时15位char VCC = 4.78; //VCC,电压参考值#define ADDRESS_0 0x90 //ADDR PIN ->GND#define ADDRESS_1 0x92 //ADDR PIN ->VDD#define ADDRESS_2 0x94 //ADDR PIN ->SDA#define ADDRESS_3 0x96 //ADDR PIN ->SCL/************POINTER REGISTER*****************/ #define Pointer_0 0x00 //Convertion register#define Pointer_1 0x01 //Config register#define Pointer_2 0x02 //Lo_thresh register#define Pointer_3 0x03 //Hi_thresh register/************CONFIG REGISTER*****************/ #define OS_0 0x0000#define OS_1 0x8000#define MUX_0 0x0000 //AINp=AIN0, AINn=AIN1#define MUX_1 0x1000 //AINp=AIN0, AINn=AIN3#define MUX_2 0x2000 //AINp=AIN1, AINn=AIN3#define MUX_3 0x3000 //AINp=AIN2, AINn=AIN3#define MUX_4 0x4000 //AINp=AIN0, AINn=GND#define MUX_5 0x5000 //AINp=AIN1, AINn=GND#define MUX_6 0x6000 //AINp=AIN2, AINn=GND#define MUX_7 0x7000 //AINp=AIN3, AINn=GND#define PGA_0 0x0000 //FS=6.144V#define PGA_1 0x0200 //FS=4.096V#define PGA_2 0x0400 //FS=2.048V#define PGA_3 0x0600 //FS=1.024V#define PGA_4 0x0800 //FS=0.512V#define PGA_5 0x0A00 //FS=0.256V#define PGA_6 0x0C00 //FS=0.256V#define PGA_7 0x0E00 //FS=0.256V#define MODE_0 0x0000#define MODE_1 0x0100#define DR_0 0x0000 //Data Rate = 8#define DR_1 0x0020 //Data Rate = 16#define DR_2 0x0040 //Data Rate = 32#define DR_3 0x0060 //Data Rate = 64#define DR_4 0x0080 //Data Rate = 128#define DR_5 0x00A0 //Data Rate = 250#define DR_6 0x00C0 //Data Rate = 475#define DR_7 0x00E0 //Data Rate = 860#define COMP_MODE_0 0x0000#define COMP_MODE_1 0x0010#define COMP_POL_0 0x0000#define COMP_POL_1 0x0008#define COMP_LAT_0 0x0000#define COMP_LAT_1 0x0040#define COMP_QUE_0 0x0000#define COMP_QUE_1 0x0001#define COMP_QUE_2 0x0002#define COMP_QUE_3 0x0003//*************ADDR Initial********************/#define ADDRESS ADDRESS_0 //ADDR PIN ->GND#define ADDRESS_W ADDRESS|0x00 //写地址#define ADDRESS_R ADDRESS|0x01 //读地址/*************Config Initial*********************/#define OS OS_1#define MUX_A0 MUX_4 //AINp=AIN0, AINn=GND#define MUX_A1 MUX_5 //AINp=AIN1, AINn=GND#define MUX_A2 MUX_6 //AINp=AIN2, AINn=GND#define MUX_A3 MUX_7 //AINp=AIN3, AINn=GND#define PGA PGA_1 //FS=6.144V#define MODE MODE_1 //Continuous conversion mode#define DR DR_7 //Data Rate = 860#define COMP_QUE COMP_QUE_3void Delay_us_15 (void);void Delay_ms_1 (void); //功能:延时void Start(void); //功能:完成IIC的起始条件操作void Stop(void); //功能:完成IIC的终止条件操作void ACK(void); //功能:完成IIC的主机应答操作void NACK(void); //功能:完成IIC的主机无应答操作unsigned char Check(void);//功能:检查从机的应答操作void Write_1_Byte(unsigned char DataByte); //写1个字节unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n); //写N个字节unsigned char Read_1_Byte(void); //读1个字节void Read_N_Byte(unsigned int *readbuff,unsigned char n); //读N个字节void InitADS1115(bit S_MUX_0, bit S_MUX_1); //ADS1115初始化void WriteWord(void); //写void ReadWord(void); //读unsigned int ADS1115(bit S_MUX_0, bit S_MUX_1); //ADS1115取值/*--------------------------------------------------------------------------------------------------------------------------------*/ /*--*********************************【主函数】*******************************--*/ /*-------------------------------------------------------------------------------------------------------------------------------*/ void main(){unsigned int result;lcd_system_reset(); //LCD1602 初始化lcd_bad_check(); //LCD1602 坏点检查while(1){result = ADS1115(0,0); //ADS1115取值_AIN0//result = ADS1115(0,1); //ADS1115取值_AIN1//result = ADS1115(1,0); //ADS1115取值_AIN2//result = ADS1115(1,1); //ADS1115取值_AIN3LcdDisp(result); //LCD1602显示电压值}}/*--------------------------------------------------------------------------------------------------------------------------------*/ /*--****************************************************************************--*/ /*-------------------------------------------------------------------------------------------------------------------------------*//*------------------------以下为LCD1602显示模块函数定义-----------------------*/void lcd_delay(uchar ms) /***********LCD1602 延时***************/{uchar j;while(ms--){for(j=0;j<250;j++){;}}}void lcd_busy_wait() /**********LCD1602 忙等待*************/{lcd_rs_port = 0;lcd_rw_port = 1;lcd_en_port = 1;lcd_data_port = 0xff;while (lcd_data_port&0x80);lcd_en_port = 0;}void lcd_command_write(uchar command) /**********LCD1602 命令字写入*************/ {lcd_busy_wait();lcd_rs_port = 0;lcd_rw_port = 0;lcd_en_port = 0;lcd_data_port = command;lcd_en_port = 1;lcd_en_port = 0;}void lcd_system_reset() /**********LCD1602 初始化**************/{lcd_delay(20);lcd_command_write(0x38);lcd_delay(100);lcd_command_write(0x38);lcd_delay(50);lcd_command_write(0x38);lcd_delay(10);lcd_command_write(0x08);lcd_command_write(0x01);lcd_command_write(0x06);lcd_command_write(0x0c);}void lcd_char_write(uchar x_pos,y_pos,lcd_dat) /******LCD1602 字符写入**********/ {x_pos &= 0x0f; /* X位置范围0~15 */y_pos &= 0x01; /* Y位置范围0~ 1 */if(y_pos==1) x_pos += 0x40;x_pos += 0x80;lcd_command_write(x_pos);lcd_busy_wait();lcd_rs_port = 1;lcd_rw_port = 0;lcd_en_port = 0;lcd_data_port = lcd_dat;lcd_en_port = 1;lcd_en_port = 0;}void lcd_bad_check() /******LCD1602 坏点检查**********/{char i,j;for(i=0;i<2;i++){for(j=0;j<16;j++) {lcd_char_write(j,i,0xff);}}lcd_delay(200);lcd_delay(200);lcd_delay(200);lcd_delay(100);lcd_delay(200);lcd_command_write(0x01); // clear lcd disp}void Num_to_Disp(uint Num) /******LCD显示数据处理*****/ //Start_1-Over_1:显示电压值,Start_2-Over_2:显示ADS1115输出数值{float NUM; //Start_1int xx, yy, zz, zzz;NUM = (Num / (float)Accuracy) * VCC; //ADS1115取值= Accuracy ×(Vin / VCC)xx = (int)NUM;yy = (int)((NUM - (float)(xx)) * 10);zz = (int)((NUM - (float)(xx)) * 100)%10;zzz = (int)((NUM - (float)(xx)) * 1000)%10;pos_char_table[6] = num_char_table[xx / 10]; //电压值十位pos_char_table[7]= num_char_table[xx % 10]; //电压值个位pos_char_table[9]= num_char_table[yy]; //电压值小数点后一位pos_char_table[10]= num_char_table[zz]; //电压值小数点后两位pos_char_table[11]= num_char_table[zzz]; //电压值小数点后三位//Over_1/*pos_char_table[6] = num_char_table[Num / 10000]; //Start_2pos_char_table[7] = num_char_table[(Num % 10000) / 1000];pos_char_table[8]= num_char_table[((Num % 10) % 1000) / 100];pos_char_table[9]= num_char_table[(Num / 10) % 10];pos_char_table[A]= num_char_table[Num % 10]; //Over_2*/}void LcdDisp(uint num) /************LCD显示*************/{uint i=0;for (i=0;i<16;i++){lcd_char_write(i,0,Lcd_Dis1_table[i]); //显示框架}Num_to_Disp(num);for(i = 6; i < 12; i++){lcd_char_write(i,0,pos_char_table[i]); //显示电压}delay_1ms(100);}void delay_1ms(uchar x) /*******1MS为单位的延时程序******/{uchar j;while(x--){for(j=0;j<125;j++){;}}}/*------------------------以下为ADS1115模块端口函数定义--------------------------*/void Delay_us_15 (void) /*延时程序*/{unsigned char i;for(i = 0;i < 15;i++)_nop_();}void Delay_ms_1 (void){unsigned char i;for(i = 150;i > 0;i--) _nop_();}///*******************************************//函数名称:Start//功能:完成IIC的起始条件操作//参数:无//返回值:无//********************************************/void Start(void){SCL=1;SDA=1;Delay_us_15 ();SDA=0;Delay_us_15 ();SCL=0;Delay_us_15 ();}/////*******************************************//函数名称:Stop//功能:完成IIC的终止条件操作//参数:无//返回值:无//********************************************/void Stop(void){SDA=0;Delay_us_15 ();SCL=1;Delay_us_15 ();SDA=1;Delay_us_15 ();}///******************************************* //函数名称:ACK//功能:完成IIC的主机应答操作//参数:无//返回值:无//********************************************/ void ACK(void){SDA=0;_nop_(); _nop_();SCL=1;Delay_us_15 ();SCL=0;_nop_(); _nop_();SDA=1;Delay_us_15 ();}//******************************************* //函数名称:NACK//功能:完成IIC的主机无应答操作//参数:无//返回值:无//********************************************/ void NACK(void){SDA=1;_nop_(); _nop_();SCL=1;Delay_us_15 ();SCL=0;_nop_(); _nop_();SDA=0;Delay_us_15 ();}//**********检查应答信号函数******************/ ///*如果返回值为1则证明有应答信号,反之没有*/ ///******************************************* //函数名称:Check//功能:检查从机的应答操作//参数:无//返回值:从机是否有应答:1--有,0--无//********************************************/ unsigned char Check(void){unsigned char slaveack;SDA=1;_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();slaveack = SDA; //读入SDA数值SCL=0;Delay_us_15 ();if(slaveack) return FALSE;else return TRUE;}/***************Write a Byte****************/void Write_1_Byte(unsigned char DataByte){int i;for(i=0;i<8;i++){if(DataByte&0x80) //if((DataByte<<i)&0x80)SDA=1;elseSDA=0;Delay_us_15 ();SCL=1;Delay_us_15 ();SCL=0;Delay_us_15 ();DataByte <<= 1;}SDA=1;_nop_();}/***************Write N Byte****************/unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n) {int i;for(i=0;i<n;i++){Write_1_Byte(*writebuffer);if(Check()){writebuffer ++;}else{Stop();return FALSE;}Stop();return TRUE;}//***************Read a Byte****************/ unsigned char Read_1_Byte(void){unsigned char data_Value = 0, FLAG, i;for(i=0;i<8;i++){SDA=1;Delay_us_15 ();SCL=1;Delay_us_15 ();FLAG=SDA;data_Value <<= 1;if( FLAG)data_Value |= 0x01;SCL=0;Delay_us_15 ();}return data_Value;}//***************Read N Byte****************/ void Read_N_Byte(unsigned int*readbuff, unsigned char n) {unsigned char i;for(i=0;i<n;i++){readbuff[i]=Read_1_Byte();if(i==n-1)NACK(); //不连续读字节elseACK(); //连续读字节}Stop();}//*****************初始化******************/ void InitADS1115(bit S_MUX_0, bit S_MUX_1){if (S_MUX_0 == 0 && S_MUX_1 == 0) //AIN0 Config = OS+MUX_A0+PGA+DR+COMP_QUE+MODE;if (S_MUX_0 == 0 && S_MUX_1 == 1) //AIN1 Config = OS+MUX_A1+PGA+DR+COMP_QUE+MODE;if (S_MUX_0 == 1 && S_MUX_1 == 0) //AIN2 Config = OS+MUX_A2+PGA+DR+COMP_QUE+MODE;if (S_MUX_0 == 1 && S_MUX_1 == 1) //AIN3 Config = OS+MUX_A3+PGA+DR+COMP_QUE+MODE;Writebuff[0]=ADDRESS_W;Writebuff[1]=Pointer_1;Writebuff[2]=Config/256;Writebuff[3]=Config%256;Readbuff[0]=ADDRESS_W;Readbuff[1]=Pointer_0;Readbuff[2]=ADDRESS_R;}//***************Write a Word***********************/void WriteWord(void){int t;Start(); //写入4个字节do{t=Write_N_Byte(Writebuff,4);}while(t==0);}//***************Read Word***********************/void ReadWord(void){int t;Start(); //写入2个字节do{t=Write_N_Byte(Readbuff,2);}while(t==0);Start(); //写入2个字节do{t=Write_N_Byte(&Readbuff[2],1);}while(t==0);Read_N_Byte(Result,2); //读出2个字节}//***************ADS1115********************/ unsigned int ADS1115(bit S_MUX_0, bit S_MUX_1) {InitADS1115(S_MUX_0, S_MUX_1);WriteWord();Delay_ms_1();ReadWord();D_ADS=Result[0]*256+Result[1]; //转换的数字量return D_ADS;}。

51单片机8个跑马灯程序汇编设计思路

51单片机8个跑马灯程序汇编设计思路51单片机8个跑马灯程序汇编设计思路主题:51单片机8个跑马灯程序汇编设计思路引言:在微电子领域中,51单片机是应用最广泛的一种单片机。

它具有性能稳定、开发简单、存储容量大等特点,广泛应用于各种电子设备中。

其中,跑马灯程序是初学者最常接触的一个项目,通过实践该项目,我们可以提高对汇编语言的理解和应用能力。

本文将介绍51单片机8个跑马灯程序汇编设计的思路,以帮助读者更好地掌握该项目。

一、跑马灯程序的基本原理1.1 硬件设计51单片机跑马灯程序的实现需要使用LED灯和适当的电路连接。

我们可以选择使用8个LED灯,分别连接到IO口P0.0~P0.7上。

通过对IO口的控制,即可控制LED灯的亮灭。

1.2 软件设计在51单片机中,我们需要使用汇编语言来编写程序。

跑马灯程序的实现思路是通过对LED灯的逐个依次点亮和熄灭,实现灯光在各个LED之间不断左右滚动的效果。

通过不断循环该过程,即可实现跑马灯效果。

二、跑马灯程序的编写2.1 初始化设置在程序的开始部分,我们需要进行一些初始化设置。

需要设置IO口的工作模式,将所有IO口设置为输出模式。

需要设置定时器和中断相关的参数,以便后续的延迟操作。

2.2 跑马灯效果的实现跑马灯的实现思路可以分为两个部分:向左滚动和向右滚动。

2.2.1 向左滚动向左滚动的实现思路是依次点亮LED灯,然后通过适当的延迟时间熄灭LED灯,实现灯光的滚动效果。

在点亮一个LED灯之后,下一个LED灯便开始点亮。

通过循环该操作,即可实现向左滚动的效果。

2.2.2 向右滚动向右滚动的实现思路与向左滚动类似,只是点亮LED灯的顺序相反。

在点亮一个LED灯之后,上一个LED灯便开始点亮。

通过循环该操作,即可实现向右滚动的效果。

2.3 循环控制为了实现跑马灯的效果,我们需要将向左滚动和向右滚动两个操作循环执行。

通过添加一个计数器变量,当计数器达到一定的值时,切换滚动方向,实现跑马灯效果的循环。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Main.c
#include "ads1118.h"
void Init(void) // 此函数方便串口调试
{
TMOD = 0X20;
TH1 = 0XF3;
TL1 = 0XF3;
TR1 = 1;
SM1 = 1;SM0 = 0;
REN = 1;
TI = 1;
}
float Volt_Value;
void main(void)
{
uint value;
Init();
EA = 1;
ADS1118_Init();
Write_ADS1118(CONFIG_VALUE,0);
while(1)
{
delay_ms(1000);
value = ADS_SEL_Read(0,4); //0.512V
printf("value = %d\n\r",value);
Volt_Value = value*0.512/32768; // 第二次转换时读出的是前一次的电压
printf("Volt_Value %f\n\r\n\r",Volt_Value);
}
}
Ads1118.c
#include "ads1118.h"
void delay_ms(uint z)
{
uint x;
for(;z>0;z--)
for(x=120;x>0;x--);
}
void ADS1118_Init(void)
{
CS_H;
SCLK_H;
MOSI_L;
}
union aa
{
uint dat1[2];
ulong dat2;
};
uint Write_ADS1118(uint dat,uchar mode)
{
// uint temp;
union aa temp;
union aa temp1;
// ulong Value;
uchar i;
if(mode == 1) dat |= 0x8000;
temp.dat1[1] = dat;
temp.dat1[0] = dat;
SCLK_L;
CS_L;
delay_ms(1);
for(i=0;i<32;i++)
{
if(temp.dat2 & 0x80000000)MOSI_H;
else MOSI_L;
temp.dat2 <<= 1;
_nop_();
SCLK_H;
_nop_();
SCLK_L;
_nop_();
temp1.dat2 <<= 1;
if(READ_MISO)temp1.dat2 |= 0x01;
_nop_();
}
CS_H;
SCLK_L;
MOSI_L;
MISO_L;
printf("temp %d\n\r",temp1.dat1[0]);
printf("temp %#X\n\r",temp1.dat1[1]);
return temp1.dat1[0];
}
int ADS_SEL_Read(uchar road,uchar Ref) // 测几路电压
{
int dat = 0;
uint Config_Value = 0x008b; // 默认低8 位,DOUT 带上拉电阻switch(road)
{
case 0: Config_Value += 0x0000;break; //AINP = AIN0 and AINN = AIN1 (default)
case 1: Config_Value += 0x1000;break; //AINP = AIN0 and AINN = AIN3
case 2: Config_Value += 0x2000;break; //AINP = AIN1 and AINN = AIN3
case 3: Config_Value += 0x3000;break; //AINP = AIN2 and AINN = AIN3
case 4: Config_Value += 0x4000;break; //AINP = AIN0 and AINN = GND
case 5: Config_Value += 0x5000;break; //AINP = AIN1 and AINN = GND
case 6: Config_Value += 0x6000;break; //AINP = AIN2 and AINN = GND
case 7: Config_Value += 0x7000;break; //AINP = AIN3 and AINN = GND
default : break;
}
switch(Ref)
{
case 0: Config_Value += 0x0000;break; //000 : FS = ± 6.144V(1)
case 1: Config_Value += 0x0200;break; //001 : FS = ± 4.096V(1)
case 2: Config_Value += 0x0400;break; //002 : FS = ± 2.048V(1)
case 3: Config_Value += 0x0600;break; //003 : FS = ± 1.024V(1)
case 4: Config_Value += 0x0800;break; //004 : FS = ±0.512V(1)
case 5: case 6: case 7: Config_Value += 0x0a00;break; //005 : FS = ±0.256V(1)
default : break;
}
CS_L;
dat = Write_ADS1118(Config_Value,1);
_nop_();
CS_H;
return dat;
}
Ads1118.h
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
#define CONFIG_VALUE 0X038B //AIN0-AIN1 4.096 128sps pull on DOUT sbit SCLK = P2^1;
sbit MOSI = P2^2;
sbit MISO = P2^3;
sbit CS = P2^0;
#define SCLK_H SCLK = 1
#define SCLK_L SCLK = 0
#define MOSI_H MOSI = 1
#define MOSI_L MOSI = 0
#define MISO_H MISO = 1
#define MISO_L MISO = 0
#define CS_H CS = 1
#define CS_L CS = 0
#define READ_MISO P2 & 0X8
void ADS1118_Init(void);
uint Write_ADS1118(uint dat,uchar mode);
void delay_ms(uint z);
int ADS_SEL_Read(uchar road,uchar Ref);。

相关文档
最新文档