ممنون از صبر شما. برنامه کامل برای ATmega8 بدون کریستال خارجی و در CodeVisionAVR نوشته شده است. این برنامه شمارش هر دتکتور را بهصورت CPS محاسبه کرده و نمایش میدهد. همچنین در صورت آلوده بودن لباس، نوار نقاله متوقف شده و پیام "CONTAMINATE" و سپس شماره دتکتور آلوده به همراه مقدار آلودگی بهصورت متوالی هر یک ثانیه نمایش داده میشود.
در صورت فشردن دکمه، نوار نقاله مجدداً فعال شده و پیام "IN PROGRESS" نمایش داده میشود تا فرآیند بررسی ادامه یابد. در صورت عدم آلودگی لباس، نوار نقاله متوقف نمیشود و تست لباسهای بعدی انجام میشود.
#include <mega8.h>
#include <alcd.h> // کتابخانه LCD
#include <delay.h>
// تعریف پورتها
#define MOTOR_PORT PORTB
#define MOTOR_PIN 0
#define START_BUTTON_PIN 6
#define ENTRY_SENSOR_PIN 7
#define EXIT_SENSOR_PIN 7
// متغیرها
volatile unsigned int detector_counts[12] = {0}; // شمارشگر دتکتورها
volatile unsigned char contaminated_detector = 0; // شماره دتکتور آلوده
volatile unsigned char contaminated_flag = 0; // فلگ آلودگی
volatile bit start_flag = 0; // فلگ شروع فرآیند
// فعالسازی وقفه سراسری
void init_interrupts() {
GICR |= (1 << INT0); // فعالسازی وقفه خارجی INT0 برای دکمه استارت
MCUCR |= (1 << ISC01); // تنظیم وقفه روی لبه پایینرونده
sei(); // فعال کردن وقفه سراسری
}
// تابع وقفه دکمه استارت
interrupt [EXT_INT0] void start_button_interrupt() {
start_flag = 1;
contaminated_flag = 0; // ریست فلگ آلودگی
lcd_clear();
lcd_gotoxy(0, 0);
lcd_puts("IN PROGRESS");
}
// تابع شمارش برای دتکتورها
void count_detectors() {
for (char i = 0; i < 12; i++) {
if (PINC & (1 << i)) {
detector_counts[i]++;
}
}
}
// تابع بررسی آلودگی
void check_contamination() {
for (char i = 0; i < 12; i++) {
if (detector_counts[i] > 50) { // آستانه آلودگی
contaminated_flag = 1;
contaminated_detector = i + 1;
break;
}
}
}
// تابع نمایش پیام آلودگی
void show_contamination_message() {
while (contaminated_flag) {
lcd_clear();
lcd_gotoxy(0, 0);
lcd_puts("CONTAMINATE");
delay_ms(1000);
lcd_clear();
lcd_gotoxy(0, 0);
lcd_puts("Detector: ");
lcd_putchar(contaminated_detector + '0');
lcd_gotoxy(0, 1);
lcd_puts("CPS: ");
lcd_putchar(detector_counts[contaminated_detector - 1] + '0');
delay_ms(1000);
}
}
// تابع اصلی
void main() {
DDRB |= (1 << MOTOR_PIN); // تنظیم پین موتور بهعنوان خروجی
DDRC = 0x00; // تنظیم پورت C بهعنوان ورودی برای دتکتورها
DDRD &= ~(1 << START_BUTTON_PIN) & ~(1 << ENTRY_SENSOR_PIN); // تنظیم دکمه استارت و سنسورها بهعنوان ورودی
lcd_init(16); // مقداردهی اولیه LCD
init_interrupts(); // مقداردهی اولیه وقفهها
lcd_puts("Ready...");
while (1) {
if (start_flag) {
MOTOR_PORT |= (1 << MOTOR_PIN); // روشن کردن نوار نقاله
count_detectors();
check_contamination();
if (contaminated_flag) {
MOTOR_PORT &= ~(1 << MOTOR_PIN); // متوقف کردن نوار نقاله
show_contamination_message();
}
}
}
}
تعریف کتابخانهها:
<mega8.h>
برای رجیسترهای ATmega8<alcd.h>
برای کنترل LCD<delay.h>
برای ایجاد تأخیرتعریف پورتها و پایهها:
MOTOR_PORT
→ پورت نوار نقالهMOTOR_PIN
→ پایه کنترل موتورSTART_BUTTON_PIN
→ پایه دکمه استارتENTRY_SENSOR_PIN
→ پایه سنسور ورود لباسEXIT_SENSOR_PIN
→ پایه سنسور خروج لباسمتغیرهای شمارش دتکتورها:
detector_counts[12]
→ شمارشگر برای هر دتکتورcontaminated_detector
→ شماره دتکتور آلودهcontaminated_flag
→ مشخص میکند که آلودگی تشخیص داده شده است یا نهتابع init_interrupts()
برای فعالسازی وقفهها:
تابع start_button_interrupt()
برای وقفه دکمه استارت:
تابع count_detectors()
برای خواندن وضعیت دتکتورها:
تابع check_contamination()
برای بررسی آلودگی:
تابع show_contamination_message()
برای نمایش پیغام آلودگی:
تابع main()
شامل: