|
发表于 2013-11-19 14:29:03
|
显示全部楼层
yongke 发表于 2013-11-12 13:02
你的程序贴出来?
这是很久以前写的 可以参考参考- #include "msp430.h"
- /***************************************************************************
- //IO口操作宏定
- ****************************************************************************/
- #define SET 1
- #define RESET 0
- #define _ADD_STR(a, b) a##b
- #define ADD_STR(a, b) _ADD_STR(a, b)
- #define _IO_PORT_IN(PORT) (PORT##IN)
- #define GPIO_READ_BITS(PORT, BIT) ( (_IO_PORT_IN(PORT) & BIT) ? (SET):(RESET))
- #define GOIO_READ_PORTS(PORT) ( _IO_PORT_IN(PORT) )
- #define _IO_PORT_OUT(PORT) (PORT##OUT)
- #define GPIO_SET_BITS(PORT, BIT) ( ( _IO_PORT_OUT(PORT) ) |= (BIT) )
- #define GPIO_RESET_BITS(PORT, BIT) ( ( _IO_PORT_OUT(PORT) ) &= ~(BIT) )
- #define _IO_PORT_DIR(PORT) (PORT##DIR)
- #define GPIO_OUTPUT_DIR(PORT, BIT) ( ( _IO_PORT_DIR(PORT) ) |= (BIT) )
- #define GPIO_INPUT_DIR(PORT, BIT) ( ( _IO_PORT_DIR(PORT) ) &= ~(BIT) )
- #define _IO_PORT_IE(PORT) (PORT##IE)
- #define GPIO_ENABLE_IRQ(PORT, BIT) ( ( _IO_PORT_IE(PORT) ) |= (BIT) )
- #define GPIO_DISABLE_IRQ(PORT, BIT) ( ( _IO_PORT_IE(PORT) ) &= ~(BIT) )
- #define _IO_PORT_SEL(PORT) (PORT##SEL)
- #define GPIO_PORT_FUNC(PORT, BIT) ( ( _IO_PORT_SEL(PORT) ) |= (BIT) )
- #define GPIO_MULTI_FUNC(PORT, BIT) ( ( _IO_PORT_SEL(PORT) ) &= ~(BIT) )
- #define TEST_BIT(x) ( GPIO_READ_BITS( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
- #define SET_BIT(x) ( GPIO_SET_BITS( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
- #define CLR_BIT(x) ( GPIO_RESET_BITS( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
- #define BIT_OUT(x) ( GPIO_OUTPUT_DIR( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
- #define BIT_IN(x) ( GPIO_INPUT_DIR( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
- #define EINT_BIT(x) ( GPIO_ENABLE_IRQ( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
- #define DINT_BIT(x) ( GPIO_DISABLE_IRQ( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
- /***************************************************************************
- //命令寄存器 (CMR)
- ****************************************************************************/
- #define Channel_0 0x0000//Select analog input channel 0
- #define Channel_1 0x1000//Select analog input channel 1
- #define Channel_2 0x2000//Select analog input channel 2
- #define Channel_3 0x3000//Select analog input channel 3
- #define Channel_4 0x4000//Select analog input channel 4
- #define Channel_5 0x5000//Select analog input channel 5
- #define Channel_6 0x6000//Select analog input channel 6
- #define Channel_7 0x7000//Select analog input channel 7
- #define WAKE_UP 0xB000//Wake up
- #define READ_CFR 0xC000//Read CFR
- #define READ_DATA 0xD000//Read data
- #define WRITE_CFR 0xE000//Write CFR
- #define DEFAULT_CFR 0xF000//Default mode
- /***************************************************************************
- //配置寄存器 (CFR)
- ****************************************************************************/
- #define AUTO_CHAN 0x0800//Channel select mode
- #define CCLK_INT 0x0400//Conversion clock (CCLK) source select
- #define MAN_TRG 0x0200//Trigger (conversion start) select
- #define SAT 0x0100//Sample rate for Auto-Trigger moden
- #define POL_INT_EOC_LOW 0x0080//Pin 10 polarity select when used as an
- #define PIN10_EOC 0x0040//Pin 10 polarity select when used as an
- #define PIN10_OUTPUT 0x0020//Pin 10 I/O select for daisy-chain mode operation
- #define ANAP_DISABLE 0x0010//Auto-Nap Power-Down enable/disable
- #define RESUME_NAP 0x0008//Nap Power-Down.
- #define RESUME_DEEP 0x0004//Deep Power-Down
- #define TAG 0x0002//TAG bit output enable
- #define NO_RESET 0x0001//Software reset
- //LCD 常用指令
- #define SYSDIS 0x00// 关振系统荡器和LCD偏压发生器
- #define SYSEN 0x01// 打开系统振荡器
- #define LCDOFF 0x02// 关LCD偏压
- #define LCDON 0x03// 打开LCD偏压
- #define BIASCOM 0x29// 1/3 偏置 4 位公共端
- /***************************************************************************
- //IO扣定义
- ****************************************************************************/
- #define NSS_PORT P2
- #define NSS_BIT BIT0
- #define SCLK_PORT P2
- #define SCLK_BIT BIT5
- #define MISO_PORT P2
- #define MISO_BIT BIT3
- #define MOSI_PORT P1
- #define MOSI_BIT BIT6
- #define RST_PORT P2
- #define RST_BIT BIT1
- #define CONV_PORT P2
- #define CONV_BIT BIT2
- #define INT_PORT P1
- #define INT_BIT BIT3
- /*****************************************************************
- 管脚分配 CS P1.0 WR P1.1 DAT P1.2
- *****************************************************************/
- #define LCD_CS_PORT P2 //LCD使能引脚
- #define LCD_CS_BIT BIT4 //LCD使能引脚
- #define LCD_WR_PORT P2 //LCD时钟引脚
- #define LCD_WR_BIT BIT5 //LCD时钟引脚
- #define LCD_Data_PORT P2 //LCD数据引脚
- #define LCD_Data_BIT BIT3 //LCD数据引脚
- float Voltage=0.0;
- unsigned char DIS_BUF[7];//显示缓冲区
- //段码解码表 0 1 2 3 4 5 6 7 8 9 - E R 空
- const unsigned char DIS[] = {0xD7,0x06,0xE3,0xA7,0x36,0xB5,0xF5,0x07,0xF7,0xB7,0x20,0xF1,0x51,0x00};
- /****************************************************************************
- * 名 称:void ADS8332_IO_INT(void)
- * 功 能:ADS8332驱动IO口初始化
- * 入口参数:无
- * 出口参数:无
- * 说 明:
- * 调用方法:ADS8332_IO_INT();
- ****************************************************************************/
- void ADS8332_IO_INT(void)
- {
- BIT_OUT(NSS);
- SET_BIT(NSS);
- BIT_OUT(SCLK);
- CLR_BIT(SCLK);//常态为低电平
- BIT_OUT(MOSI);
- SET_BIT(MOSI);
- BIT_OUT(RST);
- SET_BIT(RST);
- BIT_OUT(CONV);
- SET_BIT(CONV);
- BIT_IN(INT);
- BIT_IN(MISO);
- }
- /****************************************************************************
- * 名 称:void Delay(unsigned int n)
- * 功 能:通用延时
- * 入口参数:无
- * 出口参数:无
- * 说 明:
- * 调用方法:Delay(1000);
- ****************************************************************************/
- void Delay(unsigned int n)
- {
- for(;n>0;n--);
- }
- /*
- *********************************************************************************************************
- * Write_LCD_Byte()
- * Description : 向 LCD 写一字节
- *
- * Arguments : Data 数据 Length 数据长度
- *
- * Returns :
- *********************************************************************************************************
- */
- void Write_LCD_Byte(unsigned char Data,unsigned char Length)
- {
- unsigned char i,Temp=0x80;
- for (i=0;i<Length;i++)
- {
- CLR_BIT(LCD_WR); //“写”时钟置0
- if (Data&Temp)
- SET_BIT(LCD_Data); //数据线置1
- else
- CLR_BIT(LCD_Data); //数据线置0
- Temp>>=1; //准备下一位
- SET_BIT(LCD_WR); //“写”时钟置1
- Delay(100); //等待完成
- }
- SET_BIT(LCD_Data); //数据线置高 可减少IO口漏电流损耗
- }
- /*
- *********************************************************************************************************
- * Write_LCD_Data()
- * Description : 向 LCD 写数据
- *
- * Arguments : Address 写数据地址 Data 数据
- *
- * Returns :
- *********************************************************************************************************
- */
- void Write_LCD_Data(unsigned char Address,unsigned char Data)
- {
- CLR_BIT(LCD_CS); //片选置0
- Write_LCD_Byte(0xA0,3); //写入写数据的ID 101 高3位有效
- Write_LCD_Byte(Address,6);//写入6个位初始地址 高6位有效
- Write_LCD_Byte(Data,4); //写入4个位数据 高4位有效
- SET_BIT(LCD_CS); //片选置1
- }
- /*
- *********************************************************************************************************
- * Write_LCD_Command()
- * Description : 向 LCD 写命令
- *
- * Arguments : Command 命令
- *
- * Returns :
- *********************************************************************************************************
- */
- void Write_LCD_Command(unsigned char Command)
- {
- CLR_BIT(LCD_CS); //片选置0
- Write_LCD_Byte(0x80,3); //写入命令的ID:100
- Write_LCD_Byte(Command,8); //写入实际命令的高8位(CMD.):C8-C1
- SET_BIT(LCD_Data); //|写入一个“1”即手册上所指“无关位”的那一个数据位
- CLR_BIT(LCD_WR); //|
- Delay(100); //|
- SET_BIT(LCD_WR); //|
- SET_BIT(LCD_CS); //片选置1
- }
- /*
- *********************************************************************************************************
- * DisCharacter()
- * Description : 显示字符函数
- *
- * Arguments : *Data显示内容指针 Address 显示首位置 Length内容长度
- *
- * Returns :
- *********************************************************************************************************
- */
- void DisCharacter(unsigned char *Data,unsigned char Address,unsigned char Length,unsigned char Point)
- {
- unsigned char i,Temp;
- for(i=0;i<Length;i++)
- {
- Temp=DIS[*Data]; //数据解析
- Write_LCD_Data((Address*8-4),Temp); //写高4位数据
- if(i==(Point-1)) Temp=Temp|0x08; //小数点位判别
- Write_LCD_Data((Address*8),Temp<<=4);//写低4位数据
- Data ++; //显示数据指针增一
- Address ++; //显示地址增一
- }
- }
- /*
- *********************************************************************************************************
- * LCD_INIT()
- * Description : LCD IO口、设置初始化及清屏
- *
- * Arguments :
- *
- * Returns :
- *********************************************************************************************************
- */
- void LCD_INIT( void )
- {
- unsigned char i;
- BIT_OUT ( LCD_Data ); //|IO口初始化
- BIT_OUT ( LCD_CS ); //|
- BIT_OUT ( LCD_WR ); //|
- SET_BIT ( LCD_CS ); //|
- SET_BIT ( LCD_WR ); //|
- SET_BIT ( LCD_Data ); //|
- Write_LCD_Command(SYSEN); // 打开系统振荡器
- Write_LCD_Command(LCDON); // 打开LCD显示
- Write_LCD_Command(BIASCOM);// 设置驱动方式
- for(i=0;i<80;i++) Write_LCD_Data(i,0x00);//清屏
- }
- /*
- *********************************************************************************************************
- * Displays_Decoded()
- * Description : 显示解码函数
- *
- * Arguments : float DIS_Temp 待显示的数值
- *
- * Returns :
- *********************************************************************************************************
- */
- void Displays_Decoded(float DIS_Temp)
- {
- unsigned long Temp;
- unsigned char i;
- if(DIS_Temp<0)//负号判断
- {
- DIS_Temp=-DIS_Temp;
- DIS_BUF[0]=10;//设置负号
- }
- else
- DIS_BUF[0]=13;//清除负号
- if(DIS_Temp>=10000)
- i=0;
- else if(DIS_Temp>=1000)
- {
- DIS_Temp=DIS_Temp*10;
- i=5;
- }
- else if(DIS_Temp>=100)
- {
- DIS_Temp=DIS_Temp*100;
- i=4;
- }
- else if(DIS_Temp>=10)
- {
- DIS_Temp=DIS_Temp*1000;
- i=3;
- }
- else
- {
- DIS_Temp=DIS_Temp*10000;
- i=2;
- }
- Temp = (unsigned long) DIS_Temp;
- DIS_BUF[1]=Temp/10000;
- Temp=Temp%10000;
- DIS_BUF[2]=Temp/1000;
- Temp=Temp%1000;
- DIS_BUF[3]=Temp/100;
- Temp=Temp%100;
- DIS_BUF[4]=Temp/10;
- Temp=Temp%10;
- DIS_BUF[5]=Temp/1;
- DisCharacter(DIS_BUF,0x00,0x06,i);//显示计数值
- }
- /****************************************************************************
- * 名 称:void ADS8332_SPI_ReadWrite(unsigned int Data)
- * 功 能:模拟SPI读写
- * 入口参数:unsigned int Data 被写入数据
- * 出口参数:unsigned int Temp 读出数据
- * 说 明:Data = ADS8332_SPI_ReadWrite(0x1234)
- ****************************************************************************/
- unsigned int ADS8332_SPI_ReadWrite(unsigned int Data)
- {
- unsigned char i;
- unsigned int Temp=0x0000;
- CLR_BIT(NSS);//片选使能
- for(i=0;i<16;i++)//寄存器为16Bit
- {
- if(Data&0x8000)
- SET_BIT(MOSI);
- else
- CLR_BIT(MOSI);
- Delay(0x08);
- Temp <<= 0x01;//先读取高位
- Data <<= 0x01;//先从高位传输
- if(TEST_BIT(MISO)) Temp|=0x01;//片选之后 第一 Bit 就已经输出了
- SET_BIT(SCLK);//下降沿有效
- CLR_BIT(SCLK);//常态为低电平
- }
- SET_BIT(NSS);
- return Temp;
- }
- /****************************************************************************
- * 名 称:void ADS8332_Initi(void)
- * 功 能:ADS8332 初始化
- * 入口参数:
- * 出口参数:
- * 说 明:ADS8332_Initi(void)
- ****************************************************************************/
- void ADS8332_Init(void)
- {
- unsigned int Config=0x0000,Temp;
- ADS8332_IO_INT();//IO口初始化
- CLR_BIT(RST);//复位ADS8332
- Delay(0xFFFF);
- SET_BIT(RST);
- Delay(0xFFFF);
- Config |= WRITE_CFR;//配置工作模式具体见手册
- Config |= CCLK_INT;
- Config |= MAN_TRG;
- Config |= SAT;
- Config |= POL_INT_EOC_LOW;
- Config |= PIN10_OUTPUT;
- Config |= ANAP_DISABLE;
- Config |= RESUME_NAP;
- Config |= RESUME_DEEP;
- Config |= NO_RESET;
- ADS8332_SPI_ReadWrite(Config);//写配置寄存器
- Delay(0xFFFF);Delay(0xFFFF);Delay(0xFFFF);
- Temp = ADS8332_SPI_ReadWrite(READ_CFR);//读配置寄存器
- while(!((Temp&0x0FFF)==(Config&0x0FFF)));//比较写入和读出结果 相同则通过 不同则停在此处 应加其他处理
- }
- void main( void )
- {
- unsigned long Temp;
- WDTCTL = WDTPW + WDTHOLD;
- BCSCTL1 = CALBC1_8MHZ; //Set DCO to 1, 8, 12 or 16MHz
- DCOCTL = CALDCO_8MHZ; //如果用其他频率 相应延时要做调整
- LCD_INIT();//初始化液晶屏
- ADS8332_Init();//初始化 ADS8332
- P1DIR |= BIT6;
- for(;;)
- {
- ADS8332_SPI_ReadWrite(Channel_0);//选择通道0 每读一次设置一次 不然通道无效
- Delay(0x0F);
- CLR_BIT(CONV);//启动转换
- Delay(0x0F);
- SET_BIT(CONV);
- Delay(0x0F);
- while(TEST_BIT(INT)==1);//等待转换完成标志 应加超时判断 或者中断方式处理
-
- ADS8332_SPI_ReadWrite(READ_DATA);//读上一组数据 必须有不然读出数据错误
- Temp=ADS8332_SPI_ReadWrite(READ_DATA);//读本次转换数据 并且累加
- Voltage=Temp/65535.0*2.5;//计算电压 参考电压 2.5V
-
- //Voltage = (Voltage*1000.0 - 509.0) / 2.64; //VTEMP PIN = 509mV + 2.64 × T(°C) 测量 REF5025 温度输出 具体见参考手册
-
- Displays_Decoded(Voltage);//显示电压值
- P1OUT ^= BIT6;
- Delay(0xFF);
- }
- }
复制代码 |
|