>> 点击图片进入产品描述
序:本实验主要测试各个端口的输入输出控制、定时计数器实验。
一、硬件接线(参考提供的产品接线图):
①. 16路输入信号: X0~X7接8个按键开关,X10~X17也接8个按键开关
②. 14路输出控制: Y0~Y7晶体管输出型(可以先不接负载,观察8个输出指示灯)
Y10~Y15继电器输出(可以先不接负载,观察6个输出指示灯)
二、五种功能测试实验:
①. 用X0~X5的6个按键开关分别对应控制Y10~Y15的6个继电器,按一次吸合、再按一次释放
②. 用X10~X17的8个按键开关分别对应控制Y0~Y7的8个晶体管,按一次输出、再按一次截止
以上各开关可单独操作互不影响
③. 按下X6,所有端口按顺序以流水灯式依次置0和1,循环完单片机32个I/O即停止
④. 按下X7按键10次:采用软件计数,P0~P3依次全部输出0和1,输出变化10次(观察所有LED)
⑤. 按下X15按键5次:采用T1来计数,所有端口输出0和1变化,输出变化5次(观察所有LED)
三、其他测试提示:
在用T1计数时(上面第5项)可临时中断其他正在进行的程序:
比如你先测试全端口流水灯式置0(上面第3项),在程序未进行完时按X15开关5次即可
进入中断服务程序,然后返回刚才没有完成的流水灯式置0程序,继续执行完。
四、其他事项:
请您看透随套件提供的电路图(提供的是完整的),当中也有描述对应的单片机各端口。
五、演示程序: (C51举例)
>>(此程序的源码和可执行文件都在小光盘中)
/*============================================================================================
程序名称: 全端口控制测试程序
程序说明: 16路输入及14路输出测试、定时计数器中断测试;本程序不包含EEPROM测试.
程序设计: 月夜听风(QQ:479780666) 程序出处: http://www.mcusy.cn
==============================================================================================*/
#include <reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
//--------定义16个输入(根据电路板端口符号定义-便于识别和调试)---------
//接上16个按键开关作为控制输入.
sbit X0 = P1^0; sbit X10 = P3^0;
sbit X1 = P1^1; sbit X11 = P3^1;
sbit X2 = P1^2; sbit X12 = P3^2;
sbit X3 = P1^3; sbit X13 = P3^3;
sbit X4 = P1^4; sbit X14 = P3^4;
sbit X5 = P1^5; sbit X15 = P3^5;
sbit X6 = P1^6; sbit X16 = P3^6;
sbit X7 = P1^7; sbit X17 = P3^7;
//--------定义14个输出(根据电路板端口符号定义-便于识别和调试)---------
//Y10~Y15为6个继电器开关输出; Y0~Y7为8个独立达林顿型晶体管输出.
sbit Y10 = P0^0; sbit Y0 = P2^0;
sbit Y11 = P0^1; sbit Y1 = P2^1;
sbit Y12 = P0^2; sbit Y2 = P2^2;
sbit Y13 = P0^3; sbit Y3 = P2^3;
sbit Y14 = P0^4; sbit Y4 = P2^4;
sbit Y15 = P0^5; sbit Y5 = P2^5;
sbit Y6 = P0^7;
sbit Y7 = P0^6;
uchar dis_play[9]=
{0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0XFF};//8位移动数据
uchar num, n, a;
//----------------------------延时子程序-------------------------------
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=220;y>0;y--);
}
//----------------------------主程序----------------------------------
void main()
{
//定时器初始化-用于X15开关(对应单片机的P3.5)的计数:
TMOD=0x50;//定时计数器T1为工作方式1-16位计数方式/对外部计数
TH1=0xff;//
TL1=0xfb;//计数器初值(计数5次)
PT1=1;
EA=1;
ET1=1;//开T1/溢出中断
TR1=1;//启动T1
//---------------------------------------------------------------------
while(1) //循环
{
//------以下是用X0~X5的6个按键开关控制Y10~Y15的个继电器开启和关闭------
if(X0!=1) //如果键XO被按下
{
delay(5);while(X0!=1);//有无放开按键?(养成检查是否放开按键的习惯)
if(Y10!=0) {Y10=0;} //Y10有无输出0,没有就输出0,继电器吸合
else {Y10=1;} //否则Y10继电器释放
}
if(X1!=1) //如果键X1被按下 //以下相同判断,不解释了
{
delay(5); while(X1!=1);
if(Y11!=0) {Y11=0;}
else {Y11=1;}
}
if(X2!=1)//如果键X2被按下
{
delay(5);while(X2!=1);
if(Y12!=0){Y12=0;}
else {Y12=1;}
}
if(X3!=1)//如果键X3被按下
{
delay(5);while(X3!=1);
if(Y13!=0){Y13=0;}
else {Y13=1;}
}
if(X4!=1)//如果键X4被按下
{
delay(5);while(X4!=1);
if(Y14!=0){Y14=0;}
else {Y14=1;}
}
if(X5!=1)//如果键X5被按下
{
delay(5);while(X5!=1);
if(Y15!=0){Y15=0;}
else {Y15=1;}
}
//------以下是用X10~X17的8个按键开关控制Y0~Y7的8个晶体输出和截止-------
if(X10!=1)//如果键X10被按下
{
delay(5);while(X10!=1); //有无放开按键?
if(Y0!=0){Y0=0;} //Y0有无输出0,没有就输出0
else {Y0=1;} //否则Y0输出1- 晶体管截止悬空
}
if(X11!=1)//如果键X11被按下 //以下相同判断,不解释了
{
delay(5);while(X11!=1);
if(Y1!=0){Y1=0;}
else {Y1=1;}
}
if(X12!=1)//如果键X12被按下
{
delay(5);while(X12!=1);
if(Y2!=0){Y2=0;}
else {Y2=1;}
}
if(X13!=1)//如果键X13被按下
{
delay(5);while(X13!=1);
if(Y3!=0){Y3=0;}
else {Y3=1;}
}
if(X14!=1)//如果键X14被按下
{
delay(5);while(X14!=1);
if(Y4!=0){Y4=0;}
else {Y4=1;}
}
if(X15!=1)//如果键X15被按下
{
delay(5);while(X15!=1);
if(Y5!=0){Y5=0;}
else {Y5=1;}
}
if(X16!=1)//如果键X16被按下
{
delay(5);while(X16!=1);
if(Y6!=0){Y6=0;}
else {Y6=1;}
}
if(X17!=1)//如果键X17被按下
{
delay(5);while(X17!=1);
if(Y7!=0){Y7=0;}
else {Y7=1;}
}
//------------以下是用X6按键开关控制所有端口循环输出0一遍--------------
if(X6!=1)//如果键X6被按下
{
delay(5);while(X6!=1);//是否已放开按键?
for(num=0; num<9; num++)//P0低电平移9位
{
delay(500); //间隔一段时间
P0=dis_play[num]; //读取已定义的移位数据并写到P0口
}
P0=0xff; //清除P0显示
for(num=0; num<9; num++)//P1低电平移9位
{
delay(500);
P1=dis_play[num]; //读取已定义的移位数据并写到P1口
}
P1=0xff;
for(num=0; num<9; num++)//P2低电平移9位
{
delay(500);
P2=dis_play[num]; //读取已定义的移位数据并写到P2口
}
P2=0xff;
TR1=0;//关闭T1,为什么要关闭?
//因为程序开头启动了T1,为的不让下面的P3端口置0时误触发计数
for(num=0; num<9; num++)//P3低电平移9位
{
delay(500);
P3=dis_play[num]; //读取已定义的移位数据并写到P3口
}
P3=0xff;
TR1=1; //再启动T1 (T1还要保持等待计数)
}
//------以下是用X7按键计数10次(软件计数),控制所有端口置0和1共10次------
if(X7!=1)//如果键X7被按下
{
delay(5);while(X7!=1);
a++;//加1
if(a==10)//是否计满10次?
{
TR1=0;//关闭T1,避免T1误计数
a=0; //计满了就清零 /以下是P0~P3依次变化一遍
P0=0;delay(500);P0=0xff;delay(500);
P1=0;delay(500);P1=0xff;delay(500);
P2=0;delay(500);P2=0xff;delay(500);
P3=0;delay(500);P3=0xff;delay(500);
}
TR1=1;//启动T1
}
}
}
//-------------定时计数器T1中断子程序(执行X15的开关计数5次)-------------
void timer1_int(void)interrupt 3
{
TR1=0;//关闭T1
TH1=0xff;//
TL1=0xfb;//计数器值重置(计数5次)
for(n=0;n<5;n++)//所有端口依次全部置0和1, 变化5次
{
P0=P1=P2=P3=0; delay(500);
P0=P1=P2=P3=0xff; delay(500);
}
TR1=1;//启动T1
}