单片机实验报告
南京理工大学紫金学院电光系
一、 实验目的(四号+黑体)
1.Keil C51软件的介绍
2.学习I/O的使用;
3.学习延时子程序的编写和使用;
4.掌握单片机编程器使用和芯片烧写方法。
二、 实验原理
1. 灯闪烁实验
1) 在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。
2) 系统板上硬件连线:把“单片机系统”A2区的J61接口的P1.0~P1.6端口与D1区的J52接口相连。
原理图
3) 程序设计流程
2.广告流水灯实验
1) 做单一灯的左移右移,八个发光二极管L1~L8分别接在单片机的P1.0~P1.7接口上,输出“0”的时候,发光二极管亮,开始时P1.0->P1.1->P1.2->P1.3->...->P1.7->P1.6->...P1.0亮,重复循环。
2) 系统板上硬件连线:把“单片机系统”A2区的J61接口的P1.0~P1.6端口与D1区的J52接口相连。要求:P1.0对应着L1,P1.1对应L2,……,P1.7对应着L8。
原理图
(1) 程序设计流程:流程图如下
是
3.模拟开关实验
1)监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄火。
2)系统板上硬件连线:把“单片机系统”A2区的P1.0端口用导线连接到D1区的LED1端口上;把“单片机系统”A2区的P3.0端口用导线连接到D1区的KEY1端口上;
原理图
(1) 程序设计流程
否 是
三、 实验内容
1 灯闪烁
利用单片机的I/O引脚控制一发光二极管,实现闪烁效果。
1)C51代码
#include"reg51.h"
sbit led=P1^0;
void delay();
void main()
{
while(1)
{
led=0;
delay();
led=1;
delay();
}
}
void delay()
{
unsigned int i,j;
for(i=200;i>0;i--)
for(j=110;j>0;j--);
}
2 广告流水灯
利用单片机的任一组I/O引脚控制八个发光二极管,实现广告流水灯效果
1)C51代码
#include"reg51.h"
void time()
{
long int i;
for(i=0;i<=38000;i++);}
void delay()
{
unsigned int i,j;
for(i=200;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
while(1)
{
P1=0xfe;delay();
P1=0xfd;delay();
P1=0xfb;delay();
P1=0xf7;delay();
P1=0xef;delay();
P1=0xdf;delay();
P1=0xbf;delay();
P1=0x7f;delay();
P1=0xff;time();
P1=0x7f;delay();
P1=0xbf;delay();
P1=0xdf;delay();
P1=0xef;delay();
P1=0xf7;delay();
P1=0xfb;delay();
P1=0xfd;delay();
P1=0xfe;delay();
P1=0xff;time();
}
}
3 模拟开关
读取单片机的I/O引脚状态来控制发光二极管,引脚状态由外部开关控制。
1)C51代码
#include "reg51.h"
sbit key = P0^0;
sbit led= P1^0;
void main(void)
{
while(1)
{
if(key==0)
led=0;
if(key==1)
led=1;
}
}
四、 小结与体会
通过本次实验了解了keil和protues软件的使用,学会了I/O口的使用,学会了延时子程序的编写和使用以及掌握了单片机编程器的使用和芯片烧写方法。在自己编写程序时,要注意高低电平的分析,掌握好循环和片选定义。
(格式同上)
第二篇:大连海事大学单片机(下)实验程序总结——吴颖晶
讲义第三章实验十
1、编写程序,将8XX51单片机的内部数据存储器20H单元和35H单元的数据相乘,结果存到外部数
据存储器中。
#include<absacc.h>
int xdata *c;
main()
{
c=0x0000;
DBYTE[0x20]=0x02;
DBYTE[0x35]=0x03;
*c=DBYTE[0x20]*DBYTE[0x35];
while(1);
}
2、P1口接8个发光二极管LED,编程实现8个LED灯依次点亮0.5秒钟,如此循环。设fosc=12MHz。
(定时器采用中断方式编程)
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar i;
uchar a=10;
timer0()interrupt 1 using 1
{
TH0=-50000/256;
TL0=-5000%256;
a--;
}
void main()
{
while(1)
{
TMOD=1;
P1=0xfe;
TH0=-50000/256;
TL0=-5000%256;
EA=1;
ET0=1;
TR0=1;
while(1)
if(a==0)
{
P1=_crol_(P1,1);
a=10;
}
}
}
3、(选作)将内部RAM从21H单元开始存放的压缩BCD码数转换为二进制数,并存入30H为首址的单元,BCD码的长度存放在20H单元中。 (没有)
讲义第四章实验二
通过ADC0809实现对电位器输出的模拟电压的采集,并将采集到的数字量显示到二极管上。
#include"reg51.h"
#include"absacc.h"
#define AD0809 XBYTE[0x7000]
main()
{
unsigned char i, dat=0xff;
while(1)
{
AD0809=0x00;
//启动AD0809
for(i=0;i<200;i++);
//延时等待
dat=AD0809;
//读取A/D转换的结果
P1=dat;
//送P1显示
}
}
讲义第四章实验三
利用DAC0832输出模拟电压信号,并用运算放大器电路反向后进行观察。 #include<reg51.h>
#include<absacc.h>
#define da0832 XBYTE[0x7FFF]
main()
{
unsigned char i,j;
while(1)
{
for(i=0;i<=255;i++)
{
da0832=i;
/* 启动转换 */
for(j=0;j<=255;j++);
/* 延时 */
}
}
}
讲义第四章实验七(题目有改动)
1、P1接8个开关,P2接8个LED,单片机读入P1状
态,通过串行方式1或2自发自收,从P2口输出显示。
(实验代码丢失,以下仅供参考)
#include <reg51.h>
void main()
{
TMOD=0x20; TH1=0xCC;
TL1=0xCC;
TR1=1;
SCON=0x50;//方式二
while(1) { TI=0; P1=0xFE;
} SBUF=0xfe; while(RI!=1); RI=0; P1=SUBF; while(TI!=1);
}
2、利用实验仪D1区完成按键的动作判断、按键识别和功能定义:对两个以上的按键进行上述操作。具体要求:
– 4个按键分别对应以下四个操作
– (1)显示值加1
– (2)显示值减1
– (3)显示值乘2
– (4)显示值除2
(实验代码丢失,以下仅供参考)
#include<reg51.h>
#define uchar unsigned char
void delay(T)
{ uchar i,j;
}
uchar key()
{
uchar data key0,key1; P1=0xFF; key0=P1&0xFF; if(key0==0xFF) return 0; delay(20);
key1=P1&0xFF;
}
{
uchar data value=0; if(key1==0xFF) return 0; if(key0!=key1) return 0; return key1; for(i=0;i<T;i++) for(j=0;j<110;j++); main()
uchar data KEY; while(1) { KEY=key(); switch(KEY) { case 0xFE:value++;break; case 0xFD:value--;break;
case 0XFB:value>>1;break;
case 0XF7:value<<1;break;
}. } } P2=value;
讲义第四章实验六
1、设计接口、编写程序,实现点阵LED的静态显示。
(1)利用点阵LED的任意一行,间隔点亮LED(如 01010101或10101010);
#include <reg51.h>
void main()
{
while(1)
{
P1= 0XAA;
P0 = 0x01;
}
}
(2)利用点阵LED的一行,实现跑马灯的功能,LED从 左到右轮流、循环显示。
#include <reg51.h>
#include <intrins.h>
void delay()
{
unsigned char i,j;
for(i=0;i<255;i++) for(j=0;j<255;j++);
}
void main()
{
P1= 0XAA; P0 = 0x00; while(1) { } P1 = _crol_(P1,1); delay();
}
2、编写程序,实现点阵LED的动态显示:在点阵 LED上显示‘A’字符。
#include <reg51.h>
unsigned char tab0[]={0xfe,0xfd,0xfb};
unsigned char tab1[]={0xdf,0x8f,0x77};
void delay()
{
} unsigned char i,j; for(i=0;i<70;i++) for(j=0;j<50;j++);
void main()
{
unsigned char i=0;
for(i=0;i<3;i++)
{
}
P0=tab0[i]; P1=tab1[i]; delay();
}
大实验:直流电机的调速控制系统(第四章实验十一) #include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define V_TH0 0XFF
#define V_TL0 0XD8
#define V_TMOD 0X01
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit Key_UP=P1^2;
sbit Key_DOWN=P1^3;
sbit Key_STOP=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
void init_sys(void); /*系统初始化函数*/
void Delay5Ms(void);
uchar KeyV;
uchar TempKeyV;
uchar flag=0;
unsigned char ZDJ_A,ZDJ_B;
void main (void)
{
ZDJ_A=40; /*占空比初始值设定*/
ZDJ_B=70; /*占空比初始值设定*/
init_sys(); { while(1)
/*对按键的检测*/ P1_0=0;
P1_1=0;
if (Key_UP)KeyV = 1;
if (Key_DOWN)KeyV = 2;
if (Key_STOP)KeyV = 3;
if (KeyV!= 0)
{
Delay5Ms();
if (Key_UP)
TempKeyV = 1;
if (Key_DOWN)
TempKeyV = 2;
if (Key_STOP)
TempKeyV = 3;
} /*改变速度*/ if (P1_5==0) //如果按了+键,增加占空比
Delay5Ms();
if (P1_5==0)
{
ZDJ_A++; ZDJ_B=100-ZDJ_A; {
}
}
if (P1_6==0) //如果按了-键,减少占空比 {
Delay5Ms();
if (P1_6==0) { } ZDJ_A--; ZDJ_B=100-ZDJ_A;
} if (P1_7==0) {
Delay5Ms(); if (P1_7==0)
{
if(ZDJ_A==0)flag=1; if(flag==0) { ZDJ_A++; ZDJ_B=100-ZDJ_A;
} else { ZDJ_A--; ZDJ_B=100-ZDJ_A; }
}
}
}
}
/********************************************************* / *函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/ /*********************************************************/ void init_sys(void) /*系统初始化函数*/
{
/*定时器初始化*/
TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
ET0=1;
EA=1;
}
/****************************************************** / *函数功能:延时 */ /******************************************************/ void Delay5Ms(void)
{
}
/****************************************************** / *函数功能:中断函数 */ /******************************************************/ void timer0(void) interrupt 1 using 2
{
static uchar click=0; /*中断次数计数器变量*/
TH0=V_TH0; /*恢复定时器TL0=V_TL0; ++click; if (click>=100) click=0; if (KeyV==TempKeyV) { if (KeyV == 1) { if (click<=ZDJ_A) /*当小于占空比值时输出
} { P1_0=0; else P1_0=1; if (click<=ZDJ_B) P1_1=0; else P1_1=1; 初始值*/ unsigned int TempCyc = 1000; while(TempCyc--); 低电平,高于时是高电平,从而实现占空比的调整*/ if (KeyV == 2)
if (click<=ZDJ_A) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
}
} P1_0=1; else P1_0=0; if (click<=ZDJ_B) P1_1=1; else P1_1=0; } if (KeyV == 3) { P1_0=0; P1_1=0; }