单片机实训任务书Word格式文档下载.docx
- 文档编号:7507221
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:16
- 大小:825.80KB
单片机实训任务书Word格式文档下载.docx
《单片机实训任务书Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机实训任务书Word格式文档下载.docx(16页珍藏版)》请在冰点文库上搜索。
5.训练程序编写和调试能力
三、知识梳理和参考:
1.矩阵按键例
功能:
用单片机的并口连接4*4矩阵按键,并在数码管上显示每个按键的序号
硬件设计
单片机P0.0至P0.3接矩阵按键的行线,P2.0至P2.3接矩阵按键的列线,P3接led段码管的abcdefgdp端,段P1口的P1.0和P1.3
参考程序
//用单片机的并口连接4*4矩阵按键,并在数码管上显示每个按键的序号
#include<
reg51.h>
voiddelayms(unsignedcharxms)//延时xms子函数
{
unsignedchari,m;
for(i=xms;
i>
0;
i--)//i=xms即延时约xms毫秒
for(m=110;
m>
m--);
}
//显示子程序
voiddisplay(intj)
unsignedcharcodetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//字符0123456789ABCDE
if(j!
=-1)
P3=tab[j];
else
P3=0x00;
//黑屏
delayms(5);
//矩阵键盘扫描子程序
intscan_key(void)
unsignedi,temp,m,n;
//i为循环次数,m为列,n为行号,P0为行,P2为列
unsignedcharsel_c,sel_column;
bitfind=0;
P0=0x0f;
P2=0x00;
temp=~P0;
temp=temp&
0x0f;
if(temp!
=0x00)
{delayms(10);
temp=~P0;
temp=temp&
if(temp!
sel_c=0x01;
{//判断哪一个按键
for(i=0;
i<
4;
i++)
{
sel_column=~sel_c;
P2=sel_column;
temp=~P0;
temp=temp&
if(temp!
{m=i;
find=1;
switch(temp)
{case0x01:
n=0;
break;
case0x02:
n=1;
case0x04:
n=2;
case0x08:
n=3;
default:
}
sel_c=sel_c<
<
1;
}
}
if(find==0)return-1;
elsereturn(n*4+m);
voidmain()
intkey;
key=-1;
//没按下按键,给key赋值-1,创造黑屏条件
display(key);
while
(1)
{
key=scan_key();
if(key!
=-1)
display(key);
delayms(30);
}
想想练练
如果把矩阵键盘编号改为下图,程序怎么改写?
如果输入多位数,并在多位段码管上显示,程序怎么写?
2.
LED点阵显示例
单片机控制8*8的LED点阵显示数字和汉字
硬件线路:
单片机的并口P0连线8*8的LED点阵的列线,并口P2连线8*8的LED点阵的行线nn©
知识输理:
参见教材P137
编程思路:
在点阵上稳定显示一个字符”日”的设计思路是:
用点阵上所有点亮的点来展示成”日”字的形状,从而达到显示的目的。
字型编码用二维数组表示(也可用一维数组)。
硬件接线:
单片机的两个并行端口P0和P2分别连线LED的列选和行选。
显示过程:
行扫描方式。
每次显示一行8个LED,8行扫描显示完,即为一个字型,字型要稳定显示,开始新一轮的扫描。
首先选中第一行(P2.0所接线),把该行要点亮所对应的8位二进制数0x00(字型编码)送到列控制口(P0口),延时2ms(8行显示一帧,即一个稳定的字型,一帧的显示时间不能超过超过视觉暂留时间),选中第二行(P2.1所接线),把该行要点亮所对应的8位二进制数0x3c(字型编码)送到列控制口(P0口),延时2ms,如此下去,直到把一个字的8个字节的字型编码送给8行,完整显示一个汉字。
为了稳定显示,每隔20ms刷新显示一次,刷新100次后,再显示其他字型。
//循环显示汉字“一”、“二”和“日”三个字型
voiddelay(unsignedinti)
unsignedcharj,k;
for(j=0;
j<
i;
j++)
for(k=0;
k<
255;
k++);
{
unsignedcharcodeled[3][8]={{0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00},//汉字字型“一”
{0x00,0x00,0x3c,0x00,0x00,0x00,0xff,0x00},////汉字字型“二”
{0x00,0x3c,0x24,0x24,0x3c,0x24,0x24,0x3c}};
//汉字字型数据"
日"
unsignedcharrowselect;
unsignedchark,j;
unsignedintm;
while
(1)
{
for(k=0;
=2;
k++)
{for(m=0;
m<
=100;
m++)
//显示一个字的字型
{rowselect=0x01;
for(j=0;
=7;
{
P2=~rowselect;
//选行
//同时送字型编码中的一个字节到列线
P0=led[k][j];
delay
(2);
rowselect=rowselect<
}
delay(20);
}
编程实现把矩阵中的任意设定点点亮
如果矩阵中的一部分点亮,让任意设定点闪烁2秒后,也点亮,但是不影响前面点亮的部分,程序如何编写
实训任务二数字电压表
利用单片机和A/D转换芯片采集0-5V的模拟电压信号,转变为8位数字信号,在两位数码管上显示。
二、目的
1.学习单片机接口技术
2学习A/D转换技术
3.掌握模拟信号采集及数据显示的程序设计和调试方法
三、知识梳理和编程思路:
ADC0809是一个8位8通道的逐次逼近式AD转换器,各引脚功能如下:
(1)IN7〜IN0:
8个模拟量输入通道。
(2)ADDA、ADDB、ADDC:
地址线。
(3)ALE:
地址锁存允许信号。
对应ALE上升沿,ADDA、ADDB和ADDC地址状态送入地址锁存器中,经译码后输出选择模拟信号输入通道。
(4)START:
转换启动信号。
对应START上跳沿时,所有内部寄存器清0;
对应START下跳沿,开始进行A/D转换;
在A/D转换期间,START应保持低电平。
单片机连线此引脚,可以启动ADC0809开始转换
(5)D7~D0:
数据输出线,为三态缓冲输出形式,可以和单片机的数据线直接相连,单片机连线ADC0809的数据线,可以读取转换的结果
(6)OE:
输出允许信号,用于控制三态输出锁存器向单片机输出转换得到的数据。
当OE=0时,输出数据线呈高电阻;
当OE=1时,输出转换得到的数据。
(7)CLK:
时钟信号。
ADC0809的内部没有时钟电路,所需时钟信号由外界提供,因此有时钟信号引脚。
通常使用频率为500kHz的时钟信号(8)EOC——转换结束状态信号。
启动转换后,系统自动设置EOC=0,转换完成后,EOC=1。
该状态信号既可作为查询的状态标志,又可以作为中断请求信号使用。
(9)Vref:
参考电源。
参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准,其典型值为+5V(Vref(+)=+5V,Vref(-)=0V)。
转换步骤:
1.ALE信号上升沿有效,锁存地址并选中相应通道。
2.ST信号有效,开始转换。
A/D转换期间ST为低电平。
3.EOC信号输出高电平,表示转换结束。
4.OE信号有效,允许输出转换结果
四、示例
用滑动电阻模拟可变的电压模拟信号,模拟信号送给ADC0809模数转换芯片的IN0通道,ADC0809芯片将其转换为数字信号,送给单片机的P1口,单片机控制2位数码管显示。
//功能:
简易数字电压表程序
#include<
#defineucharunsignedchar//无符号字符型数据预定义为uchar
ucharcodeled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8E};
//定义0~F显示码
sbitP0_2=P0^2;
//可寻址位定义
sbitP0_3=P0^3;
sbitP0_6=P0^6;
sbitP0_7=P0^7;
voidsepr(unsignedchari);
//把形式参数i的高低位分开,分别存放在全局变量chh,chl中
voiddisp();
//显示chh,chl中的数据(两位)
ucharchh,chl;
//全局变量定义
voidmain()//主函数
uchara;
unsignedchari;
{
P0_2=1;
for(a=0;
a<
50;
a++);
//延时
P0_2=0;
//在P0.2引脚产生下降沿,START和ALE引脚产生上升沿,锁存通道地址,所有内部寄存器清0
//在P0.2上产生上升沿,START上产生下降沿,A/D转换开始
while(P0_3==0);
//等待转换完成,EOC=1表示转换完成
//P0_2=0,则OE=1,允许读数
P1=0xff;
//作为输入口,P1口先置全1
i=P1;
//读入A/D转换数据
sepr(i);
//数据高低位分开
disp();
//显示数据
}
//函数名:
sepr
//函数功能:
将8位二进制数00~FFH转换为0.0~5.0,低位和高位分别存在chl和chh中
//形式参数:
i为A/D转换后的8位二进制数
//返回值:
chl中存放拆分后的低位、chh中存放拆分后的高位
voidsepr(unsignedchari)//拆分高位和低位
ucharch;
ch=i;
chh=ch/51;
//除以51得到高位
ch=ch%51;
//取余运算
chl=ch*10/51;
//再除以51,并扩大10倍,得到低位
disp
显示全局变量中chl和chh中的数字
voiddisp()
ucharj;
P2=led[chl];
//显示低位
P0_6=1;
P0_7=0;
for(j=0;
100;
j++);
//延时
P0_6=0;
P0_7=0;
P2=led[chh]&
0x7f;
//显示高位
P0_6=0;
P0_7=1;
}
其他资料:
王静霞《单片机应用技术》电子工业出版社
刘高锁《单片机系统开发技术》天津出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 任务书