51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > ◆本站实例 > 详细内容
单片机工控板全端口16路输入14路输出控制实验
作者:admin  发布时间:2009/11/2  阅读次数:4269  字体大小: 【】 【】【

   >> 点击图片进入产品描述

序:本实验主要测试各个端口的输入输出控制、定时计数器实验。
、硬件接线(参考提供的产品接线图):
①. 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举例
>>(此程序的源码和可执行文件都在小光盘中)  
/*============================================================================================
程序名称: 全端口控制测试程序
产品型号: XY-30MR_T单片机工控板,采用STC89C54RD+ 、晶体22.1184M(为的是串口通信时适合的波特率)
程序说明: 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
}
  
  
  
来源:本站
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[1]
  • 评论人:[匿名] 时间: [2009/12/3 0:06:16] IP:[113.92.126.4*]
  • 工控板能实验,这个我喜欢!学习了

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号