Thông báo

Collapse
No announcement yet.

Xin được chỉ giáo

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Xin được chỉ giáo

    E kiếm được đoạn code sau dùng để xuất tín hiệu AD ra LCD:
    biến trở -> bộ ADC -> AVR -> xuất điện áp ra LCD

    19. Chip type : ATmega16
    20. Program type : Application
    21. Clock frequency : 8.000000 MHz
    22. Memory model : Small
    23. External SRAM size : 0
    24. Data Stack size : 256
    25. ************************************************** ***/
    26.
    27. #include <mega16.h>
    28.
    29. // Alphanumeric LCD Module functions
    30. #asm
    31. .equ __lcd_port=0x15 ;PORTC
    32. #endasm
    33. #include <lcd.h>
    34.
    35. #define FIRST_ADC_INPUT 0
    36. #define LAST_ADC_INPUT 7
    37. unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
    38. #define ADC_VREF_TYPE 0x20
    39.
    40. // ADC interrupt service routine
    41. // with auto input scanning
    42. interrupt [ADC_INT] void adc_isr(void)
    43. {
    44. register static unsigned char input_index=0;
    45. // Read the 8 most significant bits
    46. // of the AD conversion result
    47. adc_data[input_index]=ADCH;
    48. // Select next ADC input
    49. if (++input_index &gt; (LAST_ADC_INPUT-FIRST_ADC_INPUT))
    50. input_index=0;
    51. ADMUX=(FIRST_ADC_INPUT|ADC_VREF_TYPE)+input_index;
    52. // Start the AD conversion
    53. ADCSRA|=0x40;
    54. }
    55.
    56.
    57. // Declare your global variables here
    58. void lcd_putnum(unsigned int d)
    59. {
    60. unsigned char donvi, chuc, tram;
    61. donvi=d%10;
    62. d=d/10;
    63. chuc=d%10;
    64. d=d/10;
    65. tram=d%10;
    66. d=d/10;
    67. 68. if(tram&gt;0)
    69. {
    70. lcd_putchar(48+tram);
    71. lcd_putchar(48+chuc);
    72. lcd_putchar(48+donvi);
    73.
    74. }
    75. else if(chuc&gt;0)
    76. {
    77. lcd_putchar(48+chuc);
    78. lcd_putchar(48+donvi);
    79. lcd_putsf(" ");
    80.
    81. }
    82. else {
    83. lcd_putchar(48+donvi);
    84. lcd_putsf(" ");
    85. lcd_putsf(" ");
    86.
    87. }
    88. }
    89.
    90. void main(void)
    91. {
    92. // Declare your local variables here
    93.
    94. // Input/Output Ports initialization
    95. // Port A initialization
    96. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In
    Func0=In
    97. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T
    State0=T
    98. PORTA=0x00;
    99. DDRA=0x00;
    100.
    101. // Port B initialization
    102. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In
    Func0=In
    103. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T
    State0=T
    104. PORTB=0x00;
    105. DDRB=0x00;
    106.
    107. // Port C initialization
    108. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In
    Func0=In
    109. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T
    State0=T
    110. PORTC=0x00;
    111. DDRC=0x00;
    112.
    113. // Port D initialization
    114. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In
    Func0=In
    115. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T
    State0=T
    116. PORTD=0x00;
    117. DDRD=0x00;
    118.
    119. // Timer/Counter 0 initialization 120. // Clock source: System Clock
    121. // Clock value: Timer 0 Stopped
    122. // Mode: Normal top=FFh
    123. // OC0 output: Disconnected
    124. TCCR0=0x00;
    125. TCNT0=0x00;
    126. OCR0=0x00;
    127.
    128. // Timer/Counter 1 initialization
    129. // Clock source: System Clock
    130. // Clock value: Timer 1 Stopped
    131. // Mode: Normal top=FFFFh
    132. // OC1A output: Discon.
    133. // OC1B output: Discon.
    134. // Noise Canceler: Off
    135. // Input Capture on Falling Edge
    136. // Timer 1 Overflow Interrupt: Off
    137. // Input Capture Interrupt: Off
    138. // Compare A Match Interrupt: Off
    139. // Compare B Match Interrupt: Off
    140. TCCR1A=0x00;
    141. TCCR1B=0x00;
    142. TCNT1H=0x00;
    143. TCNT1L=0x00;
    144. ICR1H=0x00;
    145. ICR1L=0x00;
    146. OCR1AH=0x00;
    147. OCR1AL=0x00;
    148. OCR1BH=0x00;
    149. OCR1BL=0x00;
    150.
    151. // Timer/Counter 2 initialization
    152. // Clock source: System Clock
    153. // Clock value: Timer 2 Stopped
    154. // Mode: Normal top=FFh
    155. // OC2 output: Disconnected
    156. ASSR=0x00;
    157. TCCR2=0x00;
    158. TCNT2=0x00;
    159. OCR2=0x00;
    160.
    161. // External Interrupt(s) initialization
    162. // INT0: Off
    163. // INT1: Off
    164. // INT2: Off
    165. MCUCR=0x00;
    166. MCUCSR=0x00;
    167.
    168. // Timer(s)/Counter(s) Interrupt(s) initialization
    169. TIMSK=0x00;
    170.
    171. // Analog Comparator initialization
    172. // Analog Comparator: Off
    173. // Analog Comparator Input Capture by Timer/Counter 1: Off
    174. ACSR=0x80;
    175. SFIOR=0x00;
    176.
    177. // ADC initialization
    178. // ADC Clock frequency: 1000.000 kHz
    179. // ADC Voltage Reference: AREF pin 180. // ADC Auto Trigger Source: None
    181. // Only the 8 most significant bits of
    182. // the AD conversion result are used
    183. ADMUX=FIRST_ADC_INPUT|ADC_VREF_TYPE;
    184. ADCSRA=0xCB;
    185.
    186. // LCD module initialization
    187. lcd_init(16);
    188.
    189. // Global enable interrupts
    190. #asm("sei")
    191. lcd_gotoxy(0,0);
    192. lcd_putsf("ADC");
    193.
    194. while (1)
    195. {
    196. // Place your code here
    197. lcd_gotoxy(4,1);
    198. lcd_putnum(adc_data[0]);
    199. };
    200. }

    Không hiểu giá trị "gt" là gì, mà c/tr cứ đòi phải define, tại sao trong hàm IF tác giả lại dùng dấu ";", mọi người bỉết thì giúp dùm.

  • #2
    đoạn code này bạn copy sang chắc là bị lỗi nên mới bị sai như vậy.
    ví dụ bạn thay như này:
    #include <delay.h>
    interrupt [ADC_INT] void adc_isr(void)
    43. {
    44. register static unsigned char input_index=0;
    45. // Read the 8 most significant bits
    46. // of the AD conversion result
    47. adc_data[input_index]=ADCH;
    48. // Select next ADC input
    49. if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
    50. input_index=0;
    51. ADMUX=(FIRST_ADC_INPUT|ADC_VREF_TYPE)+input_index;
    52. // Start the AD conversion
    53. ADCSRA|=0x40;
    54. }


    58. void lcd_putnum(unsigned int d)
    59. {
    60. unsigned char donvi, chuc, tram;
    61. donvi=d%10;
    62. d=d/10;
    63. chuc=d%10;
    64. tram = d/10;
    lcd_putchar(48+tram);
    lcd_putchar(48+chuc);
    lcd_putchar(48+donvi);
    88. }
    //..............
    ................//

    190. #asm("sei")
    191. lcd_gotoxy(0,0);
    192. lcd_putsf("ADC");
    193.
    194. while (1)
    195. {
    196. // Place your code here
    197. lcd_gotoxy(4,1);
    198. lcd_putnum(adc_data[0]);
    delay_ms(300);
    199. };
    như vậy là sẽ hiện thị dc giá trị do được kênh ADC0.trong khi bộ ADC đo lần lần lượt 8 kênh đo.chú ý thêm delay vào để xem giá trị ADC0.
    hãy quý những j hiện tại mình đang có

    Comment


    • #3
      mình đã xem xét và sửa lại như sau:
      .... đoạn trên thì sửa như xl09 đã sửa

      57 // Declare your global variables here
      58 void lcd_putnum(unsigned int d)
      59 {
      60 unsigned char donvi, chuc, tram;
      61 donvi=d%10;
      62 d=d/10;
      63 chuc=d%10;
      64 d=d/10;
      65 tram=d%10;
      66 d=d/10;
      lcd_putchar(48+tram);
      lcd_putchar(48+chuc);
      lcd_putchar(48+donvi);
      } //xuống dòng tới void main lun nha
      90 void main(void)
      ....
      while (1)
      {
      // Place your code here
      lcd_gotoxy(4,1);
      lcd_putnum(adc_data[0]);
      // delay_ms(300); khỏi cần delay lun
      };
      }
      KQ ra cuối cùng khi vặn biến trở min (000) - max(255), đúng như yêu cầu đặt ra ban đầu của tác giả đoạn code: "Dùng PORTA.0 nhận giá trị từ biến trở hiển thị lên LCD theo ADC 8bit (từ 0->5V thành 0 ->255)"
      Nhưng em muốn hiện giá trị điện áp kìa. VD: vặn biến trở min (hiện 0v) - max(hiện 5v). mong mọi người giúp đỡ.

      Comment


      • #4
        như thế này nhe:
        điện áp bộ ADC đọc vào phụ thuộc vào Vref của bộ ADC.
        ví dụ Vref =5V(nối với +vcc) và đọc ADC 8 bit như trên thì giá trị nhận tối đa được ở thanh ghi ADCH là 255 sẽ tương ứng với điện áp Vref (5V).
        như vậy giá trị điện áp nhận được bạn tính theo ct: U = ADC*Vref/255.
        hãy quý những j hiện tại mình đang có

        Comment


        • #5
          bạn có thể them lun doạn này vào:
          unsigned int xulyadc(unsigned char adc)
          {
          //chan Vref nối với Vcc(5.00V)
          unsigned long int temp = adc;
          temp *= 500/255; //như vạy nhận điện áp đo được *100;
          return (unsigned int)(temp)
          }
          57 // Declare your global variables here
          58 void lcd_putnum(unsigned int d)
          59 {
          60 unsigned char donvi, chuc, tram;
          d = xulyadc(d);
          61 donvi=d%10;
          62 d=d/10;
          63 chuc=d%10;
          64 d=d/10;
          65 tram=d%10;
          66 d=d/10;
          lcd_putchar(48+tram);
          lcd_putchar('.'); //hiẹn thị điện áp từ 0.00V đến 5.00V
          lcd_putchar(48+chuc);
          lcd_putchar(48+donvi);
          }

          tuy nhiên khi làm thành thạo thì bạn phải tối ưu lại.
          hãy quý những j hiện tại mình đang có

          Comment


          • #6
            01689964729

            Comment

            Về tác giả

            Collapse

            yeunhan777 Tìm hiểu thêm về yeunhan777

            Bài viết mới nhất

            Collapse

            • bqviet
              Trả lời cho Đấu tắt điện cho máy tính bảng
              bởi bqviet
              Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
              06-12-2025, 17:17
            • nguyendinhvan
              Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
              bởi nguyendinhvan
              Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
              05-12-2025, 19:59
            • afrendly
              Trả lời cho Đấu tắt điện cho máy tính bảng
              bởi afrendly
              Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
              04-12-2025, 01:27
            • nick22
              Trả lời cho Máy điện châm ?
              bởi nick22
              Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
              01-12-2025, 13:23
            Đang tải...
            X