
//我想做个15路输出的彩灯,预置数为15个(10进制32767)1,
//使用P00~P07和P20~P26端口,
//设置+1(P33)和-1(P34)两个按钮,可以减到十进制32047。
//到32047后如果继续按-1按钮,可以回到32767重新进行减法。
//加法也一样,加到32767后按+1按钮可以到32047重新+1
//再设置一个按钮(P27),当P27接地时,在当前显示的数字上减去十进制数1712进行显示。
//============================
#include<reg52h>
sbit K_1 = P3^3; //+
sbit K_2 = P3^4; //-
sbit D_1 = P2^7; //显示方式选择
//----------------------------
void delay_ms(unsigned int n)
{
unsigned char j;
while(n--) for(j = 0; j < 230; j++); //230是实验测试所得!
}
void main()
{
unsigned int m;
m = 32767;
while(1) {
if (D_1 == 1) {
P2 = ~(m / 256);
P0 = ~(m % 256);
}
else {
P2 = ~((m - 1712) / 256);
P0 = ~((m - 1712) % 256);
}
if (K_1 == 0) {
delay_ms(10);
if (K_1 == 0) {
m++;
if (m > 32767) m = 32047;
while(K_1 == 0);
}
}
if (K_2 == 0) {
delay_ms(10);
if (K_2 == 0) {
m--;
if (m < 32047) m = 32767;
while(K_2 == 0);
}
}
}
}
//============================
X1彩灯控制开关,用三菱FX2N系列PLC
LD X1
ANI T0
OUT T0 K20
LD x1
MOV K2M0 K2Y0
LD> K4M0 K128
ORP X1
MOVP K1 K4M0
LD T0
ROL K4M0 K1
END
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
SETB ET0
SETB EA
MOV R2,#0
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
MOV A,R0
CJNE A,#18,T001
MOV R0,#0
T001:
MOV DPTR,#LEDTAB
MOVC A,@A+DPTR
MOV P1,A
INC R0
RETI
LEDTAB:
DB 0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,80H,00H
DB 80H,0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH
DB 00H,0FFH
END
DB 01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,0FEH,0FCH DB 0F8H,0F0H,0E0H,0C0H,80H,00H,0FFH,00H,0FEH DB 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,0BFH,0DFH DB 0EFH,0F7H,0FBH,0FDH,0FEH,00H,0FFH,00H 这个是彩灯循环花样 其中把十六进制数换成二进制的 是一的位彩灯就亮。比如第一个01H换成二进制就是00000001,所以是第一个灯亮,依此可推出彩灯循环花样
(1)彩灯从左向右依次点亮,直至全亮。再从左向右熄灭,直至全熄。
(2)全亮全灭。
(3)从左向右依次单个点亮,再从右向左依次单个点亮。(整个过程只有一个灯亮)
以上过程不断循环。
编写一个表格,依次输出,不行吗?
利用取表的方法,使端口P1 做单一灯的变化:左移2 次,右移2 次,闪烁2 次
(延时的时间02 秒)。
汇编源程序
ORG 0
START: MOV DPTR,#TABLE
LOOP: CLR A
MOVC A,@A+DPTR
CJNE A,#01H,LOOP1
JMP START
LOOP1: MOV P1,A
MOV R3,#20
LCALL DELAY
INC DPTR
JMP LOOP
DELAY: MOV R4,#20
D1: MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
DJNZ R3,DELAY
RET
TABLE: DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH,0BFH,07FH
DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH,0BFH,07FH
DB 07FH,0BFH,0DFH,0EFH
DB 0F7H,0FBH,0FDH,0FEH
DB 07FH,0BFH,0DFH,0EFH
DB 0F7H,0FBH,0FDH,0FEH
DB 00H, 0FFH,00H, 0FFH
DB 01H
END
LIBRARY ieee;
USE ieeestd_logic_1164ALL;
use ieeestd_logic_arithall;
use ieeestd_logic_unsignedall;
ENTITY color16 IS
PORT(cp,rst:IN std_LOGIC;
sel:in std_LOGIC_VECTOR(1 DOWNTO 0);
aout:OUT std_LOGIC_VECTOR(15 DOWNTO 0)
);
END color16;
ARCHITECTURE color OF color16 IS
TYPE state_1 IS (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15);
SIGNAL state_2:state_1;
BEGIN
pr_1:PROCESS (cp,rst)
BEGIN
IF rst='1' THEN
state_2<=s0;
ELSIF cp'event AND cp='1' THEN
CASE state_2 IS
WHEN s0=> state_2<=s1;
WHEN s1=> state_2<=s2;
WHEN s2=> state_2<=s3;
WHEN s3=> state_2<=s4;
WHEN s4=> state_2<=s5;
WHEN s5=> state_2<=s6;
WHEN s6=> state_2<=s7;
WHEN s7=> state_2<=s8;
WHEN s8=> state_2<=s9;
WHEN s9=> state_2<=s10;
WHEN s10=> state_2<=s11;
WHEN s11=> state_2<=s12;
WHEN s12=> state_2<=s13;
WHEN s13=> state_2<=s14;
WHEN s14=> state_2<=s15;
WHEN s15=> state_2<=s0;
END CASE;
END IF;
END PROCESS pr_1;
pr_2:PROCESS(sel,state_2)
BEGIN
if sel="00" then
-- when "00" =>
CASE state_2 IS
WHEN s0=> aout<="1000000000000000";
WHEN s1=> aout<="0100000000000000";
WHEN s2=> aout<="0010000000000000";
WHEN s3=> aout<="0001000000000000";
WHEN s4=> aout<="0000100000000000";
WHEN s5=> aout<="0000010000000000";
WHEN s6=> aout<="0000001000000000";
WHEN s7=> aout<="0000000100000000";
WHEN s8=> aout<="0000000010000000";
WHEN s9=> aout<="0000000001000000";
WHEN s10=> aout<="0000000000100000";
WHEN s11=> aout<="0000000000010000";
WHEN s12=> aout<="0000000000001000";
WHEN s13=> aout<="0000000000000100";
WHEN s14=> aout<="0000000000000010";
WHEN s15=> aout<="0000000000000001";
END CASE;
elsif sel="01" then
CASE state_2 IS
WHEN s0=> aout<="1000000000000001";
WHEN s1=> aout<="1100000000000011";
WHEN s2=> aout<="1110000000000111";
WHEN s3=> aout<="1111000000001111";
WHEN s4=> aout<="1111100000011111";
WHEN s5=> aout<="1111110000111111";
WHEN s6=> aout<="1111111001111111";
WHEN s7=> aout<="1111111111111111";
WHEN s8=> aout<="1111111001111111";
WHEN s9=> aout<="1111110000111111";
WHEN s10=> aout<="1111100000011111";
WHEN s11=> aout<="1111000000001111";
WHEN s12=> aout<="1110000000000111";
WHEN s13=> aout<="1100000000000011";
WHEN s14=> aout<="1000000000000001";
WHEN s15=> aout<="0000000000000000";
END CASE;
-- when "10"=>
elsif sel="10" then
CASE state_2 IS
WHEN s0=> aout<="1100000000000000";
WHEN s1=> aout<="0011000000000000";
WHEN s2=> aout<="0000110000000000";
WHEN s3=> aout<="0000001100000000";
WHEN s4=> aout<="0000000011000000";
WHEN s5=> aout<="0000000000110000";
WHEN s6=> aout<="0000000000001100";
WHEN s7=> aout<="0000000000000011";
WHEN s8=> aout<="0000000000000011";
WHEN s9=> aout<="0000000000001100";
WHEN s10=> aout<="0000000000110000";
WHEN s11=> aout<="0000000011000000";
WHEN s12=> aout<="0000001100000000";
WHEN s13=> aout<="0000110000000000";
WHEN s14=> aout<="0011000000000000";
WHEN s15=> aout<="1100000000000000";
END CASE;
-- when "11"=>
elsif sel="11" then
CASE state_2 IS
WHEN s0=> aout<="1111111111111111";
WHEN s1=> aout<="0000000000000000";
WHEN s2=> aout<="1111111111111111";
WHEN s3=> aout<="0000000000000000";
WHEN s4=> aout<="1111111111111111";
WHEN s5=> aout<="0000000000000000";
WHEN s6=> aout<="1111111111111111";
WHEN s7=> aout<="0000000000000000";
WHEN s8=> aout<="1111111111111111";
WHEN s9=> aout<="0000000000000000";
WHEN s10=> aout<="1111111111111111";
WHEN s11=> aout<="0000000000000000";
WHEN s12=> aout<="1111111111111111";
WHEN s13=> aout<="0000000000000000";
WHEN s14=> aout<="1111111111111111";
WHEN s15=> aout<="0000000000000000";
END CASE;
end if;
END PROCESS pr_2;
END color;
以上就是关于50分求单片机彩灯程序全部的内容,包括:50分求单片机彩灯程序、彩灯控制程序PLC、如何用汇编语言写一个循环彩灯的程序,采用定时器方式1工作等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)