您的当前位置:首页正文

华南农业大学单片机实验报告书

2020-09-30 来源:星星旅游
第四章:实验

实验一 闪烁LED实验(2学时)

一、实验目的

1、学会使用Keil建立51单片机Project和编译程序; 2、学会程序延时的方法;

3、学会使用单片机I/O口实现输出。

二、实验内容

通过软件延时,控制一位LED按设定的时间间隔闪烁。

三、实验过程与结果记录

1、单片机开发试验仪相关部分原理图

2、程序(自行编写,C语言与汇编均可) #include sbit led=P1^0; unsigned int i,j; void main() { while(1) {led1=0; for(i=1000;i>0;i--) for(j=110;j>0;j--) led1=1; for(i=1000;i>0;i--) for(j=110;j>0;j--) } }

四、思考题

1、如何改变LED闪烁的时间间隔?

通过延时函数,让CPU持续延时,使循环体内LED状态在延时的时间内保持不变。

2、 如何实现更精确的闪烁时间间隔?

用汇编可以精确延时,也可以用时钟中断,精确延时。

实验二 移位LED实验(2学时)

一、实验目的

1、学会二进制移位操作和循环语句在单片机中的用法; 2、认识CY位在汇编中如何参与移位。

二、实验内容

1、1个LED从左到右循环依次点亮; 2、1个LED左右来回循环依次点亮;

3、花式流水灯,自定义样式点亮8个LED。

三、实验过程与结果记录

1、单片机开发试验仪相关部分原理图,同实验一。 2、程序(自行编写,C语言与汇编均可) 1):#include #define uchar unsigned char uchar a;

void delay(int time) {int x,y;

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

void move(int x) { int i; if(x==1) { a=0x01;} else if(x==2) {a=0xaa;} else {a=0x80;}

for(i=0;i<=7;i++) { P0=a; delay(350); if(x==1) {a=a<<1;} else if(x==2) {a=a<<1;} else {a=a>>1;} } }

void main() {int i; a=0x01; while(1) {move(1); move(0); move(2); move(1); move(1); move(2); } }

四、思考题

1、比较RR,RL和RRC,RLC指令的异同。

2、LED共阳极接法与共阴极接法,输出I/O口时有什么不同?

IO口输出对于不同情况,要取反。

实验三 七段数码管实验(2学时)

一、实验目的

1、学习七段数码管静态显示阿拉伯数字; 2、学习查表指令的使用。

二、实验内容

采用静态显示的方法,编程实现单个七段数码管循环显示0~9,主程序中的循环语句反复将0~9的段码送至P0口,使数字0~9循环显示。

三、实验过程与结果记录

1、单片机开发试验仪相关部分原理图,其中七段数码管采用共阳极接法。

2、程序(自行编写,C语言与汇编均可) #include

#define uchar unsigned char uchar a;

uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; void delay(int time) {int x,y;

for(x=time;x>0;x--) for(y=110;y>0;y--); } void main() {P0=tab[6]; while(1) {P0=tab[0]; for(a=0;a<=9;a++) { P0=tab[a]; delay(1000); } }}

四、思考题

1、数码管静态显示与动态显示有何异同?请写出各自适用范围。

静态显示就是一直都是那个输出,动态显示是在人眼不能分辨的情况下,

快速变换输出。使用的io口比较少的时候,用动态显示。

2、数码管的共阳极接法与共阴极接法,输出字表有什么不同? 跟二极管类似,也是取反。

实验四 按键实验(2学时)

一、实验目的

1、学习独立按键的使用; 2、学习矩阵键盘的使用。

二、实验内容

判断独立按键输入(8位),当按下按键后,一位数码管显示对应的键值;

三、实验过程与结果记录

1、单片机开发试验仪相关部分原理图,其中LED与数码管部分同前述实验,按键部分原理图如下:

2、程序(自行编写,C语言与汇编均可) #include

#define uchar unsigned char

uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //uchar code tab[]={0x90,0x80,0x82,0x92,0x99,0xb0,0xa4,0xf9,0xc0} ; sbit key0=P1^0; sbit key1=P1^1; sbit key2=P1^2; sbit key3=P1^3; sbit key4=P1^4; sbit key5=P1^5; sbit key6=P1^6; sbit key7=P1^7; int a,x,y;

void delay(int z) { for(x=z;x>0;x--)

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

void main() { P0=tab[9]; while(1) { if(key1==0) { delay(10); if(key1==0) { P0=tab[1]; } while(!key1); } if(key2==0) { delay(10); if(key2==0) { P0=tab[2]; } while(!key2); } if(key3==0) { delay(10); if(key3==0) { P0=tab[3]; } while(!key3); }

if(key4==0) {

delay(10); if(key4==0) {

P0=tab[4]; }

while(!key4); }

if(key5==0) {

delay(10); if(key5==0) {

P0=tab[5]; }

while(!key5); }

if(key6==0) {

delay(10); if(key6==0) {

P0=tab[6]; }

while(!key6); }

{

if(key7==0) delay(10); if(key7==0) {

P0=tab[7];

} while(!key7); } } }

四、思考题

1、为什么需要按键防抖?如何实现软件去抖?

因为机械按键按下的瞬间,会在1和0之间抖动数次,不去抖,会多次输入,产生干扰。

先判断是否按下按键,再延时10ms,进入第二重判断,在判断里面进行按键响应的对应操作,延时直到按键松开,退出第一重判断

实验五 串口通信实验(2学时)

一、实验目的

1、学习单片机与PC之间的串口通信;

二、实验内容

1、通过一位独立按键,每按一次,数字(从0开始)加一发送到PC调试软件上显示。

三、实验过程与结果记录

1、单片机开发试验仪相关部分原理图,其中按键部分同前述,串口部分通过下载程序的USB(CH340-USB to TTL)实现。

2、程序(自行编写,C语言与汇编均可) #include #include //11.0592Mhz sbit key=P2^7;

void Uart_Init() {

TH1 = 0xFD; //晶振11.0592mhz 波特率设为9600 TL1 = TH1; TMOD |= 0x20; //定时器1方式2 SCON = 0x50; //串口接收使能 ES = 1; //串口中断使能

TR1 = 1; //定时器1使能 TI = 1; //发送中断标记位,必须设置 }

void delay_ms(unsigned int n) {

unsigned int i,j; for(i=0;ifor(j=0;j<123;j++); }

void main() {

int i = 0; Uart_Init(); delay_ms(10);

while(1) {

if(key==0) {

delay_ms(10); if(key==0) { while(!key); printf(\"num=%d\\r\\n\ i++; }

} } }

四、思考题

1、单片机串行口通信需要注意什么?从硬件电平,软件设置(波特率,停止位……)等方面描述。

因篇幅问题不能全部显示,请点此查看更多更全内容