重大光电MSP430单片机实验代码

合集下载

msp430单片机程序(LT-1B_Programs)

msp430单片机程序(LT-1B_Programs)

一、基础实验【10个】1、入门试验:LED闪烁(1个)2、时钟实验:设置MCLK、ACLK、SMCLK(1个)3、低功耗实验:设置低功耗模式(1个)4、IO端口试验:IO端口寄存器设置(1个)5、定时器:看门狗定时器、TimerA寄存器设置(2个)6、比较器:比较器A寄存器(1个)7、Flash:flash读写(1个)8、异步通信:异步通信寄存器设置(1个)9、ADC:ADC12寄存器设置(1个)二、开发板模块简单程序【56个】1、LED流水灯实验(红、黄、绿)(1)LED1:检测开发板(2)LED2:普通IO控制闪烁(3)LED3:PWM信号控制闪烁2、蜂鸣器实验(1)蜂鸣器1:单频音(步进变音调)(2)蜂鸣器2:奏乐(祝你平安)3、数码管实验(1)数码管1(显示123456)(2)数码管2(动态显示0~F)(3)数码管3(流动光圈)(4)数码管4(来回光标)4、4×1独立按键实验(1)4×1键盘1:扫描数码管显示(2)4×1键盘2:中断数码管显示(3)4×1键盘3:控制LED(4)4×1键盘4:控制蜂鸣器5、4×4矩阵键盘实验(1)4×4键盘1:行列扫描数码管显示(2)4×4键盘2:行列扫描1602液晶显示(3)4×4键盘3:控制LED蜂鸣器6、1602液晶实验(1)1602液晶1:动态字符显示(2)1602液晶2:静态字符显示(3)1602液晶3:内部时钟显示7、3.3V-5V电平转换实验(1)电平转换1:输出5V方波(2)电平转换2:输出不同占空比的方波(3)电平转换3:MCLK,SMCLK,ACLK8、RS232接口实验(1)RS232接口1:MCU发送数据PC机显示(2)RS232接口2:按键控制MCU发送数据PC机显示(3)RS232接口3:PC机发送数据MCU液晶显示(4)RS232接口4:MCU回发接收到的PC机数据(5)RS232接口5:RS232控制蜂鸣器9、RS485接口实验(1)RS485接口1:发送程序(2)RS485接口2:接收程序10、USB接口实验(1)USB接口1:简单连接测试(2)USB接口2:USB接收数据(3)USB接口3:USB发送数据11、PS2接口实验(1)PS2接口1:PS2控制1602显示(2)PS2接口2:PS2控制数码管显示(3)PS2接口3:PS2控制LED和蜂鸣器12、12-Bit高精度温度传感器实验(1)温度传感器1:DS18B20在数码管显示(2)温度传感器2:DS18B20在液晶显示13、RTC实时时钟实验(1)实时时钟1:DS1302测试(2)实时时钟2:DS1302电子钟14、2k Bit EEPROM实验(1)EEPROM1:AT24C02测试(2)EEPROM2:读出数据通过串口在PC机显示15、12-Bit模数转换器(ADC)接口实验(1)模数转换器1:ADC在数码管显示(2)模数转换器2:ADC在1602液晶在显示(3)模数转换器3:ADC通过串口在PC机显示16、8-Bit数模转换器(DAC)实验(1)数模转换器1:DAC控制LED(2)数模转换器2:DAC输出电压,ADC采样转换并在液晶上显示17、12864液晶实验(与12864液晶配套)(1)12864液晶并口1:字符显示(2)12864液晶并口2:汉字显示(3)12864液晶并口3:图形显示(4)12864液晶并口4:综合演示(5)12864液晶串口5:字符显示(6)12864液晶串口6:汉字显示(7)12864液晶串口7:图形显示(8)12864液晶串口8:综合演示18、射频模块CC1000实验(1)射频模块1:发送数据(2)射频模块2:接收数据19、ucos移植注:17、18程序随模块赠送三、开发板综合程序【30】1、键盘综合实验(1)4×4键盘+蜂鸣器+LED+数码管显示(2)4×4键盘+蜂鸣器+LED+1602液晶显示(3)4×4键盘+蜂鸣器+LED+PC机显示(4)PS2键盘+UART+PC机显示(5)PS2键盘+USB+PC机显示2、接口综合实验(1)USB UART(2)UART USB(3)RS232 RS485(4)RS485 RS2323、温度时间综合实验(1)DS18B20 + DS1302 + 数码管(2)DS18B20 + DS1302 + USB(3)DS18B20 + DS1302 + UART(4)DS18B20 + DS1302 + 16024、AD DA综合实验(1)ADC + 1602(2)ADC + UART(3)ADC + USB(4)DAC + LED + KEY(5)DAC + UART(6)DAC + USB(7)ADC + UART + DS1302(8)ADC + DAC + 1602 + KEY(9)ADC + DAC + UART + KEY5、其他综合实验(1)AT24C02高级应用(搜索,擦除,读出全部)(2)DS1302高级应用(内部RAM存取数据)6、12864液晶综合实验(1)汉字库(2)图形库7、3.2寸TFT触摸屏实验(1)静态图片(2)动画/*************************************************** 程序功能:BoardConfig.h 头文件---------------------------------------------------***************************************************/ typedef unsigned char uchar;typedef unsigned int uint;//控制位的宏定义#define Ctrl_Out P3DIR |= BIT3 + BIT6 + BIT7;#define Ctrl_0 P3OUT &= ~(BIT3 + BIT6 + BIT7)#define SRCLK_1 P3OUT |= BIT7#define SRCLK_0 P3OUT &= ~BIT7#define SER_1 P3OUT |= BIT6#define SER_0 P3OUT &= ~BIT6#define RCLK_1 P3OUT |= BIT3#define RCLK_0 P3OUT &= ~BIT3//板上资源配置函数void BoardConfig(uchar cmd){uchar i;Ctrl_Out;Ctrl_0;for(i = 0; i < 8; i++){SRCLK_0;if(cmd & 0x80) SER_1;else SER_0;SRCLK_1;cmd <<= 1;}RCLK_1;_NOP();RCLK_0;/*************************************************** 程序功能:控制8个LED闪烁,用于测试下载功能是否正常---------------------------------------------------测试说明:观察LED闪烁***************************************************/ #include <msp430x14x.h>/****************主函数****************/void main(void){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗BoardConfig(0xf0); //关闭数码管和电平转换,打开流水灯CCTL0 = CCIE; //使能CCR0中断CCR0 = 2047; //设定周期0.5STACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式P2DIR = 0xff; //设置P2口方向为输出P2OUT = 0xff;_EINT(); //使能全局中断LPM3; //CPU进入LPM3模式}/*******************************************函数名称:Timer_A功能:定时器A的中断服务函数参数:无返回值:无********************************************/#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A (void){P2OUT ^= 0xff; //P2口输出取反/***********************************************程序功能:实现流水灯以三种流动方式和四种流动速度的不同组合而进行点亮"流动"------------------------------------------------测试说明:观察流水灯流动顺序和速度的变化************************************************/#include <msp430x14x.h>#include "BoardConfig.h"uint i = 0,j = 0,dir = 0;uint flag = 0,speed = 0; //flag--灯光流动方式,speed--灯光流动速度/****************主函数****************/void main(void){BoardConfig(0xf0);CCTL0 = CCIE; //使能CCR0中断CCR0 = 50000;TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,增计数模式P2DIR = 0xff; //设置P2口方向为输出P2OUT = 0xff;_EINT(); //使能全局中断LPM0; //CPU进入LPM0模式}/*******************************************函数名称:Timer_A功能:定时器A的中断服务函数,在这里通过标志控制流水灯的流动方向和流动速度参数:无返回值:无********************************************/#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A (void){if(flag == 0){P2OUT = ~(0x80>>(i++)); //灯的点亮顺序D8 -> D1}else if(flag == 1){P2OUT = ~(0x01<<(i++)); //灯的点亮顺序D1 -> D8}else{if(dir) //灯的点亮顺序D8 -> D1,D1 -> D8,循环绕圈{P2OUT = ~(0x80>>(i++));}else{P2OUT = ~(0x01<<(i++));}}if(i == 8){dir = ~dir;}j++;if(j == 40){i = 0;j = 0;flag++;if(flag == 4) flag = 0;switch(speed){case 0:TACTL &=~ (ID0 + ID1);TACTL |= ID_3;break;case 1:TACTL &=~ (ID0 + ID1);TACTL |= ID_2;break;case 2:TACTL &=~ (ID0 + ID1);TACTL |= ID_1;break;case 3:TACTL &=~ (ID0 + ID1);TACTL |= ID_0;break;default:break;}if(flag != 3) speed++;if(speed == 4) speed = 0;}/******************************************************* 程序功能:用从P2.3和P2.4输出的PWM波形驱动LED闪烁P2.3口输出方波的占空比为75%P2.4口输出方波的占空比为25%-------------------------------------------------------测试说明:观察LED的亮灭的时间长短*******************************************************/ #include <msp430x14x.h>#include "BoardConfig.h"{WDTCTL = WDTPW + WDTHOLD; // 关狗BoardConfig(0xb0); // 关闭数码管和电平转换,打开流水灯P2DIR = 0xff; // P2端口设置为输出P2OUT = 0xff; // 关闭其他LEDP2SEL |= BIT3 + BIT4; // P2.3和P2.4连接内部模块CCR0 = 4096-1; // PWM周期为1SCCTL1 = OUTMOD_7; // CCR1 reset/setCCR1 = 3072; // CCR1 PWM duty cycleCCTL2 = OUTMOD_7; // CCR2 reset/setCCR2 = 1024; // CCR2 PWM duty cycleTACTL = TASSEL_1 + ID_3 + MC_1; // ACLK/8, up mode_BIS_SR(LPM3_bits); // Enter LPM3}//****************************************************************************** // MSP-FET430P140 Demo - Basic Clock, Output Buffered SMCLK, ACLK and MCLK//// Description: Output buffered MCLK, SMCLK and ACLK.// ACLK = LFXT1 = 32768, MCLK = DCO Max, SMCLK = XT2// //* XTAL's REQUIRED - NOT INSTALLED ON FET *//// //* Min Vcc required varies with MCLK frequency - refer to datasheet *////// MSP430F149// -----------------// /|\| XIN|-// | | | 32k// --|RST XOUT|-// | |// | XT2IN|-// | | XTAL (455k - 8Mhz)// |RST XT2OUT|-// | |// | P5.4|-->MCLK = DCO Max// | P5.5|-->SMCLK = XT2// | P5.6|-->ACLK = 32kHz//// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench V ersion: 3.21A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW +WDTHOLD; // Stop Watchdog Timer DCOCTL = DCO0 + DCO1 + DCO2; // Max DCOBCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSELBCSCTL2 |= SELS; // SMCLK = XT2P5DIR |= 0x70; // P5.6,5,4 outputsP5SEL |= 0x70; // P5.6,5,5 optionswhile(1){}//****************************************************************************** // MSP-FET430P140 Demo - Basic Clock, LPM3 Using WDT ISR, 32kHz ACLK//// Description: This program operates MSP430 normally in LPM3, pulsing P3.4// at 4 second intervals. WDT ISR used to wake-up system. All I/O configured// as low outputs to eliminate floating inputs. Current consumption does// increase when LED is powered on P3.4. Demo for measuring LPM3 current.// ACLK= LFXT1/4= 32768/4, MCLK= SMCLK= default DCO// //* External watch crystal on XIN XOUT is required for ACLK *//////// MSP430F149// ---------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.5|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench V ersion: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);BCSCTL1 |= DIV A_2; // ACLK/4WDTCTL = WDT_ADLY_1000; // WDT 1s/4 interval timerIE1 |= WDTIE; // Enable WDT interruptP1DIR = 0xFF; // All P1.x outputsP1OUT = 0; // All P1.x resetP2DIR = 0xFF; // All P2.x outputsP2OUT = 0; // All P2.x resetP3DIR = 0xFF; // All P3.x outputsP3OUT = 0x30; // All P3.x resetP4DIR = 0xFF; // All P4.x outputsP4OUT = 0; // All P4.x resetP5DIR = 0xFF; // All P5.x outputsP5OUT = 0; // All P5.x resetP6DIR = 0xFF; // All P6.x outputsP6OUT = 0x80; // All P6.x resetwhile(1){uint i;_BIS_SR(LPM3_bits + GIE); // Enter LPM3P3OUT &= ~BIT5; // Set P3.5 LED onfor (i = 18000; i>0; i--); // DelayP3OUT |= BIT5; // Clear P3.5 LED off}}#pragma vector=WDT_VECTOR__interrupt void watchdog_timer (void){_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)//******************************************************************************* // MSP-FET430P140 Demo - Software Toggle P3.4//// Description: Toggle P3.4 by xor'ing P3.4 inside of a software loop.// ACLK= n/a, MCLK= SMCLK= default DCO ~800k//// MSP430F149// -----------------// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench V ersion: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerP3DIR |= BIT4; // Set P3.4 to output directionfor (;;){volatile unsigned int i;P3OUT ^= BIT4; // Toggle P3.4 using exclusive-ORi = 50000; // Delaydo (i--);while (i != 0);}//****************************************************************************** // MSP-FET430P140 Demo - WDT, Toggle P3.4, Interval Overflow ISR, DCO SMCLK//// Description: Toggle P3.4 using software timed by the WDT ISR. Toggle rate// is approximately 30ms based on default ~ 800khz DCO/SMCLK clock source// used in this example for the WDT.// ACLK= n/a, MCLK= SMCLK= default DCO~ 800k//// MSP430F149// -----------------// /|\| XIN|-// | | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench V ersion: 3.42A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xbf); //关闭数码管、流水灯和电平转换WDTCTL = WDT_MDLY_32; // Set Watchdog Timer interval to ~30ms IE1 |= WDTIE; // Enable WDT interruptP3DIR |= BIT4; // Set P3.4 to output direction_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){P3OUT ^= BIT4; // Toggle P3.4 using exclusive-OR//****************************************************************************** // MSP-FET430P140 Demo - WDT, Toggle P3.4, Interval Overflow ISR, 32kHz ACLK//// Description: Toggle P3.4 using software timed by WDT ISR. Toggle rate is// exactly 250ms based on 32kHz ACLK WDT clock source. In this example the// WDT is configured to divide 32768 watch-crystal(2^15) by 2^13 with an ISR// triggered @ 4Hz.// ACLK= LFXT1= 32768, MCLK= SMCLK= DCO~ 800kHz// //* External watch crystal installed on XIN XOUT is required for ACLK *////// MSP430F149// -----------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.4|-->LED// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench V ersion: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDT_ADLY_250; // WDT 250ms, ACLK, interval timer IE1 |= WDTIE; // Enable WDT interruptP3DIR |= BIT4; // Set P3.4 to output direction_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interrupt}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){P3OUT ^= BIT4; // Toggle P3.4 using exclusive-OR//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, CCR0 Cont. Mode ISR, DCO SMCLK//// Description: Toggle P3.4 using software and TA_0 ISR. Toggles every// 50000 SMCLK cycles. SMCLK provides clock source for TACLK.// During the TA_0 ISR, P3.4 is toggled and 50000 clock cycles are added to// CCR0. TA_0 ISR is triggered every 50000 cycles. CPU is normally off and// used only during TA_ISR.// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz//// MSP430F149// ---------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// Built with IAR Embedded Workbench V ersion: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBoardConfig(0xb8); //关闭数码管、流水灯和电平转换P3DIR |= BIT4; // P3.4 outputCCTL0 = CCIE; // CCR0 interrupt enabledCCR0 = 50000;TACTL = TASSEL_2 + MC_2; // SMCLK, contmode_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer A0 interrupt service routine#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A (void){P3OUT ^= BIT4; // Toggle P3.4CCR0 += 50000; // Add Offset to CCR0//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, CCR0 Up Mode ISR, DCO SMCLK//// Description: Toggle P3.4 using software and TA_0 ISR. Timer_A is// configured for up mode, thus the timer overflows when TAR counts// to CCR0. In this example, CCR0 is loaded with 20000.// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz//// MSP430F149// ---------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Built with IAR Embedded Workbench V ersion: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBoardConfig(0xb8);P3DIR |= BIT4; // P3.4 outputCCTL0 = CCIE; // CCR0 interrupt enabledCCR0 = 20000;TACTL = TASSEL_2 + MC_1; // SMCLK, upmode_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer A0 interrupt service routine#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A (void){P3OUT ^= BIT4; // Toggle P3.4//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, Overflow ISR, DCO SMCLK//// Description: Toggle P3.4 using software and Timer_A overflow ISR.// In this example an ISR triggers when TA overflows. Inside the TA// overflow ISR P3.4 is toggled. Toggle rate is approximatlely 12Hz.// Proper use of the TAIV interrupt vector generator is demonstrated.// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz//// MSP430F149// ---------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench V ersion: 3.42A#include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBoardConfig(0xb8);P3DIR |= BIT4; // P3.4 outputTACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, contmode, interrupt_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer_A3 Interrupt V ector (TAIV) handler#pragma vector=TIMERA1_VECTOR__interrupt void Timer_A(void){switch( TAIV ){case 2: break; // CCR1 not usedcase 4: break; // CCR2 not usedcase 10: P3OUT ^= BIT4; // overflowbreak;}//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, Overflow ISR, 32kHz ACLK//// Description: Toggle P3.4 using software and the Timer_A overflow ISR.// In this example an ISR triggers when TA overflows. Inside the ISR P3.4// is toggled. Toggle rate is exactly 0.5Hz. Proper use of the TAIV interrupt// vector generator is demonstrated.// ACLK = TACLK = 32768Hz, MCLK = SMCLK = default DCO ~800kHz// //* An external watch crystal on XIN XOUT is required for ACLK *////// MSP430F149// ---------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// Feb 2008// Built with IAR Embedded Workbench V ersion: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBoardConfig(0xb8);P3DIR |= BIT4; // P3.4 outputTACTL = TASSEL_1 + MC_2 + TAIE; // ACLK, contmode, interrupt_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt}// Timer_A3 Interrupt V ector (TAIV) handler#pragma vector=TIMERA1_VECTOR__interrupt void Timer_A(void){switch( TAIV ){case 2: break; // CCR1 not usedcase 4: break; // CCR2 not usedcase 10: P3OUT ^= BIT4; // overflowbreak;}}#include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTHOLD + WDTPW; // 关看门狗BoardConfig(0xb0); //开流水灯,关数码管和电平转换CACTL1 = CARSEL + CAREF0 + CAON ; // Vcc/4 = - cmpCACTL2 = P2CA0; // 使用CA0P2DIR = 0xff;P2OUT = 0xff;while(1){if((CACTL2 | 0xfe) ==0xff){ // 比较电压是否超过0.25VccP2OUT &= ~BIT4;CACTL1 &= 0xfe; // CAIFG = 0}else{P2OUT |= BIT4;}}}//**************************************************************************** // MSP-FET430P140 Demo - Flash In-System Programming, Copy SegA to SegB//// Description: This program first erases flash seg A, then it increments all// values in seg A, then it erases seg B, then copies seg A to seg B.// Assumed MCLK 550kHz - 900kHz.// //* Set Breakpoint on NOP in the Mainloop to avoid Stressing Flash *////// MSP430F149// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |//// M. Mitchell// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench V ersion: 3.21A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"uchar value; // 8-bit value to write to segment Auchar DataBuffer[128];// Function prototypesvoid write_SegA (uchar value);void copy_A2B (void);{BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerFCTL2 = FWKEY + FSSEL0 + FN0; // MCLK/2 for Flash Timing Generator value = 0; // Initialize valuewhile(1) // Repeat forever{write_SegA(value++); // Write segment A, increment valuecopy_A2B(); // Copy segment A to B_NOP(); // SET BREAKPOINT HERE}}void write_SegA (uchar value){uchar *Flash_ptr; // Flash pointeruint i;Flash_ptr = (uchar *) 0x1080; // Initialize Flash pointerFCTL1 = FWKEY + ERASE; // Set Erase bitFCTL3 = FWKEY; // Clear Lock bit*Flash_ptr = 0; // Dummy write to erase Flash segmentFCTL1 = FWKEY + WRT; // Set WRT bit for write operationfor (i=0; i<128; i++){*Flash_ptr++ = value; // Write value to flash}FCTL1 = FWKEY; // Clear WRT bitFCTL3 = FWKEY + LOCK; // Set LOCK bit}void copy_A2B (void){uchar *Flash_ptrA; // Segment A pointeruchar *Flash_ptrB; // Segment B pointeruint i;Flash_ptrA = (uchar *) 0x1080; // Initialize Flash segment A pointerFlash_ptrB = (uchar *) 0x1000; // Initialize Flash segment B pointerFCTL3 = FWKEY; // Clear Lock bit*Flash_ptrB = 0; // Dummy write to erase Flash segment B FCTL1 = FWKEY + WRT; // Set WRT bit for write operationfor (i=0; i<128; i++){DataBuffer[i] = *Flash_ptrA++;*Flash_ptrB++ = DataBuffer[i]; // Copy value segment A to segment B}FCTL1 = FWKEY; // Clear WRT bitFCTL3 = FWKEY + LOCK; // Set LOCK bit//****************************************************************************** // MSP-FET430P140 Demo - USART0, Ultra-Low Pwr UART 2400 Echo ISR, 32kHz ACLK //// Description: Echo a received character, RX ISR used. In the Mainloop UART0// is made ready to receive one character with interrupt active. The Mainloop// waits in LPM3. The UART0 ISR forces the Mainloop to exit LPM3 after// receiving one character which echo's back the received character.// ACLK = UCLK0 = LFXT1 = 32768, MCLK = SMCLK = DCO~ 800k// Baud rate divider with 32768hz XTAL @2400 = 32768Hz/2400 = 13.65 (000Dh)// //* An external watch crystal is required on XIN XOUT for ACLK *////// MSP430F149// -----------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.4|----------->// | | 2400 - 8N1// | P3.5|<-----------////// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench V ersion: 3.21A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop WDTP3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXDUCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKUBR00 = 0x0D; // 32k/2400 - 13.65UBR10 = 0x00; //UMCTL0 = 0x6B; // ModulationUCTL0 &= ~SWRST; // Initialize USART state machineIE1 |= URXIE0; // Enable USART0 RX interrupt// Mainloopfor (;;){_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interruptwhile (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0}}// UART0 RX ISR will for exit from LPM3 in Mainloop#pragma vector=UART0RX_VECTOR__interrupt void usart0_rx (void){_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)}//****************************************************************************** // MSP-FET430P140 Demo - USART0, Ultra-Low Pwr UART 9600 Echo ISR, 32kHz ACLK //// Description: Echo a received character, RX ISR used. In the Mainloop UART0// is made ready to receive one character with interrupt active. The Mainloop// waits in LPM3. The UART0 ISR forces the Mainloop to exit LPM3 after// receiving one character which echo's back the received character.// ACLK = UCLK0 = LFXT1 = 32768, MCLK = SMCLK = DCO~ 800k// Baud rate divider with 32768hz XTAL @9600 = 32768Hz/9600 = 3.41 (0003h 4Ah )// //* An external watch crystal is required on XIN XOUT for ACLK *////// MSP430F149// -----------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.4|----------->// | | 9600 - 8N1// | P3.5|<-----------////// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench V ersion: 3.21A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop WDTP3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXDUCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKUBR00 = 0x03; // 32k/9600 - 3.41UBR10 = 0x00; //UMCTL0 = 0x4A; // ModulationUCTL0 &= ~SWRST; // Initialize USART state machineIE1 |= URXIE0; // Enable USART0 RX interrupt// Mainloopfor (;;){_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interruptwhile (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0}}// UART0 RX ISR will for exit from LPM3 in Mainloop#pragma vector=UART0RX_VECTOR__interrupt void usart0_rx (void){_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)//****************************************************************************** // MSP-FET430P140 Demo - USART0, UART 19200 Echo ISR, XT2 HF XTAL ACLK//// Description: Echo a received character, RX ISR used. Normal mode is LPM0,// USART0 RX interrupt triggers TX Echo. Though not required, MCLK = XT2.// ACLK = n/a, MCLK = SMCLK = UCLK0 = XT2 = 8MHz// Baud rate divider with 8Mhz XTAL @19200 = 8MHz/19200 = 416.66 ~ 417 (01A0h)// //* An external 8MHz XTAL on X2IN X2OUT is required for XT2CLK *//// //* Min Vcc required varies with MCLK frequency - refer to datasheet *//////// MSP430F149// -----------------// /|\| XT2IN|-// | | | 8Mhz// --|RST XT2OUT|-// | |// | P3.4|------------>// | | 19200 - 8N1// | P3.5|<------------////// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench V ersion: 3.21A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){volatile unsigned int i;BoardConfig(0xb8);P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDWDTCTL = WDTPW + WDTHOLD; // Stop WDTBCSCTL1 &= ~XT2OFF; // XT2ondo{IFG1 &= ~OFIFG; // Clear OSCFault flagfor (i = 0xFF; i > 0; i--); // Time for flag to set}while ((IFG1 & OFIFG)); // OSCFault flag still set?BCSCTL2 |= SELM_2 + SELS; // MCLK = SMCLK = XT2 (safe)ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXDUCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL1; // UCLK = SMCLKUBR00 = 0xA0; // 8Mhz/19200 ~ 417UBR10 = 0x01; //UMCTL0 = 0x00; // no modulationUCTL0 &= ~SWRST; // Initialize USART state machineIE1 |= URXIE0; // Enable USART0 RX interrupt_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}#pragma vector=UART0RX_VECTOR__interrupt void usart0_rx (void){while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0//****************************************************************************** // MSP-FET430P140 Demo - USART0, UART 115200 Echo ISR, XT2 HF XTAL ACLK//// Description: Echo a received character, RX ISR used. Normal mode is LPM0,// USART0 RX interrupt triggers TX Echo. Though not required, MCLK= XT2.// ACLK = n/a, MCLK = SMCLK = UCLK0 = XT2 = 8MHz// Baud rate divider with 8Mhz XTAL = 8000000/115200 = 0069 (0045h)// //* An external 8MHz XTAL on X2IN X2OUT is required for XT2CLK *//// //* Min Vcc required varies with MCLK frequency - refer to datasheet *//////// MSP430F149// -----------------// /|\| XT2IN|-// | | | 8Mhz// --|RST XT2OUT|-// | |// | P3.4|------------>// | | 115200 - 8N1// | P3.5|<------------////。

430单片机点亮LED实验报告

430单片机点亮LED实验报告

430单片机点亮LED实验报告一.安装实验软件IAR二.编写点亮LED灯程序1.使P1.0口LED灯会不停的闪烁着,程序#include <msp430x14x.h>typedef unsigned int uint;typedef unsigned char uchar;/*延时函数*/void Delay_Ms(uint x){uint i;while(x--)for(i=0;i<250;i++);}/*主函数*/int main( void ){WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer to prevent time out resetP2DIR|=BIT0;//定义P1口为输出while(1)//死循环{P2OUT^=BIT0;//P1.0口输出取反Delay_Ms(600);//稍作延时}}下载进去看到了P1.0口LED灯会不停的闪烁着。

2.实验目的让两盏灯交换闪烁程序#include"msp430g2553.h"void main(void) {void Blink_LED();WDTCTL=WDTPW+WDTHOLD; //关闭看门狗P1DIR=BIT6;P2DIR=BIT0;while(1){Blink_LED();}}void Blink_LED(){_delay_cycles(1000000); //控制第二个LED P1OUT^=BIT6;_delay_cycles(1000000); //控制第一个LEDP2OUT^=BIT0;}我编写这段程序的现象是一个灯先亮,另一个后亮,一个灯先灭,后一个再灭。

就是两个灯的状态没有做到相反。

后来我在我程序上做了一些改动。

#include"msp430g2553.h"void main(void) {void Blink_LED();WDTCTL=WDTPW+WDTHOLD; //关闭看门狗P1DIR=BIT6;P2DIR=BIT0;P1OUT |= BIT6;P2OUT &= ~BIT6;while(1){Blink_LED();}}void Blink_LED(){_delay_cycles(1000000); //控制第二个LEDP1OUT^=BIT6;P2OUT^=BIT0;}3.LED灯逆循环点亮程序#include <reg52.h>typedef unsigned char uint8; typedef unsigned int uint16; sbit ENLED1=P1^4;sbit ENLED2=P1^3;sbit ADDR0 =P1^0;sbit ADDR1 =P1^1;sbit ADDR2 =P1^2;main(){uint16 i;uint8 j;ENLED1=0; ENLED2=1;ADDR0=0; ADDR1=1; ADDR2=1; while(1){P0=~(80>>j++);for(i=1;i<20000;i++);if(j==8)j=0;}}我写好程序了可是运行的时候结果不对),之后继续修改程序while循环都没有对LED的串口做任何处理,把“P0=~(80>>j++); ”改成“P0=~(0x80>>j++); ”#include <reg52.h>typedef unsigned char uint8;typedef unsigned int uint16;sbit ENLED1=P1^4;sbit ENLED2=P1^3;sbit ADDR0 =P1^0;sbit ADDR1 =P1^1;sbit ADDR2 =P1^2;main(){uint16 i;uint8 j;ENLED1=0; ENLED2=1;ADDR0=0; ADDR1=1; ADDR2=1;while(1)P0=~(0x80>>j++); //P0=~(80>>j++);for(i=1;i<20000;i++);if(j==8){j=0;}}四.实验总结由于之前学过一段时间51单片机,所以有些东西比较清楚,但430和51一有很大不同,虽然内部结构很像,但430的寄存器的设置很麻烦,比如P1 P2口,那可真是麻烦得很,430这个IO口设置了如很多的功能,并且单独抽出了好几个设置的寄存器。

MSP430第六讲实验报告

MSP430第六讲实验报告

一、实验内容:1. MSP430单片机的复位中断和低功耗模式2. 中断方式的按键控制实现3. Lab8 按键中断方式控制led灯的亮灭4. Lab9 动动手,P4.1中断方式控制P4.6的LED二、实验步骤:Lab8 按键中断方式控制led灯的亮灭设置端口4.0为输入上拉电阻方式获取按键信号,端口4.5为输出方式,按键按下时开启一次中断,中断开启后修改4.5输出对应的LED灯状态,从而实现按键中断方式控制led 灯的亮灭。

实现代码:#include <msp430.h>int main(void){WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerP4DIR |= BIT5; // Set P4.5 to output directionP4REN |= BIT0; // Enable P2.6 internal resistanceP4OUT |= BIT0; // Set P2.6 as pull‐Up resistanceP4IES |= BIT0; // P4.0 Hi/Lo edgeP4IFG &= ~BIT0; // P4.0 IFG clearedP4IE |= BIT0; // P P4.0 interrupt enabled__bis_SR_register(LPM4_bits + GIE); // Enter LPM4 w/interrupt__no_operation(); // For debugger }#pragma vector=PORT4_VECTOR__interrupt void Port_4(void){P4OUT ^= BIT5; // P4.5 = toggleP4IFG &= ~BIT0; // P4.0 IFG cleared }思考题:1、Lab8和Lab2的执行结果有何不同?为什么?答:Lab2的结果是按下按键则灯灭,松开按键灯亮;Lab8是按下按键灯亮\灭,抬起按键不改变状态。

430单片机实验报告

430单片机实验报告
430单片机实验报告
题 目430单片机实验报告
学院(部)信息工程学院
专 业
指导教师
学号姓名
同组成员
二〇一六年五月
实验一 LED流水灯实验
一、
LED流水灯实验
二、
1.掌握IAR 开发环境的使用方法;
2.练习IO端口寄存器的设置;练习时钟部分的配置
三、
1、制作相应的外围电路。要求用单片机的P1口连接8个发光二级管,当相应的IO口输出为高电平时发光二极管发光。
P2SEL=0X00;
key_val=0;
}
void Key_Scan(void) //扫描键盘获得键值
{
unsigned char row,col,temp1,temp2;
unsigned char key_table[]={0,1,2,3,4,5,6,7,8,
9,10,11,12,13,14,15};//设置键盘逻辑键值
P1DIR |= BIT0+BIT6; // P1.0 - P1.2 outputs
P1SEL|= 0x00;
P1OUT= BIT0;
CCR0=20000;
CCTL0 = CCIE; // CCR0 toggle, interrupt enabled
TACTL = TASSEL_2 + MC0 +TACLR; // SMCLK, Contmode, int enabled
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD

msp430-流水灯

msp430-流水灯

实验一流水灯实验一.实验内容与目的1.实验内容实现LED灯的顺次点亮。

2.实验目的对msp430有初步了解,学会msp430I/O口的使用方法,了解msp430的内部资源,学习尝试使用msp430的时钟、中断。

二.方法与结果用P2口对led的亮灭进行控制(对P2口赋值为0时led点亮,电路图如下),使用msp430比较器0和定时器产生1s的定时,当定时到1s时改变led的状态(流程图如下)。

三.实现程序#include<msp430.h>void main( ){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗中断P2DIR=0xff; //设定P2口为输出P1SEL=0x00; //设定P2口为普通I/O口CCTL0=CCIE; //开启比较器0中断CCR0=32768; //定时时间的选取,当计数器TAR计数到CCR0时,跳到中断TACTL=TASSEL_1+MC_1;//TACTL是计数器的控制寄存器,选择时钟系统,计数方式P2OUT=0xfe; //设定P2口初值_EINT(); //开启总中断LPM3; //进入低损耗模式}#pragma vector=TIMERA0_VECTOR__interrupt void timer() //中断程序{if(P2OUT==0x7f){P2OUT=0xfe;}else{P2OUT=P2OUT<<1;P2OUT=P2OUT|0x01; //位操作,改变led的状态}}四.流水灯实验总结①msp430的P1~P6口都可以用作I/O口,但msp430不能利用对I/O口直接赋值的方法控制I/O口的输出、接收I/O口的输入,而是利用相应的寄存器(PxOUT 和PxIN),对PxOUT赋值就完成了I/O口的输出,将PxIN的值赋给相应变量就完成了I/O口的输入。

另外msp430还有I/O口控制寄存器,PxDIR和PxSEL,PxDIR控制I/O口的输出输入,赋值为‘1’表示输出。

MSP430单片机基础实验手册

MSP430单片机基础实验手册

1、MSP430单片机基础实验1.1、IO口实验实验目的:学会MSP430单片机IO口的常规操作。

实验原理开发板上的3个LED灯和IO口的对应关系如下:POWER——P1.7 ISO14443A——P1.6 ISO15693——P1.4根据原理图分析,只需要将对应IO输出为低电平即可使其对应三极管导通,达到点亮对应LED的目的。

关键代码分析#include <msp430.h>volatile unsigned int i; // volatile to prevent optimizationint main(void){WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerP1DIR |= 0x80; // Set P1.7 to output directionfor (;;){P1OUT ^= 0x80; // Toggle P1.7 using exclusive-ORi = 50000; // Delaydo (i--);while (i != 0);}}对应工程详见:\感知RF2实验光盘2013\RFID技术实验\1-MSP430单片机基础实验\io实验结果POWER对应的LED灯闪烁。

作业1、对其他连个灯进行对应操作;2、流水灯显示编程控制。

1.2、定时器实验实验目的:学会MSP430单片机定时器常规配置及中断操作。

实验原理采用定时器TA溢出中断对LED灯进行取反操作。

关键代码分析#include <msp430.h>int main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTP1DIR |= 0x80; // P1.0 outputTACCTL0 = CCIE; // TACCR0 interrupt enabledTACCR0 = 50000;TACTL = TASSEL_2 + MC_2; // SMCLK, contmode__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer A0 interrupt service routine#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A (void){P1OUT ^= 0x80; // Toggle P1.7TACCR0 += 50000; // Add Offset to TACCR0}对应工程详见\感知RF2实验光盘2013\RFID技术实验\1-MSP430单片机基础实验\timer实验结果LED灯快速闪烁,改变TACCR0值,闪烁时间间隔改变。

MSP430单片机实验报告

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); }。

msp430f6638单片机实验程序

msp430f6638单片机实验程序
while(1)
{if((P4IN&BIT0)==0)
{__delay_cycles(160000);
if((P4IN&BIT0)==0)
{P1OUT |=BIT0;
P1OUT |=BIT6;
P1OUT &=~BIT7;
}
}
if((P4IN&BIT4)==0)
{__delay_cycles(160000);
while (SFRIFG1 & OFIFG) //等待XT1、XT2与DCO稳定
{
UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT2OFFG);
SFRIFG1 &= ~OFIFG;
}
UCSCTL5 = DIVA__1 + DIVS__1 + DIVM__1; //设定几个CLK的分频
P4REN |=BIT0+BIT1+BIT2+BIT3+BIT4; //上下拉电阻使能
P4OUT |=BIT0+BIT1+BIT2+BIT3+BIT4; //设置为上拉电阻
P4DIR |=BIT5+BIT6+BIT7; //LED管脚设置
P5DIR |=BIT7;
P8DIR |=BIT0;
P1DIR |= BIT0+BIT6+BIT7;
while (SFRIFG1 & OFIFG) //等待XT1、XT2与DCO稳定
{
UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT2OFFG);
SFRIFG1 &= ~OFIFG;

单片机MSP4305299实验程序

单片机MSP4305299实验程序

实验一熟悉CCS 编译环境实验目的:熟悉CCS 编译环境,学习CCS 中新建工程,编译调试程序,观察变量窗口,设置断点等实验内容与步骤:1. 在CCSv5 中新建工程,指定MSP430F5529 芯片;2. 在main.c 中键入以下程序段3.#include <msp430f5529.h>void main(void){volatile unsigned int i;WDTCTL = WDTPW+WDTHOLD; // Stop WDTP1DIR |= BIT0; // P1.0 set as outputwhile(1) // continuous loop{P1OUT ^= BIT0; // XOR P1.0for(i=50000;i>0;i--); // Delay}}4. 编译Build 工程;5. 下载调试Debug 工程;6. 在调试环境下选择全部运行,观察记录实验板上的现象;7. 选择单步运行,观察记录每条指令执行时的现象;8. 选择单步运行,观察寄存器 P1DIR,P1OUT 中数据的变化;9. 停止调试,返回到编辑环境,在程序中设置断点运行;实验二简单输入输出实验实验目的:学习MPS430 通用输入输出端口GPIO 的操作,掌握CCS 中建立工程编辑调试的过程。

实验内容与步骤:1. 端口输出点亮指定LED 或闪烁(软件延时),按键控制交替点亮或熄灭LED 编写程序指定端口输出方向,控制指示灯LED1 或LED2 或LED3 闪烁#include <msp430f5529.h>void main(void){volatile unsigned int i;WDTCTL = WDTPW+WDTHOLD; // Stop WDTP8DIR |= BIT2; // P8.2 set as outputwhile(1) // continuous loop{P8OUT ^= BIT2; // XOR P8.2for(i=50000;i>0;i--); // Delay}}2. 编写程序指定端口输出方向,控制指示灯LED4 或LED5 或LED6 交替点亮,如:LED4 亮,LED5和LED6 灭,然后LED5 亮,LED4 和LED6 灭,然后LED6 亮,LED4 和LED5 灭,按此顺序循#include<msp430f5529.h>void main(void){volatile unsigned int i;WDTCTL = WDTPW+WDTHOLD; // Stop WDTP1DIR |= BIT1; // P1.1 set as outputP1DIR |= BIT2; // P1.2 set as outputP1DIR |= BIT3; // P1.3 set as outputwhile(1) // continuous loop{P1OUT &= BIT1; // XOR P1.1P1OUT ^= BIT1; // OR P1.1for(i=50000;i>0;i--); // DelayP1OUT &= BIT2; // XOR P1.2P1OUT ^= BIT2; // OR P1.2for(i=50000;i>0;i--); // DelayP1OUT &= BIT3; // XOR P1.3P1OUT ^= BIT3; // OR P1.3for(i=50000;i>0;i--); // Delay}}333333333333333333333333333333333333#include <msp430f5529.h>void main(void){WDTCTL = WDTPW + WDTHOLD;P1DIR |= BIT1;P1OUT &= ~BIT1;P1REN |= BIT7;P1OUT |= BIT7;P1IES |= BIT7;P1IFG &= ~BIT7;P1IE |= BIT7;while(1){_EINT(); // P1.0 = toggle // Toggle between H-L and L-H transition triggersP1IE |= BIT7; // Enable port interrupt}}// Port 1 interrupt service routine#pragma vector=PORT1_VECTOR__interrupt void Port_1(void){P1OUT ^= BIT1;P1IFG &= ~BIT7; // Clear P1.4 IFG}3. 检测按键S1,按键按下时产生输入中断,设置变量NUM 记录按键次数。

单片机MSP4305299实验程序

单片机MSP4305299实验程序

实验一熟悉CCS 编译环境实验目的:熟悉 CCS 编译环境,学习CCS 中新建工程,编译调试程序,观察变量窗口,设置断点等实验内容与步骤:1. 在 CCSv5 中新建工程,指定MSP430F5529 芯片;2. 在中键入以下程序段3.#include <>void main(void){volatile unsigned int i;WDTCTL = WDTPW+WDTHOLD; 编译 Build 工程;5. 下载调试 Debug 工程;6. 在调试环境下选择全部运行,观察记录实验板上的现象;7. 选择单步运行,观察记录每条指令执行时的现象;8. 选择单步运行,观察寄存器 P1DIR,P1OUT 中数据的变化;9. 停止调试,返回到编辑环境,在程序中设置断点运行;实验二简单输入输出实验实验目的:学习MPS430 通用输入输出端口GPIO 的操作,掌握CCS 中建立工程编辑调试的过程。

实验内容与步骤:1. 端口输出点亮指定 LED 或闪烁(软件延时),按键控制交替点亮或熄灭LED 编写程序指定端口输出方向,控制指示灯LED1 或LED2 或LED3 闪烁#include <>void main(void){volatile unsigned int i;WDTCTL = WDTPW+WDTHOLD; 编写程序指定端口输出方向,控制指示灯LED4 或LED5 或LED6 交替点亮,如:LED4 亮,LED5和LED6 灭,然后LED5 亮,LED4 和LED6 灭,然后LED6 亮,LED4 和LED5 灭,按此顺序循#include<>void main(void){volatile unsigned int i;WDTCTL = WDTPW+WDTHOLD; 检测按键 S1,按键按下时产生输入中断,设置变量NUM 记录按键次数。

单步调试,观察变量NUM 数值的变化。

430基础代码程序

430基础代码程序

MSP430开发板样例一、 LED流水灯实验 (2)二、数码管显示实验 (2)三、 4*4矩阵键盘扫描实验 (2)四、定时器A中断实验 (3)五、蜂鸣器报警实验 (4)六、 DS18B20温度测量实验 (4)七、DS1302实时时钟实验 (5)八、RS232串口通信实验 (8)九、RS485通信实验 (9)十、I2C存储器AT24C02读写实验 (10)十一、PS/2键盘扫描实验 (11)十二、 TLV5620正弦波产生实验 (12)十三、ADC12电压测量实验 (13)十三、高频高压电源的控制实验 (14)十四、 ADC12温度测量实验 (19)十五、1602字符型液晶显示实验 (20)十六、128*64图形液晶显示实验 (20)十七、步进电机控制实验 24 十八、高频高压电源的控制实验 (25)一、 LED流水灯实验#include "msp430x14x.h"#define uint unsigned int#define uchar unsigned charuchar LedData=0x80;//延时子程序void DelayMs(uint ms){while(ms--){for(uint i=0;i<800;i++);}}//时钟初始化函数void InitClock(void){BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频最高的标称频率DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率do{IFG1&=~OFIFG;//清除振荡器失效标志for(uint i=255;i>0;i--);}while(IFG1&OFIFG);//判断XT2是否起振BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频}void main(){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗InitClock();_DINT();//关闭中断P2SEL=0x00;//P2口所有引脚设置为一般的IO口P2DIR=0xFF;//P2口所有引脚设置为输出方向while(1){LedData>>=1;//右移一位if(LedData==0) LedData=0x80;P2OUT=LedData;//P2口输出数据DelayMs(400);}}二、数码管显示实验功能:数码管显示12345678#include "msp430x14x.h"#define uchar unsigned char#define uint unsigned int//共阳数码管编码表uchar Code[18]={0xC0,0xF9,0xA4,0xB0,//0,1,2,30x99,0x92,0x82,0xF8,//4,5,6,70x80,0x90,0x88,0x83,//8,9,A,b0xC6,0xA1,0x86,0x8E,//C,d,E,F0xBF,0xFF};//-,全灭uchar Bit[8]={1,2,3,4,5,6,7,8}; //数码管各位显示的数字uchar BitCode=0x80; //数码管位码初值//时钟初始化函数void InitClock(void){BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频最高的标称频率DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率do{IFG1&=~OFIFG;//清除振荡器失效标志for(uint i=255;i>0;i--); }while(IFG1&OFIFG);//判断XT2是否起振BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频}//端口初始化函数void InitPort(void){P2SEL=0x00;//P2口所有引脚设置为一般的IO口P4SEL=0x00;//P4口所有引脚设置为一般的IO口P2DIR=0xFF;//P2口所有引脚设置为输出方向P4DIR=0xFF;//P4口所有引脚设置为输出方向P2OUT=0x00;//P2口先输出低电平P4OUT=0xFF;//P4口先输出低电平P5SEL&=~BIT7;//P5.7设置为一般的IO口P5DIR|=BIT7;//P5.7设置为输出方向P5OUT&=~BIT7;//P5.7输出低电平来使能74HC573来驱动数码管}//延时子程序void DelayMs(uint ms){while(ms--){for(uint i=0;i<800;i++);}}//数码管扫描显示程序void Display(void){for(uchar i=0;i<8;i++){P4OUT=BitCode; //输出位码P2OUT=Code[Bit[i]]; //输出段码BitCode>>=1;//位码右移一位if(BitCode==0) BitCode=0x80;DelayMs(1); //延时1msP2OUT=0xFF;}}void main(){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗InitClock();InitPort();_DINT();//关闭中断while(1){Display();}}三、 4*4矩阵键盘扫描实验功能:在数码管上显示输入的值#include "msp430x14x.h"#define uint unsigned int#define uchar unsigned charuchar KeyValue=0xFF;//共阳数码管编码表uchar Code[18]={0xC0,0xF9,0xA4,0xB0,//0,1,2,30x99,0x92,0x82,0xF8,//4,5,6,70x80,0x90,0x88,0x83,//8,9,A,b0xC6,0xA1,0x86,0x8E,//C,d,E,F0xBF,0xFF};//-,全灭uchar Bit[8]={16,16,16,16,16,16,16,16}; //数码管各位要显示的数字//键值编码表uchar KeyCode[16]={0x77,0x7B,0x7D,0x7E,//0,1,2,30xB7,0xBB,0xBD,0xBE,//4,5,6,70xD7,0xDB,0xDD,0xDE,//8,9,A,b0xE7,0xEB,0xED,0xEE};//C,d,E,F uchar BitCode=0x80; //数码管位码初值//时钟初始化函数void InitClock(void){BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频最高的标称频率DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率do{IFG1&=~OFIFG;//清除振荡器失效标志for(uint i=255;i>0;i--);}while(IFG1&OFIFG);//判断XT2是否起振BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频}//端口初始化函数void InitPort(void){P1SEL=0x00;//P1口所有引脚设置为一般的IO口P1DIR=0x0F;//P1.0 P1.1 P1.2 P1.3设置为输出方向P1OUT=0x00;//P1口先输出低电平P1IE=0xF0;//P1.4 P1.5 P1.6 P1.7中断允许P1IES=0xF0;//P1.4 P1.5 P1.6 P1.7下降沿触发中断P2SEL=0x00;//P2口所有引脚设置为一般的IO口P4SEL=0x00;//P4口所有引脚设置为一般的IO口P2DIR=0xFF;//P2口所有引脚设置为输出方向P4DIR=0xFF;//P4口所有引脚设置为输出方向P2OUT=0x00;//P2口先输出低电平P4OUT=0xFF;//P4口先输出低电平P5SEL&=~BIT7;//P5.7设置为一般的IO口P5DIR|=BIT7;//P5.7设置为输出方向P5OUT&=~BIT7;//P5.7输出低电平来使能74HC573来驱动数码管}//延时子函数void Delay(void){for(uchar i=255;i>0;i--);}//按键分析程序void KeyProcess(void){uchar OutData=0x07;for(uchar i=0;i<4;i++){//扫描4列OutData|=0xF0;P1OUT=OutData;if(P1IN!=OutData) KeyValue=P1IN;OutData>>=1;}P1OUT=0x00;//恢复原来的值}//端口1中断处理程序#pragma vector=PORT1_VECTOR__interrupt void Port1INT(void){Delay();KeyProcess();P1IFG=0x00;//清除中断标志位}//延时子程序void DelayMs(uint ms){while(ms--){for(uint i=0;i<800;i++);}}//数码管扫描显示程序void Display(void){for(uchar i=0;i<16;i++){//查找键值对应的数字if(KeyValue==KeyCode[i]){Bit[0]=Bit[1]=Bit[2]=Bit[3]=Bit[4]=Bit[5]=Bit[6]=Bit[7] =i;//显示键值对应的数字break;} }for(uchar i=0;i<8;i++){P4OUT=BitCode; //输出位码P2OUT=Code[Bit[i]]; //输出段码BitCode>>=1;//位码右移一位if(BitCode==0) BitCode=0x80;DelayMs(1); //延时1msP2OUT=0xFF;}}void main(){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗InitClock();InitPort();_EINT();//打开中断while(1){Display();}}四、定时器A中断实验功能:定时器A中断,LED右移1位#include "msp430x14x.h"#define uint unsigned int#define uchar unsigned charuchar LedData=0x80;uchar num=10;//时钟初始化函数void InitClock(void){BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频最高的标称频率DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率do{IFG1&=~OFIFG;//清除振荡器失效标志for(uint i=255;i>0;i--);}while(IFG1&OFIFG);//判断XT2是否起振BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频}//定时器A初始化void InitTimerA(void){TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//选择1/8SMCLK 增计数清除TARCCTL0=CCIE;//CCR0中断允许比较模式CCR0=10000;//时间间隔10ms}//定时器A中断#pragma vector=TIMERA0_VECTOR__interrupt void TimerAINT(void){num--;if(num==0){LedData>>=1;//右移一位if(LedData==0) LedData=0x80;P2OUT=LedData;//P2口输出数据num=10;}}void main(){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗InitClock();InitTimerA();_EINT();//打开中断P2SEL=0x00;//P2口所有引脚设置为一般的IO口P2DIR=0xFF;//P2口所有引脚设置为输出方向while(1);}五、蜂鸣器报警实验#include "msp430x14x.h"#define uint unsigned int#define uchar unsigned char#define SPK_HIGH P5OUT|=BIT6#define SPK_LOW P5OUT&=~BIT6uchar Flag=0;//时钟初始化函数void InitClock(void){BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频最高的标称频率DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率do{IFG1&=~OFIFG;//清除振荡器失效标志for(uint i=255;i>0;i--);}while(IFG1&OFIFG);//判断XT2是否起振BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频}//ms级延时子程序void DelayMs(uint ms){while(ms--){for(uint i=0;i<800;i++);}}void main(){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗InitClock();_EINT();//关闭中断P5DIR|=BIT6;//P5.6引脚设置为输出方向while(1){SPK_HIGH;DelayMs(150);SPK_LOW;DelayMs(150);};}六、 DS18B20温度测量实验功能:在数码管上显示当前DS18B20测到的温度小数部分为4位,温度为负时,最高位显示"-" 测量范围:-55℃~ +125℃#include "msp430x14x.h"#define uint unsigned int#define uchar unsigned char#define DQ_OUT P3DIR|=BIT0 //P3.0输出#define DQ_IN P3DIR&=~BIT0 //P3.0输入#define DQ_LOW P3OUT&=~BIT0 //P3.0低电平#define DQ_HIGH P3OUT|=BIT0 //P3.0高电平#define DQ_DATA P3IN&BIT0//共阳数码管编码表uchar Code[18]={0xC0,0xF9,0xA4,0xB0,//0,1,2,30x99,0x92,0x82,0xF8,//4,5,6,70x80,0x90,0x88,0x83,//8,9,A,b0xC6,0xA1,0x86,0x8E,//C,d,E,F0xBF,0xFF};//-,全灭uchar Bit[8]={17,0,0,0,0,0,0,0}; //数码管各位显示的数字uchar BitCode=0x80; //数码管位码初值uchar MSB; //温度高字节uchar LSB; //温度低字节int t1=0; //温度整数部分数值uint t2=0; //温度小数部分数值uchar flag; //负温度标志//时钟初始化函数void InitClock(void){BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频最高的标称频率DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率do{IFG1&=~OFIFG;//清除振荡器失效标志for(uint i=255;i>0;i--);}while(IFG1&OFIFG);//判断XT2是否起振BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频}//端口初始化函数void InitPort(void){P2SEL=0x00;//P2口所有引脚设置为一般的IO口P4SEL=0x00;//P4口所有引脚设置为一般的IO口P2DIR=0xFF;//P2口所有引脚设置为输出方向P4DIR=0xFF;//P4口所有引脚设置为输出方向P2OUT=0x00;//P2口先输出低电平P4OUT=0xFF;//P4口先输出低电平P5SEL&=~BIT7;//P5.7设置为一般的IO口P5DIR|=BIT7;//P5.7设置为输出方向P5OUT&=~BIT7;//P5.7输出低电平来使能74HC573来驱动数码管}//ms级延时子程序void DelayMs(uint ms){while(ms--){for(uint i=0;i<800;i++);}}//数码管扫描显示程序void Display(void){for(uchar i=0;i<8;i++){P4OUT=BitCode; //输出位码if(i==3){ //输出段码,如果第三位显示小数点P2OUT=Code[Bit[i]]&0x7F;}else{P2OUT=Code[Bit[i]];}BitCode>>=1;//位码右移一位if(BitCode==0) BitCode=0x80;DelayMs(1); //延时1msP2OUT=0xFF;}}//10us级延时子程序void Delayus(uint us){while(us--){for(uint i=0;i<8;i++);}}//初始化DS18B20void DS18B20Init(void){DQ_OUT;//设置为输出方向DQ_LOW;//拉低总线Delayus(50);DQ_HIGH;//释放总线Delayus(6);DQ_IN;//设置为输入方向while(DQ_DATA);//等待应答信号while(~DQ_DATA);//等待释放总线}//读一个字节uchar ReadByte(void){uchar i;uchar ReadData=0;for(i=0;i<8;i++){DQ_OUT;DQ_LOW;ReadData>>=1;DQ_HIGH;Delayus(1);DQ_IN;if(DQ_DATA) ReadData|=0x80;Delayus(6);}return ReadData;}//写一个字节WriteByte(uchar WriteData){uchar i;uchar tmpData;for(i=0;i<8;i++){tmpData=WriteData&0x01;WriteData>>=1;DQ_OUT;DQ_LOW;if(tmpData){DQ_HIGH;}else{DQ_LOW;}Delayus(5);DQ_HIGH;}}//温度计算程序void GetT(){if((MSB&0xF0)>0){ //判断是否为负温度flag=1;}else{flag=0;}if(flag){ //如果为负温度取反加1MSB=~MSB;LSB=~LSB+1;}t1=MSB<<4; //得到温度整数部分t1|=(LSB>>4);t2=(LSB&0x0F)*0.0625*10000; //得到温度小数部分并扩大10000倍//计算各位数码管要显示的数值if(flag){Bit[1]=16; //如果为负温度则显示"-"}else{Bit[1]=t1/100;}Bit[2]=t1%100/10;Bit[3]=t1%10;Bit[4]=t2/1000;Bit[5]=t2%1000/100;Bit[6]=t2%100/10;Bit[7]=t2%10;}void main(){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗InitClock(); InitPort();_DINT();//关闭中断while(1){DS18B20Init();WriteByte(0xCC); //跳过ROM配置WriteByte(0x44); //启动温度转换DS18B20Init();WriteByte(0xCC);WriteByte(0xBE); //读温度寄存器LSB=ReadByte(); //读温度数据低字节MSB=ReadByte(); //读温度数据高字节GetT(); //计算温度Display();}}七、DS1302实时时钟实验功能:在数码管上显示从DS1302读取的时间日期星期数据时间格式:时-分-秒日期格式:年月日-星期 C键:选择显示时间还是日期 D键:循环选择所要编辑的位 E 键:编辑的位的数值加1 F键:编辑的位的数值减1#include "msp430x14x.h"#define uint unsigned int#define uchar unsigned char#define SCLK_HIGH P3OUT|=BIT3#define SCLK_LOW P3OUT&=~BIT3#define RST_HIGH P3OUT|=BIT1#define RST_LOW P3OUT&=~BIT1#define IO_HIGH P3OUT|=BIT2#define IO_LOW P3OUT&=~BIT2#define IO_OUT P3DIR|=BIT2#define IO_IN P3DIR&=~BIT2#define IO_DATA P3IN&BIT2uchar num=100;uchar TimeFlag=1; //显示日期时间标志uchar EditFlag=0; //闪烁显示标志uchar KeyValue=0xFF;uchar DNum=0; //D键按的次数//共阳数码管编码表const uchar Code[18]={0xC0,0xF9,0xA4,0xB0,//0,1,2,30x99,0x92,0x82,0xF8,//4,5,6,70x80,0x90,0x88,0x83,//8,9,A,b0xC6,0xA1,0x86,0x8E,//C,d,E,F0xBF,0xFF};//-,全灭//键值编码表const uchar KeyCode[16]={0x77,0x7B,0x7D,0x7E,//0,1,2,3 0xB7,0xBB,0xBD,0xBE,//4,5,6,70xD7,0xDB,0xDD,0xDE,//8,9,A,b0xE7,0xEB,0xED,0xEE};//C,d,E,F uchar DS1302[8]={0,0,0,0,0,0,0,0}; //秒,分,时,日,月,星期,年uchar DateBit[8]={0,0,0,0,0,0,16,0}; //日期各位显示的数值uchar TimeBit[8]={0,0,16,0,0,16,0,0}; //时间各位显示的数值uchar BitCode=0x80; //数码管位码初值//时钟初始化函数void InitClock(void){BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频最高的标称频率DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率do{IFG1&=~OFIFG;//清除振荡器失效标志for(uint i=255;i>0;i--);}while(IFG1&OFIFG);//判断XT2是否起振BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频}//端口初始化函数void InitPort(void){P1SEL=0x00;//P1口所有引脚设置为一般的IO口P1DIR=0x0F;//P1.0 P1.1 P1.2 P1.3设置为输出方向P1OUT=0x00;//P1口先输出低电平P1IE=0xF0;//P1.4 P1.5 P1.6 P1.7中断允许P1IES=0xF0;//P1.4 P1.5 P1.6 P1.7下降沿触发中断P3SEL=0x00;//P3口所有引脚设置为一般的IO口P3DIR=0x0E;//P3.1 P3.2 P3.3设置为输出方向P2SEL=0x00;//P2口所有引脚设置为一般的IO口P4SEL=0x00;//P4口所有引脚设置为一般的IO口P2DIR=0xFF;//P2口所有引脚设置为输出方向P4DIR=0xFF;//P4口所有引脚设置为输出方向P2OUT=0x00;//P2口先输出低电平P4OUT=0xFF;//P4口先输出低电平P5SEL&=~BIT7;//P5.7设置为一般的IO口P5DIR|=BIT7;//P5.7设置为输出方向P5OUT&=~BIT7;//P5.7输出低电平来使能74HC573来驱动数码管}//ms级延时子程序void DelayMs(uint ms){while(ms--){for(uint i=0;i<800;i++);}}//数码管扫描显示程序void Display(void){for(uchar i=0;i<8;i++){if(EditFlag==1&&DNum>0){ //判断是否闪烁if(TimeFlag==0){ //判断日期还是时间闪烁switch(DNum){ //根据D按的次数判断日期那一位闪烁case 1:P4OUT=BitCode&0x3F;break;case 2:P4OUT=BitCode&0xCF;break;case 3:P4OUT=BitCode&0xF3;break;case 4:P4OUT=BitCode&0xFE;break;}}else{switch(DNum){ //根据D按的次数判断时间那一位闪烁case 1:P4OUT=BitCode&0x3F;break;case 2:P4OUT=BitCode&0xE7;break;case 3:P4OUT=BitCode&0xFC;break;}}}else{P4OUT=BitCode; //输出位码}if(TimeFlag==1) P2OUT=Code[TimeBit[i]];//判断显示时间还是日期else P2OUT=Code[DateBit[i]];BitCode>>=1;//位码右移一位if(BitCode==0) BitCode=0x80;DelayMs(1); //延时1msP2OUT=0xFF;}}//10us级延时子程序void Delayus(uint us){while(us--){for(uint i=0;i<8;i++); }}//按键分析程序void KeyProcess(void){uchar OutData=0x07;for(uchar i=0;i<4;i++){//扫描4列OutData|=0xF0;P1OUT=OutData;if(P1IN!=OutData) KeyValue=P1IN;OutData>>=1;}P1OUT=0x00;//恢复原来的值}//端口1中断处理程序#pragma vector=PORT1_VECTOR__interrupt void Port1INT(void){for(uint i=1000;i>0;i--);KeyProcess();P1IFG=0x00;//清除中断标志位}//向DS1302写一字节数据,address为命令字节void WriteByte(uchar Command,uchar WriteData){ uchar j,k=1;RST_LOW;SCLK_LOW;RST_HIGH;for(j=0;j<=7;j++){if(Command&k) IO_HIGH;else IO_LOW;SCLK_HIGH;k<<=1;SCLK_LOW;}k=1;for(j=0;j<=7;j++){if(WriteData&k) IO_HIGH;else IO_LOW;SCLK_HIGH;k<<=1;SCLK_LOW;}RST_LOW;}//读取DS1302一字节数据,address为命令字节uchar ReadByte(uchar Command){uchar i,k=1;RST_LOW;SCLK_LOW;RST_HIGH;for(i=0;i<8;i++){if(Command&k) IO_HIGH;else IO_LOW;SCLK_HIGH;k<<=1;if(i!=7) SCLK_LOW;}k=0;for(i=0;i<8;i++){k>>=1;SCLK_LOW;IO_IN;if(IO_DATA) k|=0x80;IO_OUT;SCLK_HIGH;}RST_LOW;return(k);}//读取DS1302的秒,分,时,日,月,星期,年void ReadDS1302(){uchar i;for(i=0;i<=6;i++) DS1302[i]=ReadByte(0x80+2*i+1);//计算时间日期的各位要显示的数据TimeBit[7]=DS1302[0]&0x0F;TimeBit[6]=DS1302[0]&0x70;TimeBit[6]>>=4;TimeBit[4]=DS1302[1]&0x0F;TimeBit[3]=DS1302[1]&0x70;TimeBit[3]>>=4;TimeBit[1]=DS1302[2]&0x0F;TimeBit[0]=DS1302[2]&0x30;TimeBit[0]>>=4;DateBit[5]=DS1302[3]&0x0F;DateBit[4]=DS1302[3]&0x30;DateBit[4]>>=4;DateBit[3]=DS1302[4]&0x0F;DateBit[2]=DS1302[4]&0x10;DateBit[2]>>=4;DateBit[7]=DS1302[5]&0x07;DateBit[1]=DS1302[6]&0x0F;DateBit[0]=DS1302[6]&0xF0;DateBit[0]>>=4;}//定时器A初始化void InitTimerA(void){TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//选择1/8SMCLK 增计数清除TARCCTL0=CCIE;//CCR0中断允许比较模式CCR0=10000;//时间间隔10ms}//定时器A中断#pragma vector=TIMERA0_VECTOR__interrupt void TimerAINT(void){num--;if(num==0){EditFlag=!EditFlag; //更新闪烁标志num=50;}}//时间编辑程序void TimeEdit(uchar flag){uchar Data,NowData;if(flag){ //判断加1还是减1switch(DNum){ //判断编辑时间的哪一位case 1:{Data=ReadByte(0x85); //读取小时数据NowData=Data+1;if((NowData&0x0F)>9) NowData=NowData+6;if(NowData>=0x24) NowData=0;WriteByte(0x84,NowData); //写入小时数据break;}case 2:{Data=ReadByte(0x83); //读取分数据NowData=Data+1;if((NowData&0x0F)>9) NowData=NowData+6;if(NowData>=0x60) NowData=0;WriteByte(0x82,NowData); //写入分数据break;}case 3:{Data=ReadByte(0x81); //读取秒数据NowData=Data+1;if((NowData&0x0F)>9) NowData=NowData+6;if((NowData&0x7F)>=0x60) NowData=0;WriteByte(0x80,(NowData&0x7F)|(Data&0x80)); //写入秒数据break;}}}else{switch(DNum){ //判断编辑时间的哪一位case 1:{Data=ReadByte(0x85); //读取小时数据if(Data==0){NowData=0x23;}else{NowData=Data-1;if((NowData&0x0F)>9) NowData=NowData-6;}WriteByte(0x84,NowData); //写入小时数据break;}case 2:{Data=ReadByte(0x83); //读取分数据if(Data==0){NowData=0x59;}else{NowData=Data-1;if((NowData&0x0F)>9) NowData=NowData-6;}WriteByte(0x82,NowData); //写入分数据break;}case 3:{Data=ReadByte(0x81); //读取秒数据if(Data==0){NowData=0x59;}else{NowData=Data-1;if((NowData&0x0F)>9) NowData=NowData-6;}WriteByte(0x80,(NowData&0x7F)|(Data&0x80)); //写入秒数据break;}}}}//日期编辑程序void DateEdit(uchar flag){uchar Data,NowData;if(flag){ //判断加1还是减1switch(DNum){ //判断编辑日期的哪一位case 1:{ //年加1Data=ReadByte(0x8d); //读取年数据NowData=Data+1; //年加1if((NowData&0x0F)>9) NowData=NowData+6; //BCD调整if(NowData>=0xA0) NowData=0; //年>=100时,年=0 WriteByte(0x8c,NowData); //年写入DS1302break;}case 2:{Data=ReadByte(0x89); //读取月数据NowData=Data+1; //月加1if((NowData&0x0F)>9) NowData=NowData+6; //BCD调整if(NowData>=0x13) NowData=1; //月>=13,月=1WriteByte(0x88,NowData); //月写入DS1302break;}case 3:{Data=ReadByte(0x87); //读取日数据NowData=Data+1; //日加1if((NowData&0x0F)>9) NowData=NowData+6; //BCD调整if(NowData>=0x32) NowData=1; //日>=32,日=1 WriteByte(0x86,NowData); //日写入DS1302break;}case 4:{Data=ReadByte(0x8B); //读取星期数据NowData=Data+1; //星期加1if(NowData>=8) NowData=1; //星期>=8,星期=1 WriteByte(0x8A,NowData); //星期写入DS1302 break;}}}else{switch(DNum){case 1:{ //年减1Data=ReadByte(0x8d); //读取年数据if(Data==0){NowData=0x99; //如果年=0,减1则为99}else{NowData=Data-1; //年减1if((NowData&0x0F)>9) NowData=NowData-6; //BCD调整}WriteByte(0x8c,NowData); //年写入DS1302break;}case 2:{Data=ReadByte(0x89); //读取月数据NowData=Data-1; //月减1if((NowData&0x0F)>9) NowData=NowData-6; //BCD调整if(NowData==0) NowData=0x12; //月=0,月=12 WriteByte(0x88,NowData); //月写入DS1302break;}case 3:{Data=ReadByte(0x87); //读取日数据NowData=Data-1; //日减1if((NowData&0x0F)>9) NowData=NowData-6; //BCD调整if(NowData==0) NowData=0x31; //日=0,日=31 WriteByte(0x86,NowData); //日写入DS1302break;}case 4:{Data=ReadByte(0x8B); //读取星期数据NowData=Data-1; //星期减1if(NowData==0) NowData=7; //星期=0,星期=7 WriteByte(0x8A,NowData); //星期写入DS1302 break;}}}}//按钮功能函数void KeyFun(void){switch(KeyValue){case 0xE7:{//C键按下切换显示日期还是时间TimeFlag=!TimeFlag;DNum=0;KeyValue=0xFF;break;} case 0xEB:{ //D键按下,DNum加1DNum++;if((TimeFlag==0)&&(DNum>=5)) DNum=0; //如果当前编辑的是日期并且DNum>=5,则编辑完毕,返回正常状态if((TimeFlag==1)&&(DNum>=4)) DNum=0; //如果当前编辑的是时间并且DNum>=4,则编辑完毕,返回正常状态KeyValue=0xFF;break;}case 0xED:{ //E键按下,所选位加1if(TimeFlag==1) TimeEdit(1); //判断编辑日期还是时间 else DateEdit(1);KeyValue=0xFF;break;}case 0xEE:{ //F键按下,所选位减1if(TimeFlag==1) TimeEdit(0); //判断编辑日期还是时间 else DateEdit(0);KeyValue=0xFF;break;}}}void main(){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗InitClock();InitPort();InitTimerA();_EINT();//打开中断WriteByte(0x80,ReadByte(0x81)&0x7F); //启动DS1302while(1){KeyFun();ReadDS1302();Display();}}八、RS232串口通信实验PC串口发送数据给单片机,在数码管上显示接收到的数据并且给PC返回接收到的数据注:串口收发请使用串口调试软件调试,本程序使用串口1,请将串口线插到COM1连接至PC #include "msp430x14x.h"#define uint unsigned int#define uchar unsigned char//共阳数码管编码表uchar Code[18]={0xC0,0xF9,0xA4,0xB0,//0,1,2,30x99,0x92,0x82,0xF8,//4,5,6,70x80,0x90,0x88,0x83,//8,9,A,b0xC6,0xA1,0x86,0x8E,//C,d,E,F0xBF,0xFF};//-,全灭uchar Bit[8]={17,17,17,17,17,17,16,16}; //数码管各位要显示的数字uchar BitCode=0x80; //数码管位码初值uchar Buf=0; //接收到的数据//时钟初始化函数void InitClock(void){BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频最高的标称频率DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率do{IFG1&=~OFIFG;//清除振荡器失效标志for(uint i=255;i>0;i--);}while(IFG1&OFIFG);//判断XT2是否起振BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频}//端口初始化函数void InitPort(void){P2SEL=0x00;//P2口所有引脚设置为一般的IO口P4SEL=0x00;//P4口所有引脚设置为一般的IO口P2DIR=0xFF;//P2口所有引脚设置为输出方向P4DIR=0xFF;//P4口所有引脚设置为输出方向P2OUT=0x00;//P2口先输出低电平P4OUT=0xFF;//P4口先输出低电平P5SEL&=~BIT7;//P5.7设置为一般的IO口P5DIR|=BIT7;//P5.7设置为输出方向P5OUT&=~BIT7;//P5.7输出低电平来使能74HC573来驱动数码管P3SEL=0xC0;//P3.6 P3.7为TXD RXDP3DIR=0x40;//P3.6为输出方向}//UART1初始化函数void InitUART1(void){U1CTL|=CHAR;//数据为8位U1TCTL=SSEL0;//波特率发生器选择ACLKUBR01=0x03;UBR11=0x00;UMCTL1=0x4A;//设置波特率为9600bpsME2=UTXE1+URXE1;//使能UART1的TXD RXDU1CTL&=~SWRST;//初始化UART1状态机IE2=URXIE1;//使能UART1的接收中断}//串口1接收中断处理程序#pragma vector=UART1RX_VECTOR__interrupt void UART1RXINT(void){Buf=RXBUF1;Bit[6]=Buf/16;Bit[7]=Buf%16;TXBUF1=Buf;//发送接收到的数据}//延时子函数void Delay(void){for(uchar i=255;i>0;i--);}//延时子程序void DelayMs(uint ms){while(ms--){for(uint i=0;i<800;i++);}}//数码管扫描显示程序void Display(void){for(uchar i=0;i<8;i++){P4OUT=BitCode; //输出位码P2OUT=Code[Bit[i]]; //输出段码BitCode>>=1;//位码右移一位if(BitCode==0) BitCode=0x80;DelayMs(1); //延时1msP2OUT=0xFF;}}void main(){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗InitClock();InitPort();InitUART1();_EINT();//打开中断while(1){Display();} }九、RS485通信实验注:跳线232/485连接左边的两端,以使MAX3490连接UART0跳线RS485将A与Y连接 B与Z连接,以使MAX3490接收自己发送的数据#include "msp430x14x.h"#define uint unsigned int#define uchar unsigned char//共阳数码管编码表uchar Code[18]={0xC0,0xF9,0xA4,0xB0,//0,1,2,30x99,0x92,0x82,0xF8,//4,5,6,70x80,0x90,0x88,0x83,//8,9,A,b0xC6,0xA1,0x86,0x8E,//C,d,E,F0xBF,0xFF};//-,全灭uchar Bit[8]={17,17,17,17,17,17,16,16}; //数码管各位要显示的数字uchar BitCode=0x80; //数码管位码初值uchar Buf=0; //接收到的数据//时钟初始化函数void InitClock(void){BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频最高的标称频率DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率do{IFG1&=~OFIFG;//清除振荡器失效标志for(uint i=255;i>0;i--);}while(IFG1&OFIFG);//判断XT2是否起振BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频}//端口初始化函数void InitPort(void){P2SEL=0x00;//P2口所有引脚设置为一般的IO口P4SEL=0x00;//P4口所有引脚设置为一般的IO口P2DIR=0xFF;//P2口所有引脚设置为输出方向P4DIR=0xFF;//P4口所有引脚设置为输出方向P2OUT=0x00;//P2口先输出低电平P4OUT=0xFF;//P4口先输出低电平P5SEL&=~BIT7;//P5.7设置为一般的IO口P5DIR|=BIT7;//P5.7设置为输出方向P5OUT&=~BIT7;//P5.7输出低电平来使能74HC573来驱动数码管P3SEL=0xC0;//P3.6 P3.7为TXD RXDP3DIR=0x40;//P3.6为输出方向}//UART0初始化函数void InitUART0(void){U1CTL|=CHAR;//数据为8位U1TCTL=SSEL0;//波特率发生器选择ACLKUBR01=0x03;UBR11=0x00;UMCTL1=0x4A;//设置波特率为9600bpsME2=UTXE1+URXE1;//使能UART1的TXD RXDU1CTL&=~SWRST;//初始化UART1状态机IE2=URXIE1;//使能UART1的接收中断}//串口1接收中断处理程序#pragma vector=UART1RX_VECTOR__interrupt void UART1RXINT(void){Buf=RXBUF1;//读取MAX3490接收回来的数据并显示Bit[6]=Buf/16;Bit[7]=Buf%16;}//延时子程序void DelayMs(uint ms){while(ms--){for(uint i=0;i<800;i++);}}//数码管扫描显示程序void Display(void){for(uchar i=0;i<8;i++){P4OUT=BitCode; //输出位码P2OUT=Code[Bit[i]]; //输出段码BitCode>>=1;//位码右移一位if(BitCode==0) BitCode=0x80;DelayMs(1); //延时1msP2OUT=0xFF;}}void main(){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗InitClock();InitPort();InitUART0();_EINT();//打开中断while(1){TXBUF1=0xFF;//用MAX3490发送数据0xFFDelayMs(1);Display();}}十、I2C存储器AT24C02读写实验功能:在AT24C02某一地址写入一个数据再读出显示在P2口#include "msp430x14x.h"#define uint unsigned int#define uchar unsigned char#define SDA_OUT P5DIR|=BIT4#define SDA_IN P5DIR&=~BIT4#define SDA_HIGH P5OUT|=BIT4#define SDA_LOW P5OUT&=~BIT4#define SDA_DATA P5IN&BIT4#define SCL_OUT P5DIR|=BIT5#define SCL_HIGH P5OUT|=BIT5#define SCL_LOW P5OUT&=~BIT5//时钟初始化函数void InitClock(void){BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频最高的标称频率DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率do{IFG1&=~OFIFG;//清除振荡器失效标志for(uint i=255;i>0;i--);}while(IFG1&OFIFG);//判断XT2是否起振BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频}//10us级延时子程序void Delayus(uint us){while(us--){for(uint i=0;i<5;i++);}}//I2C起始条件void I2cStart(){ SDA_OUT;SDA_HIGH;Delayus(1);SCL_OUT;SCL_HIGH;Delayus(1);SDA_LOW;Delayus(1);SCL_LOW;//钳住I2C总线,准备发送或接收数据}//I2C停止条件void I2cStop(){SCL_OUT;SCL_LOW;Delayus(1);SDA_OUT;SDA_LOW;Delayus(1);SCL_HIGH;Delayus(1);SDA_HIGH;Delayus(1);}//发ACK应答void I2cAck(){SDA_OUT;SDA_LOW;Delayus(1);SCL_OUT;SCL_HIGH;Delayus(1);SCL_LOW;Delayus(1);}//发NAK应答void I2cNAk(){SDA_OUT;SDA_HIGH;Delayus(1);SCL_OUT;SCL_HIGH;Delayus(1);SCL_LOW;Delayus(1);}//等待应答int WaitAck(){uchar Time=255;SDA_OUT;SDA_HIGH;Delayus(1);SDA_IN;SCL_OUT;SCL_HIGH;Delayus(1);while(SDA_DATA){Time--;if(Time==0){I2cStop();return (0);}}SCL_LOW;Delayus(1);return (1);}//I2C写一字节数据void I2cWriteByte(uchar Data){uchar i;SDA_OUT;SCL_OUT;for(i=0;i<8;i++){SCL_LOW;Delayus(1);if(Data&0x80) SDA_HIGH;else SDA_LOW;Data<<=1;Delayus(1);SCL_HIGH;Delayus(1);}SCL_LOW;}//I2C读一字节数据uchar I2cReadByte(){uchar i,TmpData=0;SDA_OUT;SCL_OUT;SDA_HIGH;for(i=0;i<8;i++){SCL_LOW;Delayus(1);SCL_HIGH;Delayus(1);SDA_IN;TmpData<<=1;if(SDA_DATA) TmpData|=1;}SCL_LOW;return(TmpData);}//I2C写数据到AT24C02void I2cWrite(uchar Address,uchar Data){ I2cStart();//启动总线I2cWriteByte(0xA0);//发送器件地址WaitAck();I2cWriteByte(Address);//发送器件子地址 WaitAck();I2cWriteByte(Data);//发送数据WaitAck();I2cStop();}//I2C从AT24C02读数据uchar I2cRead(uchar Address){uchar TmpData;I2cStart();//启动总线I2cWriteByte(0xA0);//发送器件地址WaitAck();I2cWriteByte(Address);//发送器件子地址 WaitAck();I2cStart();//启动总线I2cWriteByte(0xA1);//发送器件地址I2cAck();TmpData=I2cReadByte();//读取数据I2cNAk();I2cStop();return(TmpData);}void main(){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗InitClock();_DINT();//关闭中断 P2SEL=0x00;//P2口所有引脚设置为一般的IO口P2DIR=0xFF;//P2口所有引脚设置为输出方向P2OUT=0x00;//P2口先输出0x00I2cWrite(0x00,0x12);//在地址0x00写入数据0x12while(1){P2OUT=I2cRead(0x00);//读出地址为0x00的数据并显示}}十一、PS/2键盘扫描实验功能:在数码管上显示PC键盘输入的键值#include "msp430x14x.h"#define uint unsigned int#define uchar unsigned charuchar KeyValue=0;//键值uchar IntNum=0;//中断次数uchar KeyUP=0;//键松开标识//共阳数码管编码表uchar Code[18]={0xC0,0xF9,0xA4,0xB0,//0,1,2,30x99,0x92,0x82,0xF8,//4,5,6,70x80,0x90,0x88,0x83,//8,9,A,b0xC6,0xA1,0x86,0x8E,//C,d,E,F0xBF,0xFF};//-,全灭uchar Bit[8]={16,16,16,16,16,16,16,16}; //数码管各位要显示的数字uchar BitCode=0x80; //数码管位码初值//键盘编码表uchar KeyCode[16]={69,//022,//130,//238,//337,//446,//554,//661,//762,//870,//928,//a50,//b33,//c35,//d36,//e43,//f};//时钟初始化函数void InitClock(void){BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频最高的标称频率DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率do{IFG1&=~OFIFG;//清除振荡器失效标志for(uint i=255;i>0;i--);}while(IFG1&OFIFG);//判断XT2是否起振BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频}//端口初始化函数void InitPort(void){P1SEL=0x00;//P1口所有引脚设置为一般的IO口P1DIR=0x00;//P1口所有引脚设置为输入方向P1IE=0x20;//P1.5中断允许P1IES=0x20;//P1.5下降沿触发中断P2SEL=0x00;//P2口所有引脚设置为一般的IO口。

MSP430单片机_流水灯代码

MSP430单片机_流水灯代码

MSP430单片机_流水灯代码/*要求:编写一个流水灯程序,利用LauchPad板上的两个LED和一个按键,实现每按下一次按键,两个LED灯轮流闪烁效果发生改变一次的功能。

功能:每次按键LED 闪烁次数依照3 次,4 次,5次,3 次... 的循环进行改变。

需要在按键抬起后才开始闪烁。

*/#include "io430.h"void delay(unsigned cnt)//延时xx毫秒{unsigned int i,j;for(j=0;j<cnt;j++){i=1000/6;while(i--);}}int main( void ){unsigned int i,num=0;unsigned int Key_Val_Current=1;char Key_Pressed_Flag=0;//按键标志WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗P1SEL &= ~(BIT0+BIT3+BIT6); // 功能设置:设置P1.0,P1.3,P1.6为IO口P1DIR |= (BIT0+BIT6); // 设置P1.0,P1.6为输出P1DIR &= ~BIT3; // 设置P1.3为输入P1REN |= BIT3; // 使能SW2为上下拉 (P1.3)P1OUT |= BIT3; // 设置SW2为上拉 (P1.3)while (1) // Test P1.3{//按键检测Key_Val_Current=BIT3 & P1IN;//获取当前按键(C语言:获取当前位的值)if(Key_Val_Current==0)//当前为0(按下){delay(10);//延时Key_Val_Current=BIT3 & P1IN;//继续获取当前按键(C语言:获取当前位的值)if(Key_Val_Current==0)//当前继续为0(按下){while((BIT3 & P1IN)==0);//缓冲掉10ms后的低电平Key_Pressed_Flag=1;}}//每次按键LED 闪烁次数依照3 次,4 次,5次,3 次... 的循环进行改变if (Key_Pressed_Flag){num++;//计数器num=num%3;switch(num){case 1:for(int f=0;f<3;f++){P1OUT |= BIT0; delay(500); P1OUT &= ~BIT0;delay(500); P1OUT |= BIT6; delay(500); P1OUT &= ~BIT6;delay(500); }break;case 2:for(int f=0;f<4;f++){P1OUT |= BIT0; delay(500); P1OUT &= ~BIT0;delay(500); P1OUT |= BIT6; delay(500); P1OUT &= ~BIT6;delay(500); }break;case 0:for(int f=0;f<5;f++){P1OUT |= BIT0; delay(500); P1OUT &= ~BIT0;delay(500); P1OUT |= BIT6; delay(500); P1OUT &= ~BIT6;delay(500); }break;default:break;}Key_Pressed_Flag=0;//一次按键结束}}return 0; }</cnt;j++)。

MSP430单片机C语言编程

MSP430单片机C语言编程
CCR0 =32768; // 设置计数器CCR0初值
TACTL |= MC0; //设置定时器工作模式为加计数到CCR0初值
P3DIR = 0XFF; //P3口为输出
P4DIR = 0XFF; //P4口为输出
P5DIR = 0XFF; //P5口为输出
P3OUT = 0X7E; //P3口输出为0111 1110
void main (void)
{
WDTCTL= WDTPW + WDTTMSEL+WDTSSEL;
IE1|=WDTIE;
P3DIR |=BIT7;
_EINT();
while(1);
}
interrupt[WDT_VECTOR] void WDT_interrupt (void)
P3DIR |=BIT7; //将P3.7设置为输出
_EINT(); //调用C430编译器内部函数,使能中断
while(1); //无限次循环
}
interrupt[TIMERA0_VECTOR] void Timer_A (void) //定时器A中断函数
{
P3OUT ^= BIT7; //P3.7位取反
右侧数码管与P4口相连,a~g,h对应P4.0~P4.7
(2)发光二极管
8 个发光二极管与P3 口连接
(3)按钮:
左侧8个按钮与P2口相连,引脚号标在按钮上方
右侧8个按钮与P1口相连,引脚号标在按钮上方
(4)P2.3引脚还是模拟比较器输入
(5)P6.0,P6.1引脚连接模拟量电位器,用于模拟量实验
//定义七段译码的共阳数码管显示数组
// hgfg dcba

单片机MSP430实验报告

单片机MSP430实验报告

实验二一、示例:按S1,LED1改变状态#include <msp430f5529.h>void Delay(void) //延迟子程序{int i;for(i = 100;i--;i > 0) ;//延时一点时间}void main(void){WDTCTL = WDTPW + WDTHOLD; // 停止看门狗P1DIR=0x7f;//P1DIR,置1为输出,置0为输入。

0x7f=0111 1111,p1.7为输入,p1.0~p1.6为输出P1REN |= BIT7;//P1.7开启上拉电阻。

|= 为与或,BIT7为1000 0000,P1.7的REN置1,开启端口拉电阻。

P1OUT=0xff; //P1输出高电平。

注意:while (1){if ((P1IN & BIT7)==0)//按键S1被按下。

&位与,若S1按下,P1.7=0,位与操作后,P1IN&BIT7=0x00 {void Delay(void);if (!(P1IN & BIT7)) //按键S1被按下.!(P1IN & BIT7)等同(P1IN & BIT7)==0 {while(!(P1IN & BIT7)); //按键S1被松开P1OUT ^= 0x01; //P1.0输出状态翻转}}}}二、上机自编程序的要求:按下按键S1,控制LED1的亮和灭。

短按键,则小灯亮1秒,然后灭;长按键,小灯常亮。

//********************************************************************* *********// MSP430F552x Demo - Timer0_A5, Toggle P1.0, CCR0 Up Mode ISR, DCO SMCLK //// Description: Toggle P1.0 using software and TA_1 ISR. Timer1_A is// configured for up mode, thus the timer overflows when TAR counts// to CCR0. In this example, CCR0 is loaded with 50000.// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~1.045MHz//// MSP430F552x// ---------------// /|\| |// | | |// --|RST |// | |// | P1.0|-->LED//// Bhargavi Nisarga// Texas Instruments Inc.// April 2009// Built with CCSv4 and IAR Embedded Workbench Version: 4.21//********************************************************************* #include<msp430f5529.h>unsigned int h,i;void Delay(void) //延迟子程序{int i;for(i = 100;i--;i > 0) ;//延时一点时间}void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTP1DIR=0x7f;//P1DIR,置1为输出,置0为输入。

msp430f6638单片机实验程序

msp430f6638单片机实验程序

msp430f6638单片机实验程序实验一验证性试验#includeint flag;void DCmotor(int p){ switch(p){case 0: {P1OUT &=~ BIT0; //停转P1OUT &=~ BIT6;P1OUT &=~ BIT7;break;}case 1: {P1OUT |= BIT0; //正转P1OUT |= BIT6;P1OUT &=~ BIT7;break; }case 2: { P1OUT |= BIT0;P1OUT &=~ BIT6;P1OUT |= BIT7;break;}}}int main(void) {WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timerP4REN |=BIT0+BIT1+BIT2+BIT3+BIT4; // 上下拉电阻使能P4OUT |=BIT0+BIT1+BIT2+BIT3+BIT4; //设置为上拉电阻P4DIR|=BIT5+BIT6+BIT7; //LED管脚设置P5DIR |=BIT7;P8DIR |=BIT0;P1DIR |= BIT0+BIT6+BIT7;while(1){if((P4IN&BIT0)==0){ //按键S7__delay_cycles(160000);if((P4IN&BIT0)==0) {flag=2;}}if((P4IN&BIT4)==0){ //按键S3__delay_cycles(160000);i f((P4IN&BIT4)==0) {flag=1;}}DCmotor(flag);}}设计性试验#includeint main(void){ WDTCTL = WDTPW +WDTHOLD;P4REN |=BIT0+BIT2+BIT4;P4OUT |=BIT0+BIT2+BIT4;P1DIR |=BIT0+BIT6+BIT7;while(1){ if((P4IN&BIT0)==0){ __delay_cycles(160000);if((P4IN&BIT0)==0){ P1OUT |=BIT0;P1OUT |=BIT6;P1OUT &=~BIT7;}}if((P4IN&BIT4)==0){ __delay_cycles(160000);if((P4IN&BIT4)==0){ P1OUT |=BIT0;P1OUT &=~BIT6;P1OUT |=BIT7;}}if((P4IN&BIT2)==0){ __delay_cycles(160000);if((P4IN&BIT2)==0){ P1OUT &=~BIT0;}}}}1、验证性实验:利用MSP430F6638 开发板上的拨盘电位器,控制改变AD 转换的输入电压值,转换后的数字量显示在段式液晶上面。

MSP430单片机定时器实验报告

MSP430单片机定时器实验报告

实验四定时器实验实验目的:MPS430F5529片内集成的定时器A的使用,学习计数器的补捕获比较模块的使用。

实验内容:定时器采用辅助时钟ACLK作为计数脉冲,fACLK=32768Hz,实现以下功能:1.定时器TA0延时1s,点亮或熄灭LED6,即灯亮1s灭1s,如此循环,采用中断服务程序实现。

2.定时器TA0延时1s,点亮或熄灭LED4,采用捕获比较器CCR0的比较模式,设定输出方式,输出方波,不用中断服务程序3.采用捕获比较器CCR1的比较模式LED5,设定输出方式,输出PWM波形,使LED 亮2s,灭1s。

4.用定时器实现30s倒计时,在液晶模块上显示,每过一秒显示数字变化一次。

5.使用TA1的捕获比较器CCR0捕获按键的间隔时间,在液晶模块上显示。

程序代码:程序1:#include <msp430f5529.h>void main(){WDTCTL = WDTPW + WDTHOLD; //关看门狗P1DIR |= BIT3; //设置P1.0口方向为输出。

TA0CCTL0 = CCIE; //设置捕获/比较控制寄存器中CCIE位为1,//CCR0捕获/比较功能中断为允许。

TA0CCR0 = 32767; //捕获/比较控制寄存器CCR0初值为32767TA0CTL = TASSEL_1 + MC_1+TACLR; //设置定时器A控制寄存器TACTL,//使时钟源选择为SMCLK辅助时钟。

//进入低功耗模式LPM0和开总中断_BIS_SR(LPM0_bits +GIE);}//定时器A 中断服务程序区#pragma vector=TIMER0_A0_VECTOR__interrupt void Timer_A (void){P1OUT ^= BIT3; //P1.0取反输出}实验现象:实验开始后,实验板上LED6亮灭闪烁,间隔为1s。

程序2:#include <msp430f5529.h>void main(void){WDTCTL = WDTPW + WDTHOLD; // 关狗P1DIR |= BIT1; // P1.1 设置为输出P1SEL |= BIT1; // P1.1 输出使能TA0CCR0 = 60000; // PWM PeriodTA0CCTL0 = OUTMOD_4; // CCR1 模式4TA0CCR1 = 30000; // CCR1 PWM duty cycleTA0CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, up mode, clear TAR__bis_SR_register(LPM3_bits); // Enter LPM3__no_operation(); // For debugger}实验现象:实验开始后,实验板上LED4亮灭闪烁,间隔为1s。

msp430单片机控制步进电机实验的电路图及C程序

msp430单片机控制步进电机实验的电路图及C程序

各模块的电路图如下:试验程序如下:#include <msp430x14x.h>#define DCO_FREQ 1000000 // DCO frequency#define ONE_SEC_CNT 512 // Number of WDT interrupts in 1 second#define DEBOUNCE_CNT 0x05 // (1/512)*5 = ~10 msec debounce#define DIR_MASK 0x01 // 0x01 is clockwise, 0x00 is counter-clockwise #define STEP_MASK 0x02 // 0x00 is full-stepping, 0x02 is half-stepping #define MOTION_MASK 0x04 // 0x00 is continuous, 0x04 is single-step#define DEFAULT_RA TE 0x8000 // Default stepping rate#define MIN_RATE 0x8000 // Minimum stepping rate#define MAX_RATE 0x0800 // Maximum stepping rate// Default state is full-stepping, clockwise, continuousunsigned char state = 1; // State variableunsigned char stepIndex = 0; // State table indexunsigned int rate = DEFAULT_RA TE; // Stepping rateunsigned char change_rate_flag = 0; // Flag indicating rate changeunsigned int max_rate = MAX_RA TE; // Maximum stepping rateunsigned int min_rate = MIN_RA TE; // Minimum stepping rate unsigned int SW[4];void sys_init(void);void Set_DCO(unsigned long freq);void timerA_Init(void);void uart0_Init(void);void wdt_Init(void);void toggle_stepping_mode(void);void increase_stepping_rate(void);void decrease_stepping_rate(void);void toggle_motion(void);void toggle_direction(void);//定义串口操作变量char nRev_UART0; // 串口0 的接收标志char UART0_TX_BUF[10]; // 串口0 的发送缓冲区char UART1_RX_Temp[10];char UART0_RX_BUF[10]; // 串口0 的接收缓冲区int nTX0_Len;int nRX0_Len;int nRX0_Len_temp;char nTX0_Flag;int nSend_TX0;// 整步状态表Astatic const unsigned char fullStepA[] ={0x00,0x00,0x01,0x01};// 半步状态表Bstatic const unsigned char fullStepB[] ={0x01,0x00,0x00,0x01};// 半步状态表Astatic const unsigned char HalfStepA[] = {0x01, // 001 10x06, // 110 20x00, // 000 30x00, // 000 40x00, // 000 50x07, // 111 60x01, // 001 70x01 // 001 8};// 逆时钟、半步状态表Bstatic const unsigned char CcwHalfStepB[] = {0x01, // 001 10x01, // 001 20x01, // 001 30x06, // 110 40x00, // 000 50x00, // 000 60x00, // 000 70x07 // 111 8};// 顺时钟、半步状态表Bstatic const unsigned char CwHalfStepB[] = {0x00, // 000 10x00, // 000 20x00, // 000 30x07, // 111 40x01, // 001 50x01, // 001 60x01, // 001 70x06 // 110 8};void main(void){int i;// 停止WDTWDTCTL = WDTPW + WDTHOLD;sys_init();_EINT();for(;;){if(nRev_UART0 == 1){nRev_UART0 = 0;for(i = 0;i < nRX0_Len;i++) UART1_RX_Temp[i] = UART0_RX_BUF[i];if((UART1_RX_Temp[0] == 'A') && (UART1_RX_Temp[1] == 'T')){UART0_TX_BUF[0] = 'O';UART0_TX_BUF[1] = 'K';UART0_TX_BUF[2] = 13;nTX0_Len = 3;switch(UART1_RX_Temp[2]){case 'D': // 方向toggle_direction();break;case 'C': // 运动模式toggle_motion();break;case 'M': // 步进模式toggle_stepping_mode();break;case 'F': // 增加速率increase_stepping_rate();break;case 'S': // 降低速率decrease_stepping_rate();break;default: break;}}else{UART0_TX_BUF[0] = 'E';UART0_TX_BUF[1] = 'R';UART0_TX_BUF[2] = 'O';UART0_TX_BUF[3] = 'R';UART0_TX_BUF[4] = 'R';UART0_TX_BUF[5] = 13;nTX0_Len = 6;}// 设置中断标志,进入发送中断程序IFG1 |= UTXIFG0;nRX0_Len = 0;}}}void sys_init(void){// 设置下降沿触发中断P1IES = 0x0f;P1IFG = 0x00;P1IE = 0x0f;// 设置P2.3,2,1,0 为输出// 设置P3.3,2,1,0 为输出P2OUT = 0x00;P3OUT = 0x00;P2DIR |= 0x0f;P3DIR |= 0x0f;// 设置DCOSet_DCO(DCO_FREQ);// 初始化Timer AtimerA_Init();// 初始化UART0uart0_Init();// 初始化WDTwdt_Init();}void Set_DCO(unsigned long freq){unsigned int clkCnt;unsigned int numDcoClks;unsigned int prevCnt = 0;// ACLK = LFXT1CLK/8 = 4096 HzBCSCTL1 |= DIV A_3;numDcoClks = freq/4096;TACCTL2 = CM_1 + CCIS_1 + CAP; TACTL = TASSEL_2 + MC_2 + TACLR; while(1){while( !(TACCTL2 & CCIFG) ){}TACCTL2 &= ~CCIFG;clkCnt = TACCR2 - prevCnt;prevCnt = TACCR2;if( numDcoClks == clkCnt ){break;}else if( clkCnt > numDcoClks ){DCOCTL--;if( DCOCTL == 0xFF ){if( BCSCTL1 & 0x07 ){BCSCTL1--;}else{break;}}}else{DCOCTL++;if( DCOCTL == 0x00 ){if( (BCSCTL1 & 0x07) != 0x07 ){BCSCTL1++;}else{break;}}}}// ACLK = LFXT1CLK/1 = 32768 HzBCSCTL1 &= ~DIV A_3;TACCTL2 = 0;TACTL = 0;}void wdt_Init(void){// 设置时钟源为ACLK,1秒内产生512此WDTCTL = WDTPW + WDTTMSEL + WDTCNTCL + WDTSSEL + WDTIS0 + WDTIS1; }void uart0_Init(void){//将寄存器的内容清零U0CTL = 0X00;//数据位为8bitU0CTL += CHAR;U0TCTL = 0X00;//波特率发生器选择ACLKU0TCTL += SSEL0;//波特率为9600UBR0_0 = 0X03;UBR1_0 = 0X00;UMCTL_0 = 0x4A;//使能UART0的TXD和RXDME1 |= UTXE0 + URXE0;//使能UART0的RX中断IE1 |= URXIE0;//使能UART0的TX中断IE1 |= UTXIE0;//设置P3.4为UART0的TXDP3SEL |= BIT4;//设置P3.5为UART0的RXDP3SEL |= BIT5;//P3.4为输出管脚P3DIR |= BIT4;}void timerA_Init(void){TACCR0 = rate;TACCTL0 = CCIE;TACTL = TASSEL_2 + MC_1 + TACLR;}interrupt [TIMERA0_VECTOR] void TimerA_ISR(void) {unsigned char index;unsigned char p2 = 0;unsigned char p3 = 0;// 判断步进速率是否需要改变if( change_rate_flag ){TACCR0 = rate;change_rate_flag = 0;}// 判断状态switch( (state & 0x3) ){case 0x00: // 整步、逆时钟方向index = stepIndex & 0x03;p2 |= fullStepA[index];p3 |= fullStepB[index];P2OUT = p2;P3OUT = p3;++stepIndex;break;case 0x01: // 整步、顺时钟方向index = stepIndex & 0x03;p3 |= fullStepA[index];p2 |= fullStepB[index];P3OUT = p3;P2OUT = p2;++stepIndex;break;case 0x02: // 半步、逆时钟方向index = stepIndex & 0x07;p2 |= HalfStepA[index];p3 |= CcwHalfStepB[index];P2OUT = p2;P3OUT = p3;++stepIndex;break;case 0x03: // 半步、顺时钟方向index = stepIndex & 0x07;p3 |= CwHalfStepB[index];p2 |= HalfStepA[index];P3OUT = p3;P2OUT = p2;++stepIndex;break;default: break;}// 如果单步状态下,禁止定时器中断if( state & MOTION_MASK ){TACCTL0 &= ~CCIE;}}////////////////////////////////////////// 处理来自串口0 的接收中断interrupt [UART0RX_VECTOR] void UART0_RX_ISR(void) {//接收来自的数据UART0_RX_BUF[nRX0_Len_temp] = RXBUF0;nRX0_Len_temp += 1;if(nRX0_Len_temp >= 2)if(UART0_RX_BUF[nRX0_Len_temp - 2] == '\r' && UART0_RX_BUF[nRX0_Len_temp - 1] == '\n') {// 过滤掉回车换行(\r\n)if(nRX0_Len_temp == 2){nRX0_Len_temp = 0;}else if(nRX0_Len_temp > 2){nRX0_Len = nRX0_Len_temp;nRev_UART0 = 1;nRX0_Len_temp = 0;}}}////////////////////////////////////////// 处理来自串口0 的发送中断interrupt [UART0TX_VECTOR] void UART0_TX_ISR(void) {if(nTX0_Len != 0){// 表示缓冲区里的数据没有发送完nTX0_Flag = 0;TXBUF0 = UART0_TX_BUF[nSend_TX0];nSend_TX0 += 1;if(nSend_TX0 >= nTX0_Len){nSend_TX0 = 0;nTX0_Len = 0;nTX0_Flag = 1;}}}interrupt [WDT_VECTOR] void WDT_ISR(void){unsigned char sw_state;static unsigned char one_sec_flag = 0;// 获得P1口的输入sw_state = ~P1IN & 0x0f;// 判断是否有键按下if( sw_state == 0x00 ){// 禁止看门狗中断IE1 &= ~WDTIE;// 判断是否S2的激活状态小于1秒if( !one_sec_flag && (SW[1] >= DEBOUNCE_CNT) ){toggle_motion();}// 复位状态计数器SW[0] = 0;SW[1] = 0;SW[2] = 0;SW[3] = 0;// 复位标志one_sec_flag = 0;// 使能P1口的中断功能P1IFG = 0x00;P1IE = 0x0f;}else{// 检查是否是S1状态if( sw_state & 0x01 ){if( SW[0] < ONE_SEC_CNT ){// 增加状态计数器++SW[0];}if( SW[0] == DEBOUNCE_CNT ){toggle_direction();}}else{SW[0] = 0;}// 检查是否是S2状态if( sw_state & 0x02 ){if( SW[1] < ONE_SEC_CNT ){// 增加状态计数器++SW[1];}if( SW[1] == ONE_SEC_CNT )toggle_stepping_mode();one_sec_flag = 1;SW[1] = 0;}}else{// 判断是否S2的激活状态小于1秒if( !one_sec_flag && (SW[1] >= DEBOUNCE_CNT) ) {toggle_motion();}one_sec_flag = 0;SW[1] = 0;}// 检查是否是S3状态if( sw_state & 0x04 ){// 检查是否是连续模式if( (state & MOTION_MASK) == 0 ){if( SW[2] < ONE_SEC_CNT ){// 增加状态计数器++SW[2];}if( SW[2] == DEBOUNCE_CNT ){increase_stepping_rate();}}else // 单步模式{// 增加状态计数器++SW[2];if( (SW[2] % DEBOUNCE_CNT) == 0 ){increase_stepping_rate();}}else{SW[2] = 0;}// 检查是否是S4状态if( sw_state & 0x08 ){if( SW[3] < ONE_SEC_CNT ){// 增加状态计数器++SW[3];}if( SW[3] == DEBOUNCE_CNT ){decrease_stepping_rate();}}else{SW[3] = 0;}}}interrupt [PORT1_VECTOR] void PORT1_ISR(void) {// 禁止端口1的中断P1IE = 0x00;// 清除端口1的中断标志P1IFG = 0x00;// 使能看门狗中断IE1 |= WDTIE;}void increase_stepping_rate(void){unsigned int new_rate;// 检查是否是连续模式if( (state & MOTION_MASK) == 0 )new_rate = rate >> 1;if( new_rate >= max_rate ){rate = new_rate;change_rate_flag = 1;}}//使能定时器A的中断TACCTL0 |= CCIE;}void decrease_stepping_rate(void){// 检查是否是连续模式if( (state & MOTION_MASK) == 0 ){if( rate <= (min_rate >> 1) ){rate <<= 1;change_rate_flag = 1;}}// 使能定时器A的中断TACCTL0 |= CCIE;}void toggle_stepping_mode(void){// 切换步进模式state ^= STEP_MASK;// 检查是否是半步模式if( state & STEP_MASK ){// 从整步模式切换到半步模式// 定时器的频率加倍rate = (rate >> 1);change_rate_flag = 1;max_rate = (MAX_RA TE >> 1);min_rate = (MIN_RATE >> 1);}else // 整步模式// 从半步模式切换到整步模式// 定时器的频率减半rate = (rate << 1);change_rate_flag = 1;max_rate = MAX_RATE;min_rate = MIN_RA TE;}}void toggle_motion(void){state ^= MOTION_MASK;// 检查是否是连续步进模式if( (state & MOTION_MASK) == 0 ){// 使能定时器中断TACCTL0 |= CCIE;}}void toggle_direction(void){state ^= DIR_MASK;}。

MSP430单片机实验报告

MSP430单片机实验报告

MSP430单片机实验报告专业:姓名:学号:MSP430单片机实验报告设计目标:使8位数码管显示“5201314.”,深入了解串行数据接口。

实现过程:主要分为主函数、驱动8位数码管函数、驱动1位数码管函数及延时函数。

延时函数:采用for循环。

驱动1位数码管子函数:设置74HC164的时钟传输和数传输,声明变量,使数据表中每一个要表示的字符的每一位都与shift做与运算从而进行传输,上升沿将传输数据传送出去。

驱动1位数码管子函数的流程图如图1所示。

图1 驱动1位数码管子函数流程图驱动8位数码管子函数:调用8次驱动1位数码管子函数。

驱动8位数码管子函数流程图如图2所示。

图2 驱动8位数码管流程图while图3 主函数流程图实验结果:供电后,数码管显示“5201314.”字样。

源程序:/************* 程序名称:5201314.*************//***程序功能:通过模拟同步串口控制8个共阳数码管***//*******P5.1 数据管脚,P5.3 同步时钟管脚*******/#include <io430.h> // 头文件void delay(void); // 声明延迟函数void seg7_1 (unsigned char seg7_data);// 声明驱动1 位数码管函数void seg7_8 ( unsigned char seg7_data7,unsigned char seg7_data6,unsigned char seg7_data5,unsigned char seg7_data4,unsigned char seg7_data3,unsigned char seg7_data2,unsigned char seg7_data0); // 声明驱动8 位数码管函数const unsigned char decoder_seg7[]={0x92,0xa4,0xc0,0xf9,0xb0,0xf9,0x99,0x7f }; //数码管显示表【5201314.】int main(void) // 主函数{WDTCTL=WDTPW+WDTHOLD; // 关闭看门狗P5SEL&=~BIT1; // 设置P5.1 端口为并行数字输入/ 输出口P5DIR|=BIT1; // 设置P5.1 端口为输出口P5SEL&=~BIT3; // 设置P5.3 端口为并行数字输入/ 输出口P5DIR|=BIT3; // 设置P5.3 端口为输出口while(1) // 重复执行{seg7_8 (7,6,5,4,3,2,1,0); // 调用驱动8 位数码管函数delay ( ); // 延时}}void seg7_8 (unsigned char seg7_data7,unsigned char seg7_data6,unsigned char seg7_data5,unsigned char seg7_data4,unsigned char seg7_data3,unsigned char seg7_data1,unsigned char seg7_data0)// 驱动8位数码管的同步串行数据接口驱动函数{seg7_1(seg7_data0); // 调用1 位数码管的同步串行数据接口驱动函数seg7_1(seg7_data1);seg7_1(seg7_data2);seg7_1(seg7_data3);seg7_1(seg7_data4);seg7_1(seg7_data5);seg7_1(seg7_data6);seg7_1(seg7_data7);}void seg7_1 (unsigned char seg7_data)// 驱动1 位数码管的同步串行数据接口驱动函数{unsigned char code_seg7; // 声明显示代码变量unsigned char a; // 声明循环变量unsigned char shift; // 声明串行数据位存储变量code_seg7=decoder_seg7[seg7_data]; // 显示数据译码P5OUT&=~BIT1; // P5.1 输出低电平P5OUT&=~BIT3; // P5.3 输出低电平shift=0x80; // 串行数据位指向8 位数据的最高位for(a=0; a<8; a++){if(code_seg7&shift) // 判断显示代码位的状态{P5OUT|=BIT1; // P5.1 输出高电平}else{P5OUT&=~BIT1; // P5.1 输出低电平}P5OUT|=BIT3; // P5.3 输出高电平P5OUT&=~BIT3; // P5.3 输出低电平shift=shift>>1; // 串行数据位指向数据位右移1 位}}void delay (void) //延时函数{unsigned char b;for(b=0xff;b>0;b--); }。

MSP430单片机编程与实践-实验报告

MSP430单片机编程与实践-实验报告
unsigned char aa,bb,b=0; unsigned char com_byte; unsigned char num; unsigned char key; unsigned char key_flag;
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; 采样周期

MSP430单片机课程设计-简单计算器设计

MSP430单片机课程设计-简单计算器设计
2
MSP430 单片机课程设计
unsigned char disbuff[8] = {20,20,0,0,0,0,0,0};//初始数码管 unsigned char getkey(void); unsigned int qiushu(); void clear(void); void zhuanhuan(); void delay(unsigned int j) { for(uint i=0;i<j;i++); } unsigned int qiushu() //转化成相应的十进制整数 {unsigned int y; y=disbuff[2]*100000+disbuff[3]*10000+disbuff[4]*1000+disbuff[5]*100 +disbuff[6]*10+disbuff[7]; return y; } void clear(void) {unsigned int a; for(a=7;a>1;a--) disbuff[a]=0; } //清除屏幕
实验二:猜数字游戏设计
一、目的
利用单片机芯片 MSP430x14x、四位八段共阴数码管,设计一个猜数字游戏, 并将游戏结果显示在数码管上。
二、功能
要求该设计能实现如下的功能:游戏开始后,先在程序内随即设定四个 0-9 之间的不同数,作为游戏数答案。然后用户给出 4 个数,该软件会将您提交的数 与它自动产生的数进行比较,结果在八段数码管上显示成"kAsB"。k 代表位置正 确数字也正确的字数,s 代表数字正确但位置不正确的字数。当 k=4 且 s=0 时, 则比较正确显示“GOOD” ,进行下一次比较。
4
MSP430 单片机课程设计
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一#include <msp430f6638.h>int main(void)#include <msp430f6638.h>int main(void){WDTCTL=WDTPW+WDTHOLD;int flag=0;P4REN |=BIT0+BIT1+BIT2+BIT3+BIT4;P4OUT |=BIT0+BIT1+BIT2+BIT3+BIT4;P1DIR |=BIT0+BIT6+BIT7;while(1){ if((P4IN&BIT0)==0){if ((P4IN&BIT0)==0){ flag=7;}}if((P4IN&BIT4)==0){if ((P4IN&BIT4)==0){ flag=3;}}if((P4IN&BIT2)==0){if ((P4IN&BIT2)==0){ flag=5;}}if(flag==7){P1OUT |=BIT0;P1OUT |=BIT6;P1OUT &=~BIT7; }if(flag==3){P1OUT |=BIT0;P1OUT |=BIT7;P1OUT &=~BIT6; }if(flag==5){P1OUT &=~BIT0;}}}实验二#include <msp430f6638.h>void initAdc(){ADC12CTL0 |= ADC12MSC;//自动循环采样转换ADC12CTL0 |= ADC12ON;//启动ADC12模块ADC12CTL1 |= ADC12CONSEQ1 ;//选择单通道循环采样转换ADC12CTL1 |= ADC12SHP;//采样保持模式ADC12MCTL0 |= ADC12INCH_7; //选择通道15,连接拨码电位器ADC12CTL0 |= ADC12ENC;}int main(void){WDTCTL = WDTPW +WDTHOLD;P4DIR |=BIT5+BIT6+BIT7;P5DIR |=BIT7;P8DIR |=BIT0;ADC12CTL0=ADC12SHT0_8;initAdc();ADC12IE|=BIT0;ADC12CTL0|=ADC12SC;_EINT();// 开中断}#pragma vector=ADC12_VECTOR__interrupt void ADC12ISR(void){if(ADC12MEM0>=3686){P4OUT |=BIT5+BIT6+BIT7;P5OUT |=BIT7;P8OUT |=BIT0;}if(ADC12MEM0>=2867){ P4OUT &=~BIT5;P4OUT |=BIT6+BIT7;P5OUT |=BIT7;P8OUT |=BIT0;}if(ADC12MEM0>=2048){P4OUT &=~BIT5;P4OUT &=~BIT6;P4OUT |=BIT7;P5OUT |=BIT7;P8OUT |=BIT0;}if(ADC12MEM0>=1229){P4OUT &=~BIT5;P4OUT &=~BIT6;P4OUT &=~BIT7;P5OUT |=BIT7;P8OUT |=BIT0;}if(ADC12MEM0>=410){P4OUT &=~BIT5;P4OUT &=~BIT6;P4OUT &=~BIT7;P5OUT &=~BIT7;P8OUT |=BIT0;}else{P4OUT=0x00;P5OUT=0x00;P8OUT=0x00;}}实验三#include<msp430f6638.h>volatile unsigned int sin[256]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x0A, 0x0B, 0x0D, 0x0E, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x25,0x27, 0x29, 0x2B, 0x2E, 0x30, 0x33, 0x35, 0x38, 0x3A, 0x3D, 0x40, 0x43, 0x45, 0x48, 0x4C, 0x4E,0x51, 0x55, 0x57, 0x5A, 0x5D, 0x60, 0x63, 0x66, 0x69, 0x6C, 0x6F, 0x72, 0x76, 0x79, 0x7C,0x80, 0x80, 0x83, 0x86, 0x89, 0x8D, 0x90, 0x93,0x96,0x99,0x9C,0x9F,0x0A2,0x0A5,0x0A 8,0x0AB,0x0AE,0x0B1,0x0B4,0x0B7,0x0BA,0x 0BC,0x0BF,0x0C2,0x0C5,0x0C7,0x0CA,0x0CC,0 x0CF,0x0D1,0x0D4,0x0D6,0x0D8,0x0DA,0x0D D,0x0DF,0x0E1,0x0E3,0x0E5,0x0E7,0x0E9,0x0 EA,0x0EC,0x0EE,0x0EF,0x0F1,0x0F2,0x0F4,0x0 F5,0x0F6,0x0F7,0x0F8,0x0F9,0x0FA,0x0FB,0x0 FC,0x0FD,0x0FD,0x0FE,0x0FF,0x0FF,0x0FF,0x0 FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, 0x0FF,0x0FE,0x0FD,0x0FD,0x0FC,0x0FB,0x0FA, 0x0F9,0x0F8,0x0F7,0x0F6,0x0F5,0x0F4,0x0F2, 0x0F1,0x0EF,0x0EE,0x0EC,0x0EA,0x0E9,0x0E7, 0x0E5,0x0E3,0x0E1,0x0DE,0x0DD,0x0DA,0x0D 8,0x0D6,0x0D4,0x0D1,0x0CF,0x0CC,0x0CA,0x 0C7,0x0C5,0x0C2,0x0BF,0x0BC,0x0BA,0x0B7,0 x0B4,0x0B1,0x0AE,0x0AB,0x0A8,0x0A5,0x0A2 ,0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8D, 0x89, 0x86, 0x83, 0x80, 0x80, 0x7C, 0x79, 0x78, 0x72, 0x6F, 0x6C, 0x69, 0x66, 0x63, 0x60, 0x5D, 0x5A, 0x57, 0x55, 0x51,0x4E, 0x4C, 0x48, 0x45, 0x43, 0x40, 0x3D, 0x3A, 0x38, 0x35, 0x33, 0x30, 0x2E, 0x2B, 0x29, 0x27, 0x25, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18, 0x16, 0x15, 0x13, 0x11, 0x10, 0x0E, 0x0D, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};void main(void){ volatile unsigned int i,j;WDTCTL = WDTPW + WDTHOLD; //关闭看门狗P7DIR |= BIT6;//设置P7.6口为输出口P7SEL |= BIT6;//使能P7.6口第二功能位DAC12_0CTL0 |= DAC12IR; //设置参考电压满刻度值,使Vout = Vref×(DAC12_xDAT/4096)DAC12_0CTL0 |= DAC12SREF_1; //设置参考电压为AVCCDAC12_0CTL0 |= DAC12AMP_5; //设置运算放大器输入输出缓冲器为中速中电流DAC12_0CTL0 |= DAC12CALON; //启动校验功能DAC12_0CTL0 |= DAC12OPS;//选择第二通道P7.6DAC12_0CTL0 |= DAC12ENC; //转化使能while(1){ for(j=0;j<5;j++){for(i=0;i<256;i++)DAC12_0DAT =16*sin[i];}//输入数据for(j=5;j<10;j++){for(i=0;i<256;i++)DAC12_0DAT =8*sin[i];}}}实验四#include <msp430.h>int flagTimer=0;int flagkey=0;int flagPC=0;int TimeNum=0;unsigned char send_data[]={'5'};unsigned char recv_data[];void TimerA_Init(void)//定时器TA初始化函数{TA0CTL |= MC_1 + TASSEL_2 + TACLR;TA0CCTL0 = CCIE;TA0CCR0 = 50000;}void UART_RS232_Init(void)//RS232函数{P8SEL|=0x0c;//模块功能接口设置,即P8.2与P8.3作为USCI的接收口与发射口UCA1CTL1|=UCSWRST;UCA1CTL1|=UCSSEL_1;//设置辅助时钟,用于发生特定波特率UCA1BR0=0x03;//设置波特率, BRCLK=32768Hz,BD=9600波特率UCBRx = INT(32768/9600)= 3;//取整UCA1BR1=0x00;UCA1MCTL=UCBRS_3+UCBRF_0;//波特率生成器中的调制控制UCA1CTL1&=~UCSWRST;//结束复位UCA1IE|=UCRXIE;//使能接收中断}int main(void){WDTCTL = WDTPW + WDTHOLD;P4DIR=BIT5+BIT6+BIT7;P5DIR=BIT7;P8DIR=BIT0;P4REN|=BIT4;P4OUT|=BIT4;UART_RS232_Init();TimerA_Init();__bis_SR_register(GIE);while(1){if((P4IN&BIT4)==0)flagkey=1;if(flagTimer==1){ flagTimer=0;if (flagkey==1){flagkey=0;send_data[0]++;if( send_data[0]>'9')send_data[0]='0';}UCA1TXBUF=send_data[0]; }if (flagPC==1){flagPC=0;switch(recv_data[0]){case '1': //LED1亮P8OUT|=BIT0;P5OUT&=~BIT7;P4OUT&=~BIT7;P4OUT&=~BIT5;P4OUT&=~BIT6;break;case '2': //LED2亮P5OUT|=BIT7;P8OUT&=~BIT0;P4OUT&=~BIT7;P4OUT&=~BIT5;P4OUT&=~BIT6;break;case '3': //LED3亮P8OUT&=~BIT0;P5OUT&=~BIT7;P4OUT |=BIT7;P4OUT&=~BIT5;P4OUT&=~BIT6;break;case '4': //LED4亮P8OUT&=~BIT0;P5OUT&=~BIT7;P4OUT&=~BIT7;P4OUT&=~BIT5;P4OUT|=BIT6;P4OUT&=~BIT7;break;case '5': //LED5亮P8OUT&=~BIT0;P5OUT&=~BIT7;P4OUT|=BIT5;P4OUT&=~BIT6;P4OUT&=~BIT7;break;}}}}#pragma vector = TIMER0_A0_VECTOR //定时器TA中断服务函数__interrupt void Timer_A (void){TimeNum++;//自定义一个变量TimeNumif(TimeNum >=20)//计满二十次为1s{TimeNum =0;flagTimer =1; //1S时间到的标志置1}}#pragma vector=USCI_A1_VECTOR //USCI中断服务函数__interrupt void USCI_A1_ISR(void){switch(__even_in_range(UCA1IV,4)){case 0: break; //无中断case 2: //接收中断处理while(!(UCA1IFG&UCTXIFG));//等待完成接收recv_data[0]=UCA1RXBUF;//数据读出flagPC=1; //表明PC机已发送了数据break;case 4:break; //发送中断不处理default:break; //其他情况无操作}}。

相关文档
最新文档