




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机C语言程序设计实验指导书成都工业学院通信工程系微电子技术教研室二O一三年九月实 验 须 知实验是教学的重要实践环节,是理论联系实际,培养实际操作能力和科学研究方法的重要手段,也是培养观察问题、分析问题、解决问题能力的重要方式。要求做到:实验前认真准备,实验中亲自动手、细心观察、认真思考,实验后认真写好总结报告。一、实验守则1、 实验前认真阅读实验指导书,搞清原理,明确实验任务,有目的的进行实验,以提高实验课的质量,巩固和加深理论知识。2、 必须按实验指导书预习好实验内容,复习教材有关内容,完成规定的预习内容。3、 同一实验小组内应适当分工、紧密配合,培养安全工作作风、团结协作精神和爱护公
2、物的优良品质。4、 接线前,应合理布置仪器设备和实验板位置,以利于安全、方便的操作,做到文明实验。5、 保持实验室安静、整洁,在实验室不吸烟、不喧闹、不随地吐痰、不丢纸屑。6、 在实验过程中不得擅自离开,未经实验指导教师的同意,不得随意调换仪器,也不得乱拿实验室或他组的仪器设备。7、 实验所记录的波形、数据等实验结果,应经指导教师检查、同意后才能拆除电路并整理放好。8、 在实验中应注意人身和设备安全,如在实验中发生事故或异常现象应立即断开电源,保持现场,并立即报告实验指导教师,等后处理。二、实验方法及要求1、 每次实验前,首先应熟悉所用仪器、设备的性能等。2、 每一实验小组,可由一人担任指挥(
3、可轮流担任)。线路接好先在组内相互检查。再经指导教师检查后,才能通电实验。3、 实验中所画波形或测量数据,应当场画好或记录好,并加以分析,如发现波形或数据有不合理之处,应重作一遍或说明其原因。4、 实验内容全部完成后,要认真检查实验结果是否合理,有无遗漏,实验结果应经教师检查认可后,方可拆除线路。5、 实验结束后,应将仪器设备复归原位,清理好导线、实验桌面,打扫完实验室卫生后,方可离开。三、实验报告1、 实验报告是每次实验的全面总结,编写实验报告是实验中的一项基本技能,是每个工程技术人员的基本功之一,决不可马虎从事。2、 实验报告必须每人一份,独立完成,报告内容按要求填写,要求书写认真,图表、
4、波形清楚,不得相互抄袭。3、 实验报告一般应有下列内容:实验课程、实验名称、实验班级、姓名、同组者姓名、实验日期实验目的、实验内容与实验步骤、实验仪器设备、实验结果、实验结果与结论4、 实验报告一律用实验报告纸书写,要求字迹工整,条理清楚。目录实验一 KEIL Cx51上机指南3实验二 模块化编程4实验三 中断实验6实验四 循环显示实验7实验五 基于Protues的闪烁灯控制实验9实验六 流水灯控制实验12实验七 定时/计数器应用实验17实验八 数字钟实验21实验九 串行口通信实验24实验十 A/D转换实验26实验十一 D/A转换实验28实验一 KEIL Cx51上机指南实验目的:掌握仿真器使
5、用;如何建立工程、模块;编译、全编译;如何看信息窗口,看C编译结果,了解汇编与C的关系。实验要求:通过简单程序的输入,检查和执行。熟悉仿真器的使用,了解工程、模块的建立,了解程序的编译以及信息窗口的查看。实验内容及步骤:一. 程序:程序功能,延时1s。程序如下: #include /*包含51头文件*/ /*=定义延时100ms程序=*/void delay(unsigned int t) unsigned int k=13000; for(;t!=0;-t) k=13000; while(k!=0)k-; main(void) delay(10); for(;); 二. 实验步骤: 建立项目
6、以及文件名 在Keil窗口下建立一个新项目,并将模块加入到新项目,在模块下面建立一个文件。注意项目名后缀为x.obj,文件名后缀为x.c。 输入程序 程序编译,注意编译和全编译的差别。 查看信息窗口。 将C源程序所对应的.HEX文件反汇编成汇编语言,了解C与汇编语言的关系。实验结果:在主程序for设立断点,通过程序运行时间,查看程序所实现的功能。并修改寄存器的值了解程序功能的变化。实验二 模块化编程实验目的: 掌握模块化编程的基本要领,几种类型,模块程序与主程序之间的关系。实验要求: 了解汇编至汇编模块程序的调用;了解C与C模块程序的调用;了解C与汇编模块程序的调用。实验内容及步骤: 汇编与汇
7、编程序 建立模块及文件名 输入源程序 #include mian() P1=ox55; f(jj); 编译程序 查看程序运行结果 C与C模块程序 建立模块及文件名 输入源程序 主程序:#include test( ) test( ); f(jj); 模块程序:test( ) P1=0x55; 编译程序 查看程序运行结果 C与汇编模块程序 建立模块及文件名 输入源程序 主程序:#include test( ) test( ); f(jj); 模块程序:test1 SEGMENT CODEPubic testRST test1Test: P1=0x51 retEND 编译程序 查看程序运行结果实验
8、三 中断实验实验目的:熟悉Cx51单片机中断以及初始化程序的编程方法和响应过程。实验要求: 通过实验熟悉中断处理的过程以及Cx51中断过程。实验内容及步骤: 建立模块及文件名,在WAVE窗口下建立一个新项目,并将模块加入到新项目,在模块下面建立一个文件。注意项目名后缀为x.obj,文件名后缀为x.c。并在文件里面输入相应程序。 输入源程序#include /*包含51头文件*/ main(void) P0=1;TMOD=0x22;TH0=56;TL0=56;ET0=1;EA=1;TR0=1; for(;); void timer0(void) interrupt 1 using 2 /*用P0
9、口点亮LED*/ static unsigned int t=5000; t-; if(t=0) t=5000; P0=P01; if(P0=0)P0=1; ; 编译并调试程序 运行程序并查看运行结果实验四 循环显示实验实验目的:了解动态显示接口电路的基本原理和程序设计方法。实验要求:通过实验了解七段码的组成原则及动态接口电路,掌握动态扫描的基本原理及显示程序的设计及调试。实验内容及步骤: 实验面板上有4块LED显示器,其接口电路如下图所示,8155的PA口为七段码口(字形口),PB口为数位代码口。8155初始化在单片机启动时已完成。单片机通过七段码输出七段码控制显示不同的字符,通过数位代码口
10、输出数位代码控制4块LED中的一位点亮(共阴极接地),每一时刻只能点亮一位,若要求多位轮流点亮,则采用逐位轮显的“动态扫描”法显示。图1 硬件连接图 程序 #include /*包含51头文件*/ /*本程序为循环点亮LED程序,用定时器0进行显示*/unsigned char led4=16,16,16,16,;/*定义显缓*/unsigned char code DDM17=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77, /*定义段代码*/ 0x7c,0x39,0x5e,0x79,0x71,00; /*=定义延时100ms程序
11、=*/void delay(unsigned int t) unsigned int k=13000; for(;t;t-) while(k)k-; /*=主程序=*/ main(void) P0=1;TMOD=0x22;TH0=56;TL0=56;ET0=1;EA=1;TR0=1;/*初始化*/ for(;) delay(10); led0=8; /*延时约1秒改变1次显示状态*/ delay(10);led0=16;led1=8; delay(10);led1=16;led2=8; delay(10);led2=16;led3=8; delay(10);led3=16;led2=8; de
12、lay(10);led2=16;led1=8; delay(10);led1=16;led0=8; delay(10);led0=7;led1=8; delay(10);led0=6;led1=7;led2=8; delay(10);led0=5;led1=6;led2=7;led3=8; delay(10);led0=4;led1=5;led2=6;led3=16; delay(10);led0=3;led1=5;led2=16; delay(10);led0=2;led1=16; delay(10);led0=1; delay(10);led0=16; void timer0(void)
13、interrupt 1 using 2 /*用P0口点亮LED,P1口低四位为位选,200us中断一次,显示切换一位*/ static unsigned char t=1; t=(+t)&3; P0=0; P1=(P1&0xf0)|(1t); P0=DDMledt; 调试 将程序编译成机器码输入。分别用单步、断点对其进行调试,最后用连续执行EXEC执行程序,检查结果。实验五: 基于Protues的闪烁灯控制实验一实验目的1. 学习P1口的使用方法;2. 学习延时子程序的编写二实验内容在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。 三实验电路原理图图
14、2 闪烁灯控制电路按图中要求,在Protues中把图绘制好,将晶振设置为12Mhz。四程序设计思路 延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理: 如图1.1所示的石英晶体为12MHz,因此,1个机器周期为1s,MOV R6,#20; 2个机器周期 2D1: MOV R7,#248 ;2个机器周期 2 DJNZ R7,$ ; 2个机器周期 2DJNZ R6,D1 ; 2个机器周期 2 因此,上面的延时
15、程序时间为2+(2+2248+2)20=10.002ms。 由以上可知,当R610、R7248时,延时5ms,R620、R7248时,延时10ms,以此为基本的计时单位。如本实验要求0.2秒200ms,10msR5200ms,则R520,延时子程序如下: DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET 输出控制程序设计如图1.1所示,当P1.0端口输出高电平,即P1.01时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.00时,发光二
16、极管L1亮;我们可以使用SETBP1.0指令使P1.0端口输出高电平,使用CLRP1.0指令使P1.0端口输出低电平。五程序流程图 程序流程图如图3所示 图3 程序流程图六汇编源程序ORG 0000START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒D1: MOV R6,#20D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END七. C语言源程序 #include sbit L1=P10; void delay02s
17、(void) /延时0.2秒子程序 unsigned char i,j,k; for(i=20;i0;i-) for(j=20;j0;j-) for(k=248;k0;k-); void main(void) while(1) L1=0; delay02s(); L1=1; delay02s(); 八. 编译:在编译环境下将源程序编译成目标程序,生成SHAN.HEX九. 运行:将SHAN.HEX导入AT89C51,点击运行按钮运行程序十. 实验报告:按实验报告要求完善实验报告实验六 流水灯控制实验一. 实验目的1. 掌握PROTUES软件的简单引用, 2. 掌握程序输入、修改和调试方。二. 预
18、习要求仔细阅读实验指导书,复习教材中有关内容,分析.运行结果。三. 主要实验设备及元件计算机、PROTEUS软件环境系统、WAVE或KEILE C软件环境、四. 实验要求1. 能正确运用PROTEUS软件进行简单图样的设计2. 了解延时程序、输入-输出程序、显示程序的编写思路五. 实验步骤1. 绘制PROTEUS环境下图样。 图4 流水灯仿真电路图序号元件名称(元件库中)型号1七段显示器7SEG-COM-AN-BLUE2+5V电源ALTERNATOR3单片机AT89C524按键BUTTON5无极性电容CAP6电解电筒CAP-ELEC7晶振CRYSTAL8发光二极管LED-RED9电阻RES10
19、排电阻RESPACK-8图中所含元器件有:2. 编制程序#include unsigned char RunMode;/*System Fuction*void Delay1ms(unsigned int count)unsigned int i,j;for(i=0;icount;i+)for(j=0;j120;j+);unsigned char code LEDDisplayCode = 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,/07 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF;void Display(u
20、nsigned char Value)P3 = LEDDisplayCodeValue;void LEDFlash(unsigned char Count)unsigned char i;bit Flag;for(i = 0; i8)&0x00FF);void InitialCPU(void)RunMode = 0x00;TimerCount = 0;SystemSpeedIndex = 10;P1 = 0x00;P0 = 0x00;P2 = 0xFF;P3 = 0x00;Delay1ms(500);P1 = 0xFF;P0 = 0xFF;P2 = 0xFF;P3 = 0xFF;SetSpee
21、d(SystemSpeedIndex);Display(RunMode);/Mode 0unsigned int LEDIndex = 0;bit LEDDirection = 1,LEDFlag = 1;void Mode_0(void)LEDShow(0x0001LEDIndex);LEDIndex = (LEDIndex+1)%16;/Mode 2void Mode_2(void)if(LEDDirection)LEDShow(0x0001LEDIndex);if(LEDIndex=15)LEDDirection = !LEDDirection; LEDIndex = (LEDIndex
22、+1)%16;/Mode 3void Mode_3(void)if(LEDDirection)LEDShow(0x0001LEDIndex);if(LEDIndex=15)LEDDirection = !LEDDirection; LEDIndex = (LEDIndex+1)%16;/Mode 4void Mode_4(void)if(LEDDirection)if(LEDFlag)LEDShow(0xFFFELEDIndex);elseif(LEDFlag)LEDShow(0x7FFFLEDIndex);elseLEDShow(0xFFFELEDIndex);if(LEDIndex=15)
23、LEDDirection = !LEDDirection;if(LEDDirection)LEDFlag = !LEDFlag; LEDIndex = (LEDIndex+1)%16;/Mode 5void Mode_5(void)if(LEDDirection)LEDShow(0x000FLEDIndex);if(LEDIndex=15)LEDDirection = !LEDDirection; LEDIndex = (LEDIndex+1)%16;/Mode 6void Mode_6(void)if(LEDDirection)LEDShow(0x000FLEDIndex);if(LEDIn
24、dex=15)LEDDirection = !LEDDirection; LEDIndex = (LEDIndex+1)%16;/Mode 7void Mode_7(void)if(LEDDirection)LEDShow(0x003FLEDIndex);if(LEDIndex=9)LEDDirection = !LEDDirection; LEDIndex = (LEDIndex+1)%10;/Mode 8void Mode_8(void)LEDShow(+LEDIndex);void TimerEventRun(void)if(RunMode=0x00)Mode_0();else if(R
25、unMode =0x01)Mode_1();else if(RunMode =0x02)Mode_2();else if(RunMode =0x03)Mode_3();else if(RunMode =0x04)Mode_4();else if(RunMode =0x05)Mode_5();else if(RunMode =0x06)Mode_6();else if(RunMode =0x07)Mode_7();else if(RunMode =0x08)Mode_8();void Timer2(void) interrupt 5 using 3TF2 = 0; /中断标志清除( Timer2
26、 必须软件清标志!)if(+TimerCount=SystemSpeed)TimerCount = 0;TimerEventRun(); unsigned char MusicIndex = 0;void KeyDispose(unsigned char Key)if(Key&0x01)LEDDirection = 1;LEDIndex = 0;LEDFlag = 1;RunMode = (RunMode+1)%9;Display(RunMode);if(Key&0x02)if(SystemSpeedIndex0)-SystemSpeedIndex;SetSpeed(SystemSpeedIn
27、dex);elseLEDFlash(6);if(Key&0x04)if(SystemSpeedIndex28)+SystemSpeedIndex;SetSpeed(SystemSpeedIndex);elseLEDFlash(6);/*main()unsigned char Key;InitialCPU();InitialTimer2();while(1)Key = GetKey();if(Key!=0x00)KeyDispose(Key);3. 运行程序,查看结果六. 实验报告 按实验报告要求完善实验报告实验七 定时/计数器应用实验一. 实验目的1. 进一步掌握PROTUES软件的简单引用2
28、. 掌握定时/计数器的使用二实验内容 用AT89C51的定时/计数器T0产生2秒钟的定时,每当2秒定时到来时,更换指示灯闪烁,每个指示闪烁的频率为0.2秒,也就是说,开始L1指示灯以0.2秒的速率闪烁,当2秒定时到来之后,L2开始以0.2秒的速率闪烁,如此循环下去。0.2秒的闪烁速率也由定时/计数器T0来完成。 三实验电路原理图 图5 定时器实验电路图四程序设计思路1 由于采用中断方式来完成,因此,对于中断源必须它的中断入口地址,对于定时计数器T0来说,中断入口地址为000BH,因此在中断入口地方加入长跳转指令来执行中断服务程序。书写汇编源程序格式如下所示: ORG00H LJMPSTART
29、ORG0BH ;定时/计数器T0中断入口地址 LJMP INT_T0 START: NOP ;主程序开始 INT_T0: PUSH ACC ;定时/计数器T0中断服务程序 PUSH PSW POP PSW POP ACC RETI ;中断服务程序返回 END 2 定时2秒,采用16位定时50ms,共定时40次才可达到2秒,每50ms产生一中断,定时的40次数在中断服务程序中完成,同样0.2秒的定时,需要4次才可达到0.2秒。对于中断程序,在主程序中要对中断开中断。 3 由于每次2秒定时到时,L1L4要交替闪烁。采用ID来号来识别。当ID0时,L1在闪烁,当ID1时,L2在闪烁;当ID2时,L3
30、在闪烁;当ID3时,L4在闪烁 五程序框图 T0中断服务程序流程图 图6 T0中断服务程序程序流程图 主程序流程图图图 图7 主程序流程图6编写程序 汇编语言源程序 TCOUNT2S EQU 30H TCNT02S EQU 31H ID EQU 32H ORG 00H LJMP START ORG 0BH LJMP INT_T0 START: MOV TCOUNT2S,#00H MOV TCNT02S,#00H MOV ID,#00H MOV TMOD,#01H MOV TH0,#(65536-50000) / 256 MOV TL0,#(65536-50000) MOD 256 SETB T
31、R0 SETB ET0 SETB EA SJMP $ INT_T0: MOV TH0,#(65536-50000) / 256 MOV TL0,#(65536-50000) MOD 256 INC TCOUNT2S MOV A,TCOUNT2S CJNE A,#40,NEXT MOV TCOUNT2S,#00H INC ID MOV A,ID CJNE A,#04H,NEXT MOV ID,#00H NEXT: INC TCNT02S MOV A,TCNT02S CJNE A,#4,DONE MOV TCNT02S,#00H MOV A,ID CJNE A,#00H,SID1 CPL P1.0
32、 SJMP DONE SID1: CJNE A,#01H,SID2 CPL P1.1 SJMP DONE SID2: CJNE A,#02H,SID3 CPL P1.2 SJMP DONE SID3: CJNE A,#03H,SID4 CPL P1.3 SID4: SJMP DONE DONE: RETI END C语言源程序 #include unsigned char tcount2s; unsigned char tcount02s; unsigned char ID; void main(void) TMOD=0x01; TH0=(65536-50000)/256; TL0=(6553
33、6-50000)%256; TR0=1; ET0=1; EA=1; while(1); void t0(void) interrupt 1 using 0 tcount2s+; if(tcount2s=40) tcount2s=0; ID+; if(ID=4) ID=0; tcount02s+; if(tcount02s=4) tcount02s=0; switch(ID) case 0: P1_0=P1_0; break; case 1: P1_1=P1_1; break; case 2: P1_2=P1_2; break; case 3: P1_3=P1_3; break; 七. 编译 在
34、编译环境下将源程序编译成目标程序,生成T0.HEX八. 运行:将T0.HEX导入AT89C51,点击运行按钮运行程序,并查看运行结果。图8 运行结果图九. 实验报告:按实验报告要求完善实验报告实验八 数字钟实验一. 实验目的1. 进一步掌握PROTUES软件的简单引用2. 掌握定时/计数器的使用3. 掌握LED的使用二实验内容 用AT89C51的定时/计数器T0产生0.01秒钟的定时,每当定时到来时,相应LED点亮,本实验要求有小时、分钟、秒钟、0.01秒的显示。 三. 主要实验设备及元件计算机、PROTEUS软件环境系统、WAVE或KEILE C软件环境四. 实验要求1. 能正确运用PROT
35、EUS软件进行简单图样的设计2. 掌握中断程序的编写和定时器的应用,掌握显示程序的编写思路五. 实验步骤1. 绘制PROTEUS环境下图样。图9 数字钟电路图2. 编制程序#include reg51.h#define uchar unsigned char#define uint unsigned intsbit p2_6=P26;sbit p2_7=P27;uchar time,i,j,jk,sel;uchar wei,fen,miao,shi;uchar code tb10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;uchar i
36、data dis_buff8=0;timer0() interrupt 1 using 1 TH0=(65535-1000)/256; TL0=(65535-1000)%256; P2=sel; sel+; time+; i+; j+; void main() time=0; i=0; j=0; wei=0; fen=0; miao=0; shi=0; sel=0x00; TMOD=0x01; TH0=(65535-1000)/256; TL0=(65535-1000)%256; EA=1; ET0=1; TR0=1; for(;) P0=tbdis_buffi; dis_buff1=jk%10; dis_buff2=jk/10; dis_buff3=miao%10; dis_buff4=miao/10; dis_buff5=fen%10; dis_buff6=fen/10; dis_buff7=shi%10; dis_buff0=shi/10; if(time=8)time
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 规范律师选聘管理办法
- 《出差管理办法执行》
- 行政公文写作管理办法
- oa系统差旅管理办法
- 行政编工人管理办法
- 一级建筑资质管理办法
- 索菲亚人员管理办法
- 三一建筑工程管理办法
- soho人员管理办法
- 专利形成闭环管理办法
- 神经重症患者镇痛镇静治疗中国专家共识解读
- 教科版2025小学二年级科学教学发展规划计划
- 《铁路路基施工与维护》高职高速铁路施工与维护全套教学课件
- 安全生产隐患排查表汇编
- 2025年深圳中考物理试卷真题(含答案)
- GB/T 34722-2025浸渍胶膜纸饰面胶合板和细木工板
- 绿色施工方案(3篇)
- 2025年课标卷高考地理真题(解析版)
- 《劳动与技术》一年级上册教案
- 2024年湖南省双峰县卫生局公开招聘试题带答案
- 液位计考试试题及答案
评论
0/150
提交评论