Chào các bác, em đang làm mạch đếm hiển thị ra LCD có sử dụng ngắt ngoài của 8051. Em dùng ngắt kích hoạt bằng sườn của xung. Nhưng khổ nỗi là nó không chính xác cho lắm. Em bấm 1 lần thả ra mà nó nhảy đi mấy số. Cho delay vào thì được, nhưng do đây là mạch đếm cần chính xác cao nên không thể để delay cao quá được, mà để delay bé quá hoặc ko để thì bị lỗi như trên. Sơ đồ mạch cũng ko có gì cả, chỉ là dùng 1 công tắc nối với cổng INT thôi. Test thử thì là vậy, sau ngoài đời cái ấy sẽ nối với hệ đếm sensor. Các bác giúp em với nhé. Em cảm ơn nhiều. Code của em đây
Code:
#include <REGX52.H> #include "string.h" sfr lcddata=0xA0; sbit bf=0xA7; sbit rs=P3^0; sbit rw=P3^1; sbit en=P3^2; int i=0; void wait(void) { //long n=0; en=1; rs=0; rw=1; lcddata=0xff; while(bf) { //n++; //if(n>100)break; } en=0; rw=0; } void lcdcontrol(unsigned char x) { rs=0; rw=0; lcddata=x; en=1; en=0; wait(); } void lcdinit(void) { lcdcontrol(0x30); //Phai co cai nay thi moi chay 2 dong duoc lcdcontrol(0x38); lcdcontrol(0x0e); lcdcontrol(0x01); } void lcdwrite(unsigned char c) { rs=1; rw=0; lcddata=c; en=1; en=0; wait(); } void lcdwrites(unsigned char *s) { unsigned char data lens, count; lens=strlen(s); for(count=0;count<lens;count++) { lcdwrite(*(s+count)); } } void delay(long time) { while(time--); } void number(unsigned int i) { unsigned char a,b,c,d,e; e=i%10; i=i/10; d=i%10; i=i/10; c=i%10; i=i/10; b=i%10; a=i/10; lcdwrite(a+48); lcdwrite(b+48); lcdwrite(c+48); lcdwrite(d+48); lcdwrite(e+48); } void dem(void) interrupt 2 { lcdcontrol(0x87); i++; number(i); } void main(void) { EA=1; EX1=1; IT1=1; lcdinit(); lcdcontrol(0x80); lcdwrites("Counts:"); lcdcontrol(0xc0); lcdwrites(" HUS-VNU"); while(1); }
Comment