📄 delay_dcmoter.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 + -