MSP430单片机AD转换实验(20210119160218)
MSP430模数转换ADC

SREF2 SREF1 SREF0 0 0 1
#SREF_1
17
举例 :ADC12 通道 0 使用内部 1.5V 参考电压源
BIS #REFON , &ADC12CTL0 ; turn on 2.5V ref ; Vr+=Vref+ BIS.B #SREF_1 , &ADC12MCTL0
SREF2 SREF1 SREF0 0 0 1
#SREF_1
18
举例:VR+ 使用外部正参考电压源 VeREF+ or BIS.B #SREF_2 , &ADC12MCTL0 BIS.B #SREF_3 , &ADC12MCTL0
SREF2 SREF1 SREF0 0 1 x
#SREF_2 or #SREF_3
19
ADC12工作时钟(ADC12CLK)编程设置
ADC12模块是一个转换速度高达 200ksps、采样时间可编程 的12-bit逐次逼近型模数转换器。由12-bit的SAR核、采样保 持电路、模拟开关、参考电压产生与选择电路、 ADC 时钟 选择电路、采样与转换控制电路、16个转换结果存储缓冲器 及其对应的16个存储控制寄存器、中断系统、片上集成温度 传感器等组成。 ADC12可以在没有CPU的参与下,独立实 现多达 16 次的采样、转换和存储操作。 ADC12 模块可以独 立断电,以便于低功耗设计。 MSP430X13X,MSP430X14X,MSP43015X 和 MSP430X16X 等 芯片中均有ADC12模块。
采样保持输入信号的宽度
0~1×ADC12CLK
tsample = 采样定时器输出信号的宽度 4×ADC12CLK≤tsample ≤1024×ADC12CLK
MSP430单片机构成ΣΔ型AD转换器原理及实现方法

* !$$(+,A,%)/#$)
(0)
在一定的误差范围内,有 !>?@ * !’(,则:
!’( *(+,A,(%)+%()/#$)
* !$$(+,A,%)/#$)
(/)
虽然 %)+ * %)! *’’’和 %(+ * %(!
*’’’不一定成立,但总体效果上看,可以认为它
们是等宽的’由- 个高电平和. ,- B!型 /E转换器原理及实现方法
刘 刚,刘风 ,于 军
(吉林化工学院 自动化系,吉林 吉林 ?"!(!!)
摘要:主要介绍 83D*"(微功耗单片机构成 !B!型 /E转换器的原理,给出了对应的电路图和程序框
图&83D*"(单片机主要特点是功耗极低、片内含有比较器,可以使用很少的零件构成 !B!型 /E 转换
器即增加了成本,又存在单片机与 /E 转换器连
字值&对含有比较器的单片机可以使用很少的零 件构成 !B!型 /E转换器,得较高的分辨率&
(")83D*"(系列单片机是美国德州仪器公 司?AA)年以后逐步开发出来的?)位微功耗单片 机(86-)&主要特点是功耗极低、开发方便、产品 系列化,可随使用要求不同选择相应产品&本文介 绍的 !B! 型 /E 转换电路由 83D*"(1*?" 单片 机构成,其片内结构如图?所示&
相似文献(9条)
1.期刊论文 崔明.佟刚.吴志勇.CUI MING.TONG GANG.WU ZHIYONG 基于MSP430的纸张耐压强度检测系统 -微计
算机信息2007,23(29)
基于MSP430单片机开发了一种新型的纸张耐压强度检测系统.采集的微弱信号通过两级放大器放大,测量时自动变换量程,提高了检测结果的精 度和稳定性.利用MSP430单片机片上外围部件集成度高的特性,使系统结构紧凑,节约了成本.增强的用户接口界面,使操作简便.
msp430ADDA实验

P7SEL (BIT2+BIT3)
// LCD segment definitions. #define d 0x01 #define c 0x20 #define b 0x40 #define a 0x80 #define dp 0x10 #define g 0x04 #define f 0x08 #define e 0x02 uint8_t con[10] , trans_v[10]; const char char_gen[] = {
const char char_gen_dp[] = { board
a+b+c+d+e+f+dp, b+c+dp, a+b+d+e+g+dp, a+b+c+d+g+dp, b+c+f+g+dp, a+c+d+f+g+dp, a+c+d+e+f+g+dp, a+b+c+dp, a+b+c+d+e+f+g+dp, a+b+c+d+f+g+dp, a+b+c+e+f+g, c+d+e+f+g, a+d+e+f, b+c+d+e+g, a+d+e+f+g, a+e+f+g, a+b+c+d+f+g, c+e+f+g, b+c, b+c+d, b+c+e+f+g, d+e+f, a+b+c+e+f,
MSP430单片机AD转换实验

AD转换实验一、转换原理MSP430F149勺A/D转换器原理请参考相关书籍。
实验板上与AD相关的硬件电路:RV310K------------ 3-3\J6P61SI?2Al)输入电路RV4III-10K f > 2 ;|||二、转换程序1、程序1:转换结果发送到PC主程序中进行A/D初始化,中断服务程序读A/D转换结果,主程序中通过串口发送结果。
“ main 、c ”主程序与中断程序:/*********************************************************程序功能:将ADC 对P6、0端口电压的转换结果按转换数据与对应的 模拟电压的形式通过串口发送到PC 机屏幕上显示通信格式 :N 、 8、 1, 9600测试说明 :打开串口调试精灵 ,正确设置通信格式 ,观察接收数据 **********************************************************/ #include <msp430 、 h> #include "allfunc 、 h" #include "UART0_Func 、 c" #include "ADC_Func 、 c" #define Num_of_Results 32 uint results[Num_of_Results]; // 保存 ADC 转换结果的数组uint average; uchar tcnt = 0; /*********************** void main( void ){uchar i; uchar buffer[5];WDTCTL = WDTPW + WDTHOLD; // 关狗 /* 下面六行程序关闭所有的 IO 口 */ P1DIR = 0XFF;P1OUT = 0XFF; P2DIR = 0XFF;P2OUT=0XFF;P3DIR = 0XFF;P3OUT=0XFF;P4DIR = 0XFF;P4OUT=0XFF;P5DIR = 0XFF;P5OUT=0XFF;P6DIR = 0XFF;P6OUT = 0XFF; P6DIR |= BIT2;P6OUT |= BIT2; // P6DIR|=BIT6;P6OUT&=~BIT6; //InitUART(); Init_ADC(); _EINT(); buffer[4] = '\0';主函数 *********************关闭电平转换关闭数码管显示while(1){LPM1;Hex2Dec(average,buffer);for(i = 0; i < 4; i++) buffer[i] += 0x30;PutString0("The digital value is: ");PutString(buffer);Trans_val(average,buffer); buffer[3] = buffer[2]; buffer[2] = buffer[1];buffer[1] = 0x2e - 0x30; for(i = 0; i < 4; i++) buffer[i] += 0x30;PutString0("The analog value is: "); PutString(buffer);}}/******************************************* 函数名称:ADC12ISR功能:ADC中断服务函数,在这里用多次平均的计算P6、0 口的模拟电压数值参数: 无返回值: 无********************************************/ #pragmavector=ADC_VECTOR __interrupt void ADC12ISR (void) { static uchar index = 0;results[index++] = ADC12MEM0; // Move results if(index == Num_of_Results) {uchar i;average = 0;for(i = 0; i < Num_of_Results; i++){ average += results[i];average >>= 5; // 除以 32index = 0; tcnt++;if(tcnt == 250) // 主要就是降低串口发送速度 { LPM1_EXIT; tcnt = 0; } }}“ADC_Func 、 c ” A/D 转换相关程序 : #include <msp430 、 h> typedef unsigned int uint; /******************************************** 函数名称 :Init_ADC 功 能: 初始化 ADC 参 数: 无 返回值 : 无********************************************/ void Init_ADC(void) {P6SEL |= 0x01; // ADC12CTL0 =ADC12ON+SHT0_15+MSC; // ADC12CTL1 =SHP+CONSEQ_2; // ADC12IE = 0x01; // ADC12CTL0 |= ENC; // ADC12CTL0 |= ADC12SC; //}/******************************************** 函数名称 :Hex2Dec功 能:将16进制ADC 专换数据变换成十进制表示形式参数:Hex_Val--16 进制数据 ptr--指向存放专换结果的指针返回值 : 无 ********************************************/ void Hex2Dec(uint Hex_val,uchar *ptr) { ptr[0] = Hex_val / 1000;ptr[1] = (Hex_val - ptr[0]*1000)/100; ptr[2] = (Hex_val - ptr[0]*1000 - ptr[1]*100)/10;使能ADC 通道打开ADC 设置采样时间 使用采样定时器 使能ADC 中断 使能专换 开始专换、 41ptr[3] = (Hex_val - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10);}/******************************************* 函数名称 :Trans_val功 能:将16进制ADC 专换数据变换成三位 10进制真实的模拟电压数据 , 并在液晶上显示参数:Hex_Val--16 进制数据返回值 : 无********************************************/ void Trans_val(uint Hex_Val,uchar *ptr){unsigned long caltmp; uint Curr_Volt; uchar t1;caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 33 caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10 Curr_Volt = caltmp >> 12; 〃Curr_Volt = caltmp / 25 ptr[0] = Curr_Volt / 100;//Hex->Dect1 = Curr_Volt - (ptr[0] * 100); ptr[1] = t1 / 10;ptr[2] = t1 - (ptr[1] * 10);}“UARTO_Func c ”串口程序: #include <msp430 、h> typedef unsigned char uchar;/******************************************* 函数名称 :InitUART 功 能:初始化UART 端 口参 数: 无 返回值 : 无********************************************// P3 、 4,5 =// Enable USART0 T/RXD// 8-bit character// UCLK = ACLK// 32k/9600 - 3 // // Modulationvoid InitUART(void){P3SEL |= 0x30; ME1 |= URXE0 + UTXE0;UCTL0 |= CHAR; UTCTL0 |= SSEL0; UBR00 = 0x03; UBR10 = 0x00; UMCTL0 = 0x4A;变换USART0 TXD/RXD// Initialize USART state machine}/*******************************************函数名称:Send1Char功能:向PC机发送一个字符参数:se ndchar--要发送的字符返回值:无********************************************void Send1Char(uchar sendchar){while (!(IFG1 & UTXIFG0)); //TXBUF0 = sendchar;等待发送寄存器为空} /******************************************* 函数名称:PutSting功能:向PC机发送字符串并换行指令参数:ptr--指向发送字符串的指针返回值: 无********************************************/void PutString(uchar *ptr){while(*ptr != '\0'){Send1Char(*ptr++); //}while (!(IFG1 & UTXIFG0));TXBUF0 = '\n'; //} /******************************************* 函数名称:PutSting0功能:向PC机发送字符串,无换行参数:ptr--指向发送字符串的指针返回值: 无********************************************/ void PutString0(uchar *ptr){while(*ptr != '\0'){Send1Char(*ptr++); // }}发送数据发送换行指令发送数据2、程序2: 转换结果显示在1602 显示模块上UCTL0 &= ~SWRST;“ main、c” 程序#include <msp430x14x 、h> #include "cry1602 、h" typedef unsigned char uchar; typedef unsigned int uint;/************** 宏定义***************/#define DataDir P2DIR#define DataPort P2OUT#define Busy 0x80#define CtrlDir P6DIR#define CLR_RS P6OUT&=~BIT3; //RS = P6 、3#define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4; //RW = P6 、4#define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5; //EN = P6 、5#define SET_EN P6OUT|=BIT5;/*******************************************函数名称:DispNchar功能:让液晶从某个位置起连续显示N个字符参数: x-- 位置的列坐标y-- 位置的行坐标n-- 字符个数ptr-- 指向字符存放位置的指针返回值: 无******************************************void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) uchar i;for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]);if (x == 0x0f){x = 0;y A= 1;}}}/*******************************************函数名称:LocateXY功能: 向液晶输入显示字符位置的坐标信息参数:x-- 位置的列坐标y-- 位置的行坐标返回值: 无******************************************void LocateXY(uchar x,uchar y) {uchar temp;temp = x&0x0f; y &=0x01;如果在第 2 行if(y) temp |= 0x40; //temp |= 0x80;LcdWriteCommand(temp,1);}/******************************************* 函数名称:Disp1Char功能: 在某个位置显示一个字符参数:x-- 位置的列坐标y-- 位置的行坐标data-- 显示的字符数据返回值: 无********************************************/ voidDisp1Char(uchar x,uchar y,uchar data) {LocateXY( x, y );LcdWriteData( data );} /******************************************* 函数名称:LcdReset功能: 对1602 液晶模块进行复位操作参数: 无返回值: 无********************************************/ voidLcdReset(void){CtrlDir |= 0x07; //DataDir = 0xFF; //控制线端口设为输出状态数据端口设为输出状态// 规定的复位操作LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1); LcdWriteCommand(0x08, 1); LcdWriteCommand(0x01, 1); LcdWriteCommand(0x06, 1); LcdWriteCommand(0x0c, 1);}/******************************************* 函数名称 :LcdWriteCommand 功 能: 向液晶模块写入命令 参数 :cmd-- 命令 , chk-- 就是否判忙的标志返回值 : 无********************************************/void LcdWriteCommand(uchar cmd,uchar chk) {/******************************************* 函数名称 :LcdWriteData 功 能: 向液晶显示的当前地址写入显示数据 参数 :data-- 显示字符数据返回值 : 无 ********************************************/ void LcdWriteData( uchar data ) {WaitForEnable(); // 等待液晶不忙 SET_RS; CLR_RW; _NOP(); DataPort = data;// 将显示数据写入数据端口CLR_RS;CLR_RW; _NOP();DataPort = cmd; _NOP();//将命令字写入数据端口SET_EN; _NOP(); _NOP(); CLR_EN;}//产生使能脉冲信号检测忙信号 ?// 显示模式设置 // 显示关闭 // 显示清屏// 写字符时整体不移动 // 显示开 , 不开游标 , 不闪烁,1: 判忙 ,0: 不判if (chk) WaitForEnable(); //_NOP();SET_EN; // 产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:WaitForEnable功能:等待1602 液晶完成内部操作参数: 无返回值: 无********************************************/void WaitForEnable(void){P2DIR &= 0x00; // 将P4 口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();while((P2IN & Busy)!=0); // 检测忙标志CLR_EN;P2DIR |= 0xFF; // 将P4 口切换为输出状态}/*******************************************函数名称:Delay5ms功能: 延时约5ms参数: 无返回值: 无******************************************** void Delay5ms(void){uint i=40000;while (i != 0)y-- 位置的行坐标i--;}}/******************************************* 函数名称 :Delay400ms 功 能: 延时约 400ms参 数: 无 返回值 : 无 ******************************************** void Delay400ms(void){uchar i=50;uint j;while(i--){j=7269;while(j--);}}“ cry1602、c ” 程序#include <msp430x14x 、 h> #include "cry1602 、 h" typedef unsigned char uchar; typedef unsigned int uint; 宏定义 ***************/P2DIRP2OUT0x80P6DIRn--字符个数 ptr--指向字符存放位置的指针 返回值 : 无********************************************/ void DispNChar(uchar x,uchar y, ucharn,uchar *ptr) { uchar i; for (i=0;i<n;i++) /************** #define DataDir #define DataPort #define Busy#define CtrlDir//RS = P6#define CLR_RS P6OUT&=~BIT3; #define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4;#define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5;#define SET_EN P6OUT|=BIT5;/******************************************* 函数名称 :DispNchar功 能:让液晶从某个位置起连续显示 N 个字符 参 数:X--位置的列坐标//RW = P6 、//EN = P6 、{Disp1Char(x++,y,ptr[i]);if (x == 0x0f){x = 0;y A= 1;}}}/*******************************************函数名称:LocateXY功能: 向液晶输入显示字符位置的坐标信息参数:x-- 位置的列坐标y-- 位置的行坐标返回值: 无********************************************/void LocateXY(uchar x,uchar y){uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; // 如果在第2 行temp |= 0x80;LcdWriteCommand(temp,1);}/*******************************************函数名称:Disp1Char功能: 在某个位置显示一个字符参数:x-- 位置的列坐标y-- 位置的行坐标data-- 显示的字符数据返回值: 无******************************************void Disp1Char(uchar x,uchar y,uchar data) {LocateXY( x, y );LcdWriteData( data );} /******************************************* 函数名称:LcdReset 功能: 对1602 液晶模块进行复位操作参数: 无返回值: 无******************************************void LcdReset(void){CtrlDir |= 0x07; //DataDir = 0xFF; //********************************************/void LcdWriteCommand(uchar cmd,uchar chk) { if (chk) WaitForEnable(); // 检测忙信号?CLR_RS;CLR_RW; _NOP(); 控制线端口设为输出状态数据端口设为输出状态LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1);LcdWriteCommand(0x08, 1);LcdWriteCommand(0x01, 1);LcdWriteCommand(0x06, 1);LcdWriteCommand(0x0c, 1);}/******************************************* 函数名称:LcdWriteCommand 功能: 向液晶模块写入命令参数:cmd-- 命令,chk-- 就是否判忙的标志返回值: 无// 规定的复位操作// 显示模式设置// 显示关闭// 显示清屏// 写字符时整体不移动// 显示开, 不开游标, 不闪烁,1: 判忙,0: 不判SET_EN; //_NOP();_NOP();CLR_EN;}/******************************************* 函数名称 :LcdWriteData功能: 向液晶显示的当前地址写入显示数据 参 数 :data-- 显示字符数据返回值 : 无********************************************/ void LcdWriteData( uchar data ){WaitForEnable(); // 等待液晶不忙SET_RS;CLR_RW; _NOP();SET_EN; //_NOP();_NOP();CLR_EN; }***************************************** 函数名称 :WaitForEnable功 能:等待 1602 液晶完成内部操作 参 数: 无返回值 : 无********************************************/ void WaitForEnable(void){P2DIR &= 0x00; // 将 P4 口切换为输入状态 CLR_RS;SET_RW;_NOP(); SET_EN;_NOP();_NOP();while((P2IN & Busy)!=0); // 检测忙标志 DataPort = cmd;_NOP();// 将命令字写入数据端口 产生使能脉冲信号 DataPort = data;// _NOP();将显示数据写入数据端口产生使能脉冲信号CLR_EN;P2DIR |= 0xFF; // 将P4 口切换为输出状态}/*******************************************函数名称:Delay5ms 功能: 延时约5ms参数: 无返回值: 无********************************************/void Delay5ms(void){uint i=40000; while (i != 0){i--;}}/*******************************************函数名称:Delay400ms 功能: 延时约400ms参数: 无返回值: 无********************************************/void Delay400ms(void){uchar i=50; uint j;while(i--) {j=7269; while(j--);。
MSP430单片机实验报告

MSP430单片机实验报告--段式LCD显示1.实验介绍:实验演示了将ADC结果用段式LCD显示,并且还原输入电压也采用段式LCD显示。
ADC的结果可以通过ADC12MEM0的值来显示。
当程序运行时,LCD屏幕采用10进制显示出ADC12MEM0的值。
2.实验目的:a.熟悉IAR5.0软件开发环境的使用b.了解MSP430段式LCD的工作方式c.掌握MSP430段式LCD的编程方法3.实验原理:驱动LCD需要在段电极和公共电极上施加交流电压。
若只在电极上施加直流电压,液晶本身发生劣化。
解决这个问题的一般方法是使用短时也就驱动器,如MSP430F4xx系列单片机就集成有段式液晶驱动。
如果要在没有液晶驱动器的情况下使用段式液晶显示器,就要用到如图1所示电路。
图1中,A为电极信号输入端,控制该段液晶是否被点亮;B为交流方波信号输入端,将有一个固定频率的方波信号从此端输入;com为公共背极信号。
工作原理为;固定的方波信号被直接加载到液晶公共背极,同时该信号通过一个异或门加载到液晶段极。
当A端为低电平时,液晶的段极与公共背极将得到一个同相、同频率、同幅度的方波信号,液晶的两端始终保持没有电压差;当A端为高电平时,液晶的段极也公共背极将得到一个反相、同幅度、同频率的方波信号,液晶两端将保持一个交流的电压差。
这样既能使液晶保持点亮状态,又不会发生劣化而损坏液晶显示器。
图一.段式液晶驱动电路4.实验步骤:(1)将PC 和板载仿真器通过USB 线相连;5.实验现象:段式LCD显示屏显示的数字为002031,ADC12MEM0的值为07EF,其值为16进制,将其转换后值为2031与屏幕显示一致。
6.关键代码分析:#include <msp430x26x.h>#include "General_File.h"#include "I2C_Define.h"void I2C_Start(void){DIR_OUT;SDA_1;I2C_Delay();SCL_1;I2C_Delay();SDA_0;I2C_Delay();SCL_0;}//End I2C_Start/*函数名:I2C_Stop 功能:遵循I2C总线协议定义的停止*/void I2C_Stop(void){DIR_OUT;SDA_0;I2C_Delay();SCL_1;I2C_Delay();SDA_1;}//End I2C_Stop/* 函数名:I2C_ReceiveACK 功能:待接受ACK 信号,完成一次操作*/void I2C_Write_ACK( void ){SDA_1;DIR_IN;SCL_1;I2C_Delay();while(SDA_IN );SCL_0;I2C_Delay();DIR_OUT;return;}//End I2C_ReceiveACK/* 函数名:2C_Read_Ack 功能:接受数据后发送一个ACK信号*/void I2C_Read_Ack(void){DIR_OUT;SCL_0;SDA_0;I2C_Delay();SCL_1;I2C_Delay();SCL_0;SDA_1;}//End I2C_Read_Ack/* 函数名:I2C_Read_NoAck 功能:最后接受数据后发送NoACK信号*/void I2C_Read_NoAck( void ){DIR_OUT;SCL_0;SDA_1;I2C_Delay();SCL_1;I2C_Delay();SCL_0;}//End I2C_Read_Ack/* 函数名:I2C_Receiveuchar 功能:接受一个字节的数据*/uchar I2C_Receiveuchar(void){uchar Read_Data = 0x00; //返回值uchar DataBit = 0x00; //每一个clk 接受到的数据SCL_0;I2C_Delay();SDA_1;DIR_IN;for( uchar i = 0;i < 8;i++ ){SCL_1;I2C_Delay();DataBit = SDA_IN;SCL_0;I2C_Delay();I2C_Delay();Read_Data = ( ( Read_Data << 1 ) | DataBit ); //将数据依次存入Read_Data }return( Read_Data );}//End I2C_Receiveuchar/* 函数名:I2C_Senduchar 功能:遵循I2C总线协议定义发送一字节数据*/void I2C_Senduchar( uchar Wr_Data ){DIR_OUT;SCL_0;SDA_1;for( uchar i = 0;i < 8;i++ ){if( Wr_Data & 0x80 ){SDA_1; //最高位是否为1,为1则SDA= 1 }else{SDA_0; //否则SDA=0}I2C_Delay();SCL_1;I2C_Delay();SCL_0;I2C_Delay();Wr_Data <<= 1; //数据左移一位,进入下一轮送数}SDA_1;return;}//End I2C_Senduchar/************ BU9796FS相关指令定义**********/#define Write_Com 0x80#define Write_Data 0x00#define Display_ON 0x48#define Half_Bias 0x44#define Set_Reset 0x6A#define Ext_Clock 0x69#define Blink_Mode0 0x70#define Blink_Mode1 0x71#define Blink_Mode2 0x72#define Blink_Mode3 0x73#define Pixel_ON 0x7E#define Pixel_OFF 0x7D#define BU9796_Addr 0x7C#define Base_Add 0x00/************** 引用的外部函数*********************/extern void I2C_Start(void);extern void I2C_Stop(void);extern void I2C_Write_ACK(void);extern void I2C_Senduchar( uchar Wr_Data );/************** 定义段式LCD的阿拉伯数字码*********************/const uchar Num_Code[] ={0xAF, // 00x06, // 10x6D, // 20x4F, // 30xC6, // 40xCB, // 50xEB, // 60x0E, // 70xEF, // 80xCF, // 90x10, //. 如果要显示小数点,必须要将此值与下一位值相加0x88 //: ,包括LCD上的两个":"};uchar Disp_Data[]={ 5,5,7,3,1,5 };/* 函数名:Segment_Display 功能:段式LCD数据包写入服务程序,负责将一串字符送到段式LCD 上去显示*/void Segment_Display( const uchar Addr,const uchar *P_Data, uchar Length ){uchar User_Addr = Addr;I2C_Start(); //启动BU9796I2C_Senduchar( BU9796_Addr ); //写BU9796的物理地址I2C_Write_ACK();I2C_Senduchar( Base_Add + User_Addr * 2 ); //发送起始地址,下一个紧跟的是数据I2C_Write_ACK();for( uchar i = Length ;i > 0;i-- ){if( *P_Data != 0x0A ) // 显存中是否有小数点?如果有,就将小数点码值与下一位码值相加{I2C_Senduchar( Num_Code[ *P_Data++ ] );}else{uchar Temp_Disp_Data = Num_Code[ *P_Data++ ];I2C_Senduchar( Temp_Disp_Data + Num_Code[ *P_Data++ ]);i--;}I2C_Write_ACK();}I2C_Stop(); //访问结束}/* 函数名:Init_BU9796FS 功能:初始化驱动芯片BU9796的相关参数*/void Init_BU9796FS( void ){I2C_Start(); //启动BU9796I2C_Senduchar( BU9796_Addr ); //写BU9796的物理地址I2C_Write_ACK(); //等待ackI2C_Senduchar( Write_Com + Set_Reset); //启动软复位I2C_Write_ACK(); //等待ackI2C_Senduchar( Write_Com + Blink_Mode2 );I2C_Write_ACK();I2C_Senduchar( Write_Com + Display_ON ); //开显示I2C_Write_ACK();I2C_Senduchar( Write_Data + Base_Add ); //发送起始地址,下一个紧跟的是数据I2C_Write_ACK();for( uchar i = 0;i<10;i++ ) //清LCD显示屏{I2C_Senduchar( 0x00 );I2C_Write_ACK();}I2C_Stop(); //访问结束}/* 函数名:Init_MCU 功能:初始化MSP430的相关参数*/void Init_MCU( void ){/* WDTCTL = WDTPW + WDTHOLD; */ // 关看门狗BCSCTL3 |= XT2S_2; // XT2频率范围设置BCSCTL1 &= ~XT2OFF; // 打开XT2振荡器do{IFG1 &= ~OFIFG; // 清振荡器失效标志BCSCTL3 &= ~XT2OF; // 清XT2失效标志for( uint i = 0x47FF; i > 0; i-- ); // 等待XT2频率稳定}while (IFG1 & OFIFG); // 外部时钟源正常起动了吗?BCSCTL2 |= SELM_2 + SELS ; // 设置MCLK、SMCLK为XT2P4OUT &= ~BIT4;P4DIR |= BIT4; // 打开LCD显示部分的电源//P8REN |= BIT3 + BIT4;P8DIR |= BIT3 + BIT4; // 配置MSP430与BU9796的数据数P8OUT |= BIT3 + BIT4;P5OUT &= ~BIT7; // 点亮外部LEDP5DIR |= BIT7;}/* 函数名:main 功能:系统入口主函数*/void main( void ){WDTCTL = WDTPW + WDTHOLD; // 停看门狗ADC12CTL0 = SHT0_2 + ADC12ON; // 设置采样时间,开ADC12,Vref = V ACC ADC12CTL1 = SHP; // 使用定时器采样ADC12MCTL0 = INCH_1; // 选用A1通道ADC12IE = 0x01; // 开ADC12MCTL0中断ADC12CTL0 |= ENC; // 启动转换ADC12MCTL0 = INCH_1;P5DIR |= BIT7; // P5.7输出-LED/*for (;;){ADC12CTL0 |= ADC12SC; // 软件启动转换_BIS_SR(CPUOFF + GIE); // LPM0模式,由ADC12中断唤醒}*//* 功能:将16进制转化为10进制*/int a,b;a=ADC12MEM0;Disp_Data[5]=a%10;b=a/10;Disp_Data[4]=b%10;a=b/10;Disp_Data[3]=a%10;b=a/10;Disp_Data[2]=b%10;a=b/10;Disp_Data[1]=a%10;b=a/10;Disp_Data[0]=b%10;Init_MCU();Init_BU9796FS();P5OUT |= BIT7;Segment_Display( 0,Disp_Data,6 );_BIS_SR( CPUOFF );}#pragma vector=ADC12_VECTOR__interrupt void ADC12_ISR (void){ _BIC_SR_IRQ(CPUOFF); }。
MSP430_AD转换

ADC12 的功能模块( 6/ 11)
13
ADC12 的功能模块( 7/ 11)
4. 采样及转换所需的时序控制
采样和转换所需要的各种时钟信号: ADC12CLK转换时钟、 SAMPCON采样及转换信
号、SHT控制的采样周期 、 SHS控制的采样触发来源选 择 、ADC12SSEL选择的内核时钟源 及 ADC12DIV选择 的分频系数……
ADC12CTL1=SHP;
ADC12CTL0 |= ENC;
While(1)
{
ADC12CTL0 |=ADC12SC;
while((ADC12IFG&BIT0)==0)
_NOP( );
}
}
35
谢谢观看!!
36
控制寄存器 ADC12MEM0 ~
ADC12MEM15
寄存器的含义 转换控制寄存器0 转换控制寄存器1 中断标志寄存器 中断使能寄存器 中断向量寄存器 存储控制寄存器0~15
存储寄存器0~15
18
ADC12的相关寄存器(2 / 15)
1. 转换控制寄存器
① ADC12CTL0
转换控制寄存器0
19
ADC12的相关寄存器( 3/ 15)
VR+(有3种):A VCC (模拟电源正端) V REF+ (A/D转换器内部参考电源的输出正端) V eREF+ (外部参考电源的正输入端)
V R-(有2种):A VSS (模拟电源负端) V REF- 或 V eREF- (A/D转换器内部或者外
部参考电源负端)
8
ADC12 的功能模块( 2/ 11)
应的中断标志; • ADC12MCTLx寄
存器中定义了通道 和参考电压。
第9章MSP430模数转换ADC

ISSH=0 采保源 ENC SHI
ISSH=0 ENC 采保源 SHI
37
MSP430F149 Timer_A Output Unit1 具有内部启动采样转换信号
38
ADC12转换结果存储缓冲器
16个12-bit的转换 结果存储缓冲器
一一对应
16个 8-bit的 转 换 存储控制寄存器
存储指针
第9章 模/数转换(ADC)
第一节 概述 第二节 模/数转换器 第三节 采样保持器和多路模拟开关
本章教学目标: 1、了解ADC的基本概念
2、MSP430 ADC12的原理与基本应用
1
第一节
概述
计算机测量控制系统
控 制 对 象
传感器 放大器 滤波器 放大器 计 A/ D 算 执行部件 D/A 机
2
36
采样保持信号源选择
SHSx=00 SHSx=01 SHSx=10 SHSx=11 , , , , ADC12SC bit 软件启动 Timer_A Output Unit1启动 Timer_B Output Unit0启动 Timer_B Output Unit1启动
SHSx=ADC12CTL1.10~11
CSTARTADD=ADC12CTL1的 最高 4 位的值=0~15
ADC12MEMn
ADC12MCTLn
ADC12MEM15
ADC12MCTL15
一个ADC12通道(简称通道)由通道号、该通道的转换结果 存储缓冲器、该通道的参考电压源配臵、该通道的模拟输入以 及通道序列结束标志等组成。ADC12通道n可以对应于16个 模拟输入中的任何一个,不同的ADC12通道可以对应于同一 个模拟输入,不同的ADC12通道可以有不同的参考电压源。 ADC12 通道与传统的模拟输入通道有很大的不同。 41
MSP430-ADC

如何使用ADC?
现假设需对一频率为50Hz的工频信号测量,要求每周期 采样点数为128点。分析如下: 首先,可将该信号接到AIN0,这样就可以配置相应的 GPIO了—P6.0, 其次,由于只有一路信号,所以只选择ADC1就可以实现 ,软件配置的目标为ADC1 再次,根据要求,算出fs=50*128 = 6400Hz,根据fs就可 确定触发ADC1的时间,触发一般采用定时器实现,因此 就可对定时器进行配置了。 最后,由于每次ADC的结果都放在同一个寄存器中,因 而要求每次转换结束后应将结果保存在存储器中。
精度:位数; 速率:转换时间;
被测量的个数:通道数。
思考?
使用ADC之前你要先明确: 根据你需要测量的模拟量个数确定对应的引脚; 根据所测量的特征(是否需同时测量)可以选择是否采 用双ADC或者三个ADC工作。单个ADC也可以对多达16 路引脚上的电压进行转换,但它是依次进行的。 采样频率(fs),fs需符合奈奎斯特采样定律; 输入信号的电压范围是否满足要求?没有的话需对输入 信号调理,最好在输入处加一电压跟随器。
ADC12CTL1,ADC12控制寄存器1
ADC12CTL2,ADC12控制寄存器2
ADC12MCTLx,ADC12_A转换存 储控制寄存器
ADC12IE,ADC12_A中断使能寄存 器
举例:单通道单次转换
ADC12CTL0 = ADC12SHT02 + ADC12ON; ADC12CTL1 = ADC12SHP; ADC12IE = 0x01; ADC12CTL0 |= ADC12ENC; P6SEL |= 0x01; P1DIR |= BIT0; __delay_cycles(10000); while (1) { ADC12CTL0 |= ADC12SC; __bis_SR_register(LPM0_bits + GIE); __no_operation(); }
ad转换(430单片机)

ADC12采样保持时间与采样频率【采样与转换】ADC12完成对一个模拟信号模数转换过程由两部分组成:采样保持和转换.完成采样转换周期时间= 采样保持时间 +转换时间采样保持时间:由产生SAMPCON信号开始到结束所需时间,这期间ADC进行对模拟信号采样保持。
在脉冲采样模式时(SHP=1),采样时间: Tsample = 4 x ADC12CLK x N。
式中,Tsample为采样保持时间,ADC12CLK为ADC12内核时钟周期,N则由SHT1(SHT0)的4位二进制码决定。
采样保持时间与ADC12模块的等效输入电路有关。
从ADC12模块输入看ADC内部等效为一个电阻(2K)与一个电容(30pf)相串联.这个内部RC 常数直接影响着最小的采样保持时间参数.所以,在采样转换中有一个最小采样保持时间值概念.这个最小采样保持时间值从上式中可以看出是由ADC12CLK时间周期决定(N=1时),也就是说ADC12CLK的最高频率;这个频率不能超出MSP430芯片手册中所指定的最高频率(最小采样保持时间值)。
关于脉冲采样模式(SHP=1)这个最小采样保持时间值因芯片不同,详情可以查看相应的芯片手册。
转换时间:ADC12核将采样保持的模拟信号转换成数字所需要的时间,这个转换时间在脉冲采样模式和扩展采样模式都是相同的。
转换时间=13 x (ADC12CLK/Fadc12clk)在脉冲采样模式时完成一个模拟信号采样转换周期时间计数公式为:= (4 x ADC12CLK x N) + ( 13 xADC12CLK/Fadc12clk))以上内容来自微控论坛,因为要使用最高采样频率,对输入时钟以及采样保持时间不清楚,1611头文件中并未指出SHTx_x对应的分频因子具体是多少,所以自己亲自实验测量。
输入信号为1kHz,ADC输入时钟为SMCLK,时钟频率为8MHz。
#define SHT0_0 (0*0x100u)//分频因子为N=0(此时无保持时间,无法运行)#define SHT0_1 (1*0x100u)//分频因子为N=8.8(对应采样频率为166k)#define SHT0_2 (2*0x100u)//分频因子为N=8.8 (对应采样频率为166k)#define SHT0_3 (3*0x100u)//分频因子为N=9 (对应采样频率为162k)#define SHT0_4 (4*0x100u)//分频因子为N=16 (对应采样频率为104k)#define SHT0_5 (5*0x100u)//分频因子为N=24 (对应采样频率为73k)#define SHT0_6 (6*0x100u)//分频因子为N=32 (对应采样频率为57k)#define SHT0_7 (7*0x100u)//分频因子为N=48 (对应采样频率为39k)#define SHT0_8 (8*0x100u)//分频因子为N=64 (对应采样频率为30k)可见ADC12的最高采样频率为165KHz,实验数据没有进行数据统计,内容仅供参考。
MSP430之一 关于AD转换

之一关于AD转换
l 首先应明确Msp4301X里的各系列中的ADC模块大凡是12位的转换精度。
下图即为其功能模块图。
其实这个图感觉大概看哈就行了,真有时间和精力细细结合书渗透还是可以的,不过就是刚开始看有点花花绿绿吧。
l 熟悉并能使用一个模块,必然要熟悉其各个寄存器的作用。
下面我们来看下ADC12模块中各个模块寄存器的作用,
转换控制寄存器 ADC12CTL0
ADC12CTL0
1. ENC=1时才能正常的AD转换
2. ADCSC是其采集/转换控制位,启动AD必须要用一条指令来配置ENC 和ADCSC。
3. ADCIVIE 转换时间溢出中断。
转换未完成时,继续采样则会溢出。
4. ADC0VIE 溢出中断允许位。
即ADC12MEMx。
单片机AD与DA转换实验报告

1.数据采集_A/D转换
(1)原理
①ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
int i,j;
P2=0xfb;
i=d/51;
P0=DSY_CODE[i];
DelayMS(5);
P0=0x80;
DelayMS(5);
P2=0xf7;
j=(d-i*51)*10/51;
P0=DSY_CODE[j];
DelayMS(5);
}
void main() //主程序
{
TMOD=0x02;
TH0=0x14;
if(P2>=255)flag=1;
}
if(flag==1){
P2=0;
if(P2==0)flag=0;
}
}
}
3实验结果
五.实验心得
1.由于实验设备不精确而引起的系统误差,例如:实验设备制作不精确,使用时间过长引起的设备老化,而引起的误差。
2.读数不精确引起的偶然误差。在电压表读数未稳定时读数,或者由于电压表精确度不够,而造成的读数误差。
while(1)
{
for(i=0;i<1000;i++);
P2=255;
for(i=0;i<1000;i++);
P2=0;
}
}
void juchibo()
{
unsigned int i;
char flag=0;
单片机实验AD转换实验

实验报告 课程名称:单片机原理及应用实验项目:A/D转换实验专业班级:姓名:学号:实验室号:实验组号:实验时间:批阅时间:指导教师:成绩:沈阳工业大学实验报告(适用计算机程序设计类)专业班级:学号:姓名:实验名称:A/D转换实验1.实验目的:1、掌握A/D转换与单片机的接口方法。
2、了解A/D芯片ADC0809转换性能及编程方法。
2.实验内容:利用实验台上的ADC0809做A/D转换器,实验箱上的电位器提供模拟电压信号输入,编制程序,将模拟量转换成数字量,用数码管显示模拟量转换的结果。
3. 实验方案(程序设计说明)4. 实验步骤或程序(经调试后正确的源程序)(见附件A)5.程序运行结果(见附件A)附件A 沈阳工业大学实验报告(适用计算机程序设计类)专业班级:学号:姓名:实验步骤或程序:实验原理:A/D转换器大致有三类:一是双积分A/D转换器,优点是精度高,抗干扰性好,价格便宜,但速度慢;二是逐次逼近法A/D转换器,精度、速度、价格适中;三是并行A/D转换器,速度快,价格也昂贵。
实验用的ADC0809属第二类,是八位A/D转换器。
每采集一次需100us。
ADC0809 START端为A/D转换启动信号,ALE端为通道选择地址的锁存信号。
实验电路中将其相连,以便同时锁存通道地址并开始A/D采样转换,故启动A/D转换只需如下两条指令:MOV DPTR,#PORTMOVX @DPTR,AA中为何内容并不重要,这是一次虚拟写。
在中断方式下,A/D转换结束后会自动产生EOC信号,将其与8031CPU板上的INT0相连接。
在中断处理程序中,使用如下指令即可读取A/D转换的结果:MOV DPTR,#PORTMOVX A,@DPTR实验步骤:1、0809的片选信号CS0809接CS0。
2、电位器的输出信号AN0接0809的ADIN0。
3、EOC接CPU板的INT0.程序框图:参考程序:NAME T15 ;0809实验PORT EQU 0CFA0HCSEG AT 0000HLJMP STARTCSEG AT 4100HSTART: MOV DPTR,#PORT ;启动通道0 MOVX @DPTR,AMOV R0,#0FFHLOOP1: DJNZ R0,LOOP1 ;等待中断MOVX A,@DPTRMOV R1,ADISP: MOV A,R1 ;从R1中取转换结果SWAP A ;分离高四位和低四位ANL A,#0FH ;并依次存放在50H到51H中MOV 50H,AMOV A,R1ANL A,#0FHMOV 51H,ALOOP: MOV DPTR,#0CFE9H ;写显示RAM命令字MOV A,#90HMOVX @DPTR,AMOV R0,#50H ;存放转换结果地址初值送R0 MOV R1,#02HMOV DPTR,#0CFE8H ;8279数据口地址DL0: MOV A,@R0ACALL TABLE ;转换为显码MOVX @DPTR,A ;送显码输出INC R0DJNZ R1,DL0SJMP DEL1TABLE: INC AMOVC A,@A+PCRETDB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71HDEL1: MOV R6,#255 ;延时一段时间使显示更稳定DEL2: MOV R5,#255DEL3: DJNZ R5,DEL3DJNZ R6,DEL2LJMP START ;循环END运行结果程序调试运行后,手调电位器,随着电位器的变化,看到数码管显示的数字电压值也在随之变化。
东南大学MSP430LCD+ADC实验报告

// LCD segment definitions.
#define d 0x01
#define c 0x20
#define b 0x40
#define a 0x80
#define dp 0x10
#define f 0x08
#define e 0x02
int sin_table[100];
int *sin_data_pr;
uint fre_term_pr;
int j;
double i=0;
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define uint unsigned int
#define uchar unsigned char
#define PI 3.1416
#define d 0x01
#define c 0x20
#define b 0x40
#define a 0x80
#define dp 0x10
#define g 0x04
// changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx UG for
// optimization , 32 x 32 x 8 MHz / 32,768 Hz = 250000 = MCLK cycles for DCO to settle
msp430实验报告

msp430实验报告Title: MSP430 Experiment ReportIntroductionThe MSP430 is a series of microcontroller units developed by Texas Instruments. It is widely used in embedded systems and has gained popularity due to its low power consumption and high performance. In this experiment report, we will discuss the results of our experiments with the MSP430 microcontroller. Experiment 1: Blinking LEDIn our first experiment, we programmed the MSP430 to blink an LED at a specific frequency. We used the MSP430 LaunchPad development kit, which provided us with a simple and easy-to-use platform for programming and testing the microcontroller. By writing a simple program in C using the Code Composer Studio IDE, we were able to control the LED and make it blink at different rates. This experiment helped us understand the basics of programming the MSP430 and how to interface with external components.Experiment 2: Analog-to-Digital ConversionIn our second experiment, we explored the analog-to-digital conversion (ADC) capabilities of the MSP430. We connected a potentiometer to one of the analog input pins of the microcontroller and wrote a program to read the analog voltage and convert it to a digital value. We then displayed the digital value on the LaunchPad's built-in LCD display. This experiment helped us understand how the MSP430 can be used to interface with analog sensors and convert theirreadings into digital values for further processing.Experiment 3: Serial CommunicationIn our final experiment, we used the MSP430's built-in UART module to establish serial communication with a computer. We wrote a program to send data from the microcontroller to the computer and receive data from the computer to the microcontroller. This experiment helped us understand how the MSP430 can be used to communicate with external devices and interfaces, opening up a wide range of possibilities for building complex embedded systems.ConclusionIn conclusion, our experiments with the MSP430 microcontroller have provided us with valuable insights into its capabilities and potential applications. We have learned how to program the MSP430, interface with external components, perform analog-to-digital conversion, and establish serial communication. We are excited to continue exploring the possibilities of the MSP430 and look forward to applying our knowledge to future projects and developments in the field of embedded systems.。
MSP430单片机AD转换

MSP430 单片机AD 转换
一。
简单介绍MSP430 ADC12 模块中是由以下部分组成:输入的16 路模拟开关(外部8 路,内部4 路),ADC 内部电压参考源,ADC12 内核,ADC 时钟源部分,采集与保持/触发源部分,ADC 数据输出部分,ADC 控制寄存
器等组成。
四种采样模式:
一。
简单介绍:
ADC12 模块中是由以下部分组成:输入的16 路模拟开关(外部8 路,内部4 路),ADC 内部电压参考源,ADC12 内核,ADC 时钟源部分,采集与保持/ 触发源部分,ADC 数据输出部分,ADC 控制寄存器等组成。
四种采样模式:
(1)单通道单次转换模式
(2)序列通道单词转换模式
(3)单通道多次转换模式。
MSP430单片机编程与实践-实验报告

void key_scan(); void delay(unsigned x) {
实验二:使用基本定时器,通过 P1.0 口控制 LED 灯的亮灭,亮灭时间都为
2
1S。 实验原理如图 1 所示:
实验程序:
图 1:LED 灯控制电路
#include <msp430x44x.h>
void main()
{ WDTCTL=WDTPW+WDTHOLD; IE2|=BTIE;
//关闭看门狗定时器 //打开基本定时器中断
{
}
ADC12CTL0 |= ENC; _EINT();
//允许转换
while(1)
{ ADC12CTL0 |= ADC12SC;
//开始转换
_BIS_SR(LPM0_bits); DegC = ((((long)ADCresult-1615)*704)/4095);
}
#pragma vector=ADC_VECTOR
○3 掌握 LED 静态显示和动态扫描显示的原理与编程设计; ○4 掌握 LCD 显示的原理以及编程设计; ○5 掌握 ADC 工作的原理,熟悉使用 ADC12 的工作方式; ○6 熟悉独立键盘以及行列式键盘的设计方法,掌握键盘工作原理和一般的编 程设计; ○7 综合 MSP430 的各个功能模块,练习编写数字密码锁程序,实现基本的一 些条件,使学生的学习与社会发展同步,更接近生活实际;
ADC12CTL0 = ADC12ON+REFON+REF2_5V+SHT0_6; 采样周期
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AD转换实验一、转换原理MSP430F14啲A/D转换器原理请参考相关书籍。
实验板上与AD相关的硬件电路:RV310K------------ 3-3\J6P61SI?2Al)输入电路RV4III-10K f > 2 ;|||设。
二、转换程序1、程序1:转换结果发送到PC主程序中进行A/D初始化,中断服务程序读A/D转换结果,主程序中通过串口发送结果。
”主程序与中断程序:/*********************************************************程序功能:将ADC对端口电压的转换结果按转换数据和对应的模拟电压的形式通过串口发送到PC机屏幕上显示通信格式:9600测试说明:打开串口调试精灵,正确设置通信格式,观察接收数据**********************************************************/#include <>#include ""#include ""#include ""#define Num_of_Results 32 uintresults[Num_of_Results]; // uintaverage;uchar tcnt = 0;保存ADC转换结果的数组/***********************void main( void ) {uchar i;uchar buffer[5];主函数*********************WDTCTL = WDTPW + WDTHOLD; // 关狗P1DIR = 0XFF;P1OUT = 0XFF;P2DIR = 0XFF;P2OUT = 0XFF;P3DIR = 0XFF;P3OUT = 0XFF;P4DIR = 0XFF;P4OUT = 0XFF;/* 下面六行程序关闭所有的IO 口*/P5DIR = 0XFF;P5OUT = 0XFF; P6DIR = 0XFF;P6OUT = 0XFF;P6DIR |= BIT2;P6OUT |= BIT2; //P6DIR|=BIT6;P6OUT&=~BIT6; // 关闭电平转换关闭数码管显示InitUART(); Init_ADC();_EINT(); buffer[4] = '\0';while(1){LPM1;Hex2Dec(average,buffer);for(i = 0; i < 4; i++)buffer[i] += 0x30;PutString0("The digital value is: ");PutString(buffer);Trans_val(average,buffer); buffer[3] = buffer[2]; buffer[2] = buffer[1];buffer[1] = 0x2e - 0x30; for(i = 0; i < 4; i++) buffer[i] += 0x30;PutString0("The analog value is: "); PutString(buffer);}}/******************************************* 函数名称:ADC12ISR功能:ADC中断服务函数,在这里用多次平均的计算口的模拟电压数值参数:无返回值:无********************************************/ #pragma vector=ADC_VECTOR __interrupt void ADC12ISR (void) {static uchar index = 0;results[index++] = ADC12MEM0; // Move results if(index == Num_of_Results) { uchar i;average = 0;for(i = 0; i < Num_of_Results; i++) {average += results[i];index = 0; tcnt++; if(tcnt == 250) // {LPM1_EXIT; tcnt = 0; } }}“” A/D 转换相关程序: #include <>typedef unsigned int uint;/******************************************** 函数名称: Init_ADC 功 能:初始化 ADC 参数:无返回值 :无********************************************/ void Init_ADC(void){P6SEL |= 0x01; //ADC12CTL0 = ADC12ON+SHT0_15+MSC; ADC12CTL1 = SHP+CONSEQ_2; // ADC12IE = 0x01; //ADC12CTL0 |= ENC; // ADC12CTL0 |= ADC12SC; //}]********************************************void Hex2Dec(uint Hex_val,uchar *ptr){ptr[0] = Hex_val / 1000;ptr[1] = (Hex_val - ptr[0]*1000)/100;ptr[2] = (Hex_val - ptr[0]*1000 - ptr[1]*100)/10;average >>= 5; // 除以 32函数名称: Hex2Dec 功能:将16进制ADC 转换数据变换成十进制表示形式参数:Hex_Val--16 进制数据ptr--指向存放转换结果的指针返回值 :无******************************************主要是降低串口发送速度使能ADC 通道 //打开ADC 设置采样时间 使用采样定时器 使能ADC 中断 使能转换 开始转换ptr[3] = (Hex_val - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10);}/******************************************* 函数名称:Trans_val功能:将16进制ADC专换数据变换成三位10进制真实的模拟电压数据,并在液晶上显示参数:Hex_Val--16 进制数据返回值:无********************************************/void Trans_val(uint Hex_Val,uchar *ptr){unsigned long caltmp;uint Curr_Volt;uchar t1;caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 33 caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10 Curr_Volt = caltmp >> 12; 〃Curr_Volt = caltmp / 25ptr[0] = Curr_Volt / 100; //Hex->Dect1 = Curr_Volt - (ptr[0] * 100);ptr[1] = t1 / 10;ptr[2] = t1 - (ptr[1] * 10);}“”串口程序:#include <>typedef unsigned char uchar;/******************************************* 函数名称:InitUART 功能:初始化UART端口参数:无返回值:无********************************************void InitUART(void){P3SEL |= 0x30;ME1 |= URXE0 + UTXE0;UCTL0 |= CHAR;UTCTL0 |= SSEL0;UBR00 = 0x03;UBR10 = 0x00;UMCTL0 = 0x4A; 变换// ,5 = USART0 TXD/RXD// Enable USART0 T/RXD // 8-bit character// UCLK = ACLK// 32k/9600 -//// ModulationUCTL0 &= ~SWRST; // Initialize USART state machine}/******************************************* 函数名称:Send1Char 功能:向PC 机发送一个字符参数:sendchar-- 要发送的字符返回值:无********************************************/ void Send1Char(ucharsendchar){while (!(IFG1 & UTXIFG0)); // 等待发送寄存器为空TXBUF0 =sendchar;}/******************************************* 函数名称:PutSting功能:向PC 机发送字符串并换行指令参数:ptr-- 指向发送字符串的指针返回值:无********************************************/ void PutString(uchar *ptr) {while(*ptr != '\0'){Send1Char(*ptr++); //}while (!(IFG1 & UTXIFG0));TXBUF0 = '\n'; //}/******************************************* 函数名称:PutSting0 功能:向PC 机发送字符串,无换行参数:ptr-- 指向发送字符串的指针返回值:无********************************************/ void PutString0(uchar *ptr){while(*ptr != '\0'){Send1Char(*ptr++); //}}发送数据发送换行指令发送数据2、程序 2:转换结果显示在 1602 显示模块上 “”程序 #include <>#include "" typedef unsigned char uchar; typedef unsigned int uint;/**************宏定义***************/#define DataDirP2DIR#define DataPort P2OUT#define Busy #define CtrlDir 0x80P6DIR#define CLR_RS P6OUT&=~BIT3; //RS = #define SET_RSP6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4; //RW = #define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5; //EN = #define SET_EN P6OUT|=BIT5;]*******************************************void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) { uchar i; for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]); if (x == 0x0f){x = 0; y A = 1;}}}/******************************************* 函数名称: LocateXY功 能:向液晶输入显示字符位置的坐标信息函数名称: DispNchar 功 能: 让液晶从某个位置起连续显示 N 个字符参 数:x-- 位置的列坐标y-- 位置的行坐标 n-- 字符个数ptr--指向字符存放位置的指针返回值 : 无******************************************参数:x-- 位置的列坐标y-- 位置的行坐标返回值:无****************************************** voidLocateXY(uchar x,uchar y) {uchar temp;temp = x&0x0f;y &= 0x01;i f(y) temp |= 0x40; // temp |=如果在第2 行0x80;LcdWriteCommand(temp,1);} /******************************************* 函数名称:Disp1Char功能:在某个位置显示一个字符参数:x-- 位置的列坐标y-- 位置的行坐标data-- 显示的字符数据返回值:无********************************************/ voidDisp1Char(uchar x,uchar y,uchar data) {LocateXY( x, y );LcdWriteData( data ); }/******************************************* 函数名称:LcdReset 功能:对1602 液晶模块进行复位操作参数:无返回值:无********************************************/void LcdReset(void){CtrlDir |= 0x07; // 控制线端口设为输出状态DataDir = 0xFF; // 数据端口设为输出状态// 规定的复位操作LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);/*******************************************函数名称: LcdWriteData功 能:向液晶显示的当前地址写入显示数据 参数: data-- 显示字符数据返回值 :无********************************************/ void LcdWriteData( uchar data ){WaitForEnable(); // 等待液晶不忙 SET_RS; CLR_RW;Delay5ms();LcdWriteCommand(0x38, 1); LcdWriteCommand(0x08, 1); LcdWriteCommand(0x01, 1); LcdWriteCommand(0x06, 1); LcdWriteCommand(0x0c, 1);}/*******************************************函数名称: LcdWriteCommand 功 能:向液晶模块写入命令 // 显示模式设置// 显示关闭 // 显示清屏 // 写字符时整体不移动 // 显示开,不开游标,不闪烁参数: cmd-- 命令,chk--是否判忙的标志, 1 :判忙, 0 :不判返回值 :无********************************************/ void LcdWriteCommand(uchar cmd,uchar chk){i f (chk) WaitForEnable(); // 检测忙信号CLR_RS; CLR_RW; _NOP(); DataPort = cmd; //_NOP();SET_EN; // _NOP(); _NOP(); CLR_EN;}将命令字写入数据端口产生使能脉冲信号_NOP();DataPort = data; // 将显示数据写入数据端口_NOP();SET_EN; // 产生使能脉冲信号_NOP();_NOP();CLR_EN;}/******************************************* 函数名称:WaitForEnable 功能:等待1602 液晶完成内部操作参数:无返回值:无********************************************/void WaitForEnable(void){P2DIR &= 0x00; // 将P4 口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();while((P2IN & Busy)!=0); // 检测忙标志CLR_EN;P2DIR |= 0xFF; // 将P4 口切换为输出状态}/*******************************************函数名称:Delay5ms功能:延时约5ms参数:无返回值:无******************************************** void Delay5ms(void){uint i=40000;while (i != 0){i--;}}/******************************************* 函数名称: Delay400ms 功 能:延时约 400ms参 数:无返回值 :无******************************************** void Delay400ms(void) {uchar i=50;uint j;while(i--){j=7269;while(j--);}}“”程序#include <>#include "" typedef unsigned char uchar;typedef unsigned int uint;#define DataPort P2OUT#define Busy 0x80#define CtrlDir P6DIR#define CLR_RS P6OUT&=~BIT3; //RS = #define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4; //RW = #define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5; //EN = #define SET_EN P6OUT|=BIT5; y-- 位置的行坐标n--字符个数 ptr-- 指向字符存放位置的指针返回值 :无 ********************************************/ void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) { /******************************************* 函数名称: DispNchar功能: 让液晶从某个位置起连续显示 参 数: x-- 位置的列坐标N 个字符 宏定义 *************#define DataDir P2DIRuchar i;for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]);if (x == 0x0f){x = 0;y A= 1;}}} /******************************************* 函数名称:LocateXY 功能:向液晶输入显示字符位置的坐标信息参数:x-- 位置的列坐标y-- 位置的行坐标返回值:无********************************************/void LocateXY(uchar x,uchar y) {uchar temp;temp = x&0x0f;y &= 0x01;i f(y) temp |= 0x40; // 如果在第2 行temp |= 0x80;LcdWriteCommand(temp,1);}/******************************************* 函数名称:Disp1Char 功能:在某个位置显示一个字符参数:x-- 位置的列坐标y-- 位置的行坐标data-- 显示的字符数据返回值:无******************************************void Disp1Char(uchar x,uchar y,uchar data) { LocateXY( x, y );LcdWriteData( data );}]******************************************* 函数名称: LcdReset功 能:对 1602 液晶模块进行复位操作 参 数:无 返回值 :无******************************************void LcdReset(void){CtrlDir |= 0x07;// DataDir = 0xFF; // LcdWriteCommand(0x38, 0); Delay5ms(); LcdWriteCommand(0x38, 0); Delay5ms(); LcdWriteCommand(0x38, 0);Delay5ms();返回值 :无 ********************************************/ void LcdWriteCommand(uchar cmd,uchar chk) { i f (chk) WaitForEnable(); //CLR_RS;CLR_RW;控制线端口设为输出状态 数据端口设为输出状态// 规定的复位操作 LcdWriteCommand(0x38, 1);LcdWriteCommand(0x08, 1);LcdWriteCommand(0x01, 1);LcdWriteCommand(0x06, 1);LcdWriteCommand(0x0c, 1); }/************ 函数名称: 功 能: 参数: chk-- // // // 显示模式设置 // 显示关闭 // 显示清屏 写字符时整体不移动 显示开,不开游标,不闪烁 LcdWriteCommand 向液晶模块写入命令 cmd--命令,是否判忙的标志, 1:判忙, 0:不判检测忙信号_NOP();_NOP(); CLR_EN;}/******************************************* 函数名称: LcdWriteData功 能:向液晶显示的当前地址写入显示数据 参 数: data-- 显示字符数据返回值 :无********************************************/ void LcdWriteData( uchar data ){WaitForEnable(); // 等待液晶不忙SET_RS;CLR_RW; _NOP();函数名称: WaitForEnable功 能:等待 1602 液晶完成内部操作 参 数:无 返回值 :无****************************************** void WaitForEnable(void){P2DIR &= 0x00; //将 P4 口切换为输入状态CLR_RS;SET_RW; _NOP();SET_EN; _NOP();_NOP(); while((P2IN & Busy)!=0); // 检测忙标志DataPort = cmd;_NOP();// SET_EN;// 将命令字写入数据端口 产生使能脉冲信号 DataPort = data;// _NOP();将显示数据写入数据端口 SET_EN; // _NOP();_NOP();CLR_EN;}产生使能脉冲信号P2DIR |= 0xFF; // 将P4 口切换为输出状态}/******************************************* 函数名称:Delay5ms 功能:延时约5ms参数:无返回值:无********************************************/ void Delay5ms(void){uint i=40000; while (i != 0){i--;}}/******************************************* 函数名称:Delay400ms 功能:延时约400ms参数:无返回值:无********************************************/ void Delay400ms(void){uchar i=50; uint j;while(i--){ j=7269; while(j--);。