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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)