随手DIY一个电脑控制式的LED小台灯

时间:12-01-13 栏目:单片机, 电子DIY 作者:JH单片机 评论:0 点击: 11,423 次


 

这是一个简单的单片机串口通信的运用。对于一个单片机开发者来说,这应该是非常熟悉的了。利用单片机通过串口与计算机(电脑)进行通信,实现电脑控制LED小台灯的开关,或者一些变化。

 

材料准备:单片机最小系统,LED做的台灯(可以用万用板搭建),串口通信COM线(或USB转串口线)。

单片机最小系统(复位电路,晶振电路),搭一个单片机最小系统,不用多说了吧。附简单原理图一张

单片机最小系统原理图

 怎样将LED与单片机相连?可以通过一个开关三极管,我采用的是8050PNP型三极管,然后基极通过一个1K的电阻连接到单片机的一个IO上。

写好单片机程序,附简单的串口通信程序(单片机汇编)。其实只要会单片机,用C语言写一个这样的程序很容易的。

;╔═════════════════════════════════╗
;║         LED背光灯控制程序V2.0                                         ║
;║功能:电脑控制端下发命令,单片机接收命令后回    ║
;║应,并实时检测LED灯开启状态,将数据传给电脑。║
;║ 程序设计: (守机待讯)                                                ║
;╚═════════════════════════════════╝
 BEEP EQU P2.7   ;定义“蜂鸣器”
 RUN_LED EQU P2.2     ;定义“程序运行指示灯”
 SHUJU EQU 65H   ;定义一个“数据”
 FLAG EQU 66H   ;定义一个标志位
 XIANSHI EQU 67H   ;定义一个显示单元

 ORG 0000H  �
 LJMP MAIN
 ORG 0030H
MAIN:
;============================
;主程序各项功能初始化
;============================
 MOV SP,#60H    ;设置堆栈指针地址
 MOV P1,#0FFH   ;初始化P1口
 MOV FLAG,#0          ;标志位初始化
 MOV SHUJU,#"1"         ;初始化数据单元
 MOV R1,#00H    ;初始化寄存器R1
 MOV TMOD,#21H        ;设置T1定时器工作模式2
 MOV TH1,#0FDH   ;设定波特率9600(T0定时器作为波特率发生器)
 MOV TL1,#0FDH   ;设定波特率9600
 MOV TH0,#HIGH(15536) ;装入定时器T0初值
 MOV TL0,#LOW(15536)  ;装入定时器T0初值
 MOV SCON,#50H   ;设置串口工作模式为接收数据
 SETB TR1    ;打开T1定时器
 SETB TR0    ;打开T0定时器
; SETB EX0    ;打开外部中断0
; SETB IT0    ;下降沿方式中断
 SETB EA     ;打开中断总开关

;====================================
;主程序启动
;====================================
START:
 LCALL SOUND_L        ;系统启动,长响一声
 NOP      ;无操作
 NOP
LOOP:
 JBC RI,REC       ;数据接收请求
 JNB P3.2,KEY_0   ;扫描独立键盘
LOOP1:
 LCALL CHULI          ;数据识别处理
 MOV A,FLAG
 CJNE A,#1,LOOP2
 LCALL SEND        ;数据发送判断
LOOP2:
 LCALL RUN     ;程序运行指示灯
 SJMP LOOP
;=====================================
;各项功能子程序模块
;=====================================

;-----------------------------------
;数据接收、转换环节
;接收数据后,将ACSII码转换成二进制码
;-----------------------------------
REC:
 PUSH ACC
 LCALL SOUND_S     ;按键音
 NOP
 MOV A,SBUF
; SUBB A,#30H
 MOV SHUJU,A
 NOP
 MOV FLAG,#1         ;标志位置1
 POP ACC
 AJMP LOOP1

;-----------------------------------
;数据识别处理环节(查询方式)
;对数据进行识别,执行对应命令
;-----------------------------------
CHULI:
 MOV A,SHUJU    ;将数据调用出来
 CJNE A,#"0",NEXT
 CLR P1.0
 NOP
 RET
NEXT:
 CJNE A,#"1",NEXT1
 SETB P1.0
 NOP
 RET
NEXT1:
 RET
;-------------------------------------
;状态数据返回
;检测LED当前状态,并发送实时数据给电脑
;-------------------------------------
SEND:
 PUSH ACC    ;保护现场
 CLR TI  ;把发送标志清除
 MOV A,SHUJU ;调出数据
; ADD A,#30H  ;将数据转换成ASCII码
 MOV SBUF,A ;把数据放到发送缓冲区
 JNB TI,$ ;等待数据成功发送
 CLR TI  ;发送数据成功则标志位清零
 MOV FLAG,#0
 POP ACC     ;恢复现场
 RET

;-------------------------------------
;系统启动信号(P2.7)
;成功开启系统后“滴”一声(长)
;-------------------------------------
SOUND_L:
 MOV R5,#9
D3: MOV R4,#200
D2: MOV R3,#230
D1: DJNZ R3,D1
 NOP
 CPL BEEP
 DJNZ R4,D2
 DJNZ R5,D3
 RET

;-------------------------------------
;程序运行指示灯(P2.2=RUN_LED)
;灯闪烁,代表程序正在运行
;-------------------------------------
RUN:
 JBC TF0,T0_500
 SJMP RUN
T0_500:
 INC R1
 CJNE R1,#10,CZ
 CPL RUN_LED
 MOV R1,#00H
 RET
CZ:
 MOV TH0,#HIGH(15536) ;重装定时器T0初值
 MOV TL0,#LOW(15536)  ;重装定时器T0初值
 RET

;-------------------------------------
;按键音,收发音(P2.7)
;数据更改成功后“滴”一声(短)
;-------------------------------------
SOUND_S:
 MOV R5,#2
L3: MOV R4,#200
L2: MOV R3,#235
L1: DJNZ R3,L1
 NOP
 CPL BEEP
 DJNZ R4,L2
 DJNZ R5,L3
 RET

;-------------------------------------
;手工按键中断程序
;功能按键声明:菜单功能选项0~7
;长按不放,功能加1;放手后功能自动生效
;-------------------------------------
KEY_0:
 LCALL SOUND_S     ;按键音
 JNB P3.2,$
 NOP
 NOP
 MOV A,SHUJU
 CJNE A,#"1",NET
 MOV SHUJU,#"0"
 MOV FLAG,#1
 LJMP LOOP1
NET:
 MOV SHUJU,#"1"
 MOV FlAG,#1
 LJMP LOOP1
;-------------------------------------
;延时子程序
;DELAY_1S
;-------------------------------------
DELAY_1S:
 MOV R5,#10
S3: MOV R4,#200
S2: MOV R3,#250
S1: DJNZ R3,S1
 DJNZ R4,S2
 DJNZ R5,S3
 RET

 END

一旦确定好自定义开关量的通信协议之后,再写一个上位机串口通信程序就OK了,你就可以随心所欲用电脑控制LED灯的开关了。

上位机程序,我是采用VB来写的,用到了VB里面的串口通信Mscomm控件,代码也很简单。本博客另一篇文章有讲述如何用VB写一个串口通信程序。

如果你对单片机应用很熟悉之后,你还可以写一个PWM调光的程序,调节占空比,分成256级别调光,那就高级很多,电脑控制的不再是开关,而是可以调节灯光的亮度。当然还可以加一个光敏电阻和数模转换电路,实现自动测光调光的功能。

电脑控制LED台灯

 
关于本文作者

爱数电,爱模电;爱单片机,爱嵌入式;爱EDA,也爱DSP; 爱Altium Designer,也爱PCB;爱生活,同时也爱微博…… 一个自动化专业的学生,与志同道合者学习交流!!!

QQ 号码:594420349
腾讯微博:http://t.qq.com/kevin_753

项目合作