单片机课后实验报告_第1页
单片机课后实验报告_第2页
单片机课后实验报告_第3页
单片机课后实验报告_第4页
单片机课后实验报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

单片微机原理实验报告PAGEPAGE0第页实验报告实验报告单片微机原理及应用姓名:学号:专业:电气工程及其自动化指导教师:任家富

实验(1)名称:I/O控制实验要求将8个LED灯分别接入任何一个端口(P0、P1、P2、P3),让LED灯不停止地进行循环亮/灭(亮/灭现象也可以自由发挥,如并列2个LED或交叉几个LED灯进行循环亮/灭)。二、实验原理用红外对管输入一个脉冲,利用了左移函数_crol_()使得LED巡回亮灭,中间加入了延迟函数,使得LED的亮灭,让我们可以明显看到在通过红外对管输入一个脉冲时,数码管依次亮灭。三、程序设计#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineaintunsignedintvoiddelay(uchar);voidmain(){ucharled;led=0Xfe; P1=led; while(1) { led=_crol_(led,1);//左移函数 delay(50); P1=led; delay(50); }}voiddelay(uintc){uchara,b;for(a=c;a>0;a--){ for(b=200;b>0;b--); }}四、现象及结果从红外对管处给一个脉冲,流水灯亮一个,依次循环。实验(2)名称:中断与定时一、实验要求(1)外部中断的使用采用2种触发方式(边沿与电平)进行。每次中断点亮/灭掉一个LED即可。(2)Timer定时器的使用使用16位和8位自动装载方式定时1/2/3秒,循环亮/灭LED灯。三、程序设计(1)外部中断的使用#include<reg52.h>sbitp10=P1^0;sbitp17=P1^7;sbitkey=P3^2;sbitkey1=P3^3;voidinit();voiddelay(unsignedz);intb; voidmain(){ init(); while(1);}voidinit(){ TCON=0x05; EA=1; EX0=1; EX1=1; P1=0xfe;}voidout_interrupt0()interrupt0{ if(!key) { delay(20); if(!key) {b=p17; P1=P1<<1; p10=b; while(!key); delay(20); while(!key); } }}voidout_interrupt1()interrupt2{ if(!key1) { delay(20); if(!key1) b=p17; P1=P1>>1; p10=b; delay(2000); }}voiddelay(unsignedz) //延迟{ unsignedintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}(2)Timer定时器的使用1.16位定时器#include<reg52.h>sbitp10=P1^0;sbitp17=P1^7;sbitspeak=P2^7;voidinit();inttime=0,b;//unsignedcharcodetable[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};voidmain(){ init(); while(1) { if(time==20) { time=0; b=p17; P1=P1<<1; p10=b; } } }voidinit(){ TMOD=0x01; P1=0xfe; EA=1; ET0=1; TR0=1; TH0=0x3c; TL0=0xb0; time=0;}voidtimer0()interrupt1{ TH0=0x3c; TL0=0xb0; time++;}2.8位自动重装#include<reg52.h>sbitp10=P1^0;sbitp17=P1^7;sbitspeak=P2^7;voidinit();inttime=0,b;voidmain(){ init(); while(1) { if(time==5000) { time=0; b=p17; P1=P1<<1; p10=b; } } }voidinit(){ TMOD=0x02; P1=0xfe; EA=1; ET0=1; TR0=1; TH0=0x37; TL0=0x37; time=0;}voidtimer0()interrupt1{ time++;}四、现象及结果(1)外部中断:当按下K1键,LED灯左移。按下K2键,LED右移一位。(2)Timer定时器LED灯以1秒的间隔循环亮灭。实验(3)名称:键盘键值的读取一、实验要求完成4X4的矩阵键盘键值的读取。采用联机调试的方式,将读取的键值赋给一变量,在keil变量观察窗口中查看键值。二、实验原理三、程序设计#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintuintkey;uintcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};uintkey_scan(){ uintcord,cord_hang,cord_lie; P3=0xf0; cord_lie=P3; P3=0x0f; cord_hang=P3; cord=cord_hang+cord_lie; if(cord!=0xff) { return(cord); } return(cord); }voidmain(){ uinttemp; P2=0xfe; P1=0xfe; while(1) { temp=key_scan(); if(temp!=0xff) { switch(temp) { case0xee:key=0;break; case0xed:key=1;break; case0xeb:key=2;break; case0xe7:key=3;break; case0xde:key=4;break; case0xdd:key=5;break; case0xdb:key=6;break; case0xd7:key=7;break; case0xbe:key=8;break; case0xbd:key=9;break; case0xbb:key=10;break; case0xb7:key=11;break; case0x7e:key=12;break; case0x7d:key=13;break; case0x7b:key=14;break; case0x77:key=15;break; } P2=~key; P0=~table[key]; } }四、现象及结果当按下0—16的按键时,数码管显示相应的键值。实验(4)名称:LED数码管的显示实验内容及目的用4支8段数码管分别用动态和静态显示4位数,如1234和1111。硬件电路自行搭接。二、实验原理通过控制数码管的段选和位选,让数码管显示不同的值。(1)静态扫描给位选低电平,数码管亮,给段选段码信号,(2)动态扫描控制位选,选择一个数码管亮,然后给段选分别送相应的值,通过调节延时的长短和数码管的余晖,让数码管动态显示出1234,而人为的感觉像是静态显示。三、程序设计(1)静态扫描#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintuintcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};voiddelay(uintz) { uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}voidmain(){ while(1) { P1=0x00; delay(10); P0=0xc0; }}(2)动态扫描#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintuintcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};voiddelay(uintz) { uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}voidmain(){ while(1) {P1=0xfe; P0=~table[0]; delay(10); P1=0xfd; P0=~table[1]; delay(10); P1=0xfb; P0=~table[2]; delay(10); P1=0xf7; P0=~table[3]; delay(10); }}四、现象及结果(1)静态扫描数码管显示0000。(2)动态扫描数码管显示1234。实验(5)名称:串口通讯一、实验要求通过单片机的UART,完成单片机对PC(计算机)的通讯。学会使用上位机串口助手,通过该助手完成单片机与PC之间的“接收”与“发送”数据(任意字符串)。具体要求:(1)通过矩阵键盘输入数值,并设计功能键(如”A”发送);(2)键盘输入数值放入显示缓冲单元(显缓)中,通过4位LED数码管显示;(3)按下“功能键”,实现发送(显缓中的数据)与接收(上位机发送的数据,并在LED上显示)。二、实验原理通过单片机的TXD、RXD引脚实现串行口的收发数据,让后用RS232线实现单片机和电脑之间的链接,其中要经过MAX232进行电平转换。三、程序设计#include<reg52.h>#include<stdio.h>#defineucharunsignedchar#defineuintunsignedintsbitdula=P2^6;sbitwela=P2^7;uintcord_hang,cord_lie,shu,send,accept=1;uintcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};voidserial_accept();uinta=16,b=16,c=16,d=16;uintwei=0,key,temp,s1,s2,s3,s4;uinte=1,flag=0;voiddelay(uintz) { uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}voiddisplay(uchara,ucharb,ucharc,uchard){dula=0;P0=table[a];dula=1;dula=0;wela=0;P0=0xfe;wela=1;wela=0;delay(1);P0=table[b];dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[c];dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1);P0=table[d];dula=1;dula=0;P0=0xf7;wela=1;wela=0;delay(1); }uintkey_scan(){ P3=0xf0; cord_hang=P3; P3=0x0f; cord_lie=P3; cord_hang=cord_hang|cord_lie; if(cord_hang!=0xff) //消抖 { delay(20); P3=0xf0; cord_hang=P3; P3=0x0f; cord_lie=P3; cord_hang=cord_hang|cord_lie; if(cord_hang!=0xff) { delay(20); P3=0xf0; cord_hang=P3; P3=0x0f; cord_lie=P3; cord_hang=cord_hang|cord_lie; if(cord_hang!=0xff) return(cord_hang);//有键按下时候的返回值 } } return(cord_hang); //无键按下时候的返回值,为0xff}voidkey_num(intj){ wei++; if(wei==5) {wei=1;a=16;b=16;c=16;d=16;} if(wei!=0) //实时显示 { switch(wei) { case1:a=j;s1=a;break; case2:b=j;s2=b;break; case3:c=j;s3=c;break; case4:d=j;s4=d;break; } }}voidkey_combin(){ switch(wei) { case1:shu=s1;break; case2:shu=s2+s1*10;break; case3:shu=s3+s2*10+s1*100;break; case4:shu=s4+s3*10+s2*100+s1*1000;break; }}voidkey_accept(){ printf("请输入数据:"); TI=0;//使不会应为发送标示位而进入中断函数 EA=1; ES=1;//打开串行中断 while(flag==0);//原地等待发送完数据 flag=0; b=e&0x0f; //显示低4位 a=e&0xf0; //显示高4位; a=a>>4; c=16; d=16; wei=4; EA=0; ES=0; TI=1;}voidserial_init(){ SM0=0; SM1=1; REN=1; TMOD=0x20; TR1=1; TH1=0xfd; TL1=0xfd; TI=1; //RI=1; EA=0; ES=0;}voidserial()interrupt4{ if(RI==1) {e=SBUF; flag=1; RI=0;}}voidmain(){ serial_init(); while(1) { temp=key_scan(); if(temp!=0xff) { switch(temp) { case0xee:key_num(1);break; case0xde:key_num(2);break; case0xbe:key_num(3);break; case0x7e:key_num(4);break; case0xed:key_num(5);break; case0xdd:key_num(6);break; case0xbd:key_num(7);break; case0x7d:key_num(8);break; case0xeb:key_num(9);break; case0xdb:key_num(10);break; case0xbb:key_num(11);break; case0x7b:key_num(12);break; case0xe7:key_num(13);break; case0xd7:key_combin();break; //组合成10进制数 case0xb7:printf("%d",shu);break; //把10进制数输出 case0x77:key_accept();break; //接收PC机的值。 } while(key_scan()!=0xff);//松手检测 } display(a,b,c,d); }}四、现象及结果矩阵键盘的第一个到第13个键盘,按下后,数码管会显示0—C十六进制数。按下第14个按键后,最新按下的4个数会整合成一个4位数,并在数码管在显示。按下第15个案件后,会吧数据发送到PC机的串口调试助手里面。按下第16个按键后,会等待PC机串口发送数据并显示在数码管上。实验(6)名称:综合实验一、实验内容及目的通过功能按键(A,B,C,D等)实现“秒表”、“通讯”和“步进电机的控制”等组合功能。二、实验原理本次实验是综合前面七次的实验,从而达到综合应用的目的。三、程序设计#include<reg52.h>#include<stdio.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitdula=P2^6;sbitwela=P2^7;//sbitkey_en=P1^0;uintcord_hang,cord_lie,shu,send,accept=1;uintcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};voidserial_accept();uinta=16,b=16,c=16,d=16;uintwei=0,key,temp,s1,s2,s3,s4,flag_dian_ji;uinte=1,flag=0,timer,miao_biao;bitdian_ji_fangxiang;uchardot;voiddelay(uintz) { uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}voiddisplay(uchara,ucharb,ucharc,uchard,uchardt){dula=0;P0=table[a];dula=1;dula=0;wela=0;P0=0xfe;wela=1;wela=0;delay(1);P0=table[b]|dt;dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[c];dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1);P0=table[d];dula=1;dula=0;P0=0xf7;wela=1;wela=0;delay(1); }uintkey_scan(){ P3=0xf0; cord_hang=P3; P3=0x0f; cord_lie=P3; cord_hang=cord_hang|cord_lie; if(cord_hang!=0xff) //消抖 { delay(20); P3=0xf0; cord_hang=P3; P3=0x0f; cord_lie=P3; cord_hang=cord_hang|cord_lie; if(cord_hang!=0xff) { delay(20); P3=0xf0; cord_hang=P3; P3=0x0f; cord_lie=P3; cord_hang=cord_hang|cord_lie; if(cord_hang!=0xff) return(cord_hang);//有键按下时候的返回值 } } return(cord_hang); //无键按下时候的返回值,为0xff}voidkey_num(intj){ wei++; if(wei==5) {wei=1;a=16;b=16;c=16;d=16;} if(wei!=0) //实时显示 { switch(wei) { case1:a=j;s1=a;break; case2:b=j;s2=b;break; case3:c=j;s3=c;break; case4:d=j;s4=d;break; } }}voidkey_combin(){ switch(wei) { case1:shu=s1;break; case2:shu=s2+s1*10;break; case3:shu=s3+s2*10+s1*100;break; case4:shu=s4+s3*10+s2*100+s1*1000;break; } //s1=0;s2=0;s3=0;s4=0; }voidkey_accept(){ printf("请输入数据:"); TI=0;//使不会应为发送标示位而进入中断函数 EA=1; ES=1;//打开串行中断 while(flag==0);//原地等待发送完数据 flag=0; //P1=e; b=e&0x0f; //显示低4位 a=e&0xf0; //显示高4位; a=a>>4; c=16; d=16; wei=4; EA=0; ES=0; TI=1; }voidserial_init(){ SM0=0; SM1=1; REN=1; TMOD|=0x20; TR1=1; TH1=0xfd; TL1=0xfd; TI=1; EA=0; ES=0;}voidmiaobiao_init(){ TMOD|=0x01; TH0=0xfc; TL0=0x18; EA=1; ET0=1;// TR0=1; timer=0;}voidtimer0()interrupt1{ TH0=0xfc; TL0=0x18; timer++; if(timer==10) { timer=0; miao_biao++; if(miao_biao==5999) miao_biao=0; }}voidserial()interrupt4{ if(RI==1) {e=SBUF; flag=1; RI=0;}}voiddian_ji_wei(){ flag_dian_ji=~flag_dian_ji; a=16; b=16; c=16; d=16;}voiddian_ji_qudong(){ uintnum=0; P2=0x08; for(num=0;num<3;num++) { if(dian_ji_fangxiang) {P2=_crol_(P2,1);if(P3==0x80)P3=0x08;} else {P2=_cror_(P2,1);if(P3==0x08)P3=0x80;} delay(5); } }voidmain(){ ucharclr; serial_init(); miaobiao_init(); while(1) { temp=key_s

温馨提示

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

评论

0/150

提交评论