📄 controler.c
字号:
#include <reg51.h>
#define LEDLen 3
sbit OUT0 = P1^0;
sbit OUT1 = P1^1;
sbit OUT2 = P1^2;
sbit OUT3 = P1^3;
sbit OUT4 = P1^4;
sbit OUT5 = P1^5;
sbit OUT6 = P1^6;
sbit OUT7 = P1^7;
int bdata Second;
sbit TURN0 = Second^8;
sbit TURN1 = Second^9;
sbit TURN2 = Second^10;
int bdata flag;
sbit I_test = flag^0; //电流测试标志
unsigned char Sec,Time;
unsigned int w;
unsigned char LEDBuf[LEDLen]; //显示缓冲区
unsigned char Buf0[LEDLen];
unsigned char Buf1[LEDLen];
code unsigned char LEDMAP[] = {
0x80, 0xb9, 0x24, 0x30, 0x19, 0x12, 0x02, 0xb8, 0x00, 0x10
};
void delay1() {
unsigned int j;
for (j=0;j<30000; j++){}
}
void Delay(unsigned char CNT) { //延时函数
unsigned int i;
while (CNT-- !=0)
for (i=100; i !=0; i--);
}
void DisplayLED() { //显示函数
unsigned char i;
for (i = 0; i < LEDLen; i++) {
P3 = LEDBuf[i];
if (i == 0) {
OUT4 = 1;
OUT3 = 1;
OUT2 = 0;
}
else if (i == 1) {
OUT4 = 1;
OUT3 = 0;
OUT2 = 1;
}
else {
OUT4 = 0;
OUT3 = 1;
OUT2 = 1;
}
Delay(1);
}
}
//中断函数
#define Tick 4000 //4000x250us=1s
#define T250us (256-230) //250us 时间常数(fosc11.0592
unsigned char Hour, Minute;
unsigned int C250us; //250us 计数单元
void T0Int() interrupt 1 { //T0 中断服务函数
C250us--;
if (C250us == 0) {
C250us = Tick/8; //250us 计数器为0,重置计数器
Second++; //秒进位
if (Time == 8){ //点位处理
OUT5 = TURN2;
}
else {
OUT5 = TURN0;
}
if (Second == 480) {
Second = 0; //秒清零
Minute++;
if (Minute == 60) {
Minute = 0;
Hour++;
if (Hour == Time){
OUT5 = 1;
TURN0 = 1;
TR0 = 0;
}
}
}
}
}
void main() { //主函数
Time = 8; //
TMOD = 0X02; //设置T0工作方式与处置
TH0 = T250us;
TL0 = T250us;
IE = 0x82; //开中断
Hour = 0;
Minute = 0;
Second = 0;
C250us = Tick;
TR0 = 1; //启动定时器 0
I_test = 0; //启动程序
P3 = 0x00;
if (P3 == 0x00 ){ //启动检测电流
OUT6 = 0;
delay1();
OUT6 = 1;
delay1();
if (P3 == 0x00){ //确认电流
OUT6 = 0;
delay1();
OUT6 = 1;
delay1();
while (1) { //循环函数
LEDBuf[0] = LEDMAP[Hour%10];
LEDBuf[1] = LEDMAP[Minute/10];
LEDBuf[2] = LEDMAP[Minute%10];
DisplayLED();
if (Hour == Time){
OUT7 = 0;
TURN0 = 1;
OUT5 = 1;
}
if (Time == 8){ //转浮冲的翻转函数
P3 = 0x00;
if (P3 != 0x00){ //检测电流是否反转
Buf0[0]=LEDBuf[0];
Buf0[1]=LEDBuf[1];
Buf0[2]=LEDBuf[2];
Second=0x00;
Minute=0x00;
Hour=0x00;
Time = 2;
}
}
else //如果已经进入浮充
if (TURN0 == 1) //翻看函数
if (OUT5 == 0){
w=600; //翻看时间
while (w){
w--;
LEDBuf[0]=Buf0[0];
LEDBuf[1]=Buf0[1];
LEDBuf[2]=Buf0[2];
DisplayLED();
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -