单片机基础实验报告

2024-04-26

单片机基础实验报告(精选6篇)

篇1:单片机基础实验报告

实验报告

课程名称:微机原理与接口技术

指导老师:李素敏

学生姓名:

学号:

专业: 自动化

日期:2014-04-10 地点:理工楼603

实验二

1.实验目的和要求

① 掌握keil软件和STC-ISP 软件的使用方法 ② 熟悉发光管的工作原理 ③ 通过编程体验发光管的延时闪烁及移位等功能

2.主要仪器设备

PC机

单片机学习开发套件(型号:89C52RC)

3.实验内容

①实验内容1:第一个发光管以间隔200ms闪烁

源程序:

#include #define uint unsigned int

//宏定义

main(){

while(1){ P1=0xfe;delay(200);P1=0xff;delay(200);} } void delay(uint z)//延时函数,z的取值为这个函数的延时ms数 {

uint x,y;for(x=z;x>0;x--)

for(y=110;y>0;y--);

一台一件

}

实验结果说明:要使发光管闪烁,只需设置合适的时间延时即可。

②实验内容2 : 8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。

源程序:

#include

#include //后面要用到它里面的_crol_(k,l)函数 //这个函数的意思是把一个字符变量k 循环左移l 位 #define uint unsigned int

//宏定义

unsigned char a,b,k,j;

//定义五个字符变量 sbit beep=P2^3;// 定义蜂鸣器的接口

void delay(uint z)//延时函数,z的取值为这个函数的延时ms数 {

uint x,y;for(x=z;x>0;x--)

for(y=110;y>0;y--);}

void main(){

k=0xfe;//先给k一个初值11111110等待移位 while(1){

delay500ms();

beep=0;//打开蜂鸣器

delay500ms();//让它响500ms

beep=1;//关闭蜂鸣器

j=_crol_(k,1);//把k循环左移一位

k=j;//把移完的值再送给k

P1=j;//同时把值送到P1口点亮发光二极管 } //再次循环 }

实验结果说明:在此程序中用到了_crol_(k,l)函数,此函数的功能在于循环移位,在每次发光管闪烁相应时间后左移一位,把移完的值再送到P口,点亮对应的发光管。这样循环往复,达到发光管流动的效果。

③实验内容3 :用8个发光管演示出8位二进制数累加过程,即用8个二极管表示8个二进制位(亮为1,灭为0),依次以二进制形式显示0,1,2,……255。

源程序: #include

#include //包含有左右循环移位子函数的库 #define uint unsigned int

//宏定义 #define uchar unsigned char //宏定义

void delay(uint z)//延时函数,z的取值为这个函数的延时ms数,{

uint x,y;for(x=z;x>0;x--)

for(y=110;y>0;y--);} void main()

//主函数 {

} uchar a;while(1)

//大循环 {

} a++;P1=~a;delay(200);

实验结果说明:在此定义一个无符号字符变量a,a的值进行累加,但是由于表示的二进制数要求亮为1,灭为0,与发光管的0亮1灭正好相反,所以将a的计数取反并设置相应延时,重复此过程就得到了在发光管上显示八位二进制数的累加过程。

④实验内容4 :间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。

源程序:

#include //52单片机头文件

#include //包含有左右循环移位子函数的库 #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义

void delay(uint z)//延时函数,z的取值为这个函数的延时ms数 {

uint x,y;for(x=z;x>0;x--)

for(y=110;y>0;y--);} void main()//主函数 { uchar a,i,j;while(1)//大循环

} {

} a=0xfe;//赋初值

for(j=0;j<8;j++){ for(i=0;i<8-j;i++)//左移

} {

P1=a;//点亮小灯

delay(300);//延时300毫秒

a=_crol_(a,1);//将a变量循环左移一位

} a=_crol_(a,j);//补齐,方便下面的左移一位 P1=0xff;//全部关闭

a=a<<1;//左移一位让多一个灯点亮

4.心得体会:此次实验中练习较多的就是闪烁和移位,在编程过程中,设置闪烁的时间必须达到人眼正常观察的要求,这就需要计算合适的闪烁时间,不停的尝试,最终选择适宜观察的时间间隔。发光管的循环移位时调用_crol_(k,l)函数

可以大大简化编程的行数。所以熟悉单片机的函数库,可以方便我们编程。所以在以后的实验中还得继续学习这个函数库,从而更轻松的完成实验内容。

篇2:单片机基础实验报告

班级:

姓名:

学号:

组别:

课程名称:单片机原理及应用

实验室:

实验时间:

实验项目名称:

实验一

MCS-51单片机及其开发系统(仿真器)的认识 一、实验目的:

学习并掌握单片机仿真系统的操作方法,熟悉系统功能及用法。

(1)了解MCS-51单片机开发常用工具。

(2)了解仿真器构成、功能及连接。

(3)掌握MCS-51开发软件(汇编器)安装、功能及基本操作。

(4)掌握源程序的编辑、汇编、运行(包括连续执行、单步执行和跟踪执行)。

(5)掌握汇编语言指令与机器语言指令之间的对应关系。

(6)掌握ORG、DATA、BIT等伪指令的作用。

(7)掌握在仿真开发系统下浏览、修改特殊功能寄存器、内部RAM、外部RAM单元的方法。

(8)理解MCS-51单片机在复位期间及复位后有关引脚的状态、特殊功能寄存器的初值。

二、实验内容及原理:

MdeWin单片机仿真系统的安装、设置、主要功能操作练习。

三、实验器材:

MdeWin单片机仿真系统一套、PC机一台。

四、实验步骤及实验结果分析:

一、程序输入练习:

首先在Medwin下新建一项目,并新建一后缀名为asm的文件(汇编源文件),并添加入项目中。

按规定的格式输入以上程序(只输源程序部分)。

二、程序运行和控制:

1.程序的编译、产生代码并装入: 输入源程序完毕后,可在“项目管理”窗口中点击“编译/汇编”选项,如程序无输入错误、语法错误等,编译完成。在消息窗口中,产生编译成功信息。如有错误,则消息窗口中指出错误所在行及错误类型,请重新修改源程序。

编译成功后,在“项目管理”窗口中点击“产生代码并装入”选项,对编译无误后产生的OBJ文件进行连接,并把代码装入仿真器。代码装入仿真器后,即可实行仿真。

可在反汇编窗口中查看编译产生的机器码,并与上述程序中对照。

记录你认为能说明问题的检查结果。

2.程序的全速、断点、单步等执行方式: 为提高调试程序的运行速度,程序采用全速断点运行方式。

练习设置及取消设置程序断点。

比较单步及跟踪两种程序运行方式的不同。

3.查看单片机各种资源状态及内容:

在“察看”窗口中可以查看单片机内部及程序变量等各种资源,在单步或程序断点运行中可以实时观察单片机SFR、内外RAM、程序变量等内容,可以很方便的观测程序的运行状况。

将观测的结果记录下来以便和程序分析结果相比较。

三.程序输入补充练习1.汇编语言源程序编辑、运行及调试,输入、编辑、汇编、运行(连续、单步执行)如下程序段:

;变量定义区

XVAR DATA

30H

;定义变量 X,Y地址

YVAR DATA

38H

P10 BIT

P1.0

;位定义P1.0定义为P10

ORG

0000H

;伪指令 定义PC开始位置

LJMP

MAIN

;长跳转到主程序位置

ORG

0100H

;伪指令 主程序开始位置 MAIN: MOV SP, #9FH

;设置堆栈地址

MOV A, #55H

;A=55H

MOV XVAR, A

;XVAR(30H)=55H

MOV R0, #XVAR

;R0=30H

MOV @R0, #01H

;(30H)=01H

INC R0

;R0=31H

MOV @R0, #02H

;(31H)=02H

MOV R1, #YVAR

;R1=38H

MOV A, @R0

;A=02H

MOV @R1, A

;(38H)=02H

PUSH Acc

;压栈操作A0,A1存储acc和psw

PUSH PSW

;

MOV A, #0AAH

;A=AAH

SETB RS0

;01 选用第一区寄存器

CLR RS1

MOV R0, #5AH

;R0=5AH

MOV R1, #0A5H

;R1=A5H

POP PSW

;出栈操作释放acc和psw

POP ACC

INC R1

;R1=39H

DEC R0

;R0=30H

MOV A, @R0

;A=01H

MOV @R1, A

;(39H)=01H

CLR P1.0

SETB P1.0

;置位P1.0

MOV 90H, #00H

;(90H)=00H

MOV 90H, #55H

;(90H)=55H

MOV 90H, #0FFH

;(90H)=FFH

MOV P1, #00H

;P1=00H

MOV P1, #55H

;P1=55H

MOV P1, #0FFH

;P1=FFH

SJMP $

END(1)找出每条指令的机器码,并与第3章指令码表对照,指出每一指令的功能、寻址方式、操作数书写形式。

地址

机器码

指令

目的操作数/ / 源操作数

MOV SP, #9FH

目的操作数:直接寻址;源操作数:立即寻址 MOV A, #55H

目的操作数:寄存器寻址;源操作数:立即寻址; MOV XVAR, A

目的操作数:直接寻址;源操作数:寄存器寻址; MOV R0, #XVAR

目的操作数:寄存器寻址;源操作数:立即寻址;

MOV @R0, #01H

目的操作数:寄存器间接寻址;源操作数:立即寻址; INC R0

寄存器寻址 MOV @R0, #02H

目的操作数:寄存器间接寻址;源操作数:立即寻址; MOV R1, #YVAR

目的操作数:寄存器寻址;源操作数:立即寻址; MOV A, @R0

目的操作数:寄存器寻址;源操作数:寄存器间接寻址; MOV @R1, A

目的操作数:寄存器间接寻址;源操作数:寄存器寻址; PUSH Acc;

将Acc中的内容压入堆栈;直接寻址 PUSH PSW

将PSW压入堆栈;直接寻址 MOV A, #0AAH

目的操作数:寄存器寻址;源操作数:立即寻址; SETB RS0

位寻址 CLR RS1

位寻址 MOV R0, #5AH

目的操作数:寄存器寻址;源操作数:立即寻址; MOV R1, #0A5H

目的操作数:寄存器寻址;源操作数:立即寻址; POP PSW

按压栈顺序放入PSW; 直接寻址 POP ACC

按压栈顺序放入Acc;直接寻址 INC R1

寄存器寻址 DEC R0

寄存器寻址

MOV A, @R0

目的操作数:寄存器寻址;源操作数:寄存器间接寻址; MOV @R1, A

机器码:F7;R1=A;

目的操作数:寄存器间接寻址;源操作数:立即寻址; CLR P1.0

将p10口清零 SETB P1.0

将P10口置一; 位寻址 MOV 90H, #00H

机器码:759000;(90H)=00H;目的操作数:直接寻址;源操作数:立即寻址; MOV 90H, #55H

目的操作数:直接寻址;源操作数:立即寻址; MOV 90H, #0FFH

目的操作数:直接寻址;源操作数:立即寻址; MOV P1, #00H

目的操作数:直接寻址;源操作数:立即寻址;

MOV P1, #55H

目的操作数:直接寻址;源操作数:立即寻址; MOV 90H, #0FFH

目的操作数:直接寻址;源操作数:立即寻址; SJMP $

(2)在单步执行过程中,每执行一条命令后,观察并记录有关寄存器、内存单元的变化情况。设置断点后,再连续执行,记录30H、31H、38H单元内容,与复位后的内容进行比较,由此得出什么结论?

全速执行

全速执行后复位

执行至断点处

全速执行到结束 由上图可见,全速执行后并不会输出结果,只有当程序复位之后才会将结果显示出来,但是设置断点后,运行至断点就会显示已运行的结果,由此我得出结论:当全速运行到最后时,系统处于原地跳转状态,只要系统不停下就不显示结果,而设置断点后,到达断点就会停止运行,从而显示运算结果。而单步执行在每一步执行之后,对应地址的数值就会立刻改改变。

(3)修改ORG 100H指令后的地址,重新汇编,观察程序代码在程序存储器中存放位置的变化情况。记录你认为能说明问题的检查结果。

ORG 300H

ORG 1000H 五、在实验过程中遇到的问题及解决方法(1)

软件安装出错

解决:删除注册表,在注册表的删除过程中,必须要删干净,然后换安装包重装。

(2)

出栈时,寄存器的数值改编 解决:psw 出栈时,改变了 rs0,rs1 的值,也就是换回了 0 区寄存器。因此个寄存器的数值均为压栈前的数值。

六、实验结论

篇3:单片机基础实验报告

培养“应对尚未想象出的工作的适应能力”已经成为以培养高素质应用型人才为目标的高等职业教育的使命[2]。高职护理教育就是以未来就业为导向的教育。在当今激烈的就业竞争市场中, 要提升高职护生就业竞争力, 就必须加强其关键能力培养。为此, 自2009年起, 我们在本校选取了4个护理专业高职班, 对护理学基础课程实验报告书写模式进行了探索性研究, 以提升学生关键能力。以往, 高职护生沿用多年的实验报告书写模式是: (1) 目的; (2) 评估; (3) 计划; (4) 评价; (5) 感想。

该模式是按照护理程序的工作方法制定的, 其优点是有利于使学生形成护理工作的固定思维模式, 最大弊端是学生无需动脑, 只要大段抄书即可, 不能很好地锻炼和提升学生的思维能力。为此, 我们通过改革护理学基础实验报告模式, 培养学生反思能力。现将实践过程及结果汇报如下。

1 对象

本校高职护理2007级1~4班, 共计200人, 全部为女生, 年龄16~17岁, 学生入校时随机分班。现随机抽取1、3班共100人为实验组, 2、4班共100人为对照组。

2 方法

第一阶段设立以反思能力为核心的实验报告模块, 反思报告主要内容: (1) 练习目的及要求; (2) 练习主要步骤; (3) 练习中存在的问题; (4) 练习效果; (5) 下次练习的时间及目标。

该阶段要求学生按上述模式完成任务, 如实填写实习报告;告知学生实践需要反思, 而不是机械地模仿, 既要动脑又要动手;引导学生思考练习中存在的主要问题、主要步骤, 解决主要矛盾和主要问题;帮助学生制订下次的练习计划, 包括练习时间及目标。分组练习中, 小组成员互相记录步骤中的错误之处后各自总结。

第二阶段反思报告的主要内容: (1) 练习主要过程及步骤 (要求写出关键步骤) ; (2) 已解决的第一阶段练习中存在的问题; (3) 尚未解决的问题, 设计解决方法; (4) 上述方案实施后的效果; (5) 目前已达到的熟练程度。

在第二阶段练习中, 学生已较为熟悉操作步骤, 所以只要求其简单地写出关键步骤。该阶段对学生的主要要求是, 在平时的小组练习中互相考评, 记录存在问题;自行或小组讨论解决问题的方案, 要求学生至少提出2种解决方案;总结、记录方案实施后的效果。教师在检查批改反思报告时, 着重对学生练习中存在的问题进行归纳, 以便及时反馈、指导;对于方案实施效果, 可在练习课上有目的地进行检查和评分。这样可以督促学生进行真正的反思, 而不是上交流于形式的作业。

第三阶段反思报告主要内容: (1) 对本项目测试结果的满意度; (2) 我的总结; (3) 我的创新建议。

设计该模块的主要出发点在于培养学生的总结能力。重点要求学生从练习目的, 练习过程中存在的问题及解决方案的设计方面进行归纳和总结。其中的创新建议则是有意培养学生的发散思维及创新能力。

3 结果

反思报告的设计, 主要是引导学生形成良好的反思习惯, 为了验证其效果, 我们对学生和任课教师进行了调查, 调查结果如下。

3.1 学生方面

采用传统方法的对照组有45.5%的学生认为书写实验报告可以督促自己课后复习, 54.5%的学生认为实验报告可以不动脑地抄书, 浪费时间和纸张, 对自身没有实质性提高, 建议取消书写实验报告。实验组有70.0%的学生认为有必要书写反思报告, 这样可以督促自己不断发现问题、总结经验;20.0%的学生认为只要会操作即可, 没必要创新;10.0%的学生持无所谓态度, 认为可写可不写。

3.2 教师方面

通过教师上课反馈记录发现, 实验组较对照组有如下明显优点: (1) 学生思维活跃, 有自己的见解; (2) 学生敢于挑战传统、质疑书本; (3) 学生学习目的性增强。

3.3 综合测评

我们进行了多项操作测试, 如导尿、注射、鼻饲等, 对照组学生评估问题及操作较为死板, 基本与指导教师一致;而实验组学生对病例的评估较多样, 答案不统一, 操作中有改动之处。

从以上3方面可以看出, 通过教学将理念灌输给学生, 可让学生有意识地形成一种良好的思维和行为方式。

参考文献

[1]徐国庆.实践导向职业课程研究[M].上海:上海教育出版社, 2003.

篇4:单片机基础实验报告

关键词:实验报告;实验教学;实验预习;实验报告模板;电子实验报告

中图分类号:TP3-4 文献标识码:A文章编号:1007-9599 (2013) 05-0000-02

1引言

近年来,高校对计算机公共基础课实验教学的重视程度逐步提升,实验报告成为检查考核实验教学质量的重要依据之一。书写实验报告是实验教学中的一个非常重要的环节。通过书写实验报告,对实验过程和结果进行分析总结,不但能使学生将理论和实验进一步联系起来,更好地掌握知识和技能,同时也为学生今后从事科研、撰写毕业论文奠定了一定的基础。然而,在实验报告日益被重视的同时,在其使用过程中逐渐暴露出了一些问题,严重影响着实验教学质量的提高。

2实验报告存在的主要问题

高校计算机公共基础课一般都要求学生在实验结束后填写并提交实验报告,教师对实验报告进行批改,课程结束后对实验报告进行归档,通过对实验报告的检查来检验评价实验教学的质量。其中,存在着一些问题,主要有以下几个方面:2.1实验报告与实验过程脱节。通常,学生在实验课上完成实验操作,在课后书写实验报告。学生填写实验报告时往往要努力回想课上实验的情形,然而由于时间上的脱节使得填写的内容不能完全真实地反映实验过程和结果,因而也就不能充分地发挥实验报告的作用。2.2纸质实验报告存在诸多缺点。传统纸质实验报告已经不能满足当前实验教学的要求,且逐渐暴露出诸多弊端。首先,纸质实验报告的填写、批改和反馈整个过程会花费很多的时间。实验报告批改和反馈效率低,学生也就不能及时获得教师评价,了解需改进之处,从而降低了实验教学的效果。其次,纸质实验报告在填写内容上会有局限,如对于一些较复杂的图形形式的实验结果不易表现,且篇幅有限。再次,纸质形式不便于查阅往届实验报告,不便于对学生实验报告的情况进行统计汇总,从而不利于全面评价实验教学效果。总之,纸质实验报告的形式不符合教育现代化、网络化发展的要求,同时,大量纸张的使用造成很大的浪费且存储不便。2.3实验报告抄袭现象严重。目前很多高校都存在这样的现象:学生书写实验报告就是应付了事,随便填填,甚至抄袭,一个班上交上来的实验报告就那么几个版本,实验抄袭现象严重。造成这种现象的原因是多方面的。首先,实验报告通常在实验课后完成,容易出现实验报告抄袭现象;纸质实验报告传递方便,也为抄袭提供了便利;当然,学风不正也是原因之一。总之,抄袭现象严重影响了实验教学质量的提高,使得实验报告流于形式。2.4实验报告中各栏目的设计有待改进。至今,仍有很多高校的计算机公共基础课还在采用通用的实验报告模板,这样的实验报告模板是有待改进的。首先,不同课程、不同类型的实验都共用统一的实验报告模板,使得实验报告没有针对性,不能有效发挥实验报告的作用。另外,很多栏目的内容在实验指导书上已经写明了,如实验项目名称、实验目的、实验环境、实验内容等,让学生照抄在实验报告上,不仅对于提高学生实验能力和创新能力没有实际帮助,也降低了实验教学效率。

3针对实验报告的改进措施

为了提高实验报告的质量,充分发挥其在实验教学中应有的作用,提出了以下有针对性的改进措施。3.1加强实验前的预习工作。实验课上,学生在教师的指导下自己独立完成实验任务,因而实验预习非常重要。为了让学生做好实验预习,教师应提前将下次实验任务发布给学生,并引导学生按照正确的方法进行实验预习。学生在实验课前应阅读实验教材或实验指导书,了解实验目的、实验内容等,完成实验预习报告。教师应在实验课开始时对实验预习情况予以检查,可以以提问或检查实验预习报告的方式。实验预习做好了,可以提高后续实验环节的质量和效率,从而提高实验报告的质量,也会在一定程度上减少实验报告抄袭现象的发生。3.2改进实验报告模板的设计。根据不同课程、不同类型实验的特点来设置实验报告中应该包含的栏目,对于实验项目名称、实验目的、实验环境、实验内容等在实验指导书中已写明的栏目内容,直接将其导入到实验报告模板中,从而使每个实验项目分别对应一个有针对性的实验报告模板。3.3及时提交实验报告。实验报告最好当堂完成并提交。这样既能使实验报告的填写内容与实验操作过程紧密联系;又能从一定程度上避免课后提交实验报告容易产生的抄袭、复制现象;还会使学生产生一定的紧迫感,课上实验效率也会有一定程度的提高。对于某些实验,即使无法当堂提交,也应在规定时间内及时提交。3.4制定实验报告批改规范,认真批改实验报告。首先,应制定实验报告批改规范,教师要严格按照此规范认真批改实验报告。教师批改实验报告时不能仅仅给出一个最后成绩,而应该指出实验报告上的错误,并给出对应的评语和成绩。这样,学生才能从每次实验报告的批阅结果中了解到自己存在的不足和需改进之处,从而进一步提高自身的实验能力。同时,教师的这种认真负责的批改态度会感染到学生,使之更加认真地对待实验操作和实验报告的填写。另外,应严禁实验报告抄袭、复制,一经发现,一律以零分处理,从而对实验报告抄袭现象起到一定的遏制作用。3.5采用电子实验报告管理系统。相对于纸质实验报告,电子实验报告有更多的优势。首先,电子实验报告便于填写,实验过程和实验结果的表现形式可以多样化。其次,对于学生的电子实验报告的查询、分析、统计更加便利。再次,采用电子实验报告提高了批改和反馈的效率。另外,电子实验报告便于存放,避免了大量纸张的浪费,更加环保。

目前已经有一些高校自主研发了电子实验报告管理系统。例如,基于网络的实验报告管理系统使得学生上传电子实验报告更加方便,教师可以借助网络来评阅电子实验报告[1];通用实验报告网络化管理系统可以对多门课程的实验报告进行管理,具有通用性[2];基于 B/S的实验管理系统包含了对于实验报告的在线提交功能,方便了对实验报告的收集整理[3];有的系统还带有抄袭识别功能[4],利用此功能就能够发现相互抄袭的实验报告并给出及时的处理,从而能有效遏制实验报告抄袭行为。

4结论与展望

为了提高高校计算机公共基础课实验教学的质量,解决目前实验报告存在的诸多问题,对于实验报告的改革势在必行。虽然不同高校在这方面采取的措施不尽相同,但都是为了充分发挥实验报告在实验教学中应有的作用。随着计算机教育现代化和网络化的发展,实验报告的电子化将是今后发展的必然趋势[5]。将一些新技术、新方法融入到对实验报告的现代化管理中,同时配套相应的制度和措施,将会更加有效地发挥实验报告在实验教学中的作用。

参考文献:

[1]王绍卿.基于网络的实验报告管理系统[J].山东理工大学学报(自然科学版),2008,22(5):70-72.

[2]方淑梅,梁喜龍,冯乃杰,等.通用实验报告网络化管理系统[J].辽东学院学报(自然科学版),2009,16(3):232-235.

[3]王建宏,刘嘉勇.基于B/S的实验管理系统设计与实现[J].通信技术,2010,43(6):135-136+139.

[4]胡明晓.一种带有抄袭识别的电子版实验报告管理系统[J].温州大学学报(自然科学版),2009,30(1):45-50.

[5]黄凤良,徐明,吴文婷,等.实验报告自动生成系统设计[J].实验科学与技术,2011,9(1):48-52.

篇5:单片机实验报告

实验报告

课程名称: 姓

名: 系

别: 专

业: 年

级: 学

号: 指导教师:

单片机原理及应用实验

陈璐 信息系

电气工程及其自动化

2012级 120712041 李莉

2015 年 月 25

1.实验目的和要求

1)熟悉Keil 软件界面,以及编辑、编译、运行程序的步骤;

2)熟悉Proteus软件界面,掌握用Proteus画仿真图的方法。2.主要仪器设备

Keil 软件与Proteus仿真软件 3.实验设计要求

利用单片机、1个开关和1个发光二极管,构成一个简单的开关检测系统的仿真电路图。单片机P3.0引脚接按钮开关,P1.0引脚接发光二极管的阴极。当开关闭合时,发光二极管亮;开关打开时,发光二极管灭;按钮开关与发光二极管没有任何电气上的联系。

单片机对开关K的状态的检测由程序检测P3.0引脚的输入电平。当开关K闭合,即P3.0脚输入低电平;当开关K打开,即P3.0脚输入高电平。使用发光二极管,阳极接+5V,阴极接P1.0端口。当程序控制P1.0输出高电平时,发光二极管D1灭;当程序控制P1.0输出低电平时,发光二极管D1亮。4.操作方法与实验步骤

(1)Keil C51软件使用

在Keil C51集成开发环境下,建立一个工程并编辑以下源程序,熟悉Keil C51集成开发环境下各种菜单、命令的使用。

#include “reg51.h” #define uchar unsigned char #define uint unsigned int sbit in=P3^0;sbit out=P1^0;void main(void){ while(1){ in=1;if(in= =0)out=0;else out=1;} }(2)建立新文件

进入Proteus ISIS界面,单机主菜单项【文件】→“新建设计”选项,就会弹出“新建设计”窗口,窗口中提供了多种模版选择。其中横向图纸为Landscape,纵向图纸为Portrait,DEFAULT为默认模版。单击选择的模版图标,再单击“确定”按钮,即建立一个该模版的空白文件。如果直接单击“确定”按钮,即选用系统默认的DEAFAUILT模版。

单击保存按钮,在弹出的对话框“保存ISIS设计文件”中输入文件名再单击“保存”,则完成新建设计文件的保存操作,其后缀自动为“.DSN”。

(3)设定绘图纸大小 单击菜单中的【系统】→“设置图纸大小”,选择所需图纸的尺寸位A4。

(4)选取元器件并添加到对象选择窗口中

单击器件选择按钮,弹出选取元器件对话框。在其左上角“关键字”一栏中输入元器件名称“AT89C51”,则出现关键字匹配的元器件列表。选中AT89C51所在行或单击AT89C51所在行后,再单击“确定”按钮,便将元器件AT89C51加入到ISIS对象选择窗口中。按此操作方法逐一完成其他元器件的选取。本设计中使用的各元器件的关键字相应为“AT89C51”、“BUTTON”(按钮开关)、“CAP”(瓷片电容)、“CAP-ELEC”(电解电容)、“CRYSTAL”(晶振)、“RES”(电阻)等。被选取的元器件加入到ISIS对象选择窗口中。(5)放置、移动、旋转元器件

单击ISIS对象选择窗口中的元器件名,蓝色条出现在该元器件名上。把鼠标指针移到编辑区某位置后,单击就可放置元器件于该位置,每单击一次,就放置一个元器件。如果要移动元器件,先右击元器件使其处于选中状态,再按住鼠标左键进行拖动,达到目标处后,松开鼠标即可。如要调整元器件方向,先将指针指在元器件上单击鼠标右键选中,再单击相应的旋转按钮。若多个对象一起移动或转向,可选择相应的块操作命令。(6)放置电源、地(终端)

单击工具箱的终端模式按钮,然后在对象选择窗口中单击POWER来选中电源,然后使用元器件调整工具按钮进行方向调整,最后在编辑区中单击放置电源。(7)电路图布线

单击元器件引脚间、线间等接线处,自动生成连线。(8)电气检测

单击电器检查快捷键按钮,根据电气检查列表的指示修改设计中的错误,完成实验。5.实验内容及实验数据记录

每当按下K时,LED灯就会发光。

C2U130pF19XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD*********617X112MHz18XTAL2D1R24.7K930pFRSTR4220293031C310uFPSENALEEAKR310K10K12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51LED-GREENC1R1220 6.实验数据处理与分析

每当按下K时,in(p3.0)I/O口就会变为低电平,该信号使得CPU给out(p3.0)I/O口发送低电平,使得LED灯发亮。7.实验过程中遇到的问题及解决方法

一开始安装软件的时候最后一步设置完通信设置时,鼠标点击“好”,但是屏幕一直显示“通信错误”的提示,经过重复操作,还是没有成功,结果是因为“端口选择”处选择错了,改正后最终安装成功。8.心得体会

篇6:单片机实验报告

学号_ 实验班号_ 机器号__

一、实验目的:

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<0xffff;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<8;i++)

{

P2OUT=~LED_temp;

delay();

LED_temp=LED_temp<<1;

} } void rule2()

//规律2 {

unsigned char LED_data[]={0x81,0x42,0x24,0x18};

for(unsigned int i=0;i<4;i++)

{

P2OUT=~LED_data[i];

delay();

} } void delay(){

unsigned int j;

for(j=0;j<0xffff;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<8;i++)

{

P2OUT=~LED_temp;

delay();

LED_temp=LED_temp<<1;

} } void rule2()

//规律2 {

unsigned char LED_data[]={0x81,0x42,0x24,0x18};

for(unsigned int i=0;i<4;i++)

{

P2OUT=~LED_data[i];

delay();

} } void delay(){

unsigned int j;

for(j=0;j<0xffff;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<0x1FFFF;i++),约为 1 秒。本次实验对 秒值长短精确度不要求。

思考:每个数码管显示的时间不能太长,也不能太短,为什么?

答:

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<16;i++){ P2OUT=LEDtab[i];delay();} P1OUT=BIT1;//第二个数码管开始输出 for(i=0;i<16;i++){ P2OUT=LEDtab[i];delay();} P1OUT=BIT2;//第三个数码管开始输出 for(i=0;i<16;i++){ P2OUT=LEDtab[i];delay();} P1OUT=BIT3;//第四个数码管开始输出 for(i=0;i<16;i++){ P2OUT=LEDtab[i];delay();} } } void delay(){ //延时函数 unsigned int j;for(j=0;j<0xffff;j++);//延时 } 3)用 4 个数码管做一个电子表,高两位数码管显示分钟值,低两位数码管显示秒值。每计数到 5分钟时,控制蜂鸣器发出一报警声,然后又从 0 开始重新计时。

其中 1 秒时间可通过延时完成,如执行 for(i=0;i<0x1FFFF;i++),约为 1 秒。本次实验对 秒值长短精确度不要求。

答:在上述连线的基础上,将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;k++)//分钟 { c=LEDtab[k];for(int j=0;j<6;j++)//秒钟十位 { b=LEDtab[j];for(int i=0;i<10;i++)//秒钟个位 { a=LEDtab[i];second();} } } P1OUT=~BIT7;//报警器报警 for(int j=0;j<0xffff;j++);} } void delay()//延时函数 { for(int j=0;j<0x100;j++);} void second()//读秒函数,同时以很快的速度显示4个数码管的读数 { for(int j=0;j<40;j++){ P2OUT=a;P1OUT=BIT0+BIT7;delay();P2OUT=b;P1OUT=BIT1+BIT7;delay();P2OUT=c;P1OUT=BIT2+BIT7;delay();P2OUT=d;P1OUT=BIT3+BIT7;delay();} } 思考:每个数码管显示的时间不能太长,也不能太短,为什么?

答:时间过长,没有连续的效果;时间过短,不利于观察读数。5.汇编格式指令和寻址方式的学习(可在simulator下完成)

L2_2.c源程序见下,建立C项目,进入DEBUG状态,点击view/disassembly,在反汇编 窗口得到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<0xffff;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<5;k++){ c=LEDtab[k];for(int j=0;j<6;j++){ b=LEDtab[j];for(int i=0;i<10;i++){ a=LEDtab[i];if((P1IN&BIT5)==0)key=2;while(key==2)//等待按K2键暂停计时 { second();if((P1IN&BIT4)==0)key=1;if((P1IN&BIT6)==0)key=3;} if(key==1)second();if(key==3)//清零操作开始 { flag=0;break;} } if(flag==0)break;} if(flag==0)break;} P1OUT=BIT4+BIT5+BIT6;//蜂鸣器响 for(int j=0;j<0xffff;j++);P1OUT=BIT4+BIT5+BIT6+BIT7;//蜂鸣器停止响 } } void delay(){ for(int j=0;j<0x500;j++);} void second(){ for(int j=0;j<40;j++){ P2OUT=a;P1OUT=BIT0+BIT4+BIT5+BIT6+BIT7;delay();P2OUT=b;P1OUT=BIT1+BIT4+BIT5+BIT6+BIT7;delay();P2OUT=c;P1OUT=BIT2+BIT4+BIT5+BIT6+BIT7;delay();P2OUT=d;P1OUT=BIT3+BIT4+BIT5+BIT6+BIT7;delay();} } 3.(选做)串行方式控制数码管的显示

1)画出单片机与 4 个数码管连接的原理图,分析控制方法;

2)编程控制四个数码管从右到左、依次每个数码管分别循环显示 0~

9、A~F。

3)用 4 个数码管做一个电子表,高两位数码管显示分钟值,低两位数码管显示秒值。每计数到 5分钟时,控制蜂鸣器发出一报警声,然后又从 0 开始重新计时。其中 1 秒时间可通过延时完成,如执行 for(i=0;i<0x1FFFF;i++),约为 1 秒。本次实验对 秒值长短精确度不要求。答:

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<16;i++)

{

output(LEDtab[i]);

for(int i=0;i<0xffff;i++);}

P1OUT=BIT1+BIT7;

for(int i=0;i<16;i++)

{

output(LEDtab[i]);

for(int i=0;i<0xffff;i++);}

P1OUT=BIT2+BIT7;

for(int i=0;i<16;i++)

{

output(LEDtab[i]);

for(int i=0;i<0xffff;i++);}

P1OUT=BIT3+BIT7;

for(int i=0;i<16;i++)

{

output(LEDtab[i]);

for(int i=0;i<0xffff;i++);}

} }

void output(char Data)

//串行方式输出指定信号 {

for(int i=0;i<8;i++)

{

if((Data&BIT7)==0)

P1OUT&=~BIT4;

else

P1OUT|=BIT4;

Data=Data<<1;

P1OUT|=BIT5;

delay();

P1OUT&=~BIT5;

}

P1OUT|=BIT6;

delay();

P1OUT&=~BIT6;} void delay()

//延时函数 {

for(int i=0;i<0xff;i++);} 3)用 4 个数码管做一个电子表,高两位数码管显示分钟值,低两位数码管显示秒值。每计数到 5分钟时,控制蜂鸣器发出一报警声,然后又从 0 开始重新计时。答:在上述连线的基础上,将P1.7与BUZZ相连,程序如下 #include “io430.h” void delay();void second();void output(char Data);const char LEDtab[]={~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=BIT7;

//初始化

for(;;){

a=b=c=d=~0x3F;

for(int k=0;k<5;k++)

//分钟

{

c=LEDtab[k];

for(int j=0;j<6;j++)

//秒钟十位

{

b=LEDtab[j];

for(int i=0;i<10;i++)//秒钟个位

{

a=LEDtab[i];

second();

}

}

}

P1OUT=~BIT7;

//报警声

for(int j=0;j<0xffff;j++);

} } void output(char Data)

//串行方式向数码管输出信号 {

for(int i=0;i<8;i++)

{

if((Data&BIT7)==0)

P1OUT&=~BIT4;

else

P1OUT|=BIT4;

Data=Data<<1;

P1OUT|=BIT5;

delay();

P1OUT&=~BIT5;

}

P1OUT|=BIT6;

delay();

P1OUT&=~BIT6;} void delay()

//延时函数 {

for(int j=0;j<50;j++);} void second(){

for(int j=0;j<0x40;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<8;i++)

{

if((Data&BIT7)==0)

P2OUT&=~BIT0;

else

P2OUT|=BIT0;

Data=Data<<1;

P2OUT|=BIT1;

delay();

P2OUT&=~BIT1;

}

P2OUT|=BIT2;

delay();

P2OUT&=~BIT2;} 如果程序中没有关闭看门狗那条语句,后果是什么?

上一篇:敬廉崇洁读后感下一篇:纬地学习礼记