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

            • mansion123
              Bật mí những điều ít ai biết về thi công gỗ óc chó
              bởi mansion123
              Thi công gỗ óc chó giúp không gian trở nên sang trọng, ấm cúng, gần gũi hơn. Sự kết hợp giữa thẩm mỹ và chất lượng cao của gỗ óc chó chắc chắn sẽ mang lại giá trị lâu dài và làm hài lòng ngay cả những khách hàng khó tính nhất. Vậy đằng
              ...
              hôm nay, 16:08
            • tuyennhan
              Trả lời cho Tiếng Anh cho người Việt
              bởi tuyennhan
              Cái thư sai ngay câu chào Dear sir mới đúng Hi chỉ dùng cho người quen , các vấn đề về kỹ thuật nó không trả lời hoặc nói loanh quanh tránh ảnh hưởng đến công ty .
              Giup1 người cần không giúp người không cần với lại văn mình vợ người nha đừng quên .
              hôm nay, 07:44
            • vi van pham
              Trả lời cho Tiếng Anh cho người Việt
              bởi vi van pham
              Cám ơn những lời chúc tốt đẹp của em.

              Việc em làm giống như chê sếp dốt, chẳng những không có miếng xôi nào để ăn mà còn chịu nhiều trù dập lên bờ , xuống ruộng.

              Hãy tránh vết xe đổ của tui đi. Dành thời gian lo cho gia đình....
              hôm nay, 02:00
            • nhathung1101
              Trả lời cho Tiếng Anh cho người Việt
              bởi nhathung1101
              Ngoại ngữ là không thể thiếu, nhất là làm việc với công nghệ.

              Nhưng học để tán gái hay để đọc datasheet, manual là chuyện cần quan tâm.

              Và đọc ở nguồn nào đáng tin cậy, chứ cứ lên tictok hay facebook học lỏm thì...
              Hôm qua, 22:18
            • dinhthuong80
              Trả lời cho Tiếng Anh cho người Việt
              bởi dinhthuong80
              Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.

              Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...
              Hôm qua, 14:51
            • dinhthuong80
              Trả lời cho Tiếng Anh cho người Việt
              bởi dinhthuong80
              Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.

              Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...
              Hôm qua, 14:39
            • dinhthuong80
              Trả lời cho Tiếng Anh cho người Việt
              bởi dinhthuong80
              Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.

              Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...
              Hôm qua, 14:28
            • bqviet
              Trả lời cho Tiếng Anh cho người Việt
              bởi bqviet
              Đúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
              21-02-2025, 20:26
            • mèomướp
              Trả lời cho Tiếng Anh cho người Việt
              bởi mèomướp
              Dạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
              21-02-2025, 12:32
            • vi van pham
              Trả lời cho Tiếng Anh cho người Việt
              bởi vi van pham
              Những lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).

              Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...
              20-02-2025, 21:31
            Đang tải...
            X