• 0-99 Counter using AVR Microcontroller - Đếm 0 - 99 Atmega32

QC

0-99 Counter using AVR Microcontroller - Đếm 0 - 99 Atmega32

 



Trong hướng dẫn này, chúng tôi sẽ thiết kế một bộ đếm 0-99 bằng cách kết nối hai màn hình bảy đoạn với Vi điều khiển ATMEGA32A. Ở đây chúng tôi đếm các sự kiện dựa trên số lần nút được nhấn.


Trước khi tiếp tục, chúng ta hãy hiểu màn hình bảy phân đoạn là gì. Màn hình bảy phân đoạn có tên vì nó có bảy phân đoạn chiếu sáng. Mỗi đoạn này có một đèn LED (Light Emitting Diode). Bạn có thể xem sơ đồ chân của màn hình bảy đoạn trong hình ảnh bên dưới.



Các đèn LED được chế tạo theo cách mà ánh sáng của mỗi đèn LED được chứa trong phân đoạn riêng của nó. Điều quan trọng cần lưu ý ở đây, các đèn LED trong màn hình bảy đoạn bất kỳ được sắp xếp ở chế độ cực dương chung (cực dương chung) hoặc chế độ cực âm chung (cực âm chung).



Kết nối mạch của đèn LED ở cực âm chung và cực dương chung được thể hiện trong hình trên. Ở đây người ta có thể quan sát thấy rằng, trong Cathode chung, các cực âm của mọi đèn LED được kết nối với nhau và được đưa ra dưới dạng GND. Trong Anode chung, cực dương của mọi LED được kết nối với nhau và đưa ra dưới dạng VCC. Các màn hình Cathode chung và Anode chung này rất tiện dụng trong khi ghép nhiều ô với nhau.


Bây giờ chúng ta hãy hiểu ghép kênh. Đó là một kỹ thuật đơn giản được sử dụng để kết nối song song nhiều đơn vị hơn để giảm bớt số chân cắm cần thiết, bằng cách tận dụng hiệu ứng hình ảnh. Hãy xem xét một đèn LED đang BẬT và TẮT liên tục với tốc độ 2HZ mỗi giây, tức là nó BẬT hai lần và TẮT hai lần một giây. Bây giờ với tốc độ này, mắt người có thể nhìn thấy cả chu kỳ BẬT và chu kỳ TẮT. Nhưng nếu tần số được tăng lên 50HZ, tức là 50 lần BẬT và 50 lần TẮT đối với đèn LED trong một giây. Ở tốc độ này, mắt người không thể nhìn thấy các chu kỳ TẮT. Đây là một hiệu ứng của tầm nhìn. Với tốc độ này, mắt hình ảnh đèn LED với độ sáng kém hơn và đó là tất cả.


Components Required

Hardware: ATMEGA32, Power supply (5v), AVR-ISP PROGRAMMER, HDSP5503, Seven segment displays (two pieces) (any common cathode will do ), 47uF capacitor (connected across power supply), button(three pieces), 10KΩ resistor (two pieces), 1KΩ resistor, 220Ω resistor (two pieces), 100nF capacitor (three pieces), 2N2222 transistors (two pieces).

Software: Atmel studio 6.1, progisp or flash magic.

Circuit Diagram and Working Explanation

Các kết nối được thực hiện cho màn hình 7 đoạn như sau:

PIN1 hoặc e thành mã PIN (A, 4)

PIN2 hoặc d thành mã PIN (A, 3)

PIN4 hoặc c thành mã PIN (A, 2)

PIN5 hoặc h hoặc DP thành PIN (A, 7) /// Không cần thiết vì chúng tôi không sử dụng dấu thập phân

PIN6 hoặc b thành mã PIN (A, 1)

PIN7 hoặc a thành mã PIN (A, 0)

PIN9 hoặc f thành mã PIN (A, 5)

PIN10 hoặc g thành mã PIN (A, 6)

PIN3 hoặc PIN8 hoặc CC cho bộ thu bán dẫn

Điều quan trọng ở đây là mặc dù cả hai phân đoạn đều chia sẻ cùng một cổng dữ liệu tới ATMEGA, các Cathode chung của cả hai màn hình được kết nối với hai bộ thu bán dẫn khác nhau. Bây giờ về ghép kênh, như đã giải thích trong phần giới thiệu, chúng tôi sẽ BẬT và TẮT màn hình thay vì LED.

Ở đây chúng ta có hai bóng bán dẫn, mỗi bóng bán dẫn dẫn dòng từ mỗi màn hình. Những gì chúng ta đang làm là, chúng ta sẽ kích hoạt một bóng bán dẫn trong 10ms và một màn hình khác trong 10ms khác, vì vậy màn hình hiển thị sẽ BẬT trong 10ms và sau đó nó TẮT, trong thời gian này màn hình khác sẽ BẬT. Sau đó, một lần nữa hiển thị một và như vậy. Khoảng thời gian BẬT và TẮT này rất nhỏ đối với mắt thường để chúng ta có thể nhìn thấy cả hai màn hình BẬT liên tục, điều này không đúng trong thực tế.

Có hai nút hiện diện ở đây, một nút để tăng số lượng hiển thị và một nút khác để giảm số lượng hiển thị. Các tụ điện hiện diện ở đây là để vô hiệu hóa hiệu ứng nảy của các nút. Nếu chúng bị loại bỏ, bộ điều khiển có thể đếm nhiều hơn một mỗi lần nhấn nút.

Các điện trở nối với chân là để hạn chế dòng điện, khi nhấn nút để kéo chân cắm xuống đất. Bất cứ khi nào một nút được nhấn, chân tương ứng của bộ điều khiển sẽ được kéo xuống đất và do đó bộ điều khiển nhận ra rằng nút nhất định được nhấn và hành động tương ứng sẽ được thực hiện - nó có thể tăng hoặc giảm số lượng tùy thuộc vào nút được nhấn.

Số lượng được hiển thị trong hai phân đoạn bằng cách ghép kênh như đã giải thích trước đây. Hoạt động của bộ đếm 0-99 này được giải thích theo từng bước của mã C đưa ra bên dưới. Bạn cũng có thể đọc hướng dẫn này nếu bạn đang làm việc với vi điều khiển 8051: Giao diện hiển thị 7 phân đoạn với 8051.


#include <avr/io.h> //header to enable data flow control over pins

#define F_CPU 1000000   //telling controller crystal frequency attached

#include <util/delay.h> //header to enable delay function in program

int main(void)

{

DDRB = 0x00; // Taking portB as input port

DDRA = 0xFF; //taking porta as output port

DDRD = 0b11111111; //taking portd as output

int DISPLAY1 [10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};

//character display values from 0-9

int c = 0;

int i=0;

int d = 0;

int one = 0; //memory for storing ones place value

int ten =0; //memory for storing tens place value

while(1)

{

if (bit_is_clear(PINB,0)) //when button one  is pressed

{

if (i<21)

{

i++; //increment integer ‘i’ by one if its less than 21

}

}                         

if (bit_is_clear(PINB,1)) // when button 2  is pressed

{

if (d<21)

{

d++; // increment integer ‘d’ by one if its less than 21

}

}

if (i>20) //if ‘i’ was executed more than 21 times

{

if (c<99) //if counter value less than 99

{

c++; //increment counter value

}

i=0; //put i to zero

}

if (d>20) // if ‘d’ was executed more than 21 times

{

if (c>0) //if counter value is greater than 0

{

 c--; //decrease the value by one

}

d=0; //put d to zero

}

if (c<10) // if counter value is less than 10

{

one = c; // ones place is equal to counter value or c

ten = 0; // tens place is equal to zero as ‘c’ value is less than 10

}

 if (c>=10) //if count value is greater than or equal to 10

{

ten = c/10;//as intergers cannot hold decimal points(12/10=1.2),for integer its‘1’

one = c-(ten*10);//ones place

}

PORTD |=(1<<PIND6); //turn ones place displaying display transistor ON

PORTA = DISPLAY1[one]; //put value at porta which is needed for corresponding digit display

_delay_ms(10); //wait for vision illusion

PORTD &=~(1<<PIND6); // turn ones place displaying display transistor OFF

PORTD |=(1<<PIND5); // turn tens place displaying display transistor ON

PORTA = DISPLAY1[ten]; //put value at porta which is needed for corresponding digit display

_delay_ms(10);

PORTD &=~(1<<PIND5);// turn tens place displaying display transistor OFF

}

}























Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...