单片机实验报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“实验报告单片机”。
实验名称:单片机C语言程序结构和设计(实验2、3)姓名_ __
学号_ 实验班号_ 机器号__
一、实验目的:
1.掌握单片机C语言程序结构; 2.掌握单片机C语言程序调试方法;
3.掌握MSP430FG2553基本I/O控制方法; 4.巩固编写和调试单片机C语言程序方法; 5.了解简单接口电路的控制方法;
6.了解MSP430汇编格式的寻址方式和指令系统
二、实验基本任务
1、练习调试程序
内容:用跳线将实验板上的8个发光二极管与单片机连接。编写的程序L2_debug.C如下,功能是控制与单片机相连接的8个发光二极管在全亮与全灭这两种状态下循环变换。该程序没有语法上的错误,但运行后不能实现上述现象,请上机调试其中的问题,指出程序的问题,并修改程序。
答: 将单片机P2端口的8个引脚与L1~L8相连。电路如下:
原有程序为:
通过上机调试,发现原程序有以下错误:
① 由于是P2端口上引脚与LED相接,所以应该设置P2而不是P1 ② 应将P2端口调为基本I/O端口,仅通过DIR寄存器是不行的 ③ 源程序没有对P2OUT进行初始化,无法达到全亮全灭的效果
④ 没有循环结构,无法达到全亮全灭的循环效果,可用for(;;)或while(1)结构 ⑤ delay()函数延时过短,人眼几乎无法感受亮灭的变化 正确的程序应为: #include “io430.h” void delay();int main(void){
WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
P2SEL=0;
//将P2端口设为基本I/O端口
P2SEL2=0;
P2DIR=0Xff;
//设置端口2为输出方向
P2OUT=0;
//初始化P2端口引脚,For(;;){
P2OUT=~P2OUT;
delay();} } void delay(){
unsigned int j;
for(j=0;j
//延时 } 2.
控制发光二极管的显示变化
在任务 1 的连线基础上,编程控制 8 个发光二极管按下面的 2 种规律循环变换,即规 律 1→规律 2→规律 1→规律 2→……,如此循环反复。
1)规律 1:8 个 LED 灯顺时针一个一个单独点亮,即 L1 L2……L7 L8 亮,每次只有一个灯亮,其他灯灭;
2)规律 2:8 个LED灯两两点亮,顺序为 L1 和 L8,L2和 L7,L3 和 L6,L4 和 L5,每次只有两个灯亮,其他灯灭; 答:程序如下: #include “io430.h” void delay();void rule1();void rule2();int main(void){
WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
P2SEL=0;
//将P2端口设为基本I/O端口
P2SEL2=0;
P2DIR=0Xff;
//设置端口2为输出方向
P2OUT=0;
//初始化P2端口引脚,for(;;){
rule1();
rule2();
} } void rule1()
//规律1 {
unsigned char LED_0=0x01,LED_temp;
LED_temp=LED_0;
for(unsigned int i=0;i
{
P2OUT=~LED_temp;
delay();
LED_temp=LED_temp
} } void rule2()
//规律2 {
unsigned char LED_data[]={0x81,0x42,0x24,0x18};
for(unsigned int i=0;i
{
P2OUT=~LED_data[i];
delay();
} } void delay(){
unsigned int j;
for(j=0;j
//延时 }
思考:
如果选择用单片机的 P1 端口控制 8 个发光二极管,如何在实验板上设计连线、并编程实现任务 2 的功能?
答:
设计连线:将P1端口的8个引脚与L1~L8对应相连。
程序设计:将原先程序中所有关于P2端口的操作都换为P1端口即可 3.用按键控制发光二极管的显示变化
在任务 2 基础上,增加 2 个按键与单片机的引脚相连,编程实现由按键控制发光二级管 的显示变化:当按下实验板上的 K1 键时,8 个发光二极管按任务 2 中的规律 1 变化; 当按下实验板上的 K2 键时,8 个发光二极管按任务 2 中的规律 2 变化。
答:在实验1的连线基础上,将P1.0、P1.1分别于K1、K2相连。如下图
程序如下:
#include “io430.h” void delay();void rule1();void rule2();int main(void){
WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
P2SEL=0;
//将P2端口设为基本I/O端口
P2SEL2=0;
P2DIR=0xff;
//设置端口2为输出方向
P2OUT=0;//初始化P2端口引脚,P1SEL&=~(BIT0+BIT1);//设置P1为基本I/O
P1SEL2&=~(BIT0+BIT1);
P1DIR&=~(BIT0+BIT1);//设置P1.0和P1.1为输入状态
P1REN=0x03;//使P1.0和P1.1能上拉电阻
P1OUT=0x03;
int key=2;
for(;;)
{
if((P1IN&BIT0)==0)
key=0;
else if((P1IN&BIT1)==0)
key=1;
if(key==0)
rule1();
else if(key==1)
rule2();
} }
void rule1()
//规律1 {
unsigned char LED_0=0x01,LED_temp;
LED_temp=LED_0;
for(unsigned int i=0;i
{
P2OUT=~LED_temp;
delay();
LED_temp=LED_temp
} } void rule2()
//规律2 {
unsigned char LED_data[]={0x81,0x42,0x24,0x18};
for(unsigned int i=0;i
{
P2OUT=~LED_data[i];
delay();
} } void delay(){
unsigned int j;
for(j=0;j
//延时 } 4.并行方式控制数码管的显示
参看附录A,掌握 MSP430G2553 扩展板上 4 个数码管的工作原理,用单片机的 8 个 I/O 引脚并行控制数码管的控制端 Sh~Sa,设计相关连线。编程完成下面任务:
1)画出单片机与 4 个数码管连接的原理图,分析控制方法;
2)编程控制四个数码管从右到左、依次每个数码管分别循环显示 0~
9、A~F。
3)用 4 个数码管做一个电子表,高两位数码管显示分钟值,低两位数码管显示秒值。每计数到 5分钟时,控制蜂鸣器发出一报警声,然后又从 0 开始重新计时。
其中 1 秒时间可通过延时完成,如执行 for(i=0;i
思考:每个数码管显示的时间不能太长,也不能太短,为什么?
答:
1)原理图如下:
控制方法:
P2.0~P2.7与S a~S h相连,控制LED灯的亮灭,P1.0~P1.3控制选择哪一个数码管进行输出。
2)编程控制四个数码管从右到左、依次每个数码管分别循环显示 0~
9、A~F。程序如下: #include “io430.h” void delay();const char LEDtab[16]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};int main(void){ WDTCTL = WDTPW + WDTHOLD;//关闭看门狗 P1SEL=0;//设置P1为基本I/O P1SEL2=0;P1DIR=0xff;//设置P1为输出出口 P1OUT=0;P2SEL=0;//设置P2为基本I/O P2SEL2=0;P2DIR=0xff;//设置P2为输出出口 P2OUT=0xff;unsigned int i;for(;;){ P1OUT=BIT0;//第一个数码管开始输出 for(i=0;i
其中 1 秒时间可通过延时完成,如执行 for(i=0;i
答:在上述连线的基础上,将P1.7与BUZZ相连,程序如下
#include “io430.h” void delay();void second();const char LEDtab[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};unsigned char a,b,c,d;int main(void){ // 关闭看门狗
WDTCTL = WDTPW + WDTHOLD;P1SEL=0;P1SEL2=0;P1DIR=0xff;P1OUT=0+BIT7;P2SEL=0;P2SEL2=0;P2DIR=0xff;P2OUT=0xff;//初始化 for(;;){ a=b=c=d=~0x3F;for(int k=0;k
答:时间过长,没有连续的效果;时间过短,不利于观察读数。5.汇编格式指令和寻址方式的学习(可在simulator下完成)
L2_2.c源程序见下,建立C项目,进入DEBUG状态,点击view/disaembly,在反汇编 窗口得到L2_2.c汇编格式指令的程序代码,如图2-1和图2-2,阅读该程序的汇编格 式代码。
1)程序用到了哪些指令?
答:数据传送指令;调用指令;逻辑运算指令;跳转指令;堆栈操作指令;减法运算指令;加法运算指令;返回指令;无条件转移指令。2)程序用到了哪几种寻址方式?
答:立即数寻址;寄存器寻址;绝对地址寻址;符号地址寻址。
3)修改l2_2.C,将变量i定义为全局变量,通过反汇编的代码,比较与定义为局部变
量的不同;
答:定义为全局变量时寻址方式为绝对寻址;而定义为局部变量时为寄存器寻址;全局变量在分配内存是是分配在数据区的,所以所有的程序代码都可以访问,但是局部变量是在堆栈段,所以局部变量在使用完成之后就消失了的
4)修改L2_2.C, 将变量i的类型从 unsigned int 类型,改为unsigned long 类型,反汇编看看函数delay的代码发生了什么变化?程序执行的结果有什么不同?为什 么?(需在实验板上运行)。
答:
① 代码增加了。unsigned int类型下
Unsigned long 类型下:
② 程序执行时,发光二极管亮灭的时间间隔增大 ③ delay程序执行时间增长
三、已完成的选做任务
1.(选做)用蜂鸣器、发光二极管显示按键信息
设计在实验板上用 3 个相邻发光二极管、8 个按键、1 个蜂鸣器与单片机的连接,编程
完成每按下某一个键,8个发光二极管以二进制形式显示该键值,K1~K8 的键值分别 为 000~111B,同时每按下一次键,蜂鸣器响一下,用声音提示接收到按键信息。答:连线:将P2.0~P2.2分别于L1~L3相连,P2.3与BUZZ相连,P1.0~P1.7分别与K1~K8 相连.程序如下:
#include “io430.h” void delay();int main(void){
WDTCTL = WDTPW + WDTHOLD;
P2SEL&=0xf0;
P2SEL2&=0xf0;
P2OUT|=0x0f;
P2DIR=0xff;
P1REN=0xff;
P1OUT=0xff;
P1SEL=0;
P1SEL2=0;
P1DIR=0x00;
//初始化
for(;;){
if((P1IN&BIT0)==0)
//按下K1
{
P2OUT=0x07;
//LED灯显示为000,蜂鸣器响
delay();
P2OUT+=BIT3;
//蜂鸣器停止响
};
if((P1IN&BIT1)==0)
{
P2OUT=0x06;
delay();
P2OUT+=BIT3;
};
if((P1IN&BIT2)==0)
{
P2OUT=0x05;
delay();
P2OUT+=BIT3;
};
if((P1IN&BIT3)==0)
{
P2OUT=0x04;
delay();
P2OUT+=BIT3;
};
if((P1IN&BIT4)==0)
{
P2OUT=0x03;
delay();
P2OUT+=BIT3;
};
if((P1IN&BIT5)==0)
{
P2OUT=0x02;
delay();
P2OUT+=BIT3;
};
if((P1IN&BIT6)==0)
{
P2OUT=0x01;
delay();
P2OUT+=BIT3;
};
if((P1IN&BIT7)==0)
{
P2OUT=0x00;
delay();
P2OUT+=BIT3;
};
};} void delay(){
unsigned int i;
for(i=0;i
//延时 } 2.(选做)增加按键控制功能:
按下 K1 键开始计时(或称继续计时)
K2 键暂停计时,计时保持不变,此后若
;按下 按下 K1 键将继续计时;按下 K3 键将计时归零,并停止计时,若此后按下 K1 键,将开始计时。
答:在前面并行电路制作电子表连线的基础上,将P1.4~P1.6与K1~K3相连
程序如下:
#include “io430.h” void delay();void second();const char LEDtab[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};unsigned char a,b,c,d;unsigned char key=0;int main(void){ // 关闭看门狗
WDTCTL = WDTPW + WDTHOLD;P1SEL=0;P1SEL2=0;P1DIR=0x8f;//设置P1引脚的输入输出状态 P1REN=0x70;//使P1.4~P1.6能上拉电阻 P1OUT=BIT4+BIT5+BIT6+BIT7;P2SEL=0;P2SEL2=0;P2DIR=0xff;P2OUT=0xff;//初始化 while(1){ while(key!=1){ //等待按K1键开始计时 if((P1IN&BIT4)==0)key=1;} a=b=c=d=~0x3f;unsigned char flag=1;for(int k=0;k
1)画出单片机与 4 个数码管连接的原理图,分析控制方法;
2)编程控制四个数码管从右到左、依次每个数码管分别循环显示 0~
9、A~F。
3)用 4 个数码管做一个电子表,高两位数码管显示分钟值,低两位数码管显示秒值。每计数到 5分钟时,控制蜂鸣器发出一报警声,然后又从 0 开始重新计时。其中 1 秒时间可通过延时完成,如执行 for(i=0;i
1)原理图如下:
2)编程控制四个数码管从右到左、依次每个数码管分别循环显示 0~
9、A~F。答: 连线方式:
将P1.0~P1.3与S1~S4相连,P1.4与DS相连,P1.5与SHCP相连,P1.6与STCP相连,Sa~Sh与Q0~Q7相连。程序如下:
#include “io430.h” void output(char Data);void delay();const char LEDtab[16]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};int main(void){
WDTCTL = WDTPW + WDTHOLD;
P1SEL=0;
P1SEL2=0;
P1DIR=0XFF;
P1OUT=BIT7;
//初始化
while(1)
{
P1OUT=BIT0+BIT7;
//第一个数码管输出
for(int i=0;i
{
output(LEDtab[i]);
for(int i=0;i
P1OUT=BIT1+BIT7;
for(int i=0;i
{
output(LEDtab[i]);
for(int i=0;i
P1OUT=BIT2+BIT7;
for(int i=0;i
{
output(LEDtab[i]);
for(int i=0;i
P1OUT=BIT3+BIT7;
for(int i=0;i
{
output(LEDtab[i]);
for(int i=0;i
} }
void output(char Data)
//串行方式输出指定信号 {
for(int i=0;i
{
if((Data&BIT7)==0)
P1OUT&=~BIT4;
else
P1OUT|=BIT4;
Data=Data
P1OUT|=BIT5;
delay();
P1OUT&=~BIT5;
}
P1OUT|=BIT6;
delay();
P1OUT&=~BIT6;} void delay()
//延时函数 {
for(int i=0;i
WDTCTL = WDTPW + WDTHOLD;// 关闭看门狗
P1SEL=0;
P1SEL2=0;
P1DIR=0XFF;
P1OUT=BIT7;
//初始化
for(;;){
a=b=c=d=~0x3F;
for(int k=0;k
//分钟
{
c=LEDtab[k];
for(int j=0;j
//秒钟十位
{
b=LEDtab[j];
for(int i=0;i
{
a=LEDtab[i];
second();
}
}
}
P1OUT=~BIT7;
//报警声
for(int j=0;j
} } void output(char Data)
//串行方式向数码管输出信号 {
for(int i=0;i
{
if((Data&BIT7)==0)
P1OUT&=~BIT4;
else
P1OUT|=BIT4;
Data=Data
P1OUT|=BIT5;
delay();
P1OUT&=~BIT5;
}
P1OUT|=BIT6;
delay();
P1OUT&=~BIT6;} void delay()
//延时函数 {
for(int j=0;j
for(int j=0;j
output(a);
P1OUT=BIT0+BIT7;
delay();
output(b);
P1OUT=BIT1+BIT7;
delay();
output(c);
P1OUT=BIT2+BIT7;
delay();
output(d);
P1OUT=BIT3+BIT7;delay();}} 思考:
如果数码管电路的控制端DS、SHCP、STCP分别与单片机的P2.0~P2.2相连,如何修改程序? 答:引脚初始化时也将P2端口的前三个引脚初始化,然后将上述程序中的output()函数定义改为:
void output(char Data)
//串行方式向数码管输出信号 {
for(int i=0;i
{
if((Data&BIT7)==0)
P2OUT&=~BIT0;
else
P2OUT|=BIT0;
Data=Data
P2OUT|=BIT1;
delay();
P2OUT&=~BIT1;
}
P2OUT|=BIT2;
delay();
P2OUT&=~BIT2;} 如果程序中没有关闭看门狗那条语句,后果是什么?
答:后果是一直保持初始状态不变。根据查阅的资料,看门狗是防止程序出现跑飞死机的问题,当开启看门狗后,没有相应的喂狗程序,就会自动复位,使得程序执行失败。
《单片机原理及应用》实 验 报 告2017—2018学年第一学期班级: 152 专业: 电子科学与技术 姓名: 子路 学号: 教师:实验一:Keil C51 一、实验目的1、熟悉Keil C51单片机应用开发系......
实验一一、实验题目:试编写一段程序,其功能为将21H单元的内容8位分别依次存放到从22H开始的8单元中。二、keil代码:org 0000h jmp start org 0100h start: mov 21h,#8; mov A......
51单片机控制流水灯目录 (1)51精简开发板简介 (2)实验目的 (3)实验内容 (4)元件 (5)原理图 (6)实验步骤(7)主要功能介绍(8)实验错误及分析 (9)调试及程序 (10)系统测试 (11)实验心得一、51精简开发......
实验四、中断交通灯实验林立强1000850116一、实验目的1、了解MCS-51单片机的组成、中断原理,中断处理过程、外部中断的中断方式。2、掌握中断响应及处理的编程方法。二、实验......
单片机实验报告一、实验目的1.熟练使用Keil、Protues两款软件 2.通过上机操作,增强个人动手实践能力 3.加深对理论知识的理解4.培养运用汇编语言进行初步编写程序的能力二、......