Có anh nào coi hộ dùm em xem đoạn code sau sai chổ nào mà ko chạy, trong đó ngắt ngoài 0 dùng để tăng biến đếm lên 1 khi có sản phẩm đi qua, còn ngắt timer0 dùng để hiển thị led 7seg
HTML Code:
// khai bao Header #include<reg51.h> #include<stdio.h> #define m 2 // dinh nghia m de sau nay tien cho viec chinh sua thoi gian quyet led // Khai bao Bit can dung sbit start = P0^0; // nut nhan bat dau sbit led1 = P1^0; // Cac dau ra quyet led sbit led2 = P1^1; sbit led3 = P1^2; sbit led4 = P1^3; sbit led5 = P1^4; sbit led6 = P1^5 ; const unsigned char M[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; // Ma data cua led 7 thanh anode chung unsigned int sp1; //bien dem so san phan/thùng, max = 24 unsigned long int sp2; // bien dem so thung/ngày , max = 9999 unsigned int thousand2,hundred2,tens2,unit2,tens1,unit1; // Ham tao tre de quyet led, ham nay chi mang tinh chat tao tre, chu thoi gian thuc trong ham khong dung voi thoi gian tre thuc su trong VDK void delay_ms(unsigned int time) { unsigned int i; unsigned int j; for(i = time;i>0;i--) for(j=0;j<125;j++); } // Ham xoa Led de giam hieu ung chop cua LED ( Do lech so voi tan so nhin thay cua mat ) void clear_led(void) { P1=0xFF; // quan lý nguon P2=0xFF; //quan lý data } // Ham quet LED void display(void) { clear_led(); thousand2 = sp2/1000; if (thousand2 == 0) // Neu gia tri trong hang nghin = 0 thi led hang nghin khong sang clear_led(); else { P1 = 0x1F; //led6 = 0; led5 = 1; led4=1; led3 = 1;led2 = 1;led1 = 1; P2=M[thousand2]; delay_ms(m); clear_led(); } hundred2 =(sp2%1000)/100; if ((thousand2 == 0)&&(hundred2 == 0)) // Neu gia tri trong hang nghin, va hang tram deu = 0 thi led hang nghin, hang tram khong sang clear_led(); else { P1 = 0x2F; //led6 = 1; led5 = 0; led4=1; led3 = 1;led2 = 1;led1 = 1; P2=M[hundred2]; delay_ms(m); clear_led(); } tens2 = ((sp2%1000)%100)/10; if ((thousand2 == 0)&&(hundred2 == 0)&&(tens2 == 0)) // Neu gia tri trong hang nghin, va hang tram, hang chuc deu = 0 thi led hang nghin, hang tram, hang chuc khong sang. clear_led(); else { P1 = 0x37; //led6 = 1; led5 = 1; led4=0; led3 = 1;led2 = 1;led1 = 1 P2=M[tens2]; delay_ms(m); clear_led(); } unit2 =((sp2%1000)%100)%10; P1 = 0x3B; //led6 = 1; led5 = 1; led4=1; led3 = 0;led2 = 1;led1 = 1 P2=M[unit2]; delay_ms(m); clear_led(); tens1 = sp1/10; if (tens1 ==0) clear_led(); else { P1 = 0x3D; //led6 = 1;led5 = 1; led4 = 1;led3 = 1;led2 = 0;led1 = 1; P2=M[tens1] ; delay_ms(m); clear_led(); } unit1 = (sp1%10); P1 = 0x3E; //led6 = 1;led5 = 1; led4 = 1;led3 = 1;led2 = 1;led1 = 0; P2 = M[unit1]; delay_ms(m); clear_led(); } // Khoi tao chuong trinh void init(void) { TMOD=0x01; // Cho phep Timer0 hoat dong o che do timer 16 bit IE=0x83; // Cho phep ngat ngoai tu chan INT0, ngat trong boi Timer0 IP=0x01; // Cho phep ngat ngoai uu tien hon ngat trong TH0=-5000/256; // Tre 1s TL0=-5000%256; sp1 = 0; //gia tri khoi tao ban dau = 0 sp2 = 0; // Gia tri khoi tao ban dau bang 0 clear_led(); // Xoa LED IT0=1; // cho phep ngat bang canh xuong timer 0 TF0=1; // Timer0 Overfllow Flag TR0=1; // Start Timer0 } // Ham xuat gia tri ra hien thi su dung ngat Timer void outdata(void) interrupt 1 { TR0=0; display(); TH0=-5000/256; TL0=-5000%256; TR0=1; } // Ham dem su dung ngat ngoai void count(void) interrupt 0 { EA=0; // cam ngat ngoai sp1++; if(sp1 >= 25) { sp1=0; //reset lai bien dem so sp/thung sp2++; //tang bien dem so thung/ngày lên 1. if(sp2>=9999) // reset lai bien dem so thùng/ngày. { sp2=0; } } delay_ms(10); EA=1; // cho phep ngat ngoai tro lai } // Chuong trinh chinh void main (void) { EA = 0; // Cam ngat ngoai, cho chuong trinh khoi tao xong init(); delay_ms(100); while(start); // Khi nhan nut start, moi cho phep ngat ngoai, khi do chuong trinh moi bat dau chay delay_ms(10);//thoi gian tre de loai bo hien tuong rung phim while(!start); //neu nut da duoc nha ra thi hien thi so 9999 sp2 = 0; // Gia tri khoi tao cua bien ban dau. sp1 = 0; EA = 1; // Cho phep ngat ngoai tro lai while(1) { } }
Comment