基于的ads程序編寫_第1頁
基于的ads程序編寫_第2頁
基于的ads程序編寫_第3頁
基于的ads程序編寫_第4頁
基于的ads程序編寫_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、/*-*/ /*-*功能: 【ADS1115單端輸入檢測電壓】*-*/*-*CPU: 【STC12C5A60S2】*-*/*-*ADC芯片:【ADS1115(2差分輸入或4單端輸入)】*-*/*-*液晶: 【LCD1602】*-*/*-*ADC與單片機連接:【SCL:P1.0 , SDA:P1.1】*-*/*-*檢測范圍:【0.004.99V】*-*/*-*/ #include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define _Nop() _

2、nop_()/*-以下為LCD1602顯示模塊端口定義及函數聲明-*/sbit lcd_rs_port = P17; /*定義LCD控制端口*/sbit lcd_rw_port = P16;sbit lcd_en_port = P24;#define lcd_data_port P0unsigned char num_char_table = "0123456789ABCDEF"unsigned char Lcd_Dis1_table = "Volt: V "/電壓顯示框架unsigned char pos_char_table = " 67.

3、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)

4、;/LCD1602 數據處理void LcdDisp(uint num);/LCD1602 數據顯示void delay_1ms(uchar x);/LCD1602 延時1ms/*-以下為ADS1115模塊端口定義及函數聲明-*/sbit SCL = P10;sbit SDA = P11;#define TRUE 1#define FALSE 0unsigned int Config;unsigned char Writebuff4,Readbuff3;unsigned int Result2; int D_ADS; /轉換的數字量#define Accuracy 32768 /定義ADC精度

5、,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

6、 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 /AI

7、Np=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=

8、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 /Dat

9、a 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

10、 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=AIN

11、0, 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 Del

12、ay_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個字節(jié)unsigned char Write_N_Byte(unsigned char *writebuff

13、er,unsigned char n);/寫 N個字節(jié)unsigned char Read_1_Byte(void);/讀 1個字節(jié)void Read_N_Byte(unsigned int *readbuff,unsigned char n);/讀 N個字節(jié)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取值/*-*/*-*【 主函數

14、】*-*/*-*/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顯示電壓值/*-*/*-*-*

15、/*-*/*-以下為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 c

16、ommand) /*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

17、_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位置范圍 015 */ y_pos &= 0x01; /* Y位置范圍 0 1 */ if(y_pos=1) x_pos += 0x40; x_pos += 0

18、x80; 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

19、);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

20、= (int)NUM;yy = (int)(NUM - (float)(xx) * 10);zz = (int)(NUM - (float)(xx) * 100)%10;zzz = (int)(NUM - (float)(xx) * 1000)%10;pos_char_table6 = num_char_tablexx / 10; /電壓值十位pos_char_table7= num_char_tablexx % 10;/電壓值個位pos_char_table9= num_char_tableyy;/電壓值小數點后一位pos_char_table10= num_char_tablezz;/電壓

21、值小數點后兩位pos_char_table11= num_char_tablezzz; /電壓值小數點后三位 /Over_1/*pos_char_table6 = num_char_tableNum / 10000; /Start_2pos_char_table7 = num_char_table(Num % 10000) / 1000;pos_char_table8= num_char_table(Num % 10) % 1000) / 100;pos_char_table9= num_char_table(Num / 10) % 10;pos_char_tableA= num_char_t

22、ableNum % 10; /Over_2*/void LcdDisp(uint num) /*LCD顯示*/uint i=0;for (i=0;i<16;i+) lcd_char_write(i,0,Lcd_Dis1_tablei); /顯示框架 Num_to_Disp(num);for(i = 6; i < 12; i+)lcd_char_write(i,0,pos_char_tablei); /顯示電壓 delay_1ms(100);void delay_1ms(uchar x) /*1MS為單位的延時程序*/ uchar j; while(x-) for(j=0;j<

23、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 ()

24、;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

25、();/*/函數名稱: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

26、; _nop_(); _nop_(); SCL=1; _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;els

27、e SDA=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 +;elseStop(); return FALSE;Stop()

28、;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+)readbuffi=Read_1_Byte();if(i=n-1)NACK(); /不連續(xù)讀字節(jié)else ACK(); /連續(xù)讀字節(jié)Stop();/*初始化*/void InitADS1115(bit S_MUX_0, bit S_MUX_1)if (S_MUX_0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論