海南大学届
单片机实验报告(4份)
论文题目: 学生姓名:学 号: 所在院系: 专业班级: 授课教师: 完成时间:
蜂鸣器实验
实验目的
1.熟悉实验板中蜂鸣器工作原理,掌握汇编编程控制蜂鸣器播放音乐;
2.掌握单片机编程控制蜂鸣器发出不同频率声音的方法;
3.了解一段简短音乐乐谱的构成,及其单片机程序实现的基本方法; 实验原理
1、蜂鸣器类型
蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。压电式蜂鸣器主要由多谐振荡、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
2、音乐歌曲元素
一首歌曲由音调和节拍两个主要的元素组成。对于蜂鸣器来说,频率的高低决定了音调的高低。所有不同频率的信号都是从同一个基准频率分频得来的。给蜂鸣器输入相应的频率,可以使其发出表中所示的低音、中音、高音的do~xi的声音。将其按照音乐演奏的规律组合,便可以得到所需要的乐曲。
3、原理图
实验步骤
1. 连接试验相关模块连线
如图:
J8连接P1.5
2.下载蜂鸣器试验程序
选择芯片为STC89C5XX,串口号,波特率,低速下载,下载完成后程序自动运行,观察实验现象
实验现象
蜂鸣器分别发出所载入程序的音乐,达到实验效果
实验源程序:
#include
#include
sbit Beep = P1^5 ;
unsigned char n=0;
unsigned char code music_tab[] ={ 0x18, 0x30, 0x1C , 0x10, 0x20, 0x40, 0x1C , 0x10, 0x18,0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18, 0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26, 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20, 0x20, 0x30, 0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x80, 0x20, 0x30, 0x1C , 0x10, 0x20, 0x10, 0x1C , 0x10, 0x20, 0x20, 0x26 , 0x20, 0x2B, 0x20, 0x30 , 0x20, 0x2B, 0x40, 0x20 , 0x15, 0x1F, 0x05, 0x20 , 0x10, 0x1C, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x30, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x40, 0x1C , 0x20, 0x20, 0x20, 0x26 , 0x40, 0x13, 0x60, 0x18 , 0x20, 0x15, 0x40, 0x13 , 0x40, 0x18, 0x80, 0x00
};
void int0() interrupt 1
{ TH0=0xd8;
TL0=0xef;
n--; }
void delay (unsigned char m)
{ unsigned i=3*m;
while(--i); }
void delayms(unsigned char a)
{ while(--a); }
void main()
{ unsigned char p,m;
unsigned char i=0;
TMOD&=0x0f;
TMOD|=0x01;
TH0=0xd8;TL0=0xef;
IE=0x82;
play:
while(1)
{
a: p=music_tab[i];
if(p==0x00) { i=0, delayms(1000); goto play;}
else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;}
else {m=music_tab[i++], n=music_tab[i++];}
TR0=1;
while(n!=0) Beep=~Beep,delay(m);
TR0=0;
}
}
常见问题:
1. 程序下载完成后不响
将杜邦线重新连接下或者换根线试试,将单片机拆下来重新安装下!
2. 自写程序蜂鸣器不响
需要有频率才会响的,持续高或者持续低是不会响的。
静态数码管实验
实验目的
1.理解8段数码管的基本原理。
2.理解8段数码管的显示和编程方法。
3.理解4连排共阴极8段数码管LG5641AH与MCU的接线图。
实验仪器及设备
硬件:PC机,基本配置CPU PII以上,内存2G、单片机开发板
软件:keil 2, 程序烧录软件
实验原理
8段数码管一般由8个发光二极管(LED)组成,每一个位段就是一个发
光二极管。一个8段数码管分别由a、b、c、d、e、f、g位段,外加上一个小数
点的位段h(或记为dp)组成。根据公共端所接电平的高低,可分为共阳极和共
阴极两种。有时数码管不需要小数点,只有7个位段,称7段数码管。共阴极8
段数码管的信号端高电平有效,只要在各个位段上加上相应的信号即可使相应的
位段发光,比如:要使a段发光,则在a段加上高电平即可。共阳极的8段数码
管则相反,在相应的位段加上低电平即可使该位段发光。 原理图
dp
数码管 数码管外形
实验步骤
1. 连接试验相关模块连线
如图:
JP10(P0)连接JP3
2、下载静态数码管程序
选择芯片为STC89C5XX,串口号,波特率,低速下载,下载完成后程序自动运行,观察实验现象。
实验现象
数码管依次显示0—
F
实验程序
#include
#define GPIO_DIG P0
void Delay10ms(unsigned int c);
unsigned char code DIG_CODE[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
void main(void)
{
unsigned char i = 0;
while(1)
{
GPIO_DIG = ~DIG_CODE[i];
i++;
if(i == 16)
{
i = 0;
}
Delay10ms(50);
}
}
void Delay10ms(unsigned int c) {
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
常见问题
1.数码管有显示,并且在走动,但显示不正确
检查排线连接连接顺序是否正确
2.显示不全,有一段或者多段不亮
将排线重新插拔下,更换排线或者将单片机重新安装下,重启开发板。
Led点阵实验
实验目的
利用EDA技术实现16×16 LED点阵屏的的扫描和动态显示。
实验仪器及设备
硬件:PC机,基本配置CPU PII以上,内存2G、单片机开发板 软件:keil 2, 程序烧录软件
实验原理
LED点阵的行为扫描选通信号、列为数据输入。显示采用逐行扫描方式,数据端不断输入数据,行扫描按一定顺序逐行选通,扫描一个周期(16次)产生一帧画面。
试验步骤
1. 连接开发板LED模块相关电路连线
连线如图:
2. 打开开发板电源
3. 下载LED程序
选择芯片为STC89C5XX,串口号,波特率,低速下载,点击下载程序,提示下载成功!
程序自动运行,观察实验现象。
实验现象
Led显示屏上红绿交替显示
实验程序
#include
unsigned char code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code tabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void delay1(void)
{ unsigned char i,j,k; for(k=10;k>0;k--) for(i=20;i>0;i--) for(j=248;j>0;j--); } { unsigned char i,j; while(1) { for(j=0;j<3;j++) { for(i=0;i<8;i++) { P2=taba[i]; P0=0xff; delay1(); void main(void)
} } for(j=0;j<3;j++) { for(i=0;i<8;i++) { P2=taba[7-i]; P0=0xff; delay1(); } } for(j=0;j<3;j++) { for(i=0;i<8;i++) { P2=0x00; P0=tabb[7-i]; delay1(); } } for(j=0;j<3;j++) { for(i=0;i<8;i++) { P2=0x00; P0=tabb[i]; delay1(); } } } }
常见问题解决方法 LED不亮的
1. 请您检查排线是否插好!
2. 换根排线试试。
交通灯实验
实验目的
1.利用单片机的定时器定时,实现道路的红绿灯交替点亮和熄灭。
2.以单片机为核心,设计一个十字路口交通灯控制系统。用单片机控制LED灯模拟交通信号灯显示。
3.南北方向、东西方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采用计时的方法)。
实验仪器及设备
硬件:PC机,基本配置CPU PII以上,内存2G、单片机开发板 软件:keil 2, 程序烧录软件
实验原理
主体电路:交通灯自动控制模块。这部分电路主要由80C51单片机的I/O端口、定时计数器、外部中断扩展等组成。本设计先是从普通三色灯的指示开始进行设计,用P1口作为输出。程序的初始化是东西南北方向的红灯全亮。然后南北方向红灯亮,东西方向绿灯亮,60秒后东西方向黄灯闪亮5秒后南北方向绿灯亮,东西方向红灯亮。重复执行。倒计时用到定时器T0,用P2口作为LED的显示。二位一体的LED重复执行60秒的倒计时。作为突发事件的处理,本设计主要用到外部中断EX0。用一模拟开关作为中断信号。实际中可以接其它可以产生中断信号的信号源。
实验步骤
1. 连接试验相关模块连线
如图:
J21跳线帽金接(VCC) JP8(P1)接JP16 J12接JP10(P0) JP1接JP11(P2) J22接P3.0 P3.1 2. 下载交通灯程序
选择芯片为STC89C5XX,串口号,波特率,低速下载,程序下载成功后自动运行,
观察实验现象
实验现象
由红黄绿三种颜色的LED模拟交通灯按照预定要求显示,时间由数码管显示 。
实验程序
#include
#define GPIO_DIG P0
#define GPIO_PLACE P1
#define GPIO_TRAFFIC P2
sbit RED10 = P2^0; sbit GREEN10 = P2^1; sbit RED11= P2^2;sbit YELLOW11= P2^3;sbit GREEN11 = P2^4; sbit RED00 = P3^0; sbit GREEN00 = P3^1; sbit RED01= P2^5;sbit YELLOW01= P2^6;sbit GREEN01 = P2^7; unsigned char code DIG_PLACE[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code DIG_CODE[17]
={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char DisplayData[8];unsigned char Time, Second;
void DigDisplay();void Timer0Cofig(void);
void main(void)
{
Second = 1;
Timer0Cofig();
while(1)
{
if(Second == 70)
{
Second = 1;
}
if(Second < 31)
{
DisplayData[0] = 0x00;DisplayData[1] = 0x00;DisplayData[2] = DIG_CODE[(30 - Second) % 100 / 10]; DisplayData[3] = DIG_CODE[(30 - Second) %10];DisplayData[4] = 0x00;DisplayData[5] = 0x00; DisplayData[6] = DisplayData[2];DisplayData[7] = DisplayData[3];DigDisplay();GPIO_TRAFFIC = 0xFF; RED00 = 1;
GREEN00 = 1;
GREEN11 = 0;
GREEN10 = 0;
RED01 = 0;
RED00 = 0;
}
else if(Second < 36)
{
DisplayData[0] = 0x00;DisplayData[1] = 0x00;DisplayData[2] = DIG_CODE[(35 - Second) % 100 / 10]; DisplayData[3] = DIG_CODE[(35 - Second) %10];DisplayData[4] = 0x00;DisplayData[5] = 0x00; DisplayData[6] = DisplayData[2];DisplayData[7] = DisplayData[3];DigDisplay();GPIO_TRAFFIC = 0xFF; RED00 = 1;
GREEN00 = 1;
YELLOW11 = 0;
RED10 = 0;
YELLOW01 = 0;
RED00 = 0;
{
DisplayData[0] = 0x00;DisplayData[1] = 0x00;DisplayData[2] = DIG_CODE[(65 - Second) % 100 / 10];
DisplayData[3] = DIG_CODE[(65 - Second) %10];DisplayData[4] = 0x00;DisplayData[5] = 0x00;
DisplayData[6] = DisplayData[2];DisplayData[7] = DisplayData[3];DigDisplay();
GPIO_TRAFFIC = 0xFF;
RED00 = 1;
GREEN00 = 1;
RED11 = 0;
RED10 = 0;
GREEN01 = 0;
GREEN00 = 0;
{
DisplayData[0] = 0x00;DisplayData[1] = 0x00;DisplayData[2] = DIG_CODE[(70 - Second) % 100 / 10];DisplayData[3] = DIG_CODE[(70 - Second) %10];DisplayData[4] = 0x00;DisplayData[5] = 0x00;
DisplayData[6] = DisplayData[2];DisplayData[7] = DisplayData[3];DigDisplay();GPIO_TRAFFIC = 0xFF;
RED00 = 1;GREEN00 = 1;YELLOW11 = 0; RED10= 0; YELLOW01 = 0; RED00 = 0;
}
void DigDisplay()
{
unsigned char i; unsigned int j; for(i=0; i<8; i++) { GPIO_PLACE = DIG_PLACE[i]; GPIO_DIG = DisplayData[i]; j = 10; while(j--); } } } else } else if(Second < 66)
} } GPIO_DIG = 0x00;
void Timer0Cofig(void)
{
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0xB0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0() interrupt 1
{
}
TH0 = 0x3C; TL0 = 0xB0; Time++; if(Time == 20) { } Second ++; Time = 0;
常见问题解决方法
1. 交通信号灯亮的不对
将接JP1的排线反过来插,也就是将线序反过来