51单片机C语言程序设计实验_第1页
51单片机C语言程序设计实验_第2页
51单片机C语言程序设计实验_第3页
51单片机C语言程序设计实验_第4页
51单片机C语言程序设计实验_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《51单片机C语言程序设计》实验教学指导书伍勤谟编二00六年十二月单片机C语言实践教学的内容目录实验一单片机C语言编程环境建立实验目的:掌握Keil软件的安装,使用;实验内容:Keil软件的安装,使用,熟悉单片机C语言编程过程(源文件的建立,工程的建立,编译及链接等)实验仿真板的介绍及使用等;实验二51C语言数据类型,运算符与表达式的练习(1)实验目的:掌握相关语句的编程方法。实验内容:演示字符型数据和整型数据的溢出.观察浮点型数据在内存中的存放方式;演示实型数据的舍入误差;观察数据在内存中的存储位置实验三51C语言数据类型,运算符与表达式的练习(2)实验目的:掌握相关语句的编程方法。实验内容:定义多个变量观察各自的存储空间;将变量定义在位变量变区;研究pdata和xdata型变量的存储空间;观察各种类型数据转换时的内存变化;实验四51C语言程序流程控制语句的练习实验目的:掌握for、whiledo---while等循环语句的编程方法。实验内容:利用仿真型实验板和所学流程控制语句,编写演示流水灯功能的程序。实验五51C语言的构造数据类型的练习实验目的:1熟悉51C语言的指针与数组的语法结构。2掌握指针与数组的编程的方法。实验内容:编写程序:通过指针变量访问整型变量实验六51单片机内部资源C语言的编程练习实验目的:掌握51单片机内部资源C语言编程的方法。实验内容:编写利用外中断控制实验LED灯亮灭程序;利用定时器的中断方式控制实验板上LED闪烁功能,要求每50ms改变一次。实验七51单片机内部资源C语言的编程练习实验目的:掌握51单片机内部资源C语言编程的方法。实验内容:编写利用定时器控制实验板两个灯的同时闪烁,但它们的闪烁时间不同;利用计数器功能将T0口计数值显示出来(用8个LED来显示数据)。实验八51C语言的涵数语句的练习实验目的:掌握51C语言的涵数语句与程序结构。掌握51C语言的涵数参数传递与调用。实验内容:编写程序:求1个数的阶乘实验九51单片机接口C语言编程的练习实验目的:掌握51单片机接口C语言编程基本方法。实验内容:编写实验板六位数码管动态显示程序,要求:使用定时中断实现显示的程序,第1~5位各位始终显示0,第六位在0~9之间显示。实验十51单片机应用设计举例练习实验目的:掌握51单片机应用设计方法。实验内容:编写程序:用实验板实现秒钟功能,且有高位消隐功能。51单片机C语言程序设计实践教学指导书实验一单片机C语言编程环境建立实验目的:掌握Keil软件的安装,使用;实验内容:Keil软件的安装,使用,熟悉单片机C语言编程过程(源文件的建立,工程的建立,编译及链接等)实验仿真板的介绍及使用等;思考题:1.简述Keil软件的功能2.利用安装好的Keil软件实际编写一个简单的单片机C语言程序(控制实验板上某个LED灯发光),熟悉单片机C语言编程过程.3.参照Keil软件的介绍,编程显示“Whatisyourname?”。KeilC软件使用KeilC51软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM语言和C语言的程序设计,界面友好,易学易用。下面介绍KeilC51软件的使用方法进入KeilC51后,屏幕如下图所示。几秒钟后出现编辑界启动KeilC51时的屏幕进入KeilC51后的编辑界面简单程序的调试

学习程序设计语言、学习某种程序软件,最好的方法是直接操作实践。下面通过简单的编程、调试,引导大家学习KeilC51软件的基本使用方法和基本的调试技巧。1)建立一个新工程

单击Project菜单,在弹出的下拉菜单中选中NewProject选项2)然后选择你要保存的路径,输入工程文件的名字,比如保存到C51目录里,工程文件的名字为C51

如下图所示,然后点击保存.

3)这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keilc51几乎支持所有的51核的单片机,我这里还是以大家用的比较多的Atmel的89C51来说明,如下图所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定.

4)完成上一步骤后,屏幕如下图所示到现在为止,我们还没有编写一句程序,下面开始编写我们的第一个程序。

5)在下图中,单击“File”菜单,再在下拉菜单中单击“New”选项新建文件后屏幕如下图所示此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了,但笔者建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“SaveAs”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,同时,必须键入正确的扩展名。注意,如果用C语言编写程序,则扩展名为(.c);如果用汇编语言编写程序,则扩展名必须为(.asm)。然后,单击“保存”按钮。6)回到编辑界面后,单击“Target1”前面的“+”号,然后在“SourceGroup1”上单击右键,弹出如下菜单然后单击“AddFiletoGroup‘SourceGroup1’”屏幕如下图所示选中Test.c,然后单击“Add

”屏幕好下图所示注意到“SourceGroup1”文件夹中多了一个子项“Text1.c”了吗?子项的多少与所增加的源程序的多少相同7)现在,请输入如下的C语言源程序:#include<reg52.h>//包含文件

#include<stdio.h>

voidmain(void)//主函数

{

SCON=0x52;

TMOD=0x20;

TH1=0xf3;

TR1=1;//此行及以上3行为PRINTF函数所必须

printf(“HelloIamKEIL.\n”);//打印程序执行的信息

printf(“Iwillbeyourfriend.\n”);

while(1);

}在输入上述程序时,读者已经看到了事先保存待编辑的文件的好处了吧,即Keilc51会自动识别关键字,并以不同的颜色提示用户加以注意,这样会使用户少犯错误,有利于提高编程效率。程序输入完毕后,如下图所示8)在上图中,单击“Project”菜单,再在下拉菜单中单击“BuiltTarget”选项(或者使用快捷键F7),编译成功后,再单击“Project”菜单,在下拉菜单中单击“Start/StopDebugSession”(或者使用快捷键Ctrl+F5),屏幕如下所示9)调试程序:在上图中,单击“Debug”菜单,在下拉菜单中单击“Go”选项,(或者使用快捷键F5),然后再单击“Debug”菜单,在下拉菜单中单击“StopRunning”选项(或者使用快捷键Esc);再单击“View”菜单,再在下拉菜单中单击“SerialWindows#1”选项,就可以看到程序运行后的结果,其结果如下图所示至此,我们在KeilC51上做了一个完整工程的全过程。但这只是纯软件的开发过程,如何使用程序下载器看一看程序运行的结果呢?10)单击“Project”菜单,再在下拉菜单中单击“”在下图中,单击“Output”中单击“CreateHEXFile”选项,使程序编译后产生HEX代码,供下载器软件使用。把程序下载到AT89S51单片机中。实验二51C语言数据类型,运算符与表达式的练习(1)实验目的:掌握相关语句的编程方法。实验内容:演示字符型数据和整型数据的溢出.观察浮点型数据在内存中的存放方式;演示实型数据的舍入误差;观察数据在内存中的存储位置思考题:1.通过学习和实验,简述哪些变量是80C51单片机直接支持的?2.编写上述实验内容的程序,并简述实验过程的体会.演示字符型数据和整型数据的溢出.(参考程序如下:)#include"reg51.h"voidmain(){ unsignedchara,b; intc,d; a=255; b=a+1; c=32767; d=c+1;}观察浮点型数据在内存中的存放方式;(参考程序如下:)#include"reg51.h"voidmain(){ union{ floatf1; unsignedcharc1[4]; }Num; Num.f1=1000.111; for(;;) { Num.f1++; }}演示实型数据的舍入误差;(参考程序如下:)voidmain(){ union{ floatx; unsignedcharc[4]; }a,b; a.x=1234567890.0; b.x=a.x+10;} 观察数据在内存中的存储位置(参考程序如下:)#include"reg51.h"voidmain(){ codeintx=100; inty; y=x; //避免编译警告 for(;;);}实验三51C语言数据类型,运算符与表达式的练习(2)实验目的:掌握相关语句的编程方法。实验内容:定义多个变量观察各自的存储空间;将变量定义在位变量变区;研究pdata和xdata型变量的存储空间;观察各种类型数据转换时的内存变化;思考题:1.编写上述实验内容的程序.2.简述实验过程的体会.定义多个变量观察各自的存储空间;(参考程序如下:)#include"reg51.h"voidmain(){ unsignedintidatai[61]; i[1]=10; //避免编译器的警告 for(;;);}将变量定义在位变量变区;(参考程序如下:)#include"reg51.h"voidmain(){ unsignedcharbdatac1[10]; c1[0]=10; //避免编译警告 for(;;);}研究pdata和xdata型变量的存储空间;(参考程序如下:)voidmain(){ unsignedcharpdatac1; longxdatal1; intxdatai1[10]; c1=10;l1=10;i1[0]=10; //避免编译警告 for(;;) {;}}观察各种类型数据转换时的内存变化;(参考程序如下:)voidmain(){ inti1,i11=-1000; unsignedinti2,i21=1000; longl1,l11=-1000000; unsignedlongl2,l21=1000000; charc1,c11=-10; unsignedcharc2,c21=10; floatf1,f11=123.456;/*各种类型转换为浮点型*/ f1=i11; f1=i21; f1=l11; f1=l21; f1=c11; f1=c21;/*各种类型转换为整型*/ i1=l11; i1=l21; i1=c11; i1=c21; i1=f11; i1=i21;/*各种类型转换为无符号长整型*/ i2=l11; i2=l21; i2=c11; i2=c21; i2=f11; i2=i11;/*各种类型转换为长整型*/ l1=i11; l1=i21; l1=c11; l1=c21; l1=f11; l1=l21;/*各种类型转换为无符号长整型*/ l2=i11; l2=i21; l2=c11; l2=c21; l2=f11; l2=l11;/*各种类型转换为字符型*/ c1=i11; c1=i21; c1=l11; c1=l21; c1=f11; c1=c21;/*各种类型转换为无符号字符型*/ c2=i11; c2=i21; c2=l11; c2=l21; c2=f11; c2=c11; for(;;) {;}} 实验四51C语言程序流程控制语句的练习实验目的:掌握for、whiledo---while等循环语句的编程方法。实验内容:利用仿真型实验板和所学流程控制语句,编写演示流水灯功能的程序。思考题:1.编写上述实验内容的程序.(要求是能在实验板上进行演示)2.简述实验过程的体会.3.画出实验板电路简图(指实验用到的部分电路)利用仿真型实验板和所学流程控制语句,编写演示流水灯功能的程序。(参考程序如下:)#include"reg51.h"#include"intrins.h" //该文件包含有_crol_(…)函数的说明voidmDelay(unsignedintDelayTime){ unsignedintj=0; for(;DelayTime>0;DelayTime--) { for(j=0;j<125;j++) {;} }}voidmain(){ unsignedcharOutData=0xfe; while(1) { P1=OutData; OutData=_crol_(OutData,1);//循环左移 mDelay(1000); /*延时1000毫秒*/ }}实验五51C语言的构造数据类型的练习实验目的:1熟悉51C语言的指针与数组的语法结构。2掌握指针与数组的编程的方法。实验内容:编写程序:通过指针变量访问整型变量思考题:1.编写上述实验内容的程序.2.简述实验过程的体会.编写程序:通过指针变量访问整型变量(参考程序如下:)#include"reg51.h"#include"stdio.h"serial_init() //初始化串行口{SCON=0x50;TMOD|=0x20;PCON|=0x80;TH1 = 0xfd;TR1= 1;TI = 1;}voidmain(){ inta,b; int*Point1,*Point2; serial_init(); //初始化串行口 a=100; b=10; Point1=&a; //把变量a的地址赋给Point1 Point2=&b; //把变量b的地址赋给Point2 printf("%d,%d\n",a,b); printf("%d,%d\n",*Point1,*Point2); for(;;){;}}实验六51单片机内部资源C语言的编程练习实验目的:掌握51单片机内部资源C语言编程的方法。实验内容:1.编写利用外中断控制实验LED灯亮灭程序;2.利用定时器的中断方式控制实验板上LED闪烁功能,要求每50ms改变一次。思考题:1.编写上述实验内容的程序.2.简述实验过程的体会.3.画出实验板电路简图(指实验用到的部分电路)编写利用外中断控制实验LED灯亮灭程序;(参考程序如下:)#include"reg51.h"sbitP1_0=P1^0;voidmain(){ IT0=0; //设置为下降沿触发 EA=1; //开总中断 EX0=1; //开外部中断 for(;;) {;}}voidInt0()interrupt0{ P1_0=~P1_0;//取反P1.0 }利用定时器的中断方式控制实验板上LED闪烁功能,要求每50ms改变一次(参考程序如下:)#include"reg51.h"sbit P1_0=P1^0;voidTimer0()interrupt1{ TH0=0x15; TL0=0xa0; P1_0=~P1_0;}voidmain(){ TMOD=0x01; /*定时/计数器0工作于方式1*/ TH0=0x15; TL0=0xa0; /*定时初值为60000*/ EA=1; /*开总中断允许*/ ET0=1; /*开定时/计数器0允许*/ TR0=1; /*定时/计数器0开始运行*/ for(;;) {;} } 实验七51单片机内部资源C语言的编程练习实验目的:掌握51单片机内部资源C语言编程的方法。实验内容:编写利用定时器控制实验板两个灯的同时闪烁,但它们的闪烁时间不同;利用计数器功能将T0口计数值显示出来(用8个LED来显示数据)。思考题:1.编写上述实验内容的程序.2.简述实验过程的体会.3.画出实验板电路简图(指实验用到的部分电路)编写利用定时器控制实验板两个灯的同时闪烁,但它们的闪烁时间不同;(参考程序如下:)#include"reg51.h"sbit P1_0=P1^0;sbit P1_1=P1^1;voidTimer0()interrupt1{ static Count1=0; staticCount2=0;/*静态变量计数器*/ Count1++; /*每次中断计数器加1*/ Count2++; if(Count1>=10) /*如果计数器超过20*/ { P1_0=~P1_0; /*取反P1.0*/ Count1=0; /*计数器清零*/ } if(Count2>=20) { P1_1=~P1_1; Count2=0; } TH0=0x3c; /*重置定时初值*/ TL0=0xb0;}voidmain(){ TMOD=0x01; /*定时/计数器0工作于方式1*/ TH0=0x3c; TL0=0xb0; EA=1; /*开总中断允许*/ ET0=1; /*开定时/计数器0允许*/ TR0=1; /*定时/计数器0开始运行*/ for(;;) {;}}利用计数器功能将T0口计数值显示出来(用8个LED来显示数据)。(参考程序如下:)#include"reg51.h"sbit P1_0=P1^0;voidmain(){ unsignedchartmp; P1=0xff; //关闭P1口接的所有灯 TMOD=0x05; //确定计数工作模式 TR0=1; //定时器T0开始运行 for(;;) { tmp=TL0; P1=~tmp; }}实验八51C语言的涵数语句的练习实验目的:掌握51C语言的涵数语句与程序结构。掌握51C语言的涵数参数传递与调用。实验内容:编写程序:求1个数的阶乘思考题:1.编写上述实验内容的程序.2.简述实验过程的体会.编写程序:求1个数的阶乘(参考程序如下:)#include"reg51.h"#include"stdio.h"voidinit_ser(){ SCON=0x50;/*SCON:工作模式1,8-bitUART,允许接收*/ TMOD|=0x20;/*TMOD:定时器T1,工作模式2,8位自动重载方式*/ TH1=0xf3;/*当波特率为2400时,定时器初值*/ TR1=1;/*定时器T1开始运行*/ TI=1;/*允许发送数据*/}longfactorial(intn)reentrant{ longresult; if(n==0) result=1; else result=n*factorial(n-1); returnresult;}voidmain(){ intj; longtmp; init_ser(); for(j=0;j<11;++j) { tmp=factorial(j); printf("%d!=%ld\n",j,tmp); } for(;;){;}}实验九51单片机接口C语言编程的练习实验目的:掌握51单片机接口C语言编程基本方法。实验内容:编写实验板六位数码管动态显示程序,要求:使用定时中断实现显示的程序,第1~5位各位始终显示0,第六位在0~9之间显示。思考题:1.编写上述实验内容的程序.2.简述实验过程的体会.3.画出实验板电路简图(指实验用到的部分电路)编写实验板六位数码管动态显示程序,要求:使用定时中断实现显示的程序,第1~5位各位始终显示0,第六位在0~9之间显示.(参考程序如下:)#include"reg51.h"#defineucharunsignedchar#defineuintunsignedintucharcodeBitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};ucharcodeDispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};ucharDispBuf[6]; //6字节的显示缓冲区voidTimer0()interrupt1{ uchartmp; staticucharCount; //计数器,显示程序通过它得知现正显示哪个数码管 TH0=(65536-3000)/256; TL0=(65536-3000)%256;//定时时间为3000个周期 tmp=BitTab[Count]; //根据当前的计数值取位值 P2=P2|0xfc; //P2与11111100B相或,将高6位置1 P2=P2&tmp; //P2与取出的位值相与,将某一位清零 tmp=DispBuf[Count]; //根据当前的计数值取显示缓冲待显示值 tmp=DispTab[tmp]; //取字形码 P0=tmp; //送出字形码 Count++; //计数值加1 if(Count==6) //如果计数值等于6,则让其回0 Count=0; }/*延时程序*/voidmDelay(unsignedintDelay) { unsignedinti; for(;Delay>0;Delay--) { for(i=0;i<124;i++) {;} }}voidmain(){ ucharCounter=0; P1=0xff; P0=0xff; TMOD=0x01; TH0=(65536-3000)/256; TL0=(65536-3000)%256; //定时时间为3000个周期 TR0=1; //T0开始运行 EA=1; //总中断允许 ET0=1; //T0中断允许 DispBuf[0]=0; DispBuf[1]=0; DispBuf[2]=0; DispBuf[3]=0; DispBuf[4]=0; //显示器前5位均为0 for(;;) { DispBuf[5]=Counter; Counter++; //计数 if(Counter==10) Counter=0; mDelay(1000); }}实验十51单片机应用设计举例练习实验目的:掌握51单片机应用设计方法。实验内容:编写程序:用实验板实现秒钟功能,且有高位消隐功能。思考题:1.编写上述实验内容的程序.2.简述实验过程的体会.3.画出实验板电路简图(指实验用到的部分电路)编写程序,用实验板实现秒钟功能,且有高位消隐功能。(参考程序如下:)#include"reg51.h"#defineucharunsignedchar#defineuintunsignedint#defineHidden0x10; //消隐字符在字形码表中的位置ucharcodeBitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};ucharcodeDispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};ucharDispBuf[6]; //6字节的显示缓冲区bit Sec; //1s到的标

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论