山东大学单片机硬件实验.docx
- 文档编号:9517140
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:17
- 大小:196.21KB
山东大学单片机硬件实验.docx
《山东大学单片机硬件实验.docx》由会员分享,可在线阅读,更多相关《山东大学单片机硬件实验.docx(17页珍藏版)》请在冰豆网上搜索。
山东大学单片机硬件实验
《单片机原理与应用》
实验文档存放目录:
一、实验题目:
实验1:
按键声光报警实验
实验5:
8255并行I/O扩展及交通信号灯控制实验
实验7:
7279键盘扫描及动态LED显示实验
二、实验要求
实验1:
本实验联系静态按键识别,发光二极管驱动,要求利用外部硬件中断,按键按下一次产生一次外部中断,在中断服务程序中计数器加1,同时,通过发光二极管的闪烁和蜂鸣器响的次数,指示计数器的当前值。
当计数到10时,再次按键将重新从1开始计。
实验2:
本实验利用8255实现可编程的并行IO扩展功能,并利用其完成交通灯控制。
实验要求红灯常亮30S,绿灯常亮25S后闪烁5S。
使用静态数码管显示绿灯常亮倒计时。
本实验中的东西方向信号灯同步控制,南北方向信号灯同步控制,即:
东西方向上同种颜色的灯同时亮或灭,南北方向上同种颜色的灯同时亮或灭。
实验3:
本实验利用7279进行键盘扫描及动态LED数码管显示控制。
当按下某个按键时所按按键对应的字符显示在最右端LED数码管上,如果再次按下一个按键’2’,则原来显示的内容往左移1位,将新按下的按键’2’,的字符显示在最右端,依次类推显示0~F。
三、实验过程及结果记录(截图)
实验1
实验2
实验3
四、实验源程序
实验1
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitbell=P3^1;//P3.1口位赋值给铃声
sbitled=P3^0;//P3.0口位赋值给灯
sbitkey0=P3^2;//P3.2口位赋值给按键
uintcount;
voiddelay(uintcount)//延时1ms
{
uintx,y;
for(x=count;x>0;x--)
for(y=110;y>0;y--);
}
voidshow(uintcount)
{uinti;
for(i=0;i<=count;i++)
{
led=0;bell=0;//灯亮,铃响
delay(500);//延时0.5s
led=1;bell=1;//灯灭,铃不响
delay(500);
}
}
voids_timer0()interrupt0using0
{
EA=0;//屏蔽所有中断请求
show(count);//调用子程序
count++;
delay(50);
if(count>=10)
count=0;
EA=1;//开放中断
}
/**************************主程序**********************************/
voidmain()
{EA=1;//开放中断
EX0=1;//允许外部中断0中断
IT0=0;//外部中断0为电平触发方式
while
(1);//循环执行
}
实验2
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definePAXBYTE[0x7FFC]//CS--A15
#defineCOMXBYTE[0x7FFF]
sbitP30=P3^0;
sbitP31=P3^1;
uinttemp,shi,ge,t;
uchara;
voidxianshi(uinttemp);
voiddelay();
voiddelays();
voidinit_8255();
voidinit_8255()
{
COM=0x80;//c=out,a=out,b=out
}
voiddelay()//延时500MS子程序
{
uinti,j;
for(i=500;i>0;i--)
for(j=120;j>0;j--);
}
voiddelays()//延时1S子程序
{
uinti,j;
for(i=1000;i>0;i--)
for(j=120;j>0;j--);
}
/***************************主程序*****************************/
voidmain()
{
init_8255();
TMOD=0x01;//设定工作模式1
EA=1;//开放中断
ET0=1;//允许T0中断
TF0=0;//定时器0溢出标志位
while
(1)
{
a=0x26;//变量a赋初值
for(temp=25;temp>19;temp--)//绿灯倒计时25s
{
a=a-1;
PA=0x69;//东西绿灯亮
xianshi(a);//调用数码管显示子程序
delays();//延时1s
}
a=0x1a;//变量a赋值
for(temp=19;temp>9;temp--)//倒计时
{
a=a-1;
PA=0x69;//东西绿灯亮
xianshi(a);
delays();
}
a=0x0a;
for(temp=9;temp>0;temp--)
{
a=a-1;
PA=0x69;
xianshi(a);
delays();
}
for(t=5;t>0;t--)//绿灯闪烁5s
{
a=0;//当计时值为0时闪烁
xianshi(a);
PA=0xeb;//东西绿灯灭
delay();//延时0.5s
PA=0x69;//东西绿灯亮
delay();//延时0.5s
}
a=0x26;
for(temp=25;temp>19;temp--)//绿灯倒计时25s
{
a=a-1;
PA=0x96;//南北绿灯亮
xianshi(a);
delays();
}
a=0x1a;
for(temp=19;temp>9;temp--)
{
a=a-1;
PA=0x96;
xianshi(a);
delays();
}
a=0x0a;
for(temp=9;temp>0;temp--)
{
a=a-1;
PA=0x96;
xianshi(a);
delays();
}
for(t=5;t>0;t--)//绿灯闪烁5s
{
a=0;//当计时值为0时闪烁
xianshi(a);
PA=0xbe;//南北绿灯灭
delay();//延时0.5s
PA=0x96;//南北绿灯亮
delay();//延时0.5s
}
}
}
voidxianshi(uinta)//显示子程序
{
SCON=0x00;//工作模式0
SBUF=a;//将变量a的值送给缓存寄存器
while(!
TI)//等待发送是否完成
TI=0;//中断标志位清零
}
实验3
#include
#include
sbitCS=P1^0;//csatP1.0
sbitCLK=P1^1;//clk连接于P1.1
sbitDATA=P1^2;//dat连接于P1.2
sbitKEY=P1^3;//key连接于P1.3
//********************HD7279A指令******************/
#defineRESET0xa4//复位指令
#defineRL0xa1//左移指令
#defineDECODE10xc8//译码方式1
#defineREAD0x15//读键盘指令
/*********************长延时子程序******************/
voidldelay()//25us
{
unsignedchara,b;
for(b=1;b>0;b--)
for(a=20;a>0;a--);
}
/***************短延时子程序****************/
voidsdelay()
{
unsignedchara;
for(a=3;a>0;a--);
}
voidsend(unsignedcharout)//发送一个字节
{
unsignedchari;
CS=0;//芯片使能
ldelay();//长延时
for(i=0;i<8;i++)//分8次移入数据
{
if(out&0x80)//先传高位
DATA=1;
elseDATA=0;
CLK=1;
sdelay();
CLK=0;
sdelay();
out=out<<1;//数据左移
}
DATA=0;
}
voidwrite(unsignedcharcommand,unsignedchardat)
{
send(command);
send(dat);
}
unsignedcharreceive()//接收一个字节
{
unsignedchari,inbyte;
ldelay();//长延时
for(i=0;i<8;i++)//分8次读入数据高位在前
{
CLK=1;
sdelay();
inbyte=inbyte<<1;
if(DATA)
inbyte=inbyte|0x01;//数据左移
CLK=0;
sdelay();
}
DATA=0;
returninbyte;
}
/********************键盘扫描子程序*****************************/
unsignedcharkeyscan()
{
unsignedcharkey;
if(!
KEY)//检测P1.3是否口为低电平
{
send(READ);
key=receive();//将接收到的数赋给key
switch(key)//按键编码
{
case0x1b:
return0x00;break;
case0x13:
return0x01;break;
case0x0b:
return0x02;break;
case0x03:
return0x03;break;
case0x1a:
return0x04;break;
case0x12:
return0x05;break;
case0x0a:
return0x06;break;
case0x02:
return0x07;break;
case0x19:
return0x08;break;
case0x11:
return0x09;break;
case0x09:
return0x0a;break;
case0x01:
return0x0b;break;
case0x18:
return0x0c;break;
case0x10:
return0x0d;break;
case0x08:
return0x0e;break;
case0x000:
return0x0f;break;
}
}
return0xff;
}
/*******************主程序**********************/
voidmain()
{
unsignedchari,key;
send(RESET);
while
(1)
{
if(!
KEY)//检测P1.3是否口为低电平
{
key=keyscan();//将键盘扫描所得值赋给key
send(RL);
write(DECODE1,key);
while(!
KEY);//当P1.3口为低电平,循环执行
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 山东大学 单片机 硬件 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)