MSP430单片机AD转换实验
MSP430单片机实验板设计
1 系统结构
璺 : 至 竺 皇 堕 r一
- 一
MS P 4 3 0 F1 4 9
数码 管 电路
一
单 片机
按 键 电路
一பைடு நூலகம்
收稿 日期 :2 0 1 2 0 8 — 2 1 ;修回 日期 :2 0 1 2 — 0 9 — 3 0
基金项 目 :江苏省 自然科学基金 资助项 目( BK2 0 1 1 3 1 9 )
中图分 类号 :T P 2 0 6 . 1 文 献标 志码 :A
文 章 编 号 :1 0 0 8 — 5 4 7 5 ( 2 0 1 3 ) 0 1 — 0 0 2 2 — 0 4
The De s i g n o f M CU Ex pe r i me n t Bo a r d Ba s e d o n M S P4 3 0
作者简介 : 邬 丽娜 ( 1 9 7 6 一 ) . 女, 江苏苏州人 , 讲师, 硕士, 主要 从事 单片机和嵌 入 式系统研 究
邬丽娜 : MS P 4 3 0 单 片机实验板设计
2 0 1 3 年第 1 期
2 系统硬 件设 计
硬 件 电路 的设计包 括MS P 4 3 0 最小系统 电路 、 流水 灯 电路 、 数码管 电路 、 按键 电路 、 J T AG 接 口电路
等的设计 . 其 硬 件 电路 图如 图2 所示 .
’
,
▲ 搬l 1 l 7 . 3 j
董位
^
.
i
— — —l
一
1 l
牛
2一 I{ { c j 【
.
L
1 0 l l d 】 l L F ^ 1 i }
MSP430_G2553_LaunchPad__AD转换结果用LCD1602显示
/***********************内部基准电压2.5V*****************************/#include "msp430g2553.h"char a[6] ="";int da;int j ;double c,data;void delay(int t){int s=500;for(;t>0;t--){for(;s>0;s--){;;}}}void write_com(char com){P1OUT&=~(1<<3);//rS=0;P1OUT&=~(1<<4);//RW=0;P1OUT&=~(1<<5);//en=0;P1OUT&=~(1<<1);//delay(8);P2OUT=com;delay(8);P1OUT|=(1<<5);//en=1;delay(8);P1OUT&=~(1<<5);//en=0;}void write_data(char dt){P1OUT|=(1<<3);//rs=1;P1OUT&=~(1<<4);//rw=0;P1OUT&=~(1<<5);//en=0;delay(8);P2OUT=dt;delay(8);P1OUT|=(1<<5);//en=1;delay(8);P1OUT&=~(1<<5);//en=0;}void initial_lcd(void){delay(20);write_com(0x38);delay(15);write_com(0x0c);delay(15);write_com(0x06);delay(15);write_com(0x01) ;}void LCD_Disp(char x,char y,char *character){char xtemp;switch(x){case 0:xtemp=0x80+y;break;case 1:xtemp=0xc0+y;break;default:break;}write_com(xtemp);while(*character!=0){write_data(*character);character++;}}void main(void){char *pa;pa=a;WDTCTL = WDTPW + WDTHOLD; // Stop WDTP2SEL=0x00;P2DIR |= 0xff; // Set P1.0 to output direction P1DIR |= 0x38;initial_lcd(); //LCD初始化ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE + REF2_5V;//SREF_1+REFON +REF2_5V表示使用内部参考电压2.5v__enable_interrupt(); // Enable interrupts.TACCR0 = 30; // Delay to allow Ref to settleTACCTL0 |= CCIE; // Compare-mode interrupt.TACTL = TASSEL_2 | MC_1; // TACLK = SMCLK, Up mode.LPM0; // Wait for delay.TACCTL0 &= ~CCIE; // Disable timer Interrupt__disable_interrupt();ADC10CTL1 = INCH_1; // input A1ADC10AE0 |= 0x02; // PA.1 ADC option selectfor (;;){ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exida = ADC10MEM;data = ((double)da/1024)*2.5;c =data;a[0]=((int)c%10+0x30);a[1]=0x2e;a[2]=((int)(c*10)%10+0x30);a[3]=((int)(c*100)%10+0x30);a[4]=((int)(c*1000)%10+0x30);a[5]='\0';for(j = 0;j <= 5000;j++) //延时显示LCD_Disp(0,0,pa);}}// ADC10 interrupt service routine#pragma vector=ADC10_VECTOR__interrupt void ADC10_ISR (void){__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)}#pragma vector=TIMER0_A0_VECTOR__interrupt void ta0_isr(void){TACTL = 0;LPM0_EXIT; // Exit LPM0 on return/****************************内部基准电压2.5V版**************************************/* 5v基准电压,计算公式参见手册** 功能:数模转换** 日期:2012年7月18日**************************************/#include<msp430g2452.h>#include"intrinsics.h"#define SRI_0 P2OUT &= ~BIT3 //引脚定义#define SRI_1 P2OUT |= BIT3#define CLK_0 P2OUT &= ~BIT4#define CLK_1 P2OUT |= BIT4#define LD_0 P2OUT &= ~BIT5#define LD_1 P2OUT |= BIT5void DAC8043_change(unsigned int da);/***********主函数************/void main(){WDTCTL = WDTPW + WDTHOLD;P2DIR |= BIT3 + BIT4 + BIT5;P2OUT &= ~BIT3 + ~BIT4 + ~BIT5;while(1){DAC8043_change(0x0200);//输入0x0200,输出0.62,5v基准电压}/***************DAC转换函数***************/ void DAC8043_change(unsigned int da){unsigned char i;unsigned int da1;LD_1;//使能端拉高CLK_0;//时钟拉低for(i=0;i<12;i++){da1=da&0x0800;//数据转换开始,提取最高位if(da1){SRI_1;//数据传输}else{SRI_0;}CLK_1;CLK_0;da<<=1;//移位,}LD_0;//为下一次传输做准备}基于msp430g2553模拟IIC程序#ifndef _IIC_H_#define _IIC_H_#include "msp430g2553.h"//*******************宏定义****************** #define uchar unsigned char#define uint unsigned int#define SDA_OUT P1DIR|=BIT3#define SDA_IN P1DIR&=~BIT3#define SDA_H P1OUT|=BIT3#define SDA_L P1OUT&=~BIT3#define SCL_OUT P1DIR|=BIT2#define SCL_IN P1DIR&=~BIT2#define SCL_H P1OUT|=BIT2#define SCL_L P1OUT&=~BIT2//8M晶振时大约20us延时程序void delayus(uint z){uint i,j;for(i = 0;i<20;i++)for(j=0;j<z;j++){;;};}// 开始位void start(){SDA_OUT;SCL_OUT;SDA_H;SCL_H;delayus(1); //20SDA_L;delayus(2);//40SCL_L;}// 停止位void stop(){SDA_OUT;SCL_OUT;SDA_L;delayus(1);//20SCL_H;delayus(1);SDA_H;}// 从AT24Cxx移入数据到MCU uchar shin(){uchar i,read_data;SDA_OUT;SCL_OUT;for(i = 0; i < 8; i++){SDA_H;delayus(1);SCL_H;SDA_IN;read_data <<= 1;if(P1IN&BIT3)read_data|=0x01;SDA_OUT;SCL_L;}return(read_data);}// 从MCU移出数据到AT24Cxx uchar shout(uint write_data){uchar i;uchar ack_bit;SDA_OUT;SCL_OUT;for(i = 0; i < 8; i++) // 循环移入8个位{if(write_data&0x80)SDA_H;elseSDA_L;delayus(1);//2SCL_H;delayus(1);//2SCL_L;delayus(1);//2write_data <<= 1;}SDA_H; // 读取应答delayus(1);SCL_H; //注意拉高delayus(1);SDA_IN;if(P1IN&BIT3)ack_bit=1;else ack_bit=0;SCL_L;return ack_bit; // 返回AT24Cxx应答位}#endif。
MSP430F5529实验指导书V1.0
MSP430F5529 实验指导书(V1.0)2014年10月27日东北林业大学机电工程学院“3+1”实验室实验一基础GPIO实验实验二键盘与液晶显示实验实验三时钟系统配置实验实验四看门狗与定时器实验实验五 AD/DA实验实验六比较器实验实验七 Flash实验实验八串行通信实验实验一基础GPIO实验【实验目的】1、熟悉CCS的基本使用方法;2、掌握MSP430系列单片机程序开发的基本步骤;3、掌握MSP430 IO口的基本功能。
【实验仪器】1、SEED-EXP430F5529v1.0开发板一套;2、PC机操作系统Windows XP或Windows 7,CCSv5.1集成开发环境。
【实验原理】CCS(Code Composer Studio)是 TI 公司研发的一款具有环境配置、源文件编辑、程序调试、跟踪和分析等功能的集成开发环境,能够帮助用户在一个软件环境下完成编辑、编译、链接、调试和数据分析等工作。
CCSv5.1 为 CCS 软件的最新版本,功能更强大、性能更稳定、可用性更高,是 MSP430 软件开发的理想工具。
SEED-EXP430F5529v1.0开发板上的有8个可操作的LED灯,与MCU的IO口对应关系如图1-1所示:图1-1 LED与MCU的IO对应关系电路我们可以通过控制单片机IO口的输出电平状态来控制各个LED灯的亮灭。
开发板上还有2个可操作的按键S1,S2。
如图1-2所示。
图1-2 按键电路我们可以通过读取与按键相连的IO口的输入电平状态来执行相应的操作。
此外,S1,S2还可以作为外部中断源,触发中断。
【实验内容】1、用调用头文件的方法,使能MSP430F5529开发板上的8个LED灯依次按顺序循环点亮;2、用按键S1控制开发板上LED1的亮灭状态(查询法);3、用按键S2控制开发板上跑马灯的循环速度(中断方式)。
【实验步骤】内容1:使能开发板上的8个LED灯依次按顺序循环点亮1、打开CCSv5并确定工作区间,然后选择File-->New-->CCS Project 弹出图1-3对话框。
MSP430_内部AD精讲
1
ADC12的目录
2
A D C简要综述( 1/1 )
• 在MSP430单片机家族中, 很多系列 的单片机中都有12通道12位的ADC (简称A D C 1 2 模块)。如M S P 4 3 0 F 1 3 X 、M S P 4 3 0 F 1 4 X 、 M S P 4 3 0 F 1 5 X 、M S P 4 3 0 F 1 6 X 、M S P 4 3 0 F 4 3 X 、 MSP430F44X 等系列。较其它带A/D 转换的单片机,MSP 430 的ADC 精 度高,设计灵活巧妙,给数据采集系 统的设计带来了全新的思路。
Байду номын сангаас
ADC12 的结构
6
ADC12 的功能模块( 1/ 11)
1. 参考电压发生器:
AD都需要一个基准信号,通常为电压基准。 ADC12内置参考电源,而且参考电压有6种可编程选 择,分别为VR+与VR-的组合。其中 VR+(有3种):A VCC (模拟电源正端) V REF+ (A/D转换器内部参考电源的输出正端) V eREF+ (外部参考电源的正输入端)
15
ADC12 的功能模块( 10/11 )
16
ADC12 的功能模块( 11/11 ) ADC12主要特点
1. 12位转换精度,1位非线性微分误差,1位非线性积分误差 2. 有多种时钟源提供给ADC12模块,而且模块本身内置时钟发 生器 3. 内置温度传感器 4. Timer_A/Timer_B硬件触发器 5. 配置有8路外部通道与4路内部通道 6. 内置参考电源,并且参考电压有6种组合 7. 模数转换有4种模式 8. 16字转换缓存 9. ADC12可关断内核支持超低功耗应用 10.采样速度快,最高可达200ksps 11.自动扫描 12. DMA使能
MSP430系列16位超低功耗单片机原理与实践
MSP430系列16位超低功耗单片机原理与实践MSP430系列单片机采用了哈佛结构,具有16位的数据宽度,可以实现更高的数据处理速度。
它的主频范围从1MHz到25MHz,能够满足不同应用的需求。
同时,MSP430系列单片机具有多种低功耗模式,例如待机模式、休眠模式和独立模式,可以有效地降低功耗,延长电池寿命。
MSP430系列单片机具有丰富的外设接口,包括多个串口通信接口、通用输入输出口、模拟输入输出口以及定时器和计数器等。
这些外设接口使MSP430系列单片机可以与其他外部设备进行通信,实现数据的输入和输出。
此外,MSP430系列单片机还具有多个中断源,可以实现实时中断处理,提高系统的响应能力。
使用MSP430系列单片机进行开发,首先需要选择合适的开发板和编程工具。
德州仪器公司提供了MSP430 LaunchPad开发板,可以方便地进行程序的编写和调试。
同时,德州仪器还提供了MSP430编程工具链,包括编译器、调试器和仿真器等,在开发过程中能够提高开发效率。
在实际开发中,可以利用MSP430系列单片机的低功耗特性,实现一些需要长时间运行的应用。
例如,可以将MSP430系列单片机用于物联网中的传感器节点,采集和传输环境数据。
由于MSP430系列单片机的低功耗特性,可以通过电池供电,从而实现长时间的无线监测。
此外,MSP430系列单片机还可以用于电力管理系统、家庭自动化系统和医疗设备等领域。
它的低功耗特性和丰富的外设接口使其具有很高的适用性,能够满足各种不同应用的需求。
总结起来,MSP430系列单片机是一款16位超低功耗单片机,具有高性能和丰富的外设接口。
它的低功耗特性使得它在物联网、电力管理、家庭自动化和医疗设备等领域具有广泛的应用前景。
通过学习MSP430系列单片机的原理和实践,可以更好地应用它在实际开发中。
MSP430单片机入门例程
MSP430单片机入门例程MSP430单片机是一款低功耗、高性能的16位单片机,广泛应用于各种嵌入式系统。
下面是一个简单的MSP430单片机入门例程,可以让大家初步了解MSP430单片机的基本使用方法。
所需材料:1、MSP430单片机开发板2、MSP430单片机编译器3、MSP430单片机调试器4、电脑和相关软件步骤:1、安装MSP430单片机编译器首先需要安装MSP430单片机的编译器,该编译器可以将C语言代码编译成MSP430单片机可以执行的机器码。
在安装编译器时,需要选择与您的单片机型号匹配的编译器。
2、编写程序下面是一个简单的MSP430单片机程序,可以让LED灯闪烁:c本文include <msp430.h>int main(void)本文P1DIR |= 0x01; //设置P1.0为输出while(1){P1OUT ^= 0x01; //反转P1.0的状态,LED闪烁__delay_cycles(); //延时一段时间,控制闪烁频率}本文上述程序中,首先定义了P1DIR寄存器,将P1.0设置为输出。
然后进入一个无限循环,在循环中反转P1.0的状态,使LED闪烁。
使用__delay_cycles()函数实现延时,控制LED闪烁频率。
3、编译程序使用MSP430单片机编译器将程序编译成机器码,生成可执行文件。
在编译时,需要注意选择正确的编译器选项和单片机型号。
4、调试程序使用MSP430单片机调试器将可执行文件下载到单片机中,并使用调试器进行调试。
在调试时,可以观察单片机的输出口状态和LED灯的闪烁情况,确保程序正常运行。
随着嵌入式系统的发展,MSP430单片机作为一种低功耗、高性能的微控制器,在各种应用领域中得到了广泛的应用。
为了更好地理解和应用MSP430单片机,我在学习过程中积累了一些经验,现在分享给大家。
MSP430单片机是一种超低功耗的微控制器,由德州仪器(Texas Instruments)推出。
单片机ad转换原理
单片机ad转换原理单片机AD转换原理。
单片机(Microcontroller)是一种集成了微处理器、存储器和各种输入输出设备的微型计算机系统。
在很多电子设备中,单片机都扮演着至关重要的角色。
而AD转换(Analog to Digital Conversion)则是单片机中非常重要的功能之一,它可以将模拟信号转换为数字信号,使得单片机可以对外部的模拟信号进行采集和处理。
本文将介绍单片机AD转换的原理及相关知识。
AD转换的原理是利用单片机内部的模数转换器(ADC)来实现的。
模数转换器是一种将模拟信号转换为数字信号的电路,它可以将模拟信号的大小转换为相应的数字值。
在单片机中,模数转换器可以通过一定的采样和量化过程,将模拟信号转换为数字信号,并输出到单片机的数据总线上,以便单片机进行进一步的处理。
在进行AD转换时,首先需要对模拟信号进行采样。
采样是指在一定时间间隔内对模拟信号进行取样,获取其大小。
这样可以将连续的模拟信号转换为离散的信号。
然后,对采样后的信号进行量化。
量化是指将连续的模拟信号转换为一系列离散的数字值。
在单片机中,量化通常是按照一定的精度和分辨率进行的,精度越高,分辨率越大,转换后的数字值越接近原模拟信号的真实数值。
单片机中的ADC模块通常由输入端、采样保持电路、比较器、计数器、数字转换器和控制逻辑等部分组成。
当单片机需要进行AD转换时,首先需要将模拟信号输入到ADC的输入端,然后ADC会对输入信号进行采样和量化,最终输出转换后的数字信号。
在这个过程中,ADC的控制逻辑会根据预设的转换精度和采样频率等参数,控制ADC的工作状态,以保证转换的准确性和稳定性。
在实际应用中,单片机的AD转换功能被广泛应用于各种测控系统、仪器仪表、传感器等领域。
通过AD转换,单片机可以对外部的模拟信号进行采集和处理,实现数据的数字化和处理,为系统的控制和监测提供了重要的支持。
同时,单片机的AD转换功能也为各种信号处理算法和数字信号处理提供了基础,为系统的功能和性能提升提供了可能。
单片机AD转换实验
一、实验目的1、掌握单片机与ADC0809的接口设计方法。
2、掌握Proteus软件与Keil软件的使用方法。
二、实验要求1、用Proteus软件画出电路原理图,在单片机的外部扩展片外三总线,并通过片外三总线与0809接口。
2、在0809的某一模拟量输入通道上接外部模拟量。
3、在单片机的外部扩展数码管显示器。
4、分别采用延时和查询的方法编写A/D转换程序。
5、启动A/D转换,将输入模拟量的转换结果在显示器上显示。
三、实验电路图四、实验程序流程框图和程序清单1、查询ORG 0000H START:LJMP MAINORG 0100HMAIN: MOV SP, #6FHCLR EALOOP: MOV DPTR, #0fef8H MOVX @DPTR, ALOOP1:JNB P3.2, LOOP1MOVX A, @DPTRMOV B, #51DIV ABMOV 23H, AMOV A, #10MOV 22H, AMOV A, BLCALL CHULIMOV 21H, AMOV A, BLCALL CHULIMOV 20H, A LCALL DIRLJMP LOOPDIR: PUSH ACCPUSH DPHPUSH DPLPUSH PSWSETB RS1SETB RS0MOV R0, #20HMOV R3, #0FEH LOOP2:MOV P2, R3 MOV DPTR, #TAB1MOV A, @R0MOVC A, @A+DPTRMOV P1, ALCALL DELAYINC R0MOV A, R3JNB ACC.3, LOOP3RL AMOV R3, ALJMP LOOP2LOOP3:POP PSWPOP DPLPOP DPHPOP ACCRETTAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,07FH DELAY:MOV R7, #01HDL1: MOV R6, #8EHDL0: MOV R5, #02HDJNZ R5, $DJNZ R6, DL0DJNZ R7, DL1RETCHULI:CJNE A, #25, LPLJMP LP2LP: JNC LP1LP2: MOV B, #10MUL ABMOV B, #51DIV ABLJMP LP3LP1: CLR CSUBB A, #25MOV B, #10MUL ABCLR CSUBB A, #5MOV B, #51DIV ABADD A, #5LP3: RETEND2、延时ORG 0000HSTART:LJMP MAINORG 0100HMAIN: MOV SP, #6FHCLR EALOOP: MOV DPTR, #0fef8HMOVX @DPTR, ALCALL DELAY100MOVX A, @DPTRMOV B, #51DIV ABMOV 23H, AMOV A, #10MOV 22H, AMOV A, BLCALL CHULIMOV 21H, AMOV A, BLCALL CHULIMOV 20H, ALCALL DIRLJMP LOOPDIR: PUSH ACCPUSH DPHPUSH DPLPUSH PSWSETB RS1SETB RS0MOV R0, #20HMOV R3, #0FEHLOOP2:MOV P2, R3MOV DPTR, #TAB1MOV A, @R0MOVC A, @A+DPTRMOV P1, ALCALL DELAYINC R0MOV A, R3JNB ACC.3, LOOP3RL AMOV R3, ALJMP LOOP2LOOP3:POP PSWPOP DPLPOP DPHPOP ACCRETTAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,07FH DELAY:MOV R7, #01HDL1: MOV R6, #8EHDL0: MOV R5, #02HDJNZ R5, $DJNZ R6, DL0DJNZ R7, DL1RETCHULI:CJNE A, #25, LPLJMP LP2LP: JNC LP1LP2: MOV B, #10MUL ABMOV B, #51DIV ABLJMP LP3LP1: CLR CSUBB A, #25MOV B, #10MUL ABCLR CSUBB A, #5MOV B, #51DIV ABADD A, #5LP3: RETDELAY100: MOV R6,#01H;误差 0usDL0:MOV R5,#2FHDJNZ R5,$DJNZ R6,DL0RETEND3、中断ORG 0000HSTART:LJMP MAINORG 0003HLJMP INTT0ORG 0100HMAIN: MOV SP, #6FHSETB EASETB EX0MOV DPTR, #0000HMOVX @DPTR, AHERE: LJMP HEREINTT0:MOVX A, @DPTRMOV B, #51DIV ABMOV 23H, A //整数部分放22H中MOV A, #10MOV 22H, A //小数点放22H中MOV A, BLCALL CHULIMOV 21H, A //小数点后第一位放21H中 MOV A, BLCALL CHULIMOV 20H, A //小数点后第一位放21H中 LCALL DIRMOV DPTR, #0000HMOVX @DPTR, ARETIDIR: PUSH ACCPUSH DPHPUSH DPLPUSH PSWSETB RS1SETB RS0MOV R0, #20HMOV R3, #01HLOOP2:MOV P2, R3 //位控码初始值MOV DPTR, #TAB1MOV A, @R0MOVC A, @A+DPTRMOV P1, ALCALL DELAYINC R0MOV A, R3JB ACC.3 LOOP3RL AMOV R3, ALJMP LOOP2LOOP3:POP PSWPOP DPLPOP DPHPOP ACCRETTAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,07FH DELAY:MOV R7, #01HDL1: MOV R6, #8EHDL0: MOV R5, #02HDJNZ R5, $DJNZ R6, DL0DJNZ R7, DL1RETCHULI:CJNE A, #25, LPLJMP LP2LP: JNC LP1MOV B, #10MUL ABMOV B, #51DIV ABLJMP LP3LP1: CLR CSUBB A, #25MOV B, #10MUL ABCLR CSUBB A, #5MOV B, #51DIV ABADD A, #5LJMP LP3LP2: MOV A, #5MOV B, #0LP3: RETEND五、实验结果六、实验总结通过本次试验掌握了A/D转换的电路设计,掌握了AD0808的使用以及编址技术,熟悉了A/D转换的方法和A/D转换的程序设计方法。
基于MSP430单片机和AD9850的嵌入式信号源设计
4系统软件设计
软件 模 块 由 主程 序 (S 4 0 5 3 初 始 化 、D 8 0 始 化 、 I P 3F48 Ⅵ A 95 初
角波 , 信号最高的输出频率可以达到 1 M 。 0 Hz
—
C S工艺 , 功耗 在 3 3 MO 其 ・V供 电时仅 为 15 w , 展 :业 级 温 5m 扩 [ 度 范 嗣为 一 0~ 0 : 4 8T, 采用 2 引脚 的 S O 表 面 封装 形 式 。该 芯 8 SP
片组 成 原 理 , 图 2所示 , 如 内层 虚线 内是 一 个完 整 的可 编 程 D S D
L D 2 6 初始化) C 1 84 、 显示子程序 、 键盘输入子程序 、 信号发生与控
制 子程 序 四部 分组成 。信 号 源系统 主程 序 流程 , 图 6所示 。 如 系统 开机 后首 先进 行初 始化 ,包 括 M P 3 F 4 8初始 化及 S40 53
液 晶显示 屏 的初 始化 。然后设 定 波形 和输 出频 率 , 由
本设 计 采 用 M P 3 S 40系列 1 位 单 片机 M P 3 F 4 8 为 6 S4 053 作
主控 芯 片 , P 3 采 用 高 效 的精 简 指令 集 (Ic皇 构 , MS 4 0 Rs ) 士 此单 片 机
外部晶振 ; N为相位寄存器的位数 , 等于 3 1 频率控制字 KK= 算 : f・3f=f 13 6 。计算 出 K后 ,转换 成 为 4 o22c o・4 15 / O位控 制字 ,
送 给 A 9 5 。 D 8 0 接 收完成 后 ,Q U D 80A 95 在 F P由低 电平变成 高 电
MSP430系列单片机16位ADC测试程序
* 功 能:1/16秒唤醒CPU一次。
* 入口参数:无
* 出口参数:无
****************************************************************************/
// W1 | |<----->| A1+ COM0-COM3|--->| 7.1Digit,4-Mux LCD |
// |_| | | +----------------------+
// +------->| A1- VREF |---+
以记录外部输入为0V和10.00V时,ADC2的实际读数,作为校准参考值。参
考《超低功耗电压表》程序。
本程序给出了多路ADC同时采样的程序处理方法,可供参考。
//=========================================================================
// 开启内部1.2V基准源, 开启缓冲器,ADC时钟选择为SMCLK/2(524KHz)
for (i = 0; i < 500; i++); // 略延迟,让基准电压稳定
SD16CCTL0 |= SD16DF+SD16GRP; // ADC0与ADC1编组,数据格式为有符号
{
while(ADC_Flag==0) LPM0; //CPU休眠,等待被采样结束唤醒
ADC_Flag=0;
ADC_Sum0+=ADC_Result0; //ADC0采样结果累加
基于MSP430单片机的交流电压测量设计
基于MSP430单片机的交流电压测量设计 东南大学仪器科学与工程学院许欢 摘要:在单片机的一些测量中,有时候需要我们直接测量交流信号,现介绍一种基于msp430单片机实现的交流电压的测量方法。
关键字:MSP430单片机,交流电压,测量,中断日常生活及学习中, 我们一般需要之间测量交流信号, 测量交流信号的方法有很多, 而在 应用单片机的测量中,我们常常用来测量直流电压,现在将介绍一种基于 msp430单片机实 现的交流电压的测量方法。
系统的构成主要分硬件设计和软件设计两块来介绍。
硬件设计:为了保证硬件电路设计的通用性, 采用单级性电压测量的方法,将输入的双极性电压转换成单级性电压进行测量。
整个电路主要包括极性转换电路和输入处理电路。
其中,极性转换电路主要由放大电路实现,在此我采用MCP 601放大芯片。
MCP601芯片:(Microchip 公司的一款高性能的放大芯片)Vcc 管脚:电源管脚 GND 管脚:接地管脚 VIN-管脚:负输入端管脚 VIN+管脚:正输入端管脚 OUT 管脚:输出管脚 极性转换电路设计:在进行A/D 转换时,我们一般会采用芯片的工作电压作为 A/D 转换的参考电压。
由于一般 芯片的工作电压都为正电压, 而我们在这里要测量交流电压, 所以要对输入的交流信号进行 极性转换,将双极性变成单级性。
下图为极性转换电路:如图所示,该芯片共有 8个管脚,在极性转换电路中,ADOUT 为输出信号。
输出信号是在输入信号 ADIN 的基础上叠加了一个直流分量,调节上面的Vref 的值就可以改变直流分量的值。
如果调节Vref 使直流分量的值为1.5V ,并且此时输入信号是幅值为 1.5V 的交流正弦信号,那么输出信号就为最大值为3V ,最小值为0V 的单级性正弦信号。
在极性转换电路基础上我们将很容易设计出我们要的 输入电路。
输入处理电路:在极性转换电路基础上,输入处理电路需要将 220V 的交流电压信号变为幅值为1.5V 左右的交流信号,此外,还需要为MCP 601提供适当的参考电压信号。
单片机期末测试实验报告参考模板
MSP430单片机期末设计报告课题名称:基于msp430单片机期末测试题起讫日期:14年6月23日- 14年6月27日学生学号:1200308132 1200308133 学生姓名:张玥梁尧报告成绩:中国计量学院信息工程学院生物医学工程专业目录一.实验仪器简介 (2)二.实验设计 (3)三.实验结果 (6)一:实验仪器简介MSP430单片机简介:MSP430系列单片机是美国德州仪器(TI)1996年开始推向市场的一种16位超低功耗、具有精简指令集(RISC)的混合信号处理器(Mixed Signal Processor)。
德州仪器1996年到2000年初,先后推出了31x、32x、33x 等几个系列,这些系列具有LCD驱动模块,对提高系统的集成度较有利。
每一系列有ROM 型(C)、OTP 型(P)和 EPROM 型(E)等芯片。
EPROM 型的价格昂贵,运行环境温度范围窄,主要用于样机开发。
这也表明了这几个系列的开发模式,即:用户可以用 EPROM 型开发样机;用OTP型进行小批量生产;而ROM 型适应大批量生产的产品。
MSP430系列单片机是一个16位的单片机,采用了精简指令集(RISC)结构,具有丰富的寻址方式(7 种源操作数寻址、4 种目的操作数寻址)、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令。
这些特点保证了可编制出高效率的源程序。
MSP430 系列单片机能在25MHz晶体的驱动下,实现40ns的指令周期。
16位的数据宽度、40ns的指令周期以及多功能的硬件乘法器(能实现乘加运算)相配合,能实现数字信号处理的某些算法(如FFT等)。
MSP430 单片机之所以有超低的功耗,是因为其在降低芯片的电源电压和灵活而可控的运行时钟方面都有其独到之处。
首先,MSP430 系列单片机的电源电压采用的是1.8-3.6V 电压。
因而可使其在1MHz 的时钟条件下运行时,芯片的电流最低会在165μA左右,RAM保持模式下的最低功耗只有0.1μA。
实验二 AD转换实验
实验二 AD转换实验实验预习要求1、学习 MSP430F6638 单片机中ADC12的配置方法。
2、了解ADC转换原理。
一、实验目的1、了解AD转换原理及LED灯的控制方法。
2、掌握MSP430F6638 中ADC12的配置使用方法。
3、结合电位器与ADC12模块实现对LED灯的控制。
二、实验器材PC 机,MSP430F6638 EVM,USB数据线,万用表,信号发生器。
三、实验内容1、验证性实验:利用MSP430F6638开发板上的拨盘电位器,控制改变AD转换的输入电压值,转换后的数字量显示在段式液晶上面。
使用万用表测得当前输入电压,通过计算得到转换后的理想的数字量与液晶显示的数字量进行比较。
2、设计性实验:AD转换结束会产生中断,编写AD中断服务程序。
利用信号发生器输出信号(例如正弦波、三角波信号)作为AD转换的输入,根据输入电压的大小控制LED灯的亮灭(例如随着输入电压值的增大,LED1到LED5按顺序点亮;随着输入电压值减小,LED灯按顺序熄灭),LED和单片机IO口连接如下图所示。
图2.1 LED灯电路原理图四、实验原理模数转换器(ADC)是指将连续的模拟信号转换为离散的数字信号的器件。
真实世界 的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数 字形式。
在A/D 转换中,因为输入的模拟信号在时间上是连续的,而输出的数字信号是离 散量,所以进行转换时只能按一定的时间间隔对输入的模拟信号进行采样,然后再把采样值 转换为输出的数字量。
通常A/D 转换需要经过采样、保持量化、编码几个步骤。
ADC12 电 路如下图所示。
图2.2 ADC12 模块结构框图ADC12 模块中由以下部分组成:输入的16 路模拟开关,ADC 内部电压参考源,ADC12 内核,ADC 时钟源部分,采集与保持/触发源部分,ADC 数据输出部分,ADC 控制寄存器等组成。
ADC12 的模块内核是共用的,通过前端的模拟开关来分别完成采集输入。
MSP430系列十六位超低功耗单片机教学实验系统实验教程
在这里.需要对低功耗问题作一些说明。 首先,对一个处理器而言,活动模式时的功耗必须与其性能一起来考察、衡量,忽略性能来看功耗是 片面的。在计算机体系结构中,是用 W/MIPS(瓦特/百万指令每秒)来衡量处理器的功耗与性能关系的, 这种标称方法是合理的。MSP430 系列单片机在活动模式时耗电 250uA/MIPS,这个指标是很高的(传统 的 Mcs51 单片机约为 10~20mA/MIPS)。 其次,作为一个应用系统,功耗是整个系统的功耗,而不 仅仅是处理器的功耗。比如,在一个有多个输入信号的应用系统中,处理器输入端口的漏电流对系统的耗 电影响就较大了。MSP430 单片机输入端口的漏电流最大为 50nA,远低于其他系列单片机(一般为 l~10uA)。 另外,处理器的功耗还要看它内部功能模块是否可以关闭.以及模块活动情况下的耗电.比如低电压 监测电路的耗电等。还要注意,有些单片机的某些参数指标中.虽然典型值可能很小,但最大值和典型值 相差数十倍,而设计时要考虑到最坏情况,就应该关心参数标称的最大值,而不是典型值。总体而言, MSP430 系列单片机堪称目前世界上功耗最低的单片机,其应用系统可以做到用一枚电池使用 10 年。
MSP430 系列单片机有独特的时钟系统设计,包括两个不同的时钟系统:基本时钟系统和锁频环(FLL 和 FLL+)时钟系统或 DCO 数字振荡器时钟系统。由时钟系统产生 CPU 和各功能模块所需的时钟,并且这 些时钟可以在指令的控制下打开或关闭,从而实现对总体功耗的控制。由于系统运行时使用的功能模块不 同,即采用不同的工作模式,芯片的功耗有明显的差异。在系统中共有种活动模式(AM)和 5 种低功耗模式 (LPM0~LPM4)。
MSP430单片机实现斜率A/D转换的一种方法
比较器 A控 制寄存 器 ( A T 1 的大部 分控 制 位 C CL)
如 图 2所 示 。
I垒 I 垒 垒 l 坚 l垒 l 垒 l 垒 坠 兰 垒 坚 垒 兰l
图 2 模 拟 比较 器 A 寄存 器 的 控 制 位
中图分 类号 : N 9 T 7
0 引
言
P . 、24是 MS40 12 23P . P3 F 11单 片 机 的其 中 2个
实现 A D转 换 的方法 有很 多 , 常用 的 方法 是 逐 / 最
次逼 近法 。这 里介 绍 的 SoeA D转 换 原理 具有 较 强 l / p 的抗 干扰 能力 , 且实 现 原 理 简 单 易懂 、 格低 廉 , 对 价 在 实时性 要求 不 高 的场合具 有很 强 的优 选性 。 So eA D转 换是 利用 比较 器完 成 A D转 换 的原 l / p /
S
P 21
M 1 l c糯分 I L一— K . I 一 r l — 频 - - 队 o 器 T
AC L
R
I
I
MC 1M
CO
S t TA1 e FG
—
定
P 11
●一
门I } i 『 I _
捕捉
C N -. C B- o .
捉 /比较寄存器 c R co
CE A X为 比较 器 A 输 人 选 择 位 。 当该 位 为 “ ” 0
1 硬件测量 电路实现及实现过 程
时, 比较器 输入 脚 的选择 开关 指 向 0 当该 位 为 “ ” , ; 1时
比较 器输 入脚 的选 择开 关指 向 1 。
南理工王宏波MSP430F6638单片机实验报告
MSP430 单片机应用技术实验报告学号: XXXXXXXX姓名: XXX分组:第X 组同组同学 1 姓名: XXX同组同学 2 姓名: XXX南京理工大学2016年 12月 08日实验 1一、实验题目: UCS实验二、实验目的设置 DCO FLL reference =ACLK=LFXT1 = 32768Hz, MCLK = SMCLK = 8MHz,输出 ACLK、SMCLK,用示波器观察并拍照。
UCS初始状态: XT1关闭,默认为 LFXT1,ACLK选择 XT1源(时钟错误时自动切换至), MCLK、SMCLK选择 DCOCLKDIV源。
FLL 参考时钟源为XT1CLK,DCOCLK/DCOCLKDIV,=2N=32。
因此程序需要进行的操作有,启动LFXT1,待 XT1稳定工作后,设置锁频环将XT1分频为 8MHz的 DCOCLKDIV作为 MCLK和 SMCLK的时钟源,并分别通过 P1.0和P3.4 输出。
三、实验仪器和设备计算机、开发板、示波器、信号源、电源、Code Comeposer Studio v5四、实验步骤1 、用电缆连接开发板 USB2口和电脑 USB口,打开电源开关 SW1,电源指示灯 D5 点亮;2、运行CCSV5;3、新建工作空间workspace;4、新建工程project与源文件main.c;5、编写程序;6、编译、调试、下载程序到单片机;7、观察、分析、保存运行结果。
五、实验程序六、实验结果一、实验题目:FLL+应用实验二、实验目的检测P1.4输入,遇上升沿进端口中断,在中断服务程序内翻转P4.1状态。
三、实验仪器和设备计算机、开发板、示波器、信号源、电源、Code Comeposer Studio v5四、实验步骤1、用电缆连接开发板 USB2口和电脑 USB口,打开电源开关 SW1,电源指示灯 D5 点亮;2、运行CCSV5;3、新建工作空间workspace;4、新建工程project与源文件main.C;5、编写程序;6、编译、调试、下载程序到单片机;7、观察、分析、保存运行结果。
430单片机实验报告
1、建立工程
2、编写程序,编译、运行
3、把程序下载到单片机中
4、程序代码:
#include <msp430g2452.h>
int i=0;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
//P1SEL |= 0x06; // P1.1 - P1.2 option select
unsigned char temp;
P1OUT=0; //p1out全为0;等待按键输
temp=P1IN;
if((temp&0xf0)<0xf0) ; //如果有键按下;
{
delay();
Key_Scan();
switch(key_val)
{
case 0:P2DIR|=0xff;P2OUT=0x3f;break;
}
void main()
{
WDTCTL=WDTPW+WDTHOLD;
init_keyboard();
delay();
ctrlkey(1);
while(1)
{
key_event();
}
}
五、实验设备
计算机、IAR-FET集成开发环境、MSP430G2553单片机
六、问题分析
使用单片机的P1口与矩阵式键盘连接时,可以将P1口低4位的4条端口线定义为行线,P1口高4位的4条端口线定义为列线,形成4*4键盘,可以配置16个按键,将单片机P2口与七段数码管连接,当按下矩阵键盘任意键时,数码管显示该键所在的键号。
P2SEL=0X00;
key_val=0;
}
void Key_Scan(void) //扫描键盘获得键值
单片机ad转换原理
单片机ad转换原理单片机AD转换原理。
单片机的AD转换原理是指单片机如何将模拟信号转换为数字信号的过程。
在许多嵌入式系统中,需要将外部的模拟信号转换为数字信号,以便单片机能够对其进行处理和分析。
因此,了解单片机的AD转换原理对于理解嵌入式系统的工作原理至关重要。
在单片机中,AD转换是通过内置的模数转换器(ADC)来完成的。
ADC是一种能够将模拟信号转换为数字信号的电路。
它接收来自外部的模拟信号,并将其转换为相应的数字值,以便单片机能够对其进行处理。
AD转换的过程可以分为几个主要步骤。
首先,模拟信号通过采样电路进行采样,将连续的模拟信号转换为离散的采样值。
然后,采样值经过保持电路进行保持,以便在转换过程中保持稳定。
接下来,采样值通过ADC进行量化,即将其转换为相应的数字值。
最后,数字值经过数字信号处理电路进行处理,以便单片机能够对其进行分析和处理。
在单片机中,AD转换的精度和速度是非常重要的。
精度指的是AD转换的准确度,即数字值与实际模拟信号之间的差异程度。
而速度则指的是AD转换的速度,即完成一次AD转换所需的时间。
单片机的AD转换精度和速度通常取决于其内置的ADC的性能参数,如分辨率、采样速率等。
在实际应用中,需要根据具体的需求选择合适的ADC类型和参数。
例如,对于需要高精度和高速度的应用,可以选择分辨率高、采样速率快的ADC。
而对于一些低精度和低速度要求的应用,则可以选择分辨率低、采样速率慢的ADC。
总之,单片机的AD转换原理是单片机将模拟信号转换为数字信号的过程,通过内置的ADC完成。
了解AD转换的原理和性能参数对于设计和应用嵌入式系统至关重要。
在实际应用中,需要根据具体的需求选择合适的ADC类型和参数,以确保系统的性能和稳定性。
通过对单片机AD转换原理的深入了解,可以更好地理解嵌入式系统的工作原理,为系统的设计和应用提供有力的支持。
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); }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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--);。