mình có một mạch đếm từ 0000 đến 9999 chạy trên mô phỏng có khai báo là:TMOD=0x01;TH0=0xC350;TL0=0xC350;mạch chỉ đếm tăng không đếm giảm được.vì các bác trên diễn đàn nói khai báo như vậy là sai nên không dám gửi lên nếu bạn thấy cần thì liên lạc với mình qua mail:lamdtk72@gmail.com.mình cảm thấy bài bạn gửi lên ban đầu chỉ sửa một chút là chạy nhưng mình bận quá có gì mình xem lại sau.
Thông báo
Collapse
No announcement yet.
các bác xem giúp e code này sai chỗ nào mà nó ko chạy với
Collapse
X
-
@dtcn_112: khai báo cho timer như vậy là sai rõ ràng vì, mỗi thanh ghi TH và TL chỉ có 8 bít, bạn làm vậy nó thành 16bit rồi. nếu đã làm tăng được thì làm giảm tuơng tự, và cùng hàm lun, bình thường sau 1 khoảng thời gian thì tăng biến hiển thị lên 1 đơn vị kiểu dem=dem+1, bây giờ bạn thay số 1 = 1 biến t : dem=dem+t và 1 cái ngắt ngoài con con là nếu ấn 1 phát thì t=1, ấn phát nữa t=-1, lặp lại quá trình, như vậy chỉ cần 1 phím bạn có thể tăng giảm rồi
nếu viết chương trình chạy time như bienhou nói, thì như chung1608 nói đúng đó, với ASM nó có thể làm _NOP_ trễ chuẩn 1s, còn vs C thì chỉ áng chừng 1s được thôi. cái này đã thử nghiệm rồi nhéWebsite chính thức đổi địa chỉ website thành
Mời các bạn ghé thăm !!!
Comment
-
em chào bác mast090,em cũng không hiểu tại sao lai như vậy,nhưng đúng là mạch em làm đếm từ 0000 đến 9999 em khai báo như vậy ,mạch vẫn chạy .viết bằng c em không giải thích được vấn đề này,em lấy một câu lệnh như sau:
MOVC A,@A+DPTR.
thanh ghi DPTR là thanh ghi 16 bit,vậy thanh ghi A là thanh ghi 8 bit làm sao có thể lưu được 16 bit,cho nên khi lưu trữ dữ liệu thanh ghi A chỉ lưu byte thấp (DPL),còn byte cao(DPH) được bỏ qua,nên em nghĩ khai báo cho timer cũng vậy.vì timer cũng có 1 byte thấp và 1 byte cao.
Comment
-
uhm, cũng có thể, vì 1 số thanh ghi khi khai báo quá giá trj thì nó chỉ lấy cho phần thấp và phần cao được bỏ qua, nhưng tốt nhất cứ viết đúng theo quy tắc đi, tự dưng đẻ thêm 8 bit cao nữa vào làm j đâuWebsite chính thức đổi địa chỉ website thành
Mời các bạn ghé thăm !!!
Comment
-
em vừa sửa bài tác giả gửi lên chạy rùi,cần sửa một chút thôi,em không biết cách gửi file từ máy lên diễn đàn nên để em up lên mediafire rùi gửi cả mạch mô phỏng và code,mà em gửi luôn code lên để các bác xem còn sửa chỗ nào:
#include <reg51.h>
sbit aled1= P1^0;
sbit aled2= P1^1;
sbit aled3= P1^2;
sbit aled4= P1^3;
unsigned char i,k;
unsigned char code maled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
void delay()
{
TMOD=0x01; //timer0 16 byt
//TH0=0x2710;
//TL0=0x2710;
TH0=0x27a0;
TL0=0x27a0; //sửa ở đây
TR0=1;
while(!TF0);
TF0=0;
TR0=0;
}
void ngatngoai0()interrupt 0
{
while(1)
{
for(k=0;k<9999;k++)
{
P2=maled[k/1000];
aled1=1;
delay();
aled1=0;
P2=maled[(k/100)];
aled2=1;
delay();
aled2=0;
P2=maled[(k/10)];
aled3=1;
delay();
aled3=0;
P2=maled[k];
aled4=1;
delay();
aled4=0;
}
}
}
void khoitaongatngoai0()
{EA=1;
EX0=1;
IT0=1;
}
void main()
{khoitaongatngoai0();
}
Comment
-
-
MOVC A,@A+DPTR.Nguyên văn bởi dtcn_112 Xem bài viếtem chào bác mast090,em cũng không hiểu tại sao lai như vậy,nhưng đúng là mạch em làm đếm từ 0000 đến 9999 em khai báo như vậy ,mạch vẫn chạy .viết bằng c em không giải thích được vấn đề này,em lấy một câu lệnh như sau:
MOVC A,@A+DPTR.
thanh ghi DPTR là thanh ghi 16 bit,vậy thanh ghi A là thanh ghi 8 bit làm sao có thể lưu được 16 bit,cho nên khi lưu trữ dữ liệu thanh ghi A chỉ lưu byte thấp (DPL),còn byte cao(DPH) được bỏ qua,nên em nghĩ khai báo cho timer cũng vậy.vì timer cũng có 1 byte thấp và 1 byte cao.
DPTR là thanh ghi 16 bit nhưng câu lệnh trên đâu lưu 16 bit vào A đâu nhỉ, nó lưu giá trị tại ô nhớ A+DPTR vào A mà
còn câu lệnh TH0=0x27a0; TL0=0x27a0; này các bác muốn timer đếm thế nào vậy, tạo trễ bao nhiêu?
Comment
-
bạn ấy hỏi cách làm đồng hồ đếm 1/10 hay 1/100 giây gì đó
sau đó hiển thị ra 4 con led 7 đoạn
có 2 nút
1 nút chạy và dừng đồng hồ
1 nút xóa giờ về 0000
bạn xem code thế này ok chưa hay sai gì nhé
Code:#include <regx51.h> #define uchar unsigned char #define uint unsigned int #define LedData P1 #define Pled1 P2_0 #define Pled2 P2_1 #define Pled3 P2_2 #define Pled4 P2_3 void T0_ISR();//phuc vu viec dem thoi gian void EX0_ISR();//phuc vu viec start stop thoi gian void EX1_ISR();//phuc vu viec xoa ve 0000 void init(void);//chuong trinh con khoi tao //================================================== uchar bRun; uchar bCountT0;//dem so lan ngat t0 cu 10 lan thi tang 1 cho num uchar num1,num2,num3,num4; uchar maled[10]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x8,0x9}; //================================================== void main(void) { init(); while(1); } //================================================== void init(void) { //khoi tao ngat ngoai theo suon EA=1; EX0=1;//ngat ngoai 0 IT0=1;//ngat theo suon ET0=1; EX1=1; IT1=1; TMOD=1; TL0=0xf0;//55.536 TH0=0xd8;//tuc la cu 10.000 thi xay ra tran bCountT0=0; //num=0; TR0=1;//cho phep bo dinh thoi hoat dong //ET1=1; } //================================================== void T0_ISR(void) interrupt 1 { //chuong trinh ngat phuc vu viec dem thoi gian //khoang nho nhat la 0.1 s 100ms TR0=0; TL0=0xf0; TH0=0xd8; Pled2=Pled3=Pled4=0; Pled1=1; LedData=maled[num1]; Pled1=Pled3=Pled4=0; Pled2=1; LedData=maled[num2]; Pled2=Pled1=Pled4=0; Pled3=1; LedData=maled[num3]; Pled2=Pled3=Pled1=0; Pled4=1; LedData=maled[num4]; if(!bRun) { TR0=1; return; } ++bCountT0; if(bCountT0==10) { bCountT0=0; ++num4; if(num4==10) { num4=0; ++num3; } if(num3==10) { num3=0; ++num2; } if(num2==10) { num2=0; ++num1; } if(num1==10) num1=0; } //ok sau nay se hien thi len led 7 doan TR0=1; } //================================================== //================================================== void EX0_ISR(void) interrupt 0 { if(bRun) bRun=0; else bRun=1; } void EX1_ISR(void) interrupt 2 { num1=num2=num3=num4=0; }Last edited by kidteam; 03-05-2012, 00:58.
Comment
-
thêm chống nảy phím bấm vào đi chứNguyên văn bởi kidteam Xem bài viếtbạn ấy hỏi cách làm đồng hồ đếm 1/10 hay 1/100 giây gì đó
sau đó hiển thị ra 4 con led 7 đoạn
có 2 nút
1 nút chạy và dừng đồng hồ
1 nút xóa giờ về 0000
bạn xem code thế này ok chưa hay sai gì nhé
Code:#include <regx51.h> #define uchar unsigned char #define uint unsigned int #define LedData P1 #define Pled1 P2_0 #define Pled2 P2_1 #define Pled3 P2_2 #define Pled4 P2_3 void T0_ISR();//phuc vu viec dem thoi gian void EX0_ISR();//phuc vu viec start stop thoi gian void EX1_ISR();//phuc vu viec xoa ve 0000 void init(void);//chuong trinh con khoi tao //================================================== uchar bRun; uchar bCountT0;//dem so lan ngat t0 cu 10 lan thi tang 1 cho num uchar num1,num2,num3,num4; uchar maled[10]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x8,0x9}; //================================================== void main(void) { init(); while(1); } //================================================== void init(void) { //khoi tao ngat ngoai theo suon EA=1; EX0=1;//ngat ngoai 0 IT0=1;//ngat theo suon ET0=1; EX1=1; IT1=1; TMOD=1; TL0=0xf0;//55.536 TH0=0xd8;//tuc la cu 10.000 thi xay ra tran bCountT0=0; //num=0; TR0=1;//cho phep bo dinh thoi hoat dong //ET1=1; } //================================================== void T0_ISR(void) interrupt 1 { //chuong trinh ngat phuc vu viec dem thoi gian //khoang nho nhat la 0.1 s 100ms TR0=0; TL0=0xf0; TH0=0xd8; Pled2=Pled3=Pled4=0; Pled1=1; LedData=maled[num1]; Pled1=Pled3=Pled4=0; Pled2=1; LedData=maled[num2]; Pled2=Pled1=Pled4=0; Pled3=1; LedData=maled[num3]; Pled2=Pled3=Pled1=0; Pled4=1; LedData=maled[num4]; if(!bRun) { TR0=1; return; } ++bCountT0; if(bCountT0==10) { bCountT0=0; ++num4; if(num4==10) { num4=0; ++num3; } if(num3==10) { num3=0; ++num2; } if(num2==10) { num2=0; ++num1; } if(num1==10) num1=0; } //ok sau nay se hien thi len led 7 doan TR0=1; } //================================================== //================================================== void EX0_ISR(void) interrupt 0 { if(bRun) bRun=0; else bRun=1; } void EX1_ISR(void) interrupt 2 { num1=num2=num3=num4=0; }
Ờ mà xí, nhìn cái đoạn quét led thấy nó sao sao ấy. Ko có thời gian delay thì tốc độ nhanh quá, BJT đáp ứng kịp ko nhỉ ?
Comment
-
quét led = ngắt timer kiểu này k cần thiết phải delay, ngày xưa mình cũng thắc mắc nhưng có 1 điều cơ bản mà đôi lúc ko để ý đó là thời gian chờ tới vòng ngắt timer tiếp theo chính là thời gian delay ^^Nguyên văn bởi chung1608 Xem bài viếtthêm chống nảy phím bấm vào đi chứ
Ờ mà xí, nhìn cái đoạn quét led thấy nó sao sao ấy. Ko có thời gian delay thì tốc độ nhanh quá, BJT đáp ứng kịp ko nhỉ ?
góp ý cái là chuơng trình ngắt nó có thể chạy mà k cần khai báo tên hàm trước main. bình thường trong C nếu chuơng trình con viết dưới main thì muốn sử dụng trong main thì cần khai báo tiêu đề của nó ở trên kiểu
void chuơng trình con(....)//tiêu đề
void main
void chươn trình con(...)//nội dung chuơng trình
còn nếu viết luôn nội dung chương trình trước main thì k cần khai báo tiêu đề các ctc trong code
còn với các chuơng trình ngắt k cần khai báo tiêu đề như code trên đưaWebsite chính thức đổi địa chỉ website thành
Mời các bạn ghé thăm !!!
Comment
Bài viết mới nhất
Collapse
-
bởi lvhnHãng nào tùy thích thôi bác! bây giờ các hãng đều hỗ trợ xem qua máy tính hay điện thoại đều được. Gắn Trước tiên mua về cắm nguồn set ip hết xong hãy lắp lên, cam poe chỉ cần 4 lõi là hoạt động bình thường nên 1 dây kéo cho 2 cam vẫn ok
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 15:49 -
-
Trả lời cho Tìm bạn thân quen cũ.bởi lvhnNhớ không nhầm thì lúc còn đi học có gặp chú 1 lần cf bãi xe Nguyễn Kim, giờ quán cf đó nghỉ bán rồi
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 15:44 -
-
Trả lời cho Thắc mắc pin 21v ?bởi lvhnCon số đấy biểu thị gần đúng thôi, cái đồng hồ đó có đảm bảo chính xác hay không? pin có cục lên 4v4 vẫn bình thường. Cái gì cũng có sai số trong phạm vi không quá lớn thì không ảnh hưởng gì đâu, bàn ngay ngón ngắn ngón dài mà
-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 15:32 -
-
Trả lời cho Amply bị rò DC 22 voltbởi lvhnThay mấy con transisto nhỏ đầu vào, thường vi sai lỗi hay bị. Khám tổng quát chân các linh kiện xem có bị rỉ sét nhiều không?
-
Channel: Điện thanh
Hôm qua, 15:24 -
-
bởi dinhthuong92Mạch này hiệu suất ra led đạt khoảng 90.7% tại 12V in, 40W out.
-
Channel: Nguồn!
27-07-2026, 10:15 -
-
bởi dinhthuong92Có lẽ nguồn viết bài này chỉ mang tính định tính để nói rằng cần thay đổi tổng trở tải để có Pmax chứ trình bày chưa chi tiết và thấu đáo một cách định lượng. Công thức tổng quát phải có mặt L mới được, và nói là "tổng...
-
Channel: Nguồn!
27-07-2026, 10:09 -
-
Trả lời cho [Chia sẻ] Tổng hợp các công ty AI Việt Nam đang làm gì thật sự — Từ voicebot, computer vision đến AI agentsbởi nguyendinhvanCàng ngày, CNTT càng trở nên lôi thôi , rách việc.
Cái AI và Ge... trên trình duyệt chỉ tổ làm vướng mắt, mất thì gian.
Tôi toàm phải mất cộng tắt nó đi.-
Channel: Xu hướng, nhu cầu và thị trường
25-07-2026, 14:59 -
-
bởi trung30000Em có con amply 12 sò D 718 và e688 , biến áp 15A, 30v 0 30 v, một kênh thì hoạt động bình thường, kênh còn lại nổ bụp bụp, sột sột, đèn tín hiệu nhảy lên vạch max, khoảng 4 đến 5 giây, sau đó đèn tín hiệu trả về mức không, Em thấy như...
-
Channel: Điện thanh
24-07-2026, 13:50 -
-
Trả lời cho Tìm hiểu máy hàn lăn (Rolling Welding)bởi hoang_3ibác cần thì liên hệ Em: mayhanhaivuong.com (0903238399)...
-
Channel: Điện tử công nghiệp
24-07-2026, 10:58 -
-
Trả lời cho Công thức tính định luật kirchhoffbởi abcnewmemberGiải bằng hệ phương trình bật nhất 3 ẩn.
...
-
Channel: Hỗ trợ học tập
23-07-2026, 14:52 -

Comment