1. 84214位拨码开关怎么连接到PLC
每一只4位拨码开关的线路板一共有5个输出点,需要占用PLC的4个位。
线路板上标着8421字样,可以这样接:1接PLC的00位、2接PLC的01位、4接PLC的03位、8接PLC的03位、以此类推。开关线路板上还有一个公共输出点,将其并联后一并接入PLC的COM点。
2. 请帮我用8951做个定时器,用C语言写,做好注释
定时器程序如下
可设定时间的倒计时定时器,可选择5/15/20/30/35/45/50分钟倒计时
倒计时时间由四位拨码开关的1/2/3位来控制,
第2位表示5分钟,第3位表示15分钟,第4位表示30分钟,
通过不同的组合可以产生5/15/20/30/35/45/50分钟倒计时
P1.0口的外接的发光二极管为状态LED,定时未开始时LED常亮,定时过程中LED闪烁
K1为开始按钮,K2为停止按钮
a_bit equ 20h ;数码管个位数存放内存位置
b_bit equ 21h ;数码管十位数存放内存位置
temp equ 22h ;计数器数值存放内存位置
;开机初始化
MOV P3,#0FFH ;对P3口初始化,设置为高电平,用于按键输入
MOV P0,#0FFH ;使显示时间数码管熄灭
CLR P1.0 ;点亮LED指示灯
;等待键盘输入
START:JB P3.6,$ ;循环判断开始按钮K1是否按下?
ACALL DELAY10 ;延时10毫秒触点消抖
JB P3.6,START ;如果是干扰就返回
JNB P3.6,$ ;等待按键松开
;读拨码开关的状态,获得倒计时时间
SET1:
MOV A,#0 ;首先对A清零
JB P2.0,A1 ;判断拨码开关的第2位是否接通,接通就对A加5
ADD A,#5
A1: JB P2.1,A2 ;判断拨码开关的第3位是否接通,接通就对A加15
ADD A,#15
A2: JB P2.2,A3 ;判断拨码开关的第4位是否接通,接通就对A加30
ADD A,#30
A3: MOV TEMP,A ;这时TEMP中的值就是倒计时时间
;数码管显示定时时间的程序
display:
CLR P2.4 ;使继电器1释放,开始定时(开机时继电器处于吸合状态)
CLR P2.3 ;使继电器2释放,开始定时(开机时继电器处于吸合状态)
MOV R2,#120
AB1:MOV R3,#250
TIME1: mov a,temp ;将temp中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
mov dptr,#numtab ;指定查表启始地址
mov r0,#4
dpl1: mov r1,#250 ;
dplop: mov a,a_bit ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
mov p0,a ;送出个位的7段代码
clr p2.7 ;开个位显示
ACALL DELY1 ;显示1毫秒
setb p2.7 ;关闭个位显示,防止鬼影
mov a,b_bit ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
mov p0,a ;送出十位的7段代码
clr p2.6 ;开十位显示
ACALL DELY1 ;显示1毫秒
setb p2.6 ;关闭十位显示,防止鬼影
;插入一段判断定时过程中是否有按键输入的程序段
C1: JB P3.6,B1
ACALL DELAY10 ;延时10毫秒消抖
JB P3.6,C1
JNB P3.6,$ ;等待按键松开
AJMP SET1
B1: JB P3.7,M33
ACALL DELAY10 ;延时10毫秒消抖
JB P3.7,B1
JNB P3.7,$ ;等待按键松开
AJMP OVER
M33: djnz r3,TIME1 ;2毫秒循环执行250次,时间约0.5秒
CPL P1.0 ;使LED每1秒闪烁一次
djnz r2,AB1 ;循环执行120次,时间为1分钟
DEC TEMP ;满一分钟对定时时间减1
MOV A,TEMP
JNZ DISPLAY ;判断TEMP的数值是否为0?不为0循环
;结束定时
OVER:CLR P1.0 ;LED指示灯常亮
SETB P2.4 ;继电器1吸合,定时结束,退回到开机时的状态
SETB P2.3 ;继电器2吸合,定时结束,退回到开机时的状态
AJMP START ;退到开机初始化状态
;1毫秒延时子程序
DELY1: MOV R4,#2
D1: MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET
;10毫秒延时子程序
DELAY10:MOV R4,#20
D2: MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
RET
;实验板上的7段数码管0~9数字的共阴显示代码
NUMTAB:DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
end
3. 麻烦大神用C语言写一段程序,4位拨码开关控制3个LED的程序。
#include"reg51.h"
sbitled_1=P0^0;
sbitled_2=P0^1;
sbitled_3=P0^3;
intmain(void)
{
while(1)
{
switch(P2&0x0F)
{
case12:
case8:
case7:
case9:
case10:
case11:
case13:
case14:
case15:led_1=0;led_2=1;led_3=1;break;
case4:
case5:
case6:led_1=1;led_2=0;led_3=1;break;
case0:
case1:
case2:led_1=1;led_2=1;led_3=0;break;
}
}
}
4. 四位拨码开关工作原理
四位拨码开关的工作原理是一个多位BCD编码拨动开关。里面每个开关都有一块电路板,通过印刷电路图案产生BCD编码,每一位开关下面的4个管脚输出相应的BCD码。
拨码开关的输出代码及意义
2进制代码(binary CODe)
用2个值(“0”和“1”、“OFF”和“ON”等)的组合构成的符号。
10进制代码(decimal code)
采用10进制的代码。使用0、1、2、3、4、5、6、7、8、9。
2位10进制代码
(binary-coded decimal code)
将10进制分开的数字用2进制表示。也叫BCD代码。
2位16进制代码
(binary-coded hexadecimal code)
将16进制分开的数字用2进制表示。使用0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
奇偶校验(parity check)
是一个检测2进制代码有无错误的方法。加上奇偶校验用的信号,作为奇数(或偶数)统一起来,将其用于判定。
实码(real code)
作为电子电路的2值信号,将相对于接地电压较高的H定为1,较低的L用0表示。
补码(complement code)
与实码相反,“H”用0表示,“L”用1表示。
5. 请问,用四个独立按键来制作简易密码锁C语言程序该怎么编写
这个可以模拟那种拨码形式的密码锁方式来设计,比如OFO共享单车的拨码方式。
#include<reg51.h>
#define uchar unsigned char
uchar mima[4]={1,2,3,4};
uchar keymm[4]={0,0,0,0};
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit led=P1^4;
bit flag=0;
void delay(uchar a)
{
uchar i;
while(a--)for(i=0;i<120;i++);
}
main()
{
uchar i;
led=1;
while(1)
{
if(key1==0)
{
while(key1==0);
keymm[0]++;
keymm[0]%=10;
}
if(key2==0)
{
while(key2==0);
keymm[1]++;
keymm[1]%=10;
}
if(key3==0)
{
while(key3==0);
keymm[2]++;
keymm[2]%=10;
}
if(key4==0)
{
while(key4==0);
keymm[3]++;
keymm[3]%=10;
}
for(i=0;i<4;i++)
{
if(keymm[i]!=mima[i])break;
if(i==3)flag=1;
}
if(flag)
{
i=10;
while(i--)
{
led=~led;
delay(100);
}
flag=0;
}
}
}
6. 拨码开关与PLC程序
这个就是十六进制转二进制的原理, 一位十六进制可以用四位二进制表示。比如:拨码开关是二位数的 现显示09 那么对应程序就是210.00 210.03 通 因为十六进制的9 转成二进制就是1001 与之对应的210通道 就是210.00 210.03 的状态为1 210.01 210.02 的状态为0
7. 再问一次,一个关于51单片机的程序,用C语言。关于声光控制程序的
#include<reg51.h>
#define SMG P3 //数码管
sbit key1=P0^0;
sbit key2=P0^1;
sbit key3=P0^2;
sbit key4=P0^3;
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
//0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
void main()
{
P0=0xff;//IO口做输入先写1
P3=0;//防止出现乱码
while(1)
{
if(!key1)SMG=table[1];
if(!key2)SMG=table[2];
if(!key3)SMG=table[3];
if(!key4)SMG=table[14];
}
}
还要加按键去抖程序,你自己写吧!
8. 实现对四个两段8421拨码开关的读取,能否将下面的汇编改成C语言代码
两个及两个以上的BCD拨码盘可以使用公共引脚A动态扫描的方法
所有BCD拨码盘的公共引脚A分别作为不同的扫描线连接单片机。
如果8、4、2、1数据线上拉,则A端采用低扫描;如果8、4、2、1数据线下拉,则A端采用高扫描。
这里的低扫描具有两层含义:
第一,任意时刻扫描线中只有一条为低电平,其余扫描线为高电平;
第二, 在扫描过程中,扫描线需要周期性地依次变为低电平。高扫描则与低扫描完全相反。
还要注意的就是高扫描时从8、4、2、1引脚上读到的数值即为拨码盘输入对应的BCD码,而低扫描是需要取反才得到正确的BCD码
DialChangeA=1;DialChangeB=0;//扫描个位
__no_operation();__no_operation();__no_operation();__no_operation();
__no_operation();__no_operation();__no_operation();__no_operation();
__no_operation();__no_operation();__no_operation();__no_operation();
__no_operation();__no_operation();__no_operation();__no_operation();
__no_operation();__no_operation();__no_operation();__no_operation();
__no_operation();__no_operation();__no_operation();__no_operation();
val=PINC;
val >>= 2;
i = val & 0x0f; //按位与,i得到个位值。
DialChangeA=0;DialChangeB=1;//扫描十位
__no_operation();__no_operation();__no_operation();__no_operation();
__no_operation();__no_operation();__no_operation();__no_operation();
__no_operation();__no_operation();__no_operation();__no_operation();
__no_operation();__no_operation();__no_operation();__no_operation();
__no_operation();__no_operation();__no_operation();__no_operation();
__no_operation();__no_operation();__no_operation();__no_operation();
val=PINC;
val >>= 2;
l = val & 0x0f; //按位与,i得到十位值。
l *= 10; //十位值乘以10
i += l; //然后与个位值相加。
Dalay=1;
return i; //将得到的十进制数返回