1、实验23报告姓名 杨帆 学号 2015011735实验班号 3-3 机器号 26实验2 单片机C语言程序结构一、 实验目的掌握单片机C语言程序结构和程序的调试方法以及单片机的基本I/O控制方法。二、 实验基本任务1.练习调试程序Step over(F10)在运行到函数处时不会跟踪到函数内部,而Step Into(F11)则会跟踪到函数内部.遇到的问题:建立的项目的根目录文件夹名称中含有中文,导致断点和Step Into未能准确执行。 2.控制发光二极管的显示变化 可将规律1规律2视作一个完整的过程,因此定义一个12个元素的数组,前八位满足规律1,后四位满足规律2,程序运行过程中只需将12个元素
2、一个个轮过去。 思考:用P1端口控制只需将P1的八个输出端口通过线连接至二极管的端口,设置P1为输出端,其余过程与上思路一致。 3.用按键控制发光二极管的显示变化 在任务2的基础上,只需设置与K1K4连接的两个端口为输入,定义一个变量Key保存按下的按键,按下K1后,使LED的变化在规律一中变化,按下K4后,使LED的变化在规律二中变化。再定义一个Beep函数,每当按键时,将与Buzz连接的P1.7设置为0,再延时一下,再赋为1即可控制蜂鸣器响。 4.(提高)用按键控制步进电机转动 由步进电机工作原理可知,只需使接入步进电机电机的四个端口轮流为1再加入一个延时即可控制步进电机的转动。 (1).
3、定义一个变量sum,每执行一次运转就加一,在转完一圈时使用watch观察sum的值,初步测得约为2200. (2).在任务3和任务4(1) 的基础上稍加修改即可,思路相同实验3 单片机C语言程序设计一、实验目的 在上个实验的基础下加深对单片机的C语言调试和对I/O端口的控制。二、 实验任务1. 并行方式控制数码管的显示(1).在利用Vcc和GND调试后,发现s1、s2、s3和s4连接Vcc,sa等端口连接GND时数码管会工作。 (2)其中P2.0P2.7控制SaSh,P1.0P1.3控制选择亮的数码管(3).定义09,AF数组,分别使四个数码管处于工作状态再将P2OUT赋值为之前定义的数组。显
4、示good只需对每个数码管分别让其按g o o d的形状亮即可。遇到的问题:在显示good时,前一个字母会暂现在下一个数码管上,调试后发现是尚未关闭之前的数码管即对P2OUT赋值了。(4).思路类似于任务(3)的good显示,只需定义一个时间变量T,因为T是小于180s的,所以四位分别为0,T/60,(T%60)/10,T%10.分别显示即可。 思考:延时太短则数码管导通时间变短,显示变暗,延时太长则人眼能分辨出其闪烁。 (5)设置按键只需在试验2的步进电机的基础上改进(4)即可2. 串行方式控制数码管的显示其输出为Q0Q7,所以将Q0Q7与SaSh连接起来控制数码管,将P1.0P1.6与其旁
5、边的接口连接起来,其中P1.0P1.3控制的是哪个数码管亮,而P1.4控制的输入,P1.5控制的是使DS引脚上的数据进入移位寄存器中的脉冲信号,P1.6控制的是使寄存器中的八位数据通过三态门进入到Q0Q7的脉冲信号。思考:(1) 用DS、SHCP、STCP和P2.0、P2.1、P2.2连接起来,只需将上述代码中对P1.4、P1.5、P1.6的赋值改为对P2.0、P2.1、P2.2即可(2) 看门狗可以防止程序跑飞,如果设置了要定时喂狗,不然系统会复位至main函数入口。所以在运行时会自动复位,只有一个数码管会显示0。3.(提高)利用改进的串行方式数码管模块进行显示其中SCLK,RCLK,DIO
6、分别相当于任务2中的SHCP,STCP,DS。唯一不同的是,这里控制哪个数码管亮的数据也有DIO一并输入,所以其格式为前八位为控制数码管中每个二极管的亮灭,后八位为选择哪个数码管亮,其余思路与任务2一致。实验代码(点开旁边小三角即可查看)实验2任务2#include io430.hconst int LED12=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xdb,0xe7,0x7e,0xbd;int main( void ) int i,j; WDTCTL = WDTPW + WDTHOLD; P2SEL=0; P2SEL2=0; P2DIR=0xff;
7、while(1) for(i=0;i12;i+) /前八位为规律一,后八位为规律二 P2OUT=LEDi; for(j=0;j6) i=-1; i=i+1; else if(Key=2) /i从8到11为规律二 if(i10|i8) i=7; i=i+1; P2OUT=LEDdatai; /显示 delay(); void delay() int i; for(i=0;i0xffff;i+);void Beep() /按下按键时响 int j; P1OUT&=BIT7; for(j=0;j0xffff;j+); P1OUT|=BIT7;步进电机1#include io430.hconst ch
8、ar BIT4=1,2,4,8;int main ( void ) WDTCTL = WDTPW + WDTHOLD; /关闭看门狗 int i,j; P2SEL=0; P2SEL2=0; P2DIR=0xff; P2OUT=0xff; P1REN=0x7f; P1OUT=0xff; P1DIR=0xf0; while(1) for(sum=0;sum3) i=0; P2OUT=BITi; for(j=0;j0x18f;j+); for(sum=0;sum2200;sum+) /反转 i=i-1; if(i0) i=3; P2OUT=BITi; for(j=0;j0x18f;j+); 步进电机
9、2#include io430.hvoid delay( );const char BIT4=1,2,4,8;int main ( void ) WDTCTL = WDTPW + WDTHOLD; /关闭看门狗 int i,Key,j,sum=0; P2SEL=0; P2SEL2=0; P2DIR=0xff; P2OUT=0xff; P1REN=0x7f; P1OUT=0xff; P1SEL=0; P1SEL2=0; P1DIR=0xf0; while(1) if(P1IN&0x01)=0) /判断K1是否按下 Key=1; Beep(); else if(P1IN&0x02)=0) /判断K
10、2是否按下 Key=2; Beep(); else if(P1IN&0x04)=0) /判断K3是否按下 Key=3; Beep(); if(Key=1) /正转 i=i+1; if(i=4) i=0; P2OUT=BITi; for(j=0;j0x18f;j+); else if(Key=2) /反转 i=i-1; if(i=-1) i=3; P2OUT=BITi; for(j=0;j0x18f;j+); else if(Key=3) /停止 P2OUT=0; void Beep() /按下按键时响 int j; P1OUT&=BIT7; for(j=0;j0xffff;j+); P1OUT
11、|=BIT7;实验31.3#include io430.hconst int A16=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;const int B4=0x21,0xc0,0xc0,0x90;void delay() int j; for(j=0;j0xffff;j+);int t=1; /t为1,2,4,8即BIT0,1,2,3int main( void ) WDTCTL = WDTPW + WDTHOLD; int i,j; P1SEL=0; P1SEL2=0; P1D
12、IR|=(BIT0+BIT1+BIT2+BIT3); P2SEL=0; P2SEL2=0; P2DIR=0xff; P2OUT=0xff; while(1) t=1; for(j=0;j4&t10;j+) P1OUT=(BIT0+BIT1+BIT2+BIT3); P1OUT|=t; t=2*t; for(i=0;i16;i+) P2OUT=Ai; delay(); return 0;1.4#includeio430.hconst int A10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;int T=0,i=0,t0,t1,t2,t,j;
13、void Beep() int i; P1OUT&=BIT7; for(i=0;i0xffff;i+); P1OUT|=BIT7;int main(void) WDTCTL = WDTPW + WDTHOLD; P1SEL=0; P1SEL2=0; P2SEL=0; P2SEL2=0; P1DIR|=(BIT0+BIT1+BIT2+BIT3+BIT7); P2DIR=0xff; P2OUT=0; P1OUT=0x80; while(1) T+; /计算四位分别显示什么 t0=T%10; t1=(T%60)/10; t2=T/60; if(t2=3) T=0; Beep(); for(i=0;i
14、0xaf;i+) P2OUT=At0; P1OUT|=BIT0; for(j=1;j100;j+); P1OUT&=BIT0; P2OUT=At1; P1OUT|=BIT1; for(j=1;j100;j+); P1OUT&=BIT1; t=At2; t&=BIT7; P2OUT=t; P1OUT|=BIT2; for(j=1;j100;j+); P1OUT&=BIT2; P2OUT=0xc0; P1OUT|=BIT3; for(j=1;j100;j+); P1OUT&=BIT3; 1.5#includeio430.hconst int A10=0xc0,0xf9,0xa4,0xb0,0x99
15、,0x92,0x82,0xf8,0x80,0x90;int T=0,i=0,t0,t1,t2,t,Key;void Show();void Beep() int i; P1OUT&=BIT7; for(i=0;i0xffff;i+); P1OUT|=BIT7;int main(void) WDTCTL = WDTPW + WDTHOLD; P1SEL=0; P1SEL2=0; P2SEL=0; P2SEL2=0; P1DIR|=(BIT0+BIT1+BIT2+BIT3+BIT4); P1DIR&=(BIT5+BIT6+BIT7); P1REN|=(BIT5+BIT6+BIT7); P2DIR=
16、0xff; P2OUT=0; P1OUT=0xe0; while(1) t0=T%10; t1=(T%60)/10; t2=T/60; if(t2=3) T=0; Beep(); if(P1IN&BIT5)=0) Key=1; else if(P1IN&BIT6)=0) Key=2; else if(P1IN&BIT7)=0) Key=3; if(Key=1) /按下K6归零 T=0; else if(Key=3) /按下K8则T+1s T+; Show(); void Show() int i; for(i=0;i0x2fff;i+) P2OUT=At0; P1OUT|=BIT0; P1OU
17、T&=BIT0; P2OUT=At1; P1OUT|=BIT1; P1OUT&=BIT1; t=At2; t&=BIT7; P2OUT=t; P1OUT|=BIT2; P1OUT&=BIT2; P2OUT=0xc0; P1OUT|=BIT3; P1OUT&=BIT3; 任务二#include io430.hconst char LEDtab16=0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e;const int BIT=1,2,4,8,0x10,0x20,
18、0x40,0x80;char data;void delay() int m; for(m=0;m0xffff;m+);void listdata();int main(void) WDTCTL = WDTPW + WDTHOLD; int i,k=1; P1SEL=0; P1SEL2=0; P1DIR=0xff; P1OUT=0; while(1) P1OUT|=k; for(i=0;i16;i+) data=LEDtabi; listdata(); delay(); P1OUT&=k; k=2*k; if(k=16) k=1; void listdata() int i; for(i=0;
19、i8;i+) if(data&BIT7)=0) P1OUT&=BIT4; else P1OUT|=BIT4; data=data*2; P1OUT|=BIT5; P1OUT&=BIT5; P1OUT|=BIT6; P1OUT&=BIT6;任务三#include io430.hconst char LEDtab4=0x21,0xa3,0xa3,0x90;const char BIT8=1,2,4,8,0x10,0x20,0x40,0x80;char data;int main(void) WDTCTL = WDTPW + WDTHOLD; P2SEL=0; P2SEL2=0; P2DIR=0xf
20、f; P2OUT=0; int i,k,t; while(1) for(i=0;i4;i+) /四个数码管分别亮 data=LEDtabi; for(k=0;k8;k+) /输出字母 if(data&BIT7-k)=0) P2OUT&=BIT2; else P2OUT|=BIT2; P2OUT|=BIT0; P2OUT&=BIT0; data=BITi; for(k=0;k8;k+) /输出亮的数码管 if(data&BIT7-k)=0) P2OUT&=BIT2; else P2OUT|=BIT2; P2OUT|=BIT0; P2OUT&=BIT0; P2OUT|=BIT1; P2OUT&=BIT1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1