/**
* 项目名:模拟智能传送装置
* 文件名:main.h
*/
#ifndef _MAIN_H
#define _MAIN_H
typedef enum WorkingState {
STOP, START, TRANSFER
} eWorkingState_t;
sbit RELAY = P0^4;
sbit BUZZER = P0^6;
void samplingPCF8591();
void tryToRecord(uint8_t digitalVal);
void flowingLight();
void turnOffFlowingLight();
void controlBuzzer();
void connectRelay();
void disconnectRelay();
#endif
/**
* 项目名:模拟智能传送装置
* 文件名:main.c
*/
#include
#include
#include "stdint.h"
#include "digitalTube.h"
#include "EEPROM.h"
#include "independentKey.h"
#include "PCF8591.h"
#include "timer.h"
#include "main.h"
eWorkingState_t workingState = STOP;
volatile bit flag50ms = 0, flag200ms = 0, flag300ms = 0;
volatile bit enBuzzer = 0;
bit flowingDir = 0;
bit overweight = 0;
uint8_t elecMagState = 0x00; //电磁器件的状态
void main() {
tmr0_init(1);
tmr1_init(2);
while (1) {
if (flag50ms) {
flag50ms = 0;
keyDriver(); //采样频率20Hz
}
if (flag200ms) {
flag200ms = 0;
if (workingState == TRANSFER) //在传送状态下
if (overweight == 0) //如果没有超重
flowingLight();
}
if (flag300ms) {
flag300ms = 0;
samplingPCF8591();
}
}
}
void samplingPCF8591() {
uint16_t weight; //!!!
uint8_t digitalVal;
digitalVal = PCF8591_getADCvalue(3); //channel 3
weight = (uint16_t)((uint32_t)digitalVal * 1000 / 255); //乘以1000会超过65535
if (weight > 750) { //如果超重
overweight = 1;
if (workingState != STOP)
disconnectRelay();
if (workingState == TRANSFER)
turnOffFlowingLight();
enBuzzer = 1; //蜂鸣器使能标志
tryToRecord(digitalVal);
} else { //否则说明不超重
if (overweight) //如果之前超重
if (workingState != STOP)
connectRelay();
overweight = 0;
enBuzzer = 0; //关闭报警标志
}
dspBuf[7] = (weight % 10); //更新显示
dspBuf[6] = (weight / 10 % 10);
dspBuf[5] = (weight / 100 % 10);
dspBuf[4] = (weight / 1000);
}
void tryToRecord(uint8_t digitalVal) {
static uint8_t EEPROMWritingIndex = 0;
static uint8_t preVal = 0;
if (digitalVal != preVal) {
EEPROMwrite(&digitalVal, EEPROMWritingIndex, sizeof (digitalVal));
EEPROMWritingIndex++; //到0xFF自动归0
preVal = digitalVal;
}
}
void keyAction(uint8_t keyCode) {
switch (keyCode) {
case 4:
if (workingState == STOP) {
workingState = START;
connectRelay();
}
break;
case 5:
if (workingState == START)
workingState = TRANSFER;
flowingDir = 0;
break;
case 6:
if (workingState == START)
workingState = TRANSFER;
flowingDir = 1;
break;
case 7:
if (workingState != STOP) {
disconnectRelay();
if (workingState == TRANSFER)
turnOffFlowingLight();
workingState = STOP;
}
break;
}
}
void flowingLight() {
static uint8_t ledState = 0x01;
if (flowingDir == 0) {
ledState = _crol_(ledState, 1);
} else {
ledState = _cror_(ledState, 1);
}
P2 = (P2 & 0x1F) | 0x80;
P0 = ~ledState; //实际是低电平有效
P2 &= 0x1F;
}
void turnOffFlowingLight() {
P2 = (P2 & 0x1F) | 0x80;
P0 = 0xFF;
P2 &= 0x1F;
}
void controlBuzzer() {
static bit buzzerState = 0;
if (enBuzzer) {
elecMagState ^= 0x40;
P2 = (P2 & 0x1F) | 0xA0;
P0 = elecMagState; //74HC573不能读取右边的状态,最好整体赋值
P2 &= 0x1F;
buzzerState = 1;
} else {
if (buzzerState == 1) { //如果蜂鸣器之前是鸣响的
elecMagState &= ~0x40; //关闭蜂鸣器
P2 = (P2 & 0x1F) | 0xA0;
P0 = elecMagState;
P2 &= 0x1F;
buzzerState = 0;
}
}
}
void connectRelay() {
elecMagState |= 0x10;
P2 = (P2 & 0x1F) | 0xA0;
P0 = elecMagState;
P2 &= 0x1F;
}
void disconnectRelay() {
elecMagState &= ~0x10;
P2 = (P2 & 0x1F) | 0xA0;
P0 = elecMagState;
P2 &= 0x1F;
}
/* 定时器0中断服务程序,周期1ms */
void tmr0_ISR() interrupt 1 {
static uint16_t cnt1ms = 0;
TL0 = tmr0LowByte;
TH0 = tmr0HighByte;
controlBuzzer(); //保证蜂鸣器操纵的实时性
if (cnt1ms == 299) {
cnt1ms = 0;
flag300ms = 1;
} else {
cnt1ms++;
if (cnt1ms == 200)
flag200ms = 1;
}
if (cnt1ms % 50 == 0)
flag50ms = 1;
if (cnt1ms & 1)
digitalTubeScan(); //周期2ms
}
/* 定时器1中断服务程序,周期2ms */
void tmr1_ISR() interrupt 3 {
TL1 = tmr1LowByte;
TH1 = tmr1HighByte;
keyScan();
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』