430高级流水灯程序

合集下载

流水灯程序 简单又详细【范本模板】

流水灯程序 简单又详细【范本模板】

流水灯原理图流水灯程序
其实流水灯程序就是你只要搞懂端口的高低电平是怎么一回事,置为1 即将该点即为高电平,置0即为低电平,低电平一般是0。

3V,同时要知道发光二极管在满足一定电压的同时正常发光电流为10~15mA左右,低于该电流二极管发光亮度会很暗。

比如用一个5V的电源驱动以个发光二极管其亮度会很亮,当串联一个300欧的电阻时,二极管两端的电压大概为2。

3V,此时电阻两端的电压为5.0—2。

2=2。

8V;电路中的电流为2.8V/300=9.3ma,接近于正常情况下的发光电流,当串联1K电阻时,则基本就不会光。

下图即为分别串联电阻为R=300,100,500.欧姆的情况下个发光二极管的亮
度.。

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口设置了如很多的功能,并且单独抽出了好几个设置的寄存器。

流水灯程序

流水灯程序

图1 流水灯硬件原理图从原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭的方法同LED1。

因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。

在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。

3.软件编程单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要告诉单片机怎么来进行工作,即编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭。

软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难点。

下面我们以最简单的流水灯控制功能即实现8个LED灯的循环点亮,来介绍实现流水灯控制的几种软件编程方法。

3.1位控法这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,从而来控制相应LED灯的亮灭。

程序如下:ORG 0000H ;单片机上电后从0000H地址执行AJMP START ;跳转到主程序存放地址处ORG 0030H ;设置主程序开始地址START:MOV SP,#60H ;设置堆栈起始地址为60HCLR P1.0 ;P1.0输出低电平,使LED1点亮ACALL DELAY ;调用延时子程序SETB P1.0 ;P1.0输出高电平,使LED1熄灭CLR P1.1 ;P1.1输出低电平,使LED2点亮ACALL DELAY ;调用延时子程序SETB P1.1 ;P1.1输出高电平,使LED2熄灭ACALL DELAY ;调用延时子程序SETB P1.2 ;P1.2输出高电平,使LED3熄灭CLR P1.3 ;P1.3输出低电平,使LED4点亮ACALL DELAY ;调用延时子程序SETB P1.3 ;P1.3输出高电平,使LED4熄灭CLR P1.4 ;P1.4输出低电平,使LED5点亮ACALL DELAY ;调用延时子程序SETB P1.4 ;P1.4输出高电平,使LED5熄灭CLR P1.5 ;P1.5输出低电平,使LED6点亮ACALL DELAY ;调用延时子程序SETB P1.5 ;P1.5输出高电平,使LED6熄灭CLR P1.6 ;P1.6输出低电平,使LED7点亮ACALL DELAY ;调用延时子程序SETB P1.6 ;P1.6输出高电平,使LED7熄灭ACALL DELAY ;调用延时子程序SETB P1.7 ;P1.7输出高电平,使LED8熄灭ACALL DELAY ;调用延时子程序AJMP START ;8个LED流了一遍后返回到标号START处再循环DELAY:;延时子程序MOV R0,#255;延时一段时间D1:MOV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回END ;程序结束3.2循环移位法在上个程序中我们是逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下面我们利用循环移位指令,采用循环程序结构进行编程。

基于MSP430上的流水灯设计

基于MSP430上的流水灯设计

基于MSP430上的流水灯的实验设计申报者:队长 :队员:摘要: IAR Embedded Workbench IDE是MSP430开发环境,它包含了编辑器;编译器;连接器;调试器;硬件中断模拟器;下载C语言程序到MSP430应用系统。

因此,学习和使用IAR Embedded Workbench IDE是MSP430开发环境是进行MSP430开发必不可少的环节。

主要原理是通过430单片机产生信号,控制一定数量的LED产生不同规律的变换,通过不同的程序,产生不同的循环,从而达到不同的变换效果。

关键词:MSP 430 程序 LED 变换循环Abstract:IAR Embedded Workbench IDE MSP430 developmentenvironment, itcontainsthe editor; compiler; connector;debugger; hardwareinterrupt simulator; download Clanguage program in the MSP430 application system.Therefore, the learning and use of theIAR EmbeddedWorkbench IDE MSP430 development environment isMSP430 development of essential link. The main principle is to generate the signal by 430 single chip microcomputer, transform to control the amount of LED produced by different rules, different procedures,different cycle, so as to achievethe transformation effect of different.Keywords: MSP 430 program LED transform circle目录一 MSP430单片机的概述1.1MSP430系列单片机的基本信息......... ....... .31.2MSP430系列单片机与51系列单片机的比较.. .. .. . 4 二设计思路2.1设计平台.. .. .. .. .. .. .. .. .. .. .. .. .. . . .42.2设计思路.. .. .. .. .. .. .. .. .. .. .. .. .. .. .5 三电路设计3.1电路模块设计.. .. .. .. .. .. .. .. .. .. .. .. .. .6 3.1.1 晶振电路模块.. .. .. .. .. .. .. .. .. .. .. .. .. .6 3.1.2 复位电路模块.. .. .. .. .. .. .. .. .. .. .. .. .. .6 3.1.3 数码管显示模块.. .. .. .. .. .. .. .. .. .. .. 6 3.1.4 功能模式选择模块.. .. .. .. .. .. .. .. .. .. .. .63.1.5 LED流水灯模块.. .. .. .. .. .. .. .. .. .. .. ..63.2 实验电路设计. . .. .. ... .. .. .. .. .. .6 7 8 9四程序调试及实验结果展示.. . .. .. .. .. .. .. ..10 11五实验总结.. .. . .. .. .. .. .. .. .. .. .. .. .11 12六参考文献.. .. . .. .. .. .. .. .. .. .. .. .. .. ..12附录一.. .. .. .. .. .. .. .. .. .. .. .. .. .. ..12 13 14附录二.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..141. MSP430单片机的概述1.1 MSP430系列单片机的基本信息图1 MSP430内部原理框图在运算速度方面,MSP430系列单片机能在8MHz晶体的驱动下,实现125us的指令周期。

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

流水灯的实验代码

流水灯的实验代码

流水灯的实验代码
本文将为大家详细介绍流水灯实验的代码,主要包括代码注释和相关说明。

流水灯是一种常见的电路实验,利用简单的电路原理和单片机控制方式来实现灯的闪烁变化。

在实验的过程中,我们需要加深对电路和单片机控制的理解,了解其中的技术细节和实现方式。

这里提供的实验代码基于Keil C51软件,适合初学者和嵌入式开发爱好者进行学习和体验,如有不足之处还望指正。

代码注释如下:
代码说明:
1. 调用头文件:`#include<reg51.h>`,表示调用reg51.h头文件,将程序所需的头文件库引入。

2. 给出延时函数:`void delay(unsigned int i)`,表示定义了一个延时函数,其中`while(i--)` 为循环等待i的时间。

4. 死循环:`while(1)`,表示程序进入无限循环,实现流水灯的闪烁变化。

5. 控制亮灭:`P1=0xfe;`、`P1=0xfd;`、`P1=0xfb;`、`P1=0xf7;`、`P1=0xef;`、`P1=0xdf;`、`P1=0xbf;`、`P1=0x7f;`,表示控制LED灯的亮灭,写入P1口的不同值可以点亮不同的LED灯,亮度可控。

6. 延时:`delay(50000);`,表示使LED灯闪烁间的间隔时间为50s(此处单位为微秒)。

此外需要注意的是,流水灯实验的接线原理如下:
- 八个LED的正极统一接在P1.0~P1.7上。

- 八个LED的负极统一接在电源的负极上。

体验流水灯实验的过程中,通过修改代码中的值可以调整LED灯亮度和闪烁时间,掌握基本的单片机控制方法,增加对电路和嵌入式开发的理解。

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++)。

流水灯程序 简单又详细

流水灯程序 简单又详细

流水灯原理图
流水灯程序
其实流水灯程序就是你只要搞懂端口的高低电平是怎么一回事,置为1 即将该点即为高电平,置0即为低电平,低电平一般是0.3V,同时要知道发光二极管在满足一定电压的同时正常发光电流为10~15mA左右,低于该电流二极管发光亮度会很暗。

比如用一个5V的电源驱动以个发光二极管其亮度会很亮,当串联一个300欧的电阻时,二极管两端的电压大概为2.3V, 此时电阻两端的电压为5.0-2.2=2.8V;电路中的电流为2.8V/300=9.3ma,接近于正常情况下的发光电流,当串联1K电阻时,则基本就不会光。

下图即为分别串联电阻为R=300,100,500.欧姆的情况下个发光二极管的亮度。

(注:专业文档是经验性极强的领域,无法思考和涵盖全面,素材和资料部分来自网络,供参考。

可复制、编制,期待你的好评与关注)。

基于MSP430和Proteus的多模式花样流水灯设计

基于MSP430和Proteus的多模式花样流水灯设计

指令
注释
PxDIR
输入输出方向寄存器
PxIN
输入寄存器
PxOUT
输出寄存器
PxIE
中断使能寄存器
PxIES
中断触发沿选择寄存器
PxIFG
中断标志寄存器
PxSEL
功能选择寄存器
1.2 实现变量控制频率可变的跑马灯
这部分系统设计的想法建立在延时函数的调用次数参数 从定值设为变量 n,通过外部控制按键的中断,触发对 n 的函数 运算,从而改变流水灯闪烁周期,影响闪烁频率,关键在于对实 际基频和 1s 周期的计算与控制。
MSP430 端口设置寄存器表
2 总体设计方案与实现 2.1 软件设计总方案 从系统设计的整个过程来看,包括: “功能需求分析,功能 模块化,器件选择,电路设计,程序设计,仿真调试”。其中,仿 真调试需要多次进行,以确保系统的稳定性和正确性。 以 MSP430 为核心芯片,用 P1 和 P2 口分别作为中断端口与 I / O 口。首先仅对基础功能进行讨论,将功能分为两个子模块: 模块一由 P2 口主要完成,用于点亮正常的依次循环的流水灯; 模块二需要加上 P1 口,用于控制中断信号,转向第二种流水灯 模式。同时也负责检测按键的松开,并返回模块一的功能。 2.2 花样流水灯电路设计 对于 MSP4430 的电路设计,实际电路中需要用到对晶振电 路,Vcc 以及 GND 的设置。但由于 Proteus 中 MSP430 默认内部 时钟以及供电和地段是设置好的,所以在仿真界面不予显示。 如下图 1 所示,P1 口仅 P1.3 属于基本功能控制按钮,用于 为中断提供触发信号。
msp430端口设置寄存器表指令注释pxdir输入输出方向寄存器pxin输入寄存器px0ut输出寄存器pxie中断使能寄存器pxies中断触发沿选择寄存器pxifg中断标志寄存器pxsel功能选择寄存器12实现变量控制频率可变的跑马灯这部分系统设计的想法建立在延时函数的调用次数参数从定值设为变量n通过外部控制按键的中断触发对n的函数运算从而改变流水灯闪烁周期影响闪烁频率关键在于对实际基频和ls周期的计算与控制

430程序

430程序

一、I/O口P1SEL:功能选择寄存器。

0:I/O功能;1:外设模块功能。

默认IO口P1DIR:方向选择寄存器。

0:输入;1:输出。

默认输入P1OUT:输出寄存器。

0:输出低电平;1:输出高电平P1IN:输入寄存器。

0:输入低电平;1:输入高电平P1SEL|(或)=BIT0(0x01):P1.0得1,则是外设模块功能P1SEL&(与)=~BIT1(0x01)=BIT1(0xfe):P1.0得0,清零。

P1DIR=0x00:全部配置成输入P1OUT|=BIT1:P1.2口置1,输出高电平P1OUT^=0x01:异或,0不变,1取反花样流水(正流水,反流水,中间向两边,两边向中间)#include "msp430x14x.h"unsigned int i;unsigned int table[]={0x7e,0xbd,0xdb,0xe7};void delay(unsigned int z){unsigned int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P1DIR=0xff;while(1){for(i=0;i<8;i++){P1OUT=~(0x01<<i);delay(300);}for(i=0;i<8;i++){P1OUT=~(0x80>>i);delay(300);}for(i=0;i<4;i++){P1OUT=table[i];delay(300);}for(i=3;i>0;i--){P1OUT=table[i];delay(300);}}}二、时钟输入源ACLK 辅助系统时钟,MCLK 主系统时钟,SCLK 子系统时钟按键控制小灯轮流闪烁#include "msp430x14x.h"#define u8 unsigned char#define u16 unsigned int#define u32 unsigned longu8 m,k=0;#define CPU_F ((double)800000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P2DIR=0x00;P1DIR=0xff;P1OUT=0xff;P2IE=BIT1;//P2.1P2IES=BIT0;_EINT();//全局中断开while(1){if(k>0){P1OUT^=1<<k-1;delay_ms(100);}}}#pragma vector=PORT2_VECTOR__interrupt void PORT_2(){delay_ms(5);if((P2IN&BIT1)!=0){while(!(P2IN&BIT1));P1OUT=0xff;k++;if(k==9)k=1;}P2IFG=0x00;}三、计数器TACTL:Timer_A控制寄存器TAR:Timer_A计数器TAIV:中断向量寄存器CCTL0:捕获比较控制寄存器0CCR0:捕获比较寄存器0SSEL1、SSEL0选择定时器输入分频器的时钟源(01:辅助系统)ID1 ID0:00:不分频,01:2分频,10:4分频,11:8分频MC1,MC0计数模式控制位:00:停止模式,01:增计数模式(精确定时),10:连续计数模式(捕获比较)、11:增/减计数模式(精确定时,是增计数模式的2倍)CLR:定时器清除位TAIE:定时器中断允许位(0 禁止定时器溢出中断,1 允许定时器溢出中断)TAIFG:定时器溢出标志位(定时器由CCR0/0FFFFH计数到0时,TAIFG置位)增计数模式(0-65535):计数器TAR可以增计数到CCR0的值,当计数值与CCR0的值相等时,定时器复位并从0开始重新计数。

单片机-流水灯的程序

单片机-流水灯的程序
程序分析:
#include<reg51.h> sbit led1=P2^0; sbit led2=P2^1; sbit led3=P2^2; sbit led4=P2^3; sbit led5=P2^4; sbit led6=P2^5; sbit led7=P2^6; sbit led8=P2^7; void delay (unsigned char x);
其中void表示这 个函数执行完后 不返回任何数据。 ()内无任何东西, 所以这是个无参 数的函数。 Delayms是函数名。
1
2
3
4
5
6
2)带参数函数的用位定义实现流水灯(8位二极管循环点亮)
编程思路: a) 先点亮第一盏灯,延时点亮第二盏, 依次延时8盏灯全部点亮。 b) 当8盏灯全部点亮时,熄灭8盏灯。 c) 进入循环。
循环移动
循环左移 最高位移入最低位,其它依次向左移动一位。C语言中 没有专门的指令,通过移位指令和简单逻辑运算来实现循环左移,或直接利用C51库中自带的函数-crol-实现。
循环右移 最低位移入最高位,其它位依次向右移一位,C语言中没有专门的指令,通过移位指令与简单的逻辑运算可以实现循环右移,或专门利用C51库中自带函数-cror-实现
方法二:利用总线控制实现流水灯(8位二极管循环点亮)
相关知识 二进制和十六进制之间的相互转换
二进制
十六进制
二进制
十六进制
0000
0
0100
4
0001
1
0101
5
0010
2
0110
6
0011
3
0111
7
二进制
十六进制
二进制

MSP430流水灯蜂鸣器实验报告

MSP430流水灯蜂鸣器实验报告

MSP430实验报告水位报警器姓名:丁宇昊学号: 021210508一、实验目的:掌握msp430单片机的程序编写和运行过程。

掌握IAR Embedded Workbench程序的编译和运行。

二、实验内容:用继电器代替传感器输入模拟电压,用IED灯显示水位高度,当超过预定值时,蜂鸣器响,实现报警。

三、使用串口:P1口,P2口四、电路实现:把继电器作为的AD的输入,通过AD转换,把电压分成16小分,每一份信号控制1个led,通过改变led两端电平高低,控制led亮灭。

当到达预定值时,把蜂鸣器的接口设置为高电平。

五、实验代码:#include <msp430.h>void delay(int j){do j--;while (j != 0);}int main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabledADC10CTL1 = INCH_1+SREF0; // input A1ADC10AE0 |= BIT7; // PA.1 ADC option selectP1DIR |= BIT0; // Set P1.0 to output directionP1DIR|=BIT4;P1DIR|=BIT5;P2DIR|= 0xff;P2OUT|=0xff;P2SEL&=0x00;for (;;){ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start __bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit if (ADC10MEM > 960){P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT =0xFE;}else if(ADC10MEM >900){ P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT = 0xfc;}else if(ADC10MEM >840){ P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT=0xf8;}else if(ADC10MEM >780){ P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT= 0xf0;}else if(ADC10MEM >660){ P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT= 0xe0;}else if(ADC10MEM >600){ P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT= 0xc0;}else if(ADC10MEM >540) { P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT= 0x80;}else if(ADC10MEM >480) { P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT= 0x00;}else if(ADC10MEM >420) { P1OUT&=~BIT5;P2OUT=0x00;P1OUT|=BIT4;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0xfe;P1OUT|=BIT5;P2OUT=0xfe;}else if(ADC10MEM >360) { P1OUT&=~BIT5;P2OUT=0x00;P1OUT|=BIT4;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0xfc;P1OUT|=BIT5;P2OUT=0xfc;}else if(ADC10MEM >300) {P1OUT&=~BIT5;P2OUT=0x00;P1OUT|=BIT4;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0xf8;P1OUT|=BIT5;P2OUT=0xf8;}else if(ADC10MEM >240) { P1OUT&=~BIT5;P2OUT=0x00;P1OUT|=BIT4;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0xf0;P1OUT|=BIT5;P2OUT=0xf0;}else if(ADC10MEM >180){ P1OUT&=~BIT5;P2OUT=0x00;P1OUT|=BIT4;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0xe0;P1OUT|=BIT5;P2OUT=0xe0;}else if(ADC10MEM >120){ P1OUT&=~BIT5;P2OUT=0x00;P1OUT|=BIT4;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0xc0;P1OUT|=BIT5;P2OUT=0xc0;P1DIR |=BIT6; P1OUT ^=BIT6;delay(100);}else if(ADC10MEM >60){ P1OUT&=~BIT5;P2OUT=0x00;P1OUT|=BIT4;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0x80;P1OUT|=BIT5;P2OUT=0x80;P1DIR |=BIT6;P1OUT ^=BIT6;delay(100);}else{ P1OUT&=~BIT5;P2OUT=0x00;P1OUT|=BIT4;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0x00;P1OUT|=BIT5;P2OUT=0x00;P1DIR |=BIT6;P1OUT ^=BIT6;delay(100);}}}// 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)}六、总结通过这次msp430单片机的实验,是我进一步的了解了单片机的远离,虽然在实验过程中遇到了一些问题,但我及时与同学讨论与老师沟通,解决了以上问题。

几种流水灯的闪亮程序

几种流水灯的闪亮程序

流水灯闪亮程序#include<reg52.h>#include<intrins.h>sbit led1=P1^0;#define uchar unsigned char#define uint unsigned intvoid delay(uint ms);void main(void){uchar a;a=0xfe;while(1){P1=a;delay(500);a=_crol_(a,1); //_crol_(a,1);循环左移_cror_(a,1); ;循环右移}}void delay(uint ms) //500{uint i, j; // uchar时间短uint时间较长for (i=ms;i>0;i--)for(j=100;j>0;j--);}流水灯程序#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longsbit key=P1^0;sbit led9=P0^7;uchar k;//delay usvoid Delay(uchar us) //5,7,9{while(--us);}//delay msvoid DelayMS(uint iMs){uint i,j;for(i=0;i<iMs;i++)for(j=0;j<65;j++) Delay(1);}main(){uchar i;i=0xff;led9=1;P2=i;while(1){key=1;DelayMS(50);if(key==0){led9=0;DelayMS(1000);led9=1;i=0x7f;for(k=0;k<8;k++){P2=i;i=_cror_(i,1);DelayMS(500);}i=0xfe;for(k=0;k<8;k++){P2=i;i=_crol_(i,1);DelayMS(500);}led9=0;DelayMS(500);P2=0;led9=0;DelayMS(3000);P2=0xff;led9=1;}}}流水灯程序#include<reg51.h> //包含单片机寄存器的头文件void delay(void){unsigned int i,j; //unsigned char 时间较短,值域0~255 unsigned int 时间较长,值域0~65535for(i=0;i<500;i++) // i为灭灯时间,j为亮灯时间;for(j=0;j<500;j++) // i为灭灯时间,j为亮灯时间;;}void main(void){while(1){P1=0xfe; //第一个灯亮delay(); //调用延时函数P1=0xfd; //第二个灯亮delay(); //调用延时函数P1=0xfb; //第三个灯亮delay(); //调用延时函数P1=0xf7; //第四个灯亮delay(); //调用延时函数P1=0xef; //第五个灯亮delay(); //调用延时函数P1=0xdf; //第六个灯亮delay(); //调用延时函数P1=0xbf; //第七个灯亮delay(); //调用延时函数P1=0x7f; //第八个灯亮delay(); //调用延时函数P1=0xff; //P1口全灭delay(); //调用延时函数P3=0xfe; //第一个灯亮delay(); //调用延时函数P3=0xfd; //第二个灯亮delay(); //调用延时函数P3=0xfb; //第三个灯亮delay(); //调用延时函数P3=0xf7; //第四个灯亮delay(); //调用延时函数P3=0xef; //第五个灯亮delay(); //调用延时函数P3=0xdf; //第六个灯亮delay(); //调用延时函数P3=0xbf; //第七个灯亮delay(); //调用延时函数P3=0x7f; //第八个灯亮delay(); //调用延时函数P3=0xff; //P1口全灭delay(); //调用延时函数}}带开关控制16盏流水灯的程序#include<reg51.h> //包含单片机寄存器的头文件sbit key=P1^0; //P1.0端口为开关key表示开关void delay(void){unsigned int i,j; //unsigned char 时间较短,值域0~255 unsigned int 时间较长,值域0~65535for(i=0;i<500;i++) // i为灭灯时间,j为亮灯时间;for(j=0;j<500;j++) // i为灭灯时间,j为亮灯时间;;}void main(void){while(1){key=1;delay();if(key==0){P0=0xfe; //第一个灯亮delay(); //调用延时函数P0=0xfd; //第二个灯亮delay(); //调用延时函数P0=0xfb; //第三个灯亮delay(); //调用延时函数P0=0xf7; //第四个灯亮delay(); //调用延时函数P0=0xef; //第五个灯亮delay(); //调用延时函数P0=0xdf; //第六个灯亮delay(); //调用延时函数P0=0xbf; //第七个灯亮delay(); //调用延时函数P0=0x7f; //第八个灯亮delay(); //调用延时函数P0=0xff; //P1口全灭delay(); //调用延时函数P2=0x7f; //第一个灯亮delay(); //调用延时函数P2=0xbf; //第二个灯亮delay(); //调用延时函数P2=0xdf; //第三个灯亮delay(); //调用延时函数P2=0xef; //第四个灯亮delay(); //调用延时函数P2=0xf7; //第五个灯亮 delay(); //调用延时函数P2=0xfb; //第六个灯亮delay(); //调用延时函数P2=0xfd; //第七个灯亮 delay(); //调用延时函数P2=0xfe; //第八个灯亮 delay(); //调用延时函数P2=0xff; //P1口全灭delay(); //调用延时函数}}。

430单片机实验报告

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) //扫描键盘获得键值

流水灯代码

流水灯代码
delay(k*100);
}
P1OUT=0XFF;
P2OUT=0XFF;
P3OUT=0XFF;
P4OUT=0XFF;
}
for(j=0;j<8;j++)
{
P1OUT=led3[j];
delay(50);
}
for(j=0;j<8;j++)
{
P2OUT=led3[j];
delay(50);
}
for(j=0;j<8;j++)
int led2[8]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
int led3[8]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
int led4[4]={0x7e,0x3c,0x18,0x00};
int led5[24]={0xee,0xcc,0x88,0x00,0x88,0xcc,0xee,0xff,
{
P3OUT=led3[j];
delay(50);
}
for(j=0;j<8;j++)
{
P4OUT=led3[j];
delay(50);
}
for(j=0;j<8;j++)
{
P1OUT=led6[j];
delay(600);
}
for(j=0;j<8;j++)
{
P2OUT=led6[j];
delay(600);
{
P1OUT=led3[j];
delay(k*100);
}
for(j=0;j<8;j++)

实验流水灯程序

实验流水灯程序

实验二“流水灯”一、实验目的:1.初步了解汇编语言2.通过实验了解单片机最小系统3.了解单片机的I/O口通信。

4.学习延时子程序的编写和使用.二、实验内容:1. 流水灯(跑马灯)(1)……MOV P1, #7FHACALL DELAYMOV P1, #0BFHACALL DELAYMOV P1, #0DFHACALL DELAY……MOV P1, #0FDHACALL DELAYMOV P1, #0FFHACALL DELAY……不科学(2)ORG 00H ;起始地址START: ;程序一开始,初始一些所需要变量,如进位C的清0等MOV A, #0FFH ;累加器A的8位全置1(0FFH),发光二极管全熄灭...CLR C ;进位..0.,.C=0..C.被清MOV R1, #8 ;R1=8,循环..8.次(右移..作计数器......,.用.R1....8.次)RIGHT: ;这是发光二极管向右“流动”......的循环体RRC A ;把进位C在累加器A中从左向右....轮换一位MOV P1, A ;输出至P1口ACALL DELAY ;调延时子程序,延时200msDJNZ R1, RIGHT ;R1减1,如果不为0跳回RIGHT循环执行JMP START ;跳回一开始,重复执行该流水灯程序DELAY: ;延时200ms的子程序MOV R3, #20D1:MOV R4, #20D2:MOV R5, #248 ; 2+248×2=498=498μsDJNZ R5, $;R5减1,如果不为0,就执行本行DJNZ R4, D2 ;2+20×(498+2)=10002μs≈10msDJNZ R3, D1RET ;子程序结束标志,返回主程序END ;程序结束点(3)取表法要显示的数据之间不存在简单的运算关系,不能使用ADD和SUBB等指令根据上一状态计算出下一状态的显示值。

但显示的数据存在依次取用的特点,这时一般就会用到取表的方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档