利用定时器空孝T1,对外部脉冲(P3.5引脚输入)计数,
每输入200次脉冲产生一次中断,累加器+1,
选用T1,计数器模式,方式2(自动重装初值8位计数器),
TMOD
=0110
0000B
=60H
计数初值
=2^8
-200
=256
-200
=56d
=38H,
汇编程序如下:
主程序:
MAIN:
CLR
A
累加器清零
MOV
TMOD,
#60H
置T1计数模式、方式2
MOV
TL1,
#38H
写入计数初值
MOV
TH1,
#38H
写入留待自动重装的初值
SETB
TR1
启动T1计数
SETB
ET1
允许迟亏清T1中断码前
SETB
EB
CPU开中断
SJMP
$
等待一轮对外部脉冲计数溢出中断
以下是T1中断处理子程序:
T1_INT:
INC
A
累加器加1
RETI
中断返回
1、使用T0和T1外部脉冲计数,控薯孝前制两个电机,到1700个脉冲电机停止,
--统计脉冲个数,用外部中断更好。
--T0和T1,留着定时用。
用四个按键控制,按键1控制电机正转,按键2控制电机反转,按键3控制电机1正转,按键4控制电机2正转。
2、例程:
#include<reg51.h>sbit k1 = ? //自己定义
sbit k2 = ?
sbit k3 = ?
sbit k4 = ?
sbit DIAN1 = ?
sbit DIAN2 = ?
sbit DIAN3 = ?
sbit DIAN4 = ?
sbit SEN1 = ?
sbit SEN2 = ?
void delay(unsigned int x)
{
unsigned int m, n
for(m = x m > 0 m--) for(n = 115 n > 0 n--)
}
void main(void)
{
TMOD = 0x55
IE = 0x8a
while(1) {
慎颂if (!k1) {
delay(10)
if (!k1) {
while(!k1)
TH0 = (65536 - 1700) / 256
TL0 = (65536 - 1700) % 256
SEN1 = 0
DIAN1 = 0 DIAN2 = 1
SEN1 = 1
TR0 = 1
}
}
if (!k2) {
数清delay(10)
if (!k2) {
while(!k2)
TH0 = (65536 - 1700) / 256
TL0 = (65536 - 1700) % 256
SEN1 = 0
DIAN1 = 1 DIAN2 = 0
SEN1 = 1
TR0 = 1
}
}
if (!k3) {
delay(10)
if (!k3) {
while(!k3)
TH1 = (65536 - 1700) / 256
TL1 = (65536 - 1700) % 256
SEN2 = 0
DIAN3 = 0 DIAN4 = 1
SEN2 = 1
TR1 = 1
}
}
if (!k4) {
delay(10)
if (!k4) {
while(!k4)
TH1 = (65536 - 1700) / 256
TL1 = (65536 - 1700) % 256
SEN2 = 0
DIAN3 = 1 DIAN4 = 0
SEN2 = 1
TR1 = 1
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)