单片机实验报告(1)
文华学院学生实验报告
实验课程:单片机原理及应用
学院及系:文化学院信息学部
专业班级:2012级通信班 学 号:[1**********]1 姓 名:黄 心 怡 实验日期:2014. 11. 7
实验一:点亮小灯
一.硬件电路图 1.硬件电路图
2.工作原理
利用I/O口的P1口控制流水灯的亮灭。
二.软件设计
1.依次亮第1,3,5,7,2,4,6,8个小灯:
(1)
#include
sbit P1^1=p1; //定义1位接口 void main() {
P1=0; //使得P1.1口连接的一个小灯亮 }
2〉源代码
#include //头文件 void delay(unsigned int t) //延时函数 {
unsignedint i; for(i=0;i
main() //主函数 {
unsigned char k; //定义一个无符号字符变量k P1=0x01; //点亮第一个小灯
for(k=0;k
{
if(k
if(k=4)
P1=0x10; //当k=4时第二个灯亮
if(k>4&&k4且k
}
2.依次点亮第1,2,3,4,5,6,7,8位小灯:
2>源代码
#include //头文件 void delay(unsigned int t) //延时函数 {
unsignedint i; for(i=0;i
main() //主函数 {
unsigned char k; //定义一个无符号的字符变量k P1=0x01; //点亮第一个小灯
for(k=0;k
{
delay(20000); //延时
P1
}
三.实验结果分析
首先是点亮一个灯,注意要硬件电路的连接中P口的正反接法,如果不对应的话,就达不到想要的结果。软件设计中注意P的大写。要点亮基数灯与偶数灯,其中要用到延时函数与for函数。这次实验中没遇到特别困难的问题,在for循环的知识上要弄清楚。
实验二:数码管的使用
一.硬件电路图 1.硬件电路图
2.工作原理
利用I/ O口的P0口和P1口控制数码管,使数码管显示相应的数字 二.软件设计
1. 在一位数码管上循环显示数字0~9. 1>
2>源代码 程序如下:
#include //头文件 unsigned
char
code
table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};/*定义一个数组显示一位数码管共阳极时的数字0~9*/
void delay(unsigned int t) //延时函数 {unsignedint i; for(i=0;i
void main() //主函数
{unsigned char k; //定义一个字符k
P2=table[0]; //将数组table的首地址的值显示在P2口,即显示数字0
for(k=0;k
2. 使用8位数码管,利用延时使8位数码管上显示1~7。 1> 程序流程图
2〉 源代码
程序如下:
#include //头文件
unsigned char code table1[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
/*用数组table1
显示8 位数码管共阴极的数字
1~7*/
unsigned char code table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/*
用
数
组
table2控制8位
数码管的8个位*/
void delay(unsigned int t) //延时函数 {unsignedint i; for(i=0;i
void main() //主函数 {unsigned char k;//定义一个字符k
for(k=0;k
位数码管显示数字1,第二位数码管显示数字2,依次到第八位数码管显示数字7*/
{P1=table2[k]; P0=table1[k]; delay(2000000000);} }
三.实验结果分析
用单位数码管时要注意的是是共阳极,将0,1,2,3,4,5,6,7,8,9所对应的字形码准确的写出来,阴极与阳极的分开不能弄混。这次实验要用到数组,数组的调用。第二个实验用到的是8位二极管,位选的是共阳极,控制每一位,是低电平有效。段选的是阴极,控制每个数字的显示,是高电平有效。开始总是显示不了9和一些数字,可能延时函数用得不是很好,修改一下就能显示出来了,遇到的问题不大。
实验三:按键的控制和蜂鸣器的使用
一.硬件电路图 1.硬件电路图
2.工作原理
通过I/O口用按键控制蜂鸣器及小灯 二.软件设计
1.设计一个发生固定声音频率的程序 1>程序流程图
2>源代码
#include //头文件
sbit buzzer=P2^3; //用P2口的第三位控制蜂鸣器 void delay(void) //延时函数 {
unsigned char i,j;
j=60;
for(i=1;i
void main() //主函数 {
while(1) //利用while函数使蜂鸣器一直响 {
buzzer=1; delay(); buzzer=0; delay(); } }
2.利用按键控制LED灯的亮灭
2>源代码 程序如下:
#include //头文件
sbit key=P3^2; //控制LED灯的按键为第三个按键且由P3口的第三位控制
sbit led=P2^3; //由P2口的第四位控制LED灯
void delay(void) //延时函数 {
unsigned char i,j; j=60;
for(i=1;i
void main() //主函数 {
P3=0xff; //给P3口一个高电平 while(1) //使循环一直执行 {
if(key==0) //如果按键为低电平,即按下 {delay(); //延时一段时间
if(key==0) //再次判断按键是否为低电平,若仍为低电平,即按键按下,
此过程为去抖
led=0; //LED灯点亮 }
else //相反若按键没按下,则LED灯灭 {delay(); //仍用延时函数去抖 if(key!=0) led=1; }
} }
3.利用按键控制蜂鸣器声音的响停
1> 程序流程图:流程图同上相同,只需将与LED灯有关的换成蜂鸣器即可。 2> 源代码 程序如下:
#include //头文件
sbit key=P3^2; //控制LED灯的按键为第三个按键且由P3口的第三位控制sbit buzzer=P1^0; //用P1口的第一位控制蜂鸣器
void delay(void) //延时函数
{
unsigned char i,j;
j=60;
for(i=1;i
}
void main() //主函数
{
P3=0xff; //给P3口一个高电平
while(1) //使循环一直执行
{
if(key==0) //当按键为低电平,即按下
{
delay(); //延时去抖 if(key==0) //若仍为低电平,则按键确实按下 buzzer=1; //蜂鸣器响 delay(); buzzer=0; delay(); }
}
}
4.使用按键,使按键按下后一位数码管上显示数字0~9
1>程序流程图:流程图基本同上相同,只需将使LED灯亮变成使数码管显示数字 2>源代码
程序如下:
#include //头文件
sbit key=P3^2; //控制LED灯的按键为第三个按键且由P3口的第三位控制
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; /*一位数码管共阳极时,数码管显示的数字0~9*/
void delay1(void) //控制按键去抖的延时函数
{
unsigned char i,j;
j=60;
for(i=1;i
}
void delay(unsigned int t) //控制数码管显示数字时的延时函数 {
unsignedint i;
for(i=0;i
}
void main() //主函数
{
int b; //定义一个整形变量b
P3=0xff; //给P3口一个高电平
while(1) //使循环一直执行
{
if(key==0) //当按键为低电平,即按下
{
delay1(); //延时去抖 if(key==0) //若仍为低电平,则按键确实按下
P2=table[0]; //使数码管显示数字0
for(b=1;b
{delay(20000000); //每显示过一个数字后延时一段时间 P2=table[b];
}
}
P2=0xff; //数字0~9显示一遍后数码管熄灭
}
}
三.实验结果分析
这次实验使用按键控制led灯的亮灭及蜂鸣器的响声。写程序时忽略了判断按键是否按下,消抖也没有弄清楚,经过多次调试,才把程序写明白。同时注意延时函数,不同的延时导致的结果会有所差异。
实验四:定时器与小灯和数码管的应用
一.硬件电路图
1.硬件电路图
2.工作原理
定时器的使用和中断程序的使用
二.软件设计
1. 验证用定时器T0控制小灯
1> 程序流程图
2〉源代码
#include //头文件
sbit led=P1^0;//小灯由p1口第一位控制
void main()//主函数
{
led=1;//给小灯低电平,使灯灭
IT0=0;//外部中断,低电平触发
EA=1;//开总中断
EX0=1;//允许外部中断
}
void deng() interrupt 0
{
led=0;//产生中断时灯亮
}
2. 用按键控制数码管,使按键按第一下,数码管显示数字1,第二次按下显示数字2…,直到第九次按下显示数字9,即用数码管对按键按下的次数计数.
3. 程序流程图
4. 源程序
#include //头文件
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //定义数组table存放数字0~9
sbit key=P3^2;//按键与p3口的第三位相连
char m;//定义一个字符变量
void delay1(void) //延时函数
{
unsigned char i,j;
j=60;
for(i=1;i
}
void delay(unsigned int t)//去抖函数
{
unsigned int i;
for(i=0;i
}
void deng() interrupt 0//中断函数
{
m++;
if(key==0)
{
delay1();
{
delay(2000000); P1=table[m]; if(key==0)
} if(m>9) P1=0xff;
}
void main()//主函数
{
P1=0xc0;//数码管显示0
IT0=0;//外部中断,低电平触发
EA=1;//开总中断
EX0=1;允许外部中断
while(1);
}
3.用定时器,在中断时,按键按下时,使流水灯循环点亮.
1> 程序流程图
流程图同上相同,只需将中断程序里数码管显示数字的程序改为小灯循环点亮的程序
2> 源代码
#include
sbit key=P3^2;//按键与pp3口的第三位相连
void delay1(void) //控制数码管数字转换之间的延时函数 {
unsigned char i,j;
j=60;
for(i=1;i
}
void delay(unsigned int t) //按键取抖的延时函数
{
unsigned int i;
for(i=0;i
void deng() interrupt 0//中断
{
int m;
m=0;
if(key==0)
{
delay1();
if(key==0)
{
P1=0xff; delay(200000); P1
}
}
if(m>9) P1=0xff;
}
void main()
{
P1=0xfe;//p1赋初值
IT0=0;//外部中断,低电平触发
EA=1;//开总中断
EX0=1;//允许外部中断
while(1);}
三.实验结果分析
学了定时器及中断的相关理论知识后,做这个实验就相对轻松了一些,虽然写的程序较多,但耐心的慢慢改善,实验结果也不难得出。
实验五.定时器
一.硬件电路图
1.硬件电路图
2.工作原理
通过定时器控制相应现象的实现
二.软件设计
1、用定时器T0工作方式1控制单片机发出声音
1>程序流程图
2>源代码
#include //头文件
#define uchar unsigned char
uchar num; //定义一个无符号字符变量 sbit buzzer=P1^0; //蜂鸣器与P1口的第一位相连 void delay(void) //延时函数
{
unsigned char i,j;
j=10;
for(i=1;i
}
void main()
{
TMOD=0x01; //定时器T0用工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //给定时器赋初值
EA=1; //开总中断
ET0=1; //允许定时器T0中断
TR0=1; //开启定时器T0
buzzer=0;
while(buzzer) //使蜂鸣器响
{buzzer=1;
delay();
buzzer=0;
delay();
}
}
void deng() interrupt 1 //中断函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20)
{
num=0;
buzzer=~buzzer;
}
}
2、用定时器1工作方式1控制两个LED以不同周期闪烁
说明:设计一个LED 以200ms为周期闪烁,另一个LED以800ms为周期闪烁。
设计定时器1每50ms产生一次中断,由2个变量分别对中断次数计数,其中一个变量计数2次,即100ms,控制LED 亮灭;另一个变量计数8次,即400ms,控制LED亮灭。
1> 程序流程图
2> 源代码
#include //头文件
#define uchar unsigned char
ucharnum; //定义两个无符号字符变量 uchar i;
sbit led1=P2^0; //led1灯与P2口第一位相连 sbit led2=P2^1; //led2灯与P2口第二位相连
void main() //主函数
{
P2=0x00; //P2口赋初值0
TMOD=0x10; //定时器T1用工作方式1 TH0=(65536-50000)/256; //定时器T1赋初值
TL0=(65536-50000)%256;
EA=1; //开总中断
ET1=1; //允许定时器T1中断
TR1=1; //开启定时器T1
led1=0; //led1灯给低电平 led2=0; //led2灯给低电平 while(1);
}
void deng() interrupt 3 //中断函数 {
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==2)
{
num=0;
led1=~led1;
}
i++;
if(i==8)
{
i=0;
led2=~led2;
}
}
三.实验结果分析
实验的时候要先弄清定时器1与定时器0的区别,选择合适的中断。