Tải bản đầy đủ (.docx) (10 trang)

chương trình điều khiển đèn giao thông

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (34.38 KB, 10 trang )

Đèn Giao Thông
/*
* File: newmain.c
* Author:
*
* Created on April 13, 2015,
*/
//den giao thong tai nga tu:
//dung pic16f877a thach anh 4MH
//led 7 doan anot
//thoi gian den do 15s, den xanh 12s, den vang 3s
#include <htc.h>
__CONFIG(WDTDIS&PWRTEN&UNPROTECT&BORDIS&LVPDIS);
#define _XTAL_FREQ 4000000

int chuc_dec,donvi_dec,chuc_hex,donvi_hex,dem,count=16000;
int chuc_dec1,donvi_dec1,chuc_hex1,donvi_hex1,dem1,count1=16000;

#define MAX_TASKS 7
#define DO1

RC0

#define XANH1

RC1

#define VANG1

RC2


#define DO2

RC3

#define XANH2

RC4

#define VANG2

RC5

typedef struct _sTask
{
void (*pTask)(void);


unsigned int Delay;
unsigned int Period;
char RunMe;
}sTask;

sTask SCH_Tasks[MAX_TASKS];

char SCH_Delete_Task(const unsigned char Index);
void SCH_Init(void);
void interrupt SCH_Update(void);
char SCH_Add_Task(void (*pFn)(void),
unsigned int delay,
unsigned int period);

void SCH_Dispatch_Tasks(void);
void SCH_Start(void);
//.................................................
void init_port();
void tach_so(int dem,int dem1);
void dec_to_hex();
void quetled_7doan();
//..................................................

void Task_T1(void);
void Task_T2(void);
void Task_T3(void);
void Task_T4(void);
void Task_T5(void);


void main(void)
{
init_port();

TRISC = 0;
SCH_Init();
SCH_Add_Task(Task_T1,0,30000);
SCH_Add_Task(Task_T2,12000,30000);
SCH_Add_Task(Task_T3,15000,30000);
SCH_Add_Task(Task_T4,27000,30000);
SCH_Add_Task(Task_T5,0,10);

SCH_Start();
while(1)

{
SCH_Dispatch_Tasks();
}
}

char SCH_Delete_Task(const unsigned char Index)
{
if(SCH_Tasks[Index].pTask==0) return -1;
SCH_Tasks[Index].pTask = 0;
SCH_Tasks[Index].Delay = 0;
SCH_Tasks[Index].Period = 0;
SCH_Tasks[Index].RunMe = 0;
return 0;
}


void SCH_Init(void)
{
unsigned char Index;
for(Index=0;Index{
SCH_Delete_Task(Index);
}
OPTION = 0x02; //Prescaler 1:8
TMR0 = 256-125;
T0IF = 0;
}

void interrupt SCH_Update(void)
{

unsigned char Index;
TMR0 = 256-125;
T0IF = 0;
for(Index=0;Index{
if(SCH_Tasks[Index].pTask!=0)
{
if(SCH_Tasks[Index].Delay==0)
{
SCH_Tasks[Index].RunMe = 1;
if(SCH_Tasks[Index].Period>0)
{
SCH_Tasks[Index].Delay = SCH_Tasks[Index].Period;
}
}


else
{
SCH_Tasks[Index].Delay--;
}
}
}
count--;
count1--;
}

char SCH_Add_Task(void (*pFn)(void),
unsigned int delay,
unsigned int period)

{
int Index = 0;
while((SCH_Tasks[Index].pTask!=0)&&(Index{
Index++;
}
if(Index==MAX_TASKS)
{
return -1;
}
SCH_Tasks[Index].pTask = pFn;
SCH_Tasks[Index].Delay = delay;
SCH_Tasks[Index].Period = period;
SCH_Tasks[Index].RunMe = 0;
return Index;
}


void SCH_Dispatch_Tasks(void)
{
unsigned char Index;
for(Index=0;Index{
if(SCH_Tasks[Index].pTask!=0 && SCH_Tasks[Index].RunMe>0)
{
SCH_Tasks[Index].pTask();
SCH_Tasks[Index].RunMe = 0;
}
if(SCH_Tasks[Index].Period == 0)
{

SCH_Delete_Task(Index);
}
}
}

void SCH_Start(void)
{
T0IE = 1;
GIE = 1;
}

void Task_T1(void)
{
count=16000;
count1=13000;
int i;


DO2=0;
XANH2=1;
VANG1=0;
DO1 = 1;
}

void Task_T2(void)
{
count1=4000;
int i;
XANH2=0;
VANG2=1;

DO1 = 1;
}

void Task_T3(void)
{ count1=16000;
count=13000;
int i;
DO1=0;
XANH1=1;
VANG2=0;
DO2=1;

}

void Task_T4(void)
{
count=4000;


int i;
VANG1=1;
XANH1=0;
DO2 = 1;
}

void Task_T5(void)
{
dem=count/1000;;
dem1=count1/1000;
tach_so(dem,dem1);

dec_to_hex();
quetled_7doan();
}

void init_port()
{
TRISB=0X00;
PORTB=0X00;
TRISD=0X00;
PORTD=0X00;
}
void tach_so(int dem,int dem1)
{
chuc_dec=dem/10;
donvi_dec=dem%10;
chuc_dec1=dem1/10;
donvi_dec1=dem1%10;
}


void dec_to_hex()
{
int i;
const unsigned char a[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
i=chuc_dec;
chuc_hex=a[i];
i=donvi_dec;
donvi_hex=a[i];

i=chuc_dec1;

chuc_hex1=a[i];
i=donvi_dec1;
donvi_hex1=a[i];
}

void quetled_7doan()
{
unsigned char a[4];
int mabandau,i;
a[3]=chuc_hex;
a[2]=donvi_hex;

a[1]=chuc_hex1;
a[0]=donvi_hex1;
mabandau = 0b00000001;
for (i=0;i<=3;i++)
{
PORTB = mabandau;
PORTD = a[i];


__delay_ms(1);
PORTB = 0X00; //SAU KHI DELAY DE MAT NHIN THAY ROI XOA DE TAT,
//NEU KO XOA THI TIEP TUC CHUONG TRINH SE QUET QUA 7SEG KHAC NHUNG
// CHUA DUA MANG VAO NEN LED 7SG THU 2 SE CO KI TU GIONG LED 7SEG THU1.
mabandau = mabandau<<1;
}
}




×