求单片机大神!用89c52单片机实现智能台灯程序!

求单片机大神!用89c52单片机实现智能台灯程序!,第1张

1、没必要通过24c02来存储设置的数据

2、89C52没有ADC,如果需要输入模拟量,请外接ADC

3、部分程序贴出。供大家参考:(全部程序请下载zip附件)

#include<REG52.h>

#include<timer.h>

#include<DigitalTube.h>

//中断0唤醒单片机 //开启单片机按键接P3^2

//以下随意改,只要不与数码管数据冲突

sbit key_1 = P1^0 //关孙颂闭单片机

sbit key_2 = P1^1 //时间+

sbit key_3 = P1^2 //时间-

sbit key_4 = P1^3 //确认

#define Period 5 //每次加或减的时间(分钟)

sbit LAMP = P1^4 //台灯开关控制输入

bit confirm=0

char time=40 //以分钟为单位,每次加Period分钟或减Period分钟

void menu(void)

{

if(key_1==0)

{

delay(10)

if(key_1==0)

{

delay(5)

while(key_1==0)delay(5)

PCON=0x02 //进入掉电模式

}

}

if(key_2==0)

{

delay(10)

if(key_2==0)

{

delay(5)

while(key_2==0)delay(5)

if(time<60)

{

time+=Period

}

}

}

if(key_3==0)

{

delay(10)

if(key_3==0)

{

delay(5)

while(key_3==0)delay(5)

if(time>20)

{

time-=Period

}

}

}

if(key_4==0)

{

delay(10)

if(key_4==0)

{

delay(5)

while(key_4==0)delay(5)

confirm=1

}

}

}

void main(void)

{

IE=0x81 //开中断

IT0=1 //低电平触发

LAMP=1 //点亮台灯

PCON=0x02 //关闭单片机

while(1)

{

while(!confirm)

{

menu()

DigitalTube_disNum(0,time/10)

DigitalTube_disNum(1,time%10)

}

while(time>0)

{

time--

delay(60000) //一分钟,误差有一点

}

LAMP=0 //关闭台灯

time=40

confirm=0

}

}

void Wakeup() interrupt 0 using 0  //中高凯旁断唤戚橡醒单片机

{

unsigned char i = 0

IE = 0x00

delayMicroseconds(10)

while(i<4)

{

DigitalTube_disNum(i++,8)

}

IE = 0x81

}

#include"timer.h"

#if FOSC==12 //如果使用12MHz晶振

void delay(unsigned int ms)

{

unsigned int i

for(ms>0ms--)

for(i=0i<124i++)

}

#else

void delay(unsigned int ms)

{

unsigned int i

for(ms>0ms--)

for(i=0i<=113i++)

}

#endif

void delayMicroseconds(unsigned int us)

{

for(us>4us-=4)

}

#ifdef USE_MORE_DELAY

void delayminutes(unsigned int minute)

{

unsigned int i,j

for(minute>0minute--)

for(i=0i<125i++)

for(j=0j<60000j++)

}

void delayday(unsigned int day)

{

   unsigned int i,j

for(day>0day--)

for(i=0i<3000i++)

for(j=0j>60000j++)

}

#endif

#include"DigitalTube.h"

#define HIGH 0

#define LOW  1

#ifdef CO_CATHODE

#define N_0 0xC0

#define N_1 0xF9

#define N_2 0xA4

#define N_3 0xB0

#define N_4 0x99

#define N_5 0x92

#define N_6 0x82

#define N_7 0xF8

#define N_8 0x80

#define N_9 0x90

#endif

#ifdef CO_ANODE

#define N_0 0x3F

#define N_1 0x06

#define N_2 0x5B

#define N_3 0x4D

#define N_4 0x66

#define N_5 0x6D

#define N_6 0x7D

#define N_7 0x07

#define N_8 0x7F

#define N_9 0x6F

#endif

#if Seg_Number>7

#define SegLOW {Segment_7 = LOWSegment_6 = LOWSegment_5 = LOWSegment_4 = LOWSegment_3 = LOWSegment_2 = LOWSegment_1 = LOWSegment_0 = LOW}

#endif

#if Seg_Number>6

#ifndef SegLOW

#define SegLOW {Segment_6 = LOWSegment_5 = LOWSegment_4 = LOWSegment_3 = LOWSegment_2 = LOWSegment_1 = LOWSegment_0 = LOW}

#endif

#endif

#if Seg_Number>5

#ifndef SegLOW

#define SegLOW {Segment_5 = LOWSegment_4 = LOWSegment_3 = LOWSegment_2 = LOWSegment_1 = LOWSegment_0 = LOW}

#endif

#endif

#if Seg_Number>4

#ifndef SegLOW

#define SegLOW {Segment_4 = LOWSegment_3 = LOWSegment_2 = LOWSegment_1 = LOWSegment_0 = LOW}

#endif

#endif

#if Seg_Number>3

#ifndef SegLOW

#define SegLOW {Segment_3 = LOWSegment_2 = LOWSegment_1 = LOWSegment_0 = LOW}

#endif

#endif

#if Seg_Number>2

#ifndef SegLOW

#define SegLOW {Segment_2 = LOWSegment_1 = LOWSegment_0 = LOW}

#endif

#endif

#if Seg_Number>1 

#ifndef SegLOW

#define SegLOW {Segment_1 = LOWSegment_0 = LOW}

#endif

#endif

#if Seg_Number>0

#ifndef SegLOW

#define SegLOW {Segment_0 = LOW}

#endif

#endif

unsigned int i = 0

void DigitalTube_disNum(unsigned char seg_Number,unsigned char Data)

{

switch(Data)

{

case 0: SegData_Port = N_0break

case 1: SegData_Port = N_1break

case 2: SegData_Port = N_2break

case 3: SegData_Port = N_3break

case 4: SegData_Port = N_4break

case 5: SegData_Port = N_5break

case 6: SegData_Port = N_6break

case 7: SegData_Port = N_7break

case 8: SegData_Port = N_8break

case 9: SegData_Port = N_9break

}

SegLOW

switch(seg_Number)

{

#if Seg_Number>7

case 7:Segment_7 = HIGHbreak

#endif

#if Seg_Number>6

case 6:Segment_6 = HIGHbreak

#endif

#if Seg_Number>5

case 5:Segment_5 = HIGHbreak

#endif

#if Seg_Number>4

case 4:Segment_4 = HIGHbreak

#endif

#if Seg_Number>3

case 3:Segment_3 = HIGHbreak

#endif

#if Seg_Number>2

case 2:Segment_2 = HIGHbreak

#endif

#if Seg_Number>1

case 1:Segment_1 = HIGHbreak

#endif

#if Seg_Number>0

case 0:Segment_0 = HIGHbreak

#endif

}

while(i++<30)i=0 //一点点延时,保障数码管不闪烁也不缺段

}

Arduino板子一块,光敏电阻一个,匹配滑谨橘电阻一个(需查询光敏电阻的datasheet才能确定。)

开信团关一个,匹配电阻一个。

LED一个。

如果打算控制普通台灯,那么继电器模块一个。

方法就是:

光敏电阻和匹配电阻连接上上拉或者下拉电路。接入aruduino的ADC口。

开关和匹配电阻连接上拉或者下拉电路,接入Arduino的 digital口。

然后用digital口连接并控制LED(演示用)或者连接继电器(实用)。

如果你打算扮演一把高玩,比如调光啥的,那么就需要用MOS管或者可控硅。。。算我没说,按照你提问题的水平还是别晌蚂倒腾了,容易发生安全事故,危及生命。。。。

大致的程序逻辑就是:

读取开关状态,光敏电阻的状态,然后根据状态来控制LED或者继电器。

问题是,我说的这些你弄明白了没?好吧,估计你看不懂哈。还是提建议你老老实实弄本靠谱的入门书,踏踏实实地完成入门学习吧。

*--------------------------------交通灯控制程序------------------------------------------*

*--------------------------------MCS-51汇编语拍链言----------------------------------------*

*--------------------------------用AT89S51单片机,12MHz晶振-------------------*

*--------------------------------程序名:交通灯.ASM-----------------------------------*

*--------------------------------交通灯控制系统程序------------------------------------*

ORG 0000H 主程序的入口地址

AJMP START 跳转到主程序的开始处

ORG 0003H 外部中断0的中断程序入口地址

AJMP INT 跳转到中断服务程序处

ORG 000BH

AJMP DISP

ORG 001BH

AJMP TIME

ORG 0030H

*--------------------------------初始化--------------------------------------------------*

START:MOV SP,#60H

MOV P1,#0

MOV R3,#0

MOV TMOD,#11H 定时器T0,T1定时方式且都工作于模式1

MOV TH0,#0D8H10ms定时

MOV TL0,#0F0H

MOV TH1,#03CH50ms定时

MOV TL1,#0B0H初值15536

SETB EA 总中断开

SETB IT0 脉冲触发方式IT=1

SETB EX0 开外部中断0

SETB ET0 开定时中断0

SETB ET1 开定时中断1

SETB TR0 开启定时器0

SETB TR1 开启定时器1

*--------------------------------主程序--------------------------------------------------*

MAIN:SETB P1.0开东西绿灯

SETB P1.5开南北红灯

MOV R2,#40东西绿灯亮40s

LOOP:MOV 30H,R2

MOV A,R2

MOV 32H,A

MOV 33H,A

JNB 00H,NEXT00H标志位为1说明有救护车到达,需要执行相应的设置

ACALL HELP调用10s救护车处理程序

NEXT:CJNE R2,#0,LOOP

MOV 30H,#0

MOV 32H,#5关东西绿灯

MOV 33H,#5

SETB P1.1东西黄灯闪5s

SETB P1.4 南北黄灯闪5s

MOV R2,#5

LOOP1:MOV 30H,R2

MOV 32H,R2

JNB 00H,NEXT1

ACALL HELP

NEXT1:ACALL DELAY1 延时0.08s

SETB P1.1东西黄灯闪5s

SETB P1.4 南北黄灯闪5s

ACALL DELAY1延时0.08s

CLR P1.1 关东西隐贺隐黄灯

CLR P1.4 关南灶厅北黄灯

CJNE R2,#0,LOOP1 时间未到零,继续循环

MOV 30H,#0

MOV 32H,#0

CLR P1.0 关东西绿灯

CLR P1.1 关东西绿灯

CLR P1.4 关南北黄灯

CLR P1.5 关南北红灯

SETB P1.2开东西红灯

SETB P1.3开南北绿灯

MOV R2,#60东西红灯亮60s

LOOP2:MOV 30H,R2

MOV A,R2

MOV 32H,A

JNB 00H,NEXT2

ACALL HELP

NEXT2:CJNE R2,#5,LOOP2

MOV 32H,#0

SETB P1.1 东西黄灯闪5s

SETB P1.4南北黄灯闪5s

LOOP3: MOV 30H,R2

MOV 32H,R2

JNB 00H,NEXT3

ACALL HELP

NEXT3:ACALL DELAY1

SETB P1.1

SETB P1.4

ACALL DELAY1

CLR P1.1

CLR P1.4

CJNE R2,#0,LOOP3

MOV 30H,#0

MOV 32H,#0

CLR P1.1 关东西黄灯

CLR P1.2 关东西红灯

CLR P1.3 关南北绿灯

CLR P1.4 关南北黄灯

AJMP MAIN

DELAY1:MOV 55H,#200

YS: MOV 56H,#200

DJNZ 56H,$

DJNZ 55H,YS

RET

*-------------------------------紧急响应子程序-----------------------------------------*

HELP:MOV 50H,R2保护R2

MOV 51H,P1保护R1

MOV P1,#0

SETB P1.2东西红灯亮

SETB P1.5南北红灯亮

MOV R2,#10东南西北红灯亮10s

D1:MOV 30H,R2

MOV 32H,R2

CJNE R2,#0,D1

MOV 30H,#0

MOV 32H,#0

CLR 00H

MOV R2,50H

MOV P1,51H

RETI

*-------------------------------外部中断服务程序-----------------------------------------*

INT:CLR EA

PUSH ACC

PUSH PSW

SETB 00H 清标志位00H

POP PSW

POP ACC

SETB EA

RETI

*-------------------------------显示中断处理程序-----------------------------------------*

DISP:CLR EA

CLR TR0

PUSH ACC

PUSH PSW

ACALL HEXBCD 把十六进制数变成十进制数

MOV A,30H

JNZ QING1 为零不显示

MOV 40H,#10

MOV 41H,#10

QING1:MOV A,32H

JNZ QING2 为零不显示

MOV 44H,#10H

MOV 45H,#10H

QING2:MOV R0,#40H R0指向显示缓冲区首地址

MOV R1,#0000001B 首位位选字送R1

LD0:MOV P2,R1 从P2口输出位选码

MOV DPTR,#TAB

MOV A,@R0 取要显示的数

MOVC A,@A+DPTR查表获得七段码

MOV P0,A 从P0口输出段选码

ACALL DELAY 调用延时程序

INC R0指向缓冲区下一单元

MOV A,R1 位选码送A

JB ACC.5,EXIT1判六位是否显示完,显示完毕返回

RL A 未显示完毕,将位选码变成下一个选字

MOV R1,A 修改后的为选码送R1

AJMP LD0 循环选手

EXIT1:MOV TH0,#0D8H 定时10s

MOV TL0,#0F0H

POP PSW

POP ACC

SETB TR0 开定时器0

SETB EA 开中断中开关

RETI 中断返回

*-------------------------------十六进制转十进制子程序-----------------------------------*

HEXBCD:MOV A,30H

MOV B,#10

DIV AB

MOV 40H,B

MOV 41H,A

MOV 42H,#10

MOV 43H,#10

MOV A,32H

MOV B,#10

DIV AB

MOV 44H,B

MOV 45H,A

RET

*---------------------------------1ms延时子程序------------------------------------------*

DELAY:MOV R5,#10

DEL:MOV R6,#50

DJNZ R6,$

DJNZ R5,DEL

RET

*---------------------------------定时中断处理程序---------------------------------------*

TIME:CLR EA

CLR TR1

PUSH ACC

PUSH PSW

INC R3

CJNE R3,#20,EXIT0 50ms*20=1s定时

MOV R3,#0

DEC R2

EXIT0:MOV TH1,#3CH 50ms定时

MOV TL1,#0B0H

POP PSW

POP ACC

SETB TR1

SETB EA

RETI

TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H

END


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12474545.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存