⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 delay_dcmoter.c

📁 继电器和直流小电机正反转控制 ZLG7290键盘与显示控制芯片的控制和使用
💻 C
字号:
     /*******************************************************************/ 
      /*                                                                         
      /* 深圳信息职业技术学院电子通信系                                              
      /*  
      /* 《单片机程序设计实践教程》项目例程 
      /*                                                       
      /* 第10章 基础项目. '继电器和直流小电机正反转控制'演示程序                                                                   
      /*                                                                         
      /* 功能:利用按键控制直流电机的正转、刹车、停转和反转以及继电器输出端的断开和连接,并用LED发光管
	  /* 和7段数码管显示相应的状态。
      /* 演示过程:正确连接直流电机和继电器输出端,将程序下载执行后,按压相应按键即可看到演示效果 */
 	  /* 存在问题:无;
      /* 邮箱: panxn@sziit.com.cn  */ 
      /* 作者:潘晓宁   */ 
      /*                     */ 
      /* 修改时间: 2008/8/3                 */ 
      /*                                */ 
      /*【版权】Copyright(C)PanXiaoNing All Rights Reserved             */ 
      /*【声明】此程序仅用于学习与参考   
      /*                                                                    */ 
      /*******************************************************************/ 

#include  <absacc.h>
#include  <intrins.h>
#include  "I2C.h"
#include  "ZLG7290.h"

#define  uchar  unsigned  char
#define  uint  unsigned  int

#define  PA8255  XBYTE[0x3ffc]              //8255端口A的地址
#define  PB8255  XBYTE[0x3ffd]              //8255端口B的地址
#define  PC8255  XBYTE[0x3ffe]              //8255端口C的地址
#define  COM8255  XBYTE[0x3fff]            //8255命令字的地址

sbit  cs138=P1^6 ;                         //74HC138的选通端口
 
void  DispHexValue(char x, unsigned char dat);
void  MotorRelayRun(void);
void  delay(uchar);

uchar KeyValue,KeyPushFlag;

/*********************************主函数***************************************/
void  main(void)
{  cs138=0;                           //选通74HC138的使能端
   COM8255=0x80;                      //8255的初始化,PA,PC口为输出

   PC8255=0;                          //初始化直流电机停转,继电器断开
   EA=1;                              //允许所有中断被响应
   IT1 = 1;                           //外部中断1的触发方式为下降沿触发
   EX1 = 1;                           //允许外部中断1被响应(ZLG7290键盘中断)

   KeyPushFlag=0;                     //按键标志位置零,表示无键被按下
   KeyValue=3;                        //初始化向数码管第1位写入'03',表示直流电机停转
   PA8255=0x0f;                       //82C55的PA口D17、D16、D15和D14点亮
   DispHexValue(4, 0x08);             //初始化向数码管第4位写入'08',表示继电器断开

   while(1)
   {
     if(KeyValue<=4) DispHexValue(0, KeyValue);   //以16进制方式显示直流电机运行数值
	 else DispHexValue(4, KeyValue);              //以16进制方式显示继电器运行数值
     if (KeyPushFlag)		                      //如果有键按下
	 {	
		KeyPushFlag= 0;                           //KeyPushFlag置0,可以等待ZLG7290键盘中断的再次发生
		ZLG7290_ReadReg(ZLG7290_Key,&KeyValue);  //由ZLG7290键值寄存器读取被压键值,此函数由项目中的ZLG7290.c规定
		MotorRelayRun();                         //直流电机和继电器运行
	  }
	 delay(120);                                 //延时大约120ms
   }
}
/*********************************主函数结束************************************/

void DispHexValue(char x, unsigned char dat)
//ZLG7290的16进制字节显示函数,dat:要显示的数据,取值0~255;x:显示位置,取值0~6
{
  unsigned char d;
  d = dat / 16;                  //取x位的16进制显示数
  ZLG7290_Download(x,0,0,d);	    //在x位不闪烁、熄灭小数点点亮数字d,此函数由项目中的ZLG7290.c规定
  d = dat - d * 16;              //取x+1位的16进制余数的显示数
  ZLG7290_Download(x+1,0,0,d);   //在x+1位不闪烁、熄灭小数点点亮数字d,此函数由项目中的ZLG7290.c规定
}

void MotorRelayRun(void )                 //直流电机和继电器运行子程序 
{
  switch(KeyValue)
  {
    case 1: PC8255=(PC8255|0x08)&0xfb;   //S1键被按下,向数码管写入'01',表示正转,直流电机  10-正转
	        PA8255=0x55;                 //82C55的PA口D17、D15、D13和D11点亮
		    break;
    case 2: PC8255|=0x0c;                //S2键被按下,向数码管写入'02',表示刹车,直流电机  11-刹车
	        PA8255=0x3f;                 //82C55的PA口D17和D15点亮
			break;	                   
    case 3: PC8255&=0xf3;                //S3键被按下,向数码管写入'03',表示停转,直流电机  00-停转
			PA8255=0xfc;                 //82C55的PA口D12和D11点亮
		    break;	                 
    case 4: PC8255=(PC8255|0x04)&0xf7;   //S4键被按下,向数码管写入'04',表示反转,直流电机  01-反转
			PA8255=0xaa;	             //82C55的PA口D16、D14、D12和D10点亮
		    break;
    case 5: PC8255|=0x02;                //S5键被按下, 继电器控制信号为高,向数码管写入'05',表示输出端断开
			PA8255=0xf0;               	 //82C55的PA口D13、D12、D11和D10点亮
		    break;
    case 8: PC8255&=0xfd;                //S8键被按下,继电器控制信号为低,向数码管写入'08',表示输出端连接
			PA8255=0x0f;	             //82C55的PA口D17、D16、D15和D14点亮
		    break;
	 default:break;
	}
}

void INT1_SVC() interrupt 2         //外部中断1服务程序
{
   EX1=0;                           //关外部中断1
   KeyPushFlag = 1;                 //有键按下,设KeyPushFlag为1,提供主程序对事件进行处理的条件
   EX1=1;                           //打开外部中断1
}
void  delay(uchar  x)              // 延时,系统主频为11.0592MHz
{  uchar k;
   while(x--)                      //延时大约x毫秒钟
     for(k=0;k<125;k++){}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -