嵌入式课程设计随堂报告.docx
- 文档编号:11574190
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:50
- 大小:2.28MB
嵌入式课程设计随堂报告.docx
《嵌入式课程设计随堂报告.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计随堂报告.docx(50页珍藏版)》请在冰豆网上搜索。
嵌入式课程设计随堂报告
嵌入式课程设计随堂报告
学院计算机与通信工程学院
专业班级 物联1402
姓 名 包纳仁夫
学 号 41466039
第一次实验报告
一、实验目的:
第一次实验了解了实验开发板资源,完成三个部分的实验:
程序的下载,用普中等程序烧录软件下载程序;KEIL软件安装使用和入门led灯的程序调用,独立实现led灯闪烁频率调整;蜂鸣器的点响,独立利用程序操控蜂鸣器的频率。
二、实验步骤:
led代码
/********************************************************************
*LED闪烁的简单实验
*
********************************************************************/
#include
voiddelay(unsignedinti);//声明延时函数
voidmain()
{
while
(1)
{
P2=0x00;//置P0口为低电平
delay(1000);//调用延时程序
P2=0xff;//置P0口为高电平
//此时P2口全部输出1,状态从0变成1了,对应的灯的输出也由低电平变成高电平
delay(1000);//调用延时程序,再进行延时,
}
}
/*******延时函数*************/
voiddelay(unsignedinti)
{
unsignedcharj;
for(i;i>0;i--)//循环600*255次
for(j=255;j>0;j--);
}
(3)分析:
通过将串口赋值,设置高电平和低电平,在每个发光函数后边加上延时函数,让led灯闪烁来显示对应操作。
(4)蜂鸣器代码:
#include
sbitBeep=P1^5;
voidDelay(unsignedinti);
voidmain()
{
Beep=1;
Delay(5);
Beep=0;
Delay(5);
}
voidDelay(unsignedinti)
{
charj;
for(i;i>0;i--)
for(j=200;j>0;j--);
}
(5)代码分析:
先将P1^5管脚定义为beep,然后用1和0分别控制高低电平,再其中假如延时函数,实现点响蜂鸣器
蜂鸣器就是常常说的交流蜂鸣器或直流蜂鸣器(自激式蜂鸣器)。
我们单片机板子上配的交流蜂鸣器需要给蜂鸣器一个脉冲才会响。
常见的有PWM波控制蜂鸣器的频率。
脉冲就是高低电平的切换直流蜂鸣器是给一定的驱动直流电压就会响。
三、实验结果:
(1)
实验效果
(2)
第二次实验报告
一、实验目的:
本次实验共四部分内容:
独立按键的使用,通过按键的按动,给二极管管脚高低电平,来调整数码管;动静态数码管的显示,通过控制它们的“位选”,来实现数字的显示;矩阵键盘的使用,通过行列的置位实现4*4键盘操控数码管;最后是步进电机转动,通过改动电机的脉冲信号来控制电机的转速等。
二、实验过程和结果:
(1)独立键盘代码:
/**************************************************************************
*实验名:
独立按键实验
*使用的IO:
LED使用P2,键盘使用P3.0、P3.1、P3.2、P3.3
*实验效果:
按下K1键,灭掉LED,按下K2键,打开所有的LED,按下K3键,LED左移一位,按下K4键,LED右移一位。
*注意:
由于P3.2口跟红外线共用,所以做按键实验时为了不让红外线影响实验
*效果,最好把红外线先取下来。
**************************************************************************/
#include
#include
#defineGPIO_LEDP2
sbitK1=P3^0;
sbitK2=P3^1;
sbitK3=P3^2;
sbitK4=P3^3;
voidDelay10ms();//延时10ms
/**************************************************************************
*函数名:
main
*函数功能:
主函数
*输入:
无
*输出:
无
**************************************************************************/
voidmain(void)
{
unsignedinti,j;
while
(1)
{
if(K1==0)//检测按键K1是否按下
{
Delay10ms();//消除抖动
if(K1==0)//再次检测按键是否按下
j=0;
while((i<50)&&(K1==0))//检测按键松手检测,如果不松手超过延时也会自动结束等待
{
Delay10ms();
i++;
}
i=0;
}
if(K2==0)//检测按键K2是否按下
{
Delay10ms();
if(K2==0)
j=0xff;
while((i<50)&&(K2==0))
{
Delay10ms();
i++;
}
i=0;
}
if(K3==0)//检测按键K3是否按下
{
Delay10ms();
if(K3==0)
{
if((j==0)||(j==0xff))//如果当前状态是全亮的或者全灭的,就点亮他的第一盏灯
{
j=0xfe;
}
else
j=_crol_(j,1);//左移一位
}
while((i<50)&&(K3==0))
{
Delay10ms();
i++;
}
i=0;
}
if(K4==0)//检测按键K4是否按下
{
Delay10ms();
if(K4==0)
{
if((j==0)||(j==0xff))
{
j=0xfe;
}
else
j=_cror_(j,1);//右移一位
}
while((i<50)&&(K4==0))
{
Delay10ms();
i++;
}
i=0;
}
GPIO_LED=j;
}
}
/*************************************************************************
*函数名:
Delay10ms
*函数功能:
延时函数,延时10ms
*输入:
无
*输出:
无
**************************************************************************/
voidDelay10ms(void)//误差0us
{
unsignedchara,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
结果与分析:
下载独立按键控制led灯.hex。
实验效果是:
按下K1键,灭掉LED,按下K2键,打开所有的LED,按下K3键,LED左移一位,按下K4键,LED右移一位。
过程是:
先设置IO口为高电平(一般上电默认就为高);读取IO口电平确认是否有按键按下;如有IO电平为低电平后,延时几个ms;再读取该IO电平,如果任然为低电平,说明对应按键按下;执行相应按键的程序.
结果图:
(2)静态数码管代码:
#include
#include
#defineGPIO_DIGP0
sbitLSA=P2^2;
sbitLSB=P2^3;
sbitLSC=P2^4;
sbitK1=P3^0;
sbitK2=P3^1;
sbitK3=P3^2;
sbitK4=P3^3;
DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9的值
voidDelay10ms();//延时10ms
/*******************************************/
voidmain(void)
{
unsignedinti,j;
LSA=0;
LSB=0;
LSC=0;
while
(1)
{
if(K1==0)//检测按键K1是否按下
{
Delay10ms();//消除抖动
if(K1==0)
{
j=1;
}
while((i<50)&&(K1==0))//检测按键是否松开
{
Delay10ms();
i++;
}
i=0;
}
if(K2==0)//检测按键K2是否按下
{
Delay10ms();
if(K2==0)
{
j=2;
}
while((i<50)&&(K2==0))
{
Delay10ms();
i++;
}
i=0;
}
if(K3==0)//检测按键K3是否按下
{
Delay10ms();
if(K3==0)
{
j=3;
}
while((i<50)&&(K3==0))
{
Delay10ms();
i++;
}
i=0;
}
if(K4==0)//检测按键K4是否按下
{
Delay10ms();
if(K4==0)
{
j=4;
}
while((i<50)&&(K4==0))
{
Delay10ms();
i++;
}
i=0;
}
GPIO_DIG=DIG_CODE[j];
}
}
/*************************************************************************
*函数名:
Delay10ms
*函数功能:
延时函数,延时10ms
*输入:
无
*输出:
无
**************************************************************************/
voidDelay10ms(void)//误差0us
{
unsignedchara,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
结果与分析:
下载HEX文件,观察实验效果,实验的效果是:
按下K1键,显示1,按下K2键,显示2,按下K3键,显示3,按下K4键,显示4。
对共阴极数码来说,其8个发光二极管的阴极在数码管内部全部连接在一起,所以称“共阴”,而它们的阳极是独立的,通常在设计电路时一般把阴极接地。
当我们给数码管的任意一个阳极加一个高电平时,对应的这个发光二极管就点亮了。
通过代码操控按键所获得的数值,再由芯片转换操控数码管的亮暗。
结果图:
(3)矩阵键盘代码:
#include
#defineGPIO_DIGP0
#defineGPIO_KEYP1
sbitLSA=P2^2;
sbitLSB=P2^3;
sbitLSC=P2^4;
unsignedcharcodeDIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsignedcharKeyValue;
//用来存放读取到的键值
voidDelay10ms();//延时10ms
voidKeyDown();//检测按键函数
voidmain(void)
{
LSA=0;//给一个数码管提供位选
LSB=0;
LSC=0;
while
(1)
{
KeyDown();
GPIO_DIG=DIG_CODE[KeyValue];
}
}
/******************************************************************************
*函数名:
KeyDown
*函数功能:
检测有按键按下并读取键值
*输入:
无
*输出:
无
******************************************************************************/
voidKeyDown(void)
{
chara;
GPIO_KEY=0x0f;
if(GPIO_KEY!
=0x0f)
{
Delay10ms();
if(GPIO_KEY!
=0x0f)
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07):
KeyValue=0;break;
case(0X0b):
KeyValue=1;break;
case(0X0d):
KeyValue=2;break;
case(0X0e):
KeyValue=3;break;
//default:
KeyValue=17;//检测出错回复17意思是把数码管全灭掉。
}
//测试行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70):
KeyValue=KeyValue;break;
case(0Xb0):
KeyValue=KeyValue+4;break;
case(0Xd0):
KeyValue=KeyValue+8;break;
case(0Xe0):
KeyValue=KeyValue+12;break;
//default:
KeyValue=17;
}
while((a<50)&&(GPIO_KEY!
=0xf0))//检测按键松手检测
{
Delay10ms();
a++;
}
a=0;
}
}
}
结果与分析:
扫描矩阵键盘,即是把某一条(只有一条)行线置为低电平,而列线全部置为输入方向,然后检测列线,如果检测到某一条列线是低电平,那么就表示位于这条列线与输出低电平的行线的交点处的按键被按下了。
要扫描16个按键,就依次以这样的方法扫描16次,之后就可以确定哪一个按键被按下了。
在代码中还要运用到消抖函数,以及判断是否手已经抬起。
结果图:
(4)动态数码管代码:
#include
//#include
#defineGPIO_DIGP0
#defineGPIO_KEYP1
sbitLSA=P2^2;
sbitLSB=P2^3;
sbitLSC=P2^4;
unsignedcharcodeDIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsignedcharKeyValue;
//用来存放读取到的键值
unsignedcharKeyState;//记录按键的状态,0没有,1有
unsignedcharDisplayData[8];
//用来存放要显示的8位数的值
unsignedcharNum;//用来存放中断的时候显示的第位数值
voidDelay50us();//延时50us
voidKeyDown();//检测按键函数
voidDigDisplay();//动态显示函数
voidTimerConfiguration();//定时器初始化设置
/*******************************************************************************
*函数名:
main
*函数功能:
主函数
*输入:
无
*输出:
无
*******************************************************************************/
voidmain(void)
{
TimerConfiguration();
KeyState=0;//初始化按键状态
while
(1)
{
KeyDown();
if(KeyState==1)
{
DisplayData[7]=DisplayData[6];
DisplayData[6]=DisplayData[5];
DisplayData[5]=DisplayData[4];
DisplayData[4]=DisplayData[3];
DisplayData[3]=DisplayData[2];
DisplayData[2]=DisplayData[1];
DisplayData[1]=DisplayData[0];
DisplayData[0]=DIG_CODE[KeyValue];
KeyState=0;
}
//DigDisplay();
}
}
/*******************************************************************************
*函数名:
TimerConfiguration
*函数功能:
定时器初始化
*输入:
无
*输出:
无
*******************************************************************************/
voidTimerConfiguration()
{
TMOD=0X02;//选择为定时器0模式,工作方式2,仅用TRX打开启动。
TH0=0X9C;//给定时器赋初值,定时100us
TL0=0X9C;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
/*******************************************************************************
*函数名:
DigDisplay
*函数功能:
使用数码管显示
*输入:
无
*输出:
无
*******************************************************************************/
voidDigDisplay()
{
unsignedchari,j;
//for(i=0;i<8;i++)
//{
GPIO_DIG=0x00;//消隐
switch(i)//位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0;break;
case
(1):
LSA=1;LSB=0;LSC=0;break;
case
(2):
LSA=0;LSB=1;LSC=0;break;
case(3):
LSA=1;LSB=1;LSC=0;break;
case(4):
LSA=0;LSB=0;LSC=1;break;
case(5):
LSA=1;LSB=0;LSC=1;break;
case(6):
LSA=0;LSB=1;LSC=1;break;
case(7):
LSA=1;LSB=1;LSC=1;break;
}
GPIO_DIG=DisplayData[i];
i++;
if(i>7)
i=0;
//j=10;//扫描间隔时间设定
//while(j--)
//Delay50us();
//GPIO_DIG=0x00;//消隐
//}
}
/*******************************************************************************
*函数名:
KeyDown
*函数功能:
检测有按键按下并读取键值
*输入:
无
*输出:
无
*******************************************************************************/
voidKeyDown(void)
{
unsignedinta=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!
=0x0f)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 课程设计 报告