中南大学单片机课程设计

更新时间:2023-09-02 11:54:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

李志民实验室单片机实验

课外通过郭天祥的视频提示,利用自己的单片机做的比较复杂的实践(c语言)

1.题目:利用动态扫描和定时器1在数码管上显示出从87654321开始,以0.1

秒得速度往下递减直至8765250并保持此数,与此同时利用定时器0以500ms

速度进行从上至下移动,当数码管上数见到停止时,实验板上流水灯也停止然

后全部开始闪烁,三秒后(用t0定时)流水灯全部关闭,数码管上显示“HELLO”

就此保持住。

实验程序

#include<reg52.h>

#include <intrins.h>

#define unit unsigned int

#define uchar unsigned char

void display(aa,bb,cc,dd,ee,bai,shi,ge) ;

void init();

sbit wela=P2^3;

sbit dula=P2^2;

uchar temp,t0,t1,bai,shi,ge,aa,bb,cc,dd,ee,flag,flag1;

unit shu;

void delay(unit z) ;

uchar code table[]={

0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71

,0x36,0x76,0x38,0x3f,0 };

void main()

{

init();

while(1)

{

if(flag1!=1)

display(8,7,6,5,4,bai,shi,ge);

else

display(16,17,18,18,19,20,20,20);

}

}

void init()

{ 0x3f,

李志民实验室单片机实验

shu=321;

temp=0xfe;

P1=temp;

TMOD=0x11;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

ET1=1;

TR1=1;

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

t0++;

if(flag!=1)

{

if(t0==10)

{

t0=1;

temp=_crol_(temp,1);

P1=temp;

}

}

else

{

if(t0%4==0)

P1=~P1;

if(t0==60)

{ TR0=0;

P1=0xff;

flag1=1;

}

}

}

李志民实验室单片机实验

void timer1() interrupt 3

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

t1++;

if(t1==5)

{ t1=0;

shu--;

bai=shu/100;

shi=shu%100/10;

ge=shu%10;

if(shu==250)

{ TR0=0;

P1=0xff;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

flag=1;

t0=0;

TR1=0;

}

}

}

void display(aa,bb,cc,dd,ee,bai,shi,ge)

{

wela=1;

P0=0xfe;

wela=0;

dula=1;

P0=table[aa];

delay(1);

wela=1;

李志民实验室单片机实验

wela=0; dula=1; P0=table[bb]; delay(1); wela=1; P0=0xfb; wela=0; dula=1; P0=table[cc]; delay(1); wela=1; P0=0xf7; wela=0; dula=1; P0=table[dd]; delay(1); wela=1; P0=0xef; wela=0; dula=1; P0=table[ee]; delay(1); wela=1; P0=0xdf; wela=0; dula=1; P0=table[bai]; delay(1); wela=1; P0=0xbf; wela=0; dula=1; P0=table[shi];

李志民实验室单片机实验

delay(1);

wela=1;

P0=0x7f;

wela=0;

dula=1;

P0=table[ge];

delay(1);

}

void delay(unit z)

{ unit i,j;

for(i=z;i>0;i--)

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

}

2.题目

通过按4*4的矩阵键盘在数码管上分别显示0~~F, 例如按第一行第一列是显

示0.按第一行第二列显示1······

实验程序:

#include<reg52.h>

#define unit unsigned int

#define uchar unsigned char

sbit wela=P0^1;

sbit dula=P0^0;

Uchar code table[]={

0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71

,0x36,0x76,0x38,0x3f,0 };

void delay(unit z);

void display(uchar num);

void keyscan();

void main()

{

dula=1; 0x3f,

李志民实验室单片机实验

P1=0;

dula=0;

wela=1;

P1=0;

wela=0;

while(1)

{

keyscan();

}

}

void keyscan()

{

uchar temp,key;

P2=0xfe;

temp=P2;

temp=temp&0xf0 ;

if(temp!=0xf0)

{

delay(10);

temp=P2;

temp=temp&0xf0 ;

if(temp!=0xf0)

{

temp= P2;

switch (temp )

{

case 0x7e :key=0;break;

case 0xbe :key=1;break;

case 0xde :key=2;break;

case 0xee: key=3;break;

}

if(temp!=0xf0)

李志民实验室单片机实验

{

temp=P2;

temp=temp&0xf0

}

display(key) ;

}

}

}

void display(uchar num)

{ P1=table[ num];

dula=1;

dula=0;

}

void delay(unit z)

{ unit i,j;

for(i=z;i>0;i--)

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

}

;

李志民实验室单片机实验

一、实验目的与要求:

1、熟练掌握

Keil C51集成开发工具的操作及调试程序的方法,包括:仿真调试与脱机运行间的切

换方法;

2、熟练使用 SST89C554RC单片机核心板及 I/O扩展实验系统;

3、熟练掌握在 Keil C51与 Proteus仿真软件虚拟联机环境下,基于 51单片机控制器数

字接口电路的硬件、软件设计与功能调试;

4、完成MCS51单片机指令系统软件编程设计和硬件接口功能设计题;

二、基本实验内容(SST89E54RC单片机实现单片机实现)

实验一:清零程序与拆字程序设计根据实验指导书之“第二章单片机原理实验”(P17~P23

页)内容,熟悉实验环境及方法,完成思考题 1、2(P23)基础实验项目。

(1) (2)

1:实验程序:ORG 0000H

李志民实验室单片机实验

LJMP MAIN

ORG 0100H

MAIN: MOV R0,#00H ;片内RAM首地址

MOV R1,#10H ;R1设定值

MOV DPTR,#7000H ;写入数据初值

MOV A,#00H

DIM:

LOOP: MOVX @DPTR, A

INC DPTR

INC R0

CJNE R0,#00H,LOOP

DJNZ R1,DIM

SJMP $

END

2:ORG 0000H

LJMP MAIN

ORG 0100H

MAIN:

MOV A,#13H

MOV DPTR,#7000H

MOVX @DPTR,A

MOVX A,@DPTR

MOV B,A

SWAP A

ANL A,#0FH

MOV DPTR,#7001H

MOVX @DPTR,A

MOV A,B

ANL A,#0FH

MOV DPTR,#7002H

MOVX @DPTR,A

MOVX @DPTR,A

END

实验二:拼字程序与数据传送程序设计汇编语言完成实验指导书 P24思考题

3、4题的基础实验项目。

李志民实验室单片机实验

(3) (4)

3:ORG 0100H

MAIN:

MOV A,#13H

MOV DPTR,#7000H

MOVX @DPTR,A ;给7000H赋初值

INC DPTR

MOV A,#24H

MOVX @DPTR,A ;7001H

MOV DPTR,#7000H

MOVX A,@DPTR

ANL A,#0FH

SWAP A

MOV B,A

INC DPTR

MOVX A,@DPTR

ANL A,#0FH

ORL A,B

INC DPTR

MOVX @DPTR,A

END

4:ORG 0000H

AJMP MAIN

ORG 0100H

LOOP EQU 50H

MAIN:MOV R2,#70H

MOV R3,#00H

MOV R4,#70H

李志民实验室单片机实验

MOV R5,#20H

MOV R6,#00H

MOV R7,#05H

MOV DPH,R6

MOV DPL,R7

MOV A,#05H

MOVX @DPTR,A

MOV LOOP,A ;字节数

CS: MOV DPH,R2

MOV DPL,R3

MOVX A,@DPTR ;首地址值里的内容

MOV DPH,R4

MOV DPL,R5

MOVX @DPTR,A ;首地址内容传送到R4R5的地址

CLR C ;进位端清零

MOV A,R3

ADD A,#01H

MOV R3,A

JC C1

JMP C3

C1: MOV A,R2

ADD A,#01H

MOV R2,A ;地址后移

C3: CLR C

MOV A,R5

ADD A,#01H

MOV R5,A

CLR A

ADDC A,R4 ;R4R5地址后移

MOV R4,A

C4: DJNZ LOOP,CS

SJMP $

END

实验三:散转与排序程序设计汇编语言完成实验指导书 P24思考题5、6题的

基础实验项目。

李志民实验室单片机实验

(5) (6)

5:ORG 0000H

LJMP MAIN

ORG 0100H

MAIN:

MOV R0,#30H

MOV R1,#0AH

MOV A,@R0

LOG: INC R0

CJNE A,@R0,MIN

MIN: JC MMN

SJMP MON

MMN: MOV B,A

MOV A,@R0

MOV @R0,B

MON: DJNZ R1,LOG

END

6:

ORG 0000H

LJMP MAIN

ORG 0100H

MAIN:

李志民实验室单片机实验

MOV R0,#30H ;数据块起始地址

MOV R1,#0AH ;比较数据个数

DEC R1

MOV A,R0

MOV R4,A

CLR PSW.5 ; 清标志位

MST: MOV A,R4

MOV R0,A

MOV A,R1

MOV R3,A

LOG:

MOV A,@R0

MOV R2,A

INC R0

MOV A,@R0

CLR C

SUBB A,R2

JC MON ;前数小于后数 ,不变

SETB PSW.5 ;清标志位

MOV A,@R0

DEC R0

MOV @R0,A

INC R0

MOV A,R2

MOV @R0,A

MON: DJNZ R3,LOG

JBC PSW.5,MST

END

实验四:数字量输入输出实验

基本部分:阅读、验证C语言程序功能。使用汇编语言编程,完成实验指导书

之“3.1数字量输入输出实验”基本实验项目(P36)。

汇编程序:

ORG 0000h

LJMP START

ORG 0060H

START:

MOV A,#0F0H ;准备给P1口高四位置高,做输入

MOV P1,A ;给P1口高四位置高

MOV A,P1 ;读P1口

SWAP A ;交换A的高四位与低四位

MOV P1,A ;将读到的数送P1口显示(通过P1口的低

四位接的发光二极管显示)

李志民实验室单片机实验

LJMP START ;重新扫描

END

提高部分:题目一:LED交通灯控制(使用8255接口芯片)

要求:使用汇编语言编程,功能为:通过开关实现LED灯工作方式即时控制,完成 LED交通灯的开关控制显示功能和 LED交通灯自动循环显示功能。

题目二:LED灯控制(使用8255接口芯片)

要求:使用汇编语言编程,功能为:通过KK1实现 LED灯工作方式即时控制完成LED开关控制显示和 LED灯左循环、右循环、间隔闪烁功能。

题目三:键盘扫描与数码管显示设计(使用 8255接口芯片)

要求:阅读、验证C语言参考程序功能。使用汇编语言完成编程与功能调

试(P69)。

实验五:定时器/计数器实验

基本部分:阅读、验证C语言程序功能。使用汇编语言编程,完成实验指导书

之“3.3定时/计数器实验”基本实验项目(P40)。

提高部分:(任选一题完成)

题目一:定时器控制LED灯

要求:由单片机内部定时器1,按方式1工作,即作为16位定时器使用每0.05秒钟T1溢出中断一次。P1口的P1.0-P1.7分别接八个发光二极管。编写程序模拟时序控制装置。开机后第一秒钟 L1,L3亮,第二秒钟L2,L4亮,第三秒钟L5,L7亮,第四秒钟 L6,L8亮,第五秒钟L1,L3,L5,L7亮,第六秒钟L2,L4,L6,L8亮,第七秒钟八个 LED灯全亮,第八秒钟全灭,以后又从头开始,L1,L3亮,然后L2,L4亮 一直循环下去。

汇编程序:ORG 00H

LJMP MAIN

ORG 0100H

MAIN: MOV SP,#30H

MOV A,#00H

MOV P1,A

L0: MOV A,#05H ;第1s

MOV P1,A

LCALL DELAY

MOV A,#0AH

MOV P1,A

LCALL DELAY

MOV A,#50H

MOV P1,A

LCALL DELAY

MOV A,#0A0H

MOV P1,A

LCALL DELAY

MOV A,#55H

MOV P1,A

李志民实验室单片机实验

LCALL DELAY

MOV A,#0AAH

MOV P1,A

LCALL DELAY

MOV A,#0FFH

MOV P1,A

LCALL DELAY

CLR A ;第8s

MOV P1,A

LCALL DELAY

LJMP L0

DELAY: ;1s定时,初始化定时器

MOV TMOD,#10H

MOV TH1,#9EH

MOV TL1,#58H

MOV IE,#00H

MOV R0,#14H

LOOP:SETB TR1

LOOP1:JBC TF1,LOOP2

AJMP LOOP1

LOOP2:MOV TH1,#9EH

MOV TL1,#58H

CLR TF1

DJNZ R0,LOOP

RET

END

题目二:计数器实验:

要求:单片机内部定时计数器,按计数器模式和方式1工作,对

李志民实验室单片机实验

P3.4(T0)引脚进行计数。使用T1作定时器,50ms中断一次,看T0内每0.50来了多少脉冲,将其数值按二进制在LED灯上显示出来,5秒后再次测试。

题目三:急救车与交通灯(外部中断实验)

要求:完成交通灯基本功能基础上,当有急救车到达时,两向交通信号为

全红,以便让急救车通过。假定急救车通过路口时间为10秒,急救车通过后,

交通灯恢复中断前状态。本实验题以按键为中断申请,表示有急救车通过。

实验六:A/D、D/A转换实验

基本部分:阅读、验证

C语言程序功能。使用汇编语言编程,完成实验指导书之“4.3 A/D转换实验”项目(P64)和“4.4 D/A转换实验”项目(P67)。

实验目的:

1. 学习数/模转换的基本原理

2. 掌握 DAC0832 的使用方法。

实验内容:

设计实验电路图实验线路并编写程序,实现 D/A 转换,要求产生锯齿波、脉冲波,并用示波器观察电压波形。

实验原理:

D/A 转换器是一种将数字量转换成模拟量的器件,其特点是:接收、保持和转换的数字信息,不存在随温度、时间漂移的问题,其电路抗干扰性较好。大多数的 D/A 转换器接口设计主要围绕 D/A集成芯片的使用及配置响应的外围电路。DAC0832 是 8 位芯片,采用 CMOS 工艺和 R-2RT 形电阻解码网络,转换 WR1 结果为一对差动电流 Iout1 和 Iout2

4-4-1 示,引脚如图 4-4-1所示。

输出,其主要性能参数如表

李志民实验室单片机实验

实验步骤

1. 实验接线图如图 4-4-2 所示,按图接线;

2. 编写实验程序,经编译、链接无误后装入系统,启动调试;

3. 运行程序,用示波器测量 DA 的输出,观察实验现象;

4. 自行编写实验程序,产生三角波形,使用示波器观察输出,验证程序功能。

AD: ORG 00H

LJMP MAIN

ORG 0100H

MAIN:

STR EQU 7F08H ;转换值存储地址

MOV R0,#08

MOV DPTR,#7F00H ;转换值起始地址

LOOP: MOVX @DPTR,A

NOP

JNB P3.3,$

MOVX A,@DPTR

MOV P2,STR

MOV R0,STR+1

MOVX @DPTR,A

INC DPTR

INC STR

DJNZ R0,LOOP

END

DA:

ORG 00H

李志民实验室单片机实验

LJMP MAIN

ORG 0100H

MAIN:

MOV DPTR,#7FFFH

MOV A,#00H ;初始值,产生锯齿波

LP1:MOVX @DPTR,A

INC A

SJMP LP1

END

提高部分:(要求在PROTERUS中完成)

小键盘给定(并显示工作状态),选择信号源输出波形类型(D/A

转换方式),经过 A/D采样后,将采样数据用LED灯,显示当前模拟信号值大小及变化状态。

实验七:串行通信实验

基本部分:阅读、调试C语言程序功能。使用汇编语言编程,完成实验指导书

之“3.7串口通讯实验”项目。(要求:实验仪器上完成)

利用单片机实验系统,实现与PC机通讯。功能要求:将从实验系统键盘上键入的数字,字母显示到PC机显示器上,将PC机键盘输入的字符(0-F)显示到单片机实验系统的数码管上。

实验目的:

1. 学习MCS-51 单片机串口的工作原理及程序设计;

2. 了解使用SSTEasyIAP11F.EXE 软件实现程序脱机运行的方法;

3. 熟悉启动加载代码与SoftICE 相互切换的方法。

实验原理:

MCS-51 单片机内部的全双工串行接口部分,包含有串行接收器和串行发送器。有两个物理上独立的接收缓冲器和发送缓冲器。接收缓冲器只能读出接收的数据,但不能写入。发送缓冲器只能写入发送的数据,但不能读出。因此可以同时收、发数据,实现全双工通讯。两个缓冲器是特殊功能寄存器SBUF,它们公用地址为99H,SBUF 是不可位寻址的。此外,还有两个寄存器SCON 和PCON 分别用于控制串行口的工作方式以及波特率,定时器T1 可以用作波特率发生器 SST89E554RC 提供了增强型全双工串行接口,具有帧错误检测和自动地址识别的功能。 由于SST89E554RC 的串口用作调试目的,所以Keil C51 软件提供了串口模拟窗口,可以借助此窗口调试串口通讯程序。也可以将程序编译生成目标代码(.HEX),脱机运行。

李志民实验室单片机实验

实验内容

编写实验程序,每隔一定的时间单片机向串口发送一次数据“Xi’an Tangdu Corp.”。

汇编程序:ORG 00H

LJMP MAIN

ORG 0023H ;中断设置

LJMP XJM

ORG 0100H

MAIN: MOV SP,#30H

MOV R1,#50H ;初始化,选定时器1产生19200b/S的波特率

MOV R0,#00H

MOV TMOD,#20H

MOV TL1,#0FDH

MOV TH1,#0FDH

MOV SCON,#50H

MOV R7,#20H

SETB TR1 ;开启定时器

SETB ES ;开串行中断

SETB EA ;开全局中断

LOOP1:CLR PSW.5

DJNZ R7,LOOP

SJMP $

LOOP:MOV DPTR,#TAB

MOV A,R0

MOVC A,@A+DPTR

MOV SBUF,A

JNB PSW.5,$

SJMP LOOP1

ORG 0023H

XJM:LCALL DELAY

JB TI,SEND

LJMP RECIVE

SEND: CLR TI

INC R0

SETB PSW.5

JMP EXIT

RECIVE: MOV A,SBUF

MOV @R1,A

INC R1

本文来源:https://www.bwwdw.com/article/r5ai.html

Top