单片机实训任务书.docx
《单片机实训任务书.docx》由会员分享,可在线阅读,更多相关《单片机实训任务书.docx(16页珍藏版)》请在冰豆网上搜索。
单片机实训任务书
《单片机原理及接口》
实训任务书
使用班级:
电气自动化技术103
指导老师:
冉会中
电子信息与电气工程系
2011年2月
提前下载并阅读实训任务书。
三人一小组,每组保证一台电脑。
下周一上午8:
40带上电脑,到单片机实验室
实训任务一:
选座系统设计/LED点阵广告设计
一、内容
1、选座系统设计
设计主要内容:
会议厅电影厅等有座位选择的需求,要求用单片机、LED和按键设计自助选座系统。
基本功能要求:
1)用点亮LED上对应的点表示已选的座位
2)用LED上对应的熄灭的点表示未选的座位
3)按按键实现座位的行号和列号输入,并通过矩阵LED上对应的点闪烁来形象显示将选定的座位号
2.点阵广告设计
设计主要内容:
常见室外有LED点阵广告,要求用单片机、多片LED设计显示汉字的点阵广告牌系统。
基本功能要求:
用点亮LED上对应的点显示一个特定的汉字或图形
二、目的
1.学习矩阵按键的工作原理
2.学习矩阵按键识别的方法
3.学习点阵显示的工作原理
4.学习点矩点亮显示字型的方法
5.训练程序编写和调试能力
三、知识梳理和参考:
1.矩阵按键例
功能:
用单片机的并口连接4*4矩阵按键,并在数码管上显示每个按键的序号
硬件设计
单片机P0.0至P0.3接矩阵按键的行线,P2.0至P2.3接矩阵按键的列线,P3接led段码管的abcdefgdp端,段P1口的P1.0和P1.3
参考程序
//用单片机的并口连接4*4矩阵按键,并在数码管上显示每个按键的序号
#include
voiddelayms(unsignedcharxms)//延时xms子函数
{
unsignedchari,m;
for(i=xms;i>0;i--)//i=xms即延时约xms毫秒
for(m=110;m>0;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&0x0f;
if(temp!
=0x00)
sel_c=0x01;
{//判断哪一个按键
for(i=0;i<4;i++)
{
sel_column=~sel_c;
P2=sel_column;
temp=~P0;
temp=temp&0x0f;
if(temp!
=0x00)
{m=i;
find=1;
switch(temp)
{case0x01:
n=0;break;
case0x02:
n=1;break;
case0x04:
n=2;break;
case0x08:
n=3;break;
default:
break;
}
}
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次后,再显示其他字型。
参考程序
//循环显示汉字“一”、“二”和“日”三个字型
#include
voiddelay(unsignedinti)
{
unsignedcharj,k;
for(j=0;j
for(k=0;k<255;k++);
}
voidmain()
{
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;k<=2;k++)
{for(m=0;m<=100;m++)
//显示一个字的字型
{rowselect=0x01;
for(j=0;j<=7;j++)
{
P2=~rowselect;//选行
//同时送字型编码中的一个字节到列线
P0=led[k][j];
delay
(2);
rowselect=rowselect<<1;
}
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;
while
(1)
{
P0_2=1;
for(a=0;a<50;a++);//延时
P0_2=0;//在P0.2引脚产生下降沿,START和ALE引脚产生上升沿,锁存通道地址,所有内部寄存器清0
for(a=0;a<50;a++);//延时
P0_2=1;//在P0.2上产生上升沿,START上产生下降沿,A/D转换开始
while(P0_3==0);//等待转换完成,EOC=1表示转换完成
P0_2=0;//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;j<100;j++);//延时
P0_6=0;
P0_7=0;
P2=led[chh]&0x7f;//显示高位
P0_6=0;
P0_7=1;
for(j=0;j<100;j++);//延时
P0_6=0;
P0_7=0;
}
其他资料:
王静霞《单片机应用技术》电子工业出版社
刘高锁《单片机系统开发技术》天津出版社