×
单片机 > 单片机程序设计 > 详情

51单片机项目 模拟智能传送装置

发布时间:2020-06-18 发布时间:
|

/**

 * 项目名:模拟智能传送装置

 * 文件名: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();

}



关键字:51单片机  模拟智能传送装置  采样频率 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单