Chia sẻ đèn giao thông ngã tư PIC16F877A CCS

Chia sẻ đèn giao thông ngã tư PIC16F877A CCS

Tác giả: HUỲNH NGỌC LÂM
Nguồn: https://xcvn.blogspot.com


Chào các bạn trong bài đăng trước mình đã hướng dẫn các bạn về đèn giao thông ngã tư nhưng là chạy 1 cách tư động nên trong bài này hướng dẫn các bạn điều khiển bằng nút nhấn nha !

Ảnh mô phỏng protues.

đèn giao thông ngã tư pic16f877a

Đây là code chương trình.

// Được viết bằng ngôn ngữ : CCS
// Phần mềm mô phỏng Protues 8

#include <16f877a.h>

#use delay (clock=4000000)

#use fast_io(d)

#use fast_io(b)

#use fast_io(c)

#use fast_io(a)

#byte portd=0x08

#bit ra0=0x05.0 // Binh thuong

#bit ra1=0x05.1 // Gio cao diem

#bit ra2=0x05.2 // Ban dem

#bit ra3=0x05.3 // Nut chuyen che do

#bit rb0=0x06.0 // led1

#bit rb1=0x06.1 // led2

#bit rb2=0x06.2 // led3

#bit rb3=0x06.3 // led4

#bit rc0=0x07.0 // x1

#bit rc1=0x07.1 // v1

#bit rc2=0x07.2 // d1

#bit rc3=0x07.3 // x2

#bit rc4=0x07.4 // v2

#bit rc5=0x07.5 // d2

#define bat 1

#define tat 0

//--------------------------------

int m[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

int num1,donvi1,chuc1;

int num2,donvi2,chuc2;

//---------------------delay-------------

void delay(int ms)

 {

  int a,b;

  for(a=0;a<ms;a++)

   for(b=0;b<50;b++)

    {

    }

 }

//-------------hien thi---------------------

void ht1(void)

 {

  int c;

  for(c=0;c<50;c++)

   {

   chuc1=num1/10;

   donvi1=num1%10;

   output_d(m[chuc1]);

   rb2=bat;

   delay(10);

   rb2=tat;

   output_d(m[donvi1]);

   rb3=bat;

   delay(10);

   rb3=tat;

   chuc2=num2/10;

   donvi2=num2%10;

   output_d(m[chuc2]);

   rb0=bat;

   delay(10);

   rb0=tat;

   output_d(m[donvi2]);

   rb1=bat;

   delay(10);

   rb1=tat;

   }

 }


void main(void)

 {

 set_tris_d(0x00);

 set_tris_b(0xff);

 set_tris_c(0x00);

 set_tris_a(0xff);

 output_d(0xFF);

 rc0=tat;

 rc5=tat;

 rc1=tat;

 rc2=tat;

 rc3=tat;

 rc4=tat;

  while(true)

   {

///--------------che do binh thuong -----------------   

   if(!ra0)

   {

   delay_ms(100);

   while(!ra0)

   {

   binhthuong:

    num1=35;

    num2=30;

    do

    { 

     set_tris_b(0x00);

     rc0=bat;

     rc5=bat;

     rc1=tat;

     rc2=tat;

     rc3=tat;

     rc4=tat;

     ht1();

     num1--;

     num2--;

    }

                  while(num2!=0);

                  num2=num1=5;

                  do

                   {

                   set_tris_b(0x00);

                   rc1=bat;

                   rc5=bat;

                   rc0=tat;

                   rc2=tat;

                   rc3=tat;

                   rc4=tat;

                   ht1();

                   num1--;

                   num2--;

                   }

     while(num2!=0);

     num1=30;

     num2=35;

     do

     {

     set_tris_b(0x00);

     rc2=bat; 

     rc3=bat;

     rc0=tat;

     rc1=tat;

     rc4=tat;

     rc5=tat;

     ht1();

     num1--;

     num2--;

     }

                   while(num1!=0);

                   num1=num2=5;

                    do

                     {

                   set_tris_b(0x00);

                   rc2=bat;

                   rc4=bat;

                   rc0=tat;

                   rc1=tat;

                   rc3=tat;

                   rc5=tat;

                   ht1();

                   num1--;

                   num2--;

                      }

                  while(num1!=0);

                  goto binhthuong;

    }

    }

//---------------gio cao diem--------------------------    

   if(!ra1)

   {

   delay_ms(100);

   while(!ra1)

   {

    caodiem:

    num1=60;

    num2=55;

    do

    { 

     set_tris_b(0x00);

     rc0=bat;

     rc5=bat;

     rc1=tat;

     rc2=tat;

     rc3=tat;

     rc4=tat;

     ht1();

     num1--;

     num2--;

    }

                  while(num2!=0);

                  num2=num1=5;

                  do

                   {

                   set_tris_b(0x00);

                   rc1=bat;

                   rc5=bat;

                   rc0=tat;

                   rc2=tat;

                   rc3=tat;

                   rc4=tat;

                   ht1();

                   num1--;

                   num2--;

                   }

     while(num2!=0);

     num1=55;

     num2=60;

     do

     {

     set_tris_b(0x00);

     rc2=bat; 

     rc3=bat;

     rc0=tat;

     rc1=tat;

     rc4=tat;

     rc5=tat;

     ht1();

     num1--;

     num2--;

     }

                   while(num1!=0);

                   num1=num2=5;

                    do

                     {

                   set_tris_b(0x00);

                   rc2=bat;

                   rc4=bat;

                   rc0=tat;

                   rc1=tat;

                   rc3=tat;

                   rc5=tat;

                   ht1();

                   num1--;

                   num2--;

                      }

                  while(num1!=0);

                  goto caodiem;

    }

    }

    

//-------------------ban dem---------------

   if(!ra2)

   {

   delay_ms(100);

   while(!ra2)

   {

                   dem:

                   rc4=bat;

                   rc1=bat;

                   delay_ms(1000);

                   rc4=tat;

                   rc1=tat;

                   goto dem;

   }

   }

//---------------------- ket thuc chuong trinh ----------------------

   }

 }  

 

Download chương trình và mô phỏng : (File đính kèm) 

Bình Luận
Cùng danh mục: Cơ bản Vi điều khiển

Ứng dụng vi điều khiển AT89S52 đếm và đặt trước vòng quay từ 0-99 cho máy quấn băng keo máy biến áp xung

21/02/2018 21:32:46 / Lượt xem: 775 / Người đăng: Nguyễn Thế Trọng Nhân

Đây là bài mô phỏng vi điều khiển AT89S52 đếm và cài đặt vòng quay cho mô tơ hiển thị trên 2 led 7 vach từ 00-99. Áp dụng cho máy quấn keo biến áp xung

BÀI 4 : Mô phỏng PIC16F877A (XC8) giao tiếp với nút nhấn

25/05/2016 20:50:22 / Lượt xem: 3373 / Người đăng: lam3ngon

Nói về nút nhấn (button) thì có lẽ chúng ta đã quá quen với nó rồi thậm chí chúng ta chúng ta còn tiếp xúc với nó hằng ngày nữa, ví dụ như : bàn phím máy tính, các thiết bị điều khiển tivi, máy điều hòa…..

Mô phỏng hiệu ứng 8 LED đơn với PIC16F877A XC8 (P2)

18/05/2016 15:37:21 / Lượt xem: 2919 / Người đăng: lam3ngon

Chào các bạn trong bài đăng này mình sẽ hướng dẫn các bạn tăng mức độ khó của PORJECT lên khó hơn 1 tý so với bài đăng trước nếu như bài đăng trước chúng ta chỉ dùng lại ở việc chớp tắt LED và sáng xen kẻ thì trong bài đăng này mình sẽ giới thiệu với các bạn về Đuổi LED (Chaser LED), sáng dồn, dịch trái, dịch phải, sáng dần, tắt dần…

Giao tiếp SPI và mô phỏng trên AVR

18/05/2016 13:20:22 / Lượt xem: 3216 / Người đăng: biendt

Bài này giúp các bạn biết cách sử dụng cách truyền thông nối tiếp đồng bộ SPI. Công cụ chính cũng là 2 bộ phần mềm AVRStudio (+gcc-avr) và Proteus. Thực chất ngôn ngữ lập trình vẫn là gcc-avr nhưng tôi không dùng Programmer Notepad để biết code như thông thường, thay vào đó tôi dùng AVRStudio làm trình biên tập,

Bài 2 : Mô phỏng hiệu ứng 8 LED đơn với PIC16F877A XC8 (P1)

13/05/2016 14:48:16 / Lượt xem: 2300 / Người đăng: lam3ngon

Trong bài đăng này mình sẽ hướng dẫn các bạn chớp tắt nhiều LED cùng lúc cũng như 1 số hiệu ứng đơn giản như : Xen kẻ, nữa sáng nữa tắt,sáng hết tắt hết …. Để tạo được nhứng hiệu ứng đơn giản như vậy thì mình sẽ giới thiệu với các bạn bảng mã HEX để giúp chúng ta dễ dàng tạo ra nhưng hiệu ứng đơn giản trên.

Quảng cáo - Tài trợ

 -----------------------------

Hỗ trợ trực tuyến