اطلاعیه

Collapse
No announcement yet.

برنامه میکرو 8051

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #46
    پاسخ : برنامه میکرو 8051

    سلام.
    ببخشید .در مورد سئوال دوم ،برنامه را به صورت زیر تغییر دادم ودر پروتئوس امتحان کردم با 7447تا 15 را می شمرد ولی نتوانستم با یک سگمنت 4 تایی تا 60را بشمارد فکر کنم اشکال از چک کردن پایه های سگمنت ها است .
    فعلأ
    rg 0000h
    mov R2,#60
    setb P1.0
    clr P1.1
    clr p1.2
    clr p1.3
    MOV TMOD,#00000110b
    MOV TH0,#-60
    SETB P3.4
    HERE: JNB P3.0,HERE
    AGAIN: SETB TR0
    BACK: MOV A,TL0
    CJNE A,#9,L
    H: MOV P2,A

    p: JNB TF0,BACK
    setb P1.2
    INC R1
    CJNE R1,#9,L1
    K: MOV P2,R1

    d: clr P1.1
    clr P1.3
    DJNZ R2,AGAIN
    L: JC H
    setb P1.1
    MOV P2,A
    jmp p
    L1: JC K
    setb P1.3
    MOV P2,R1
    jmp d
    END
    مرسی
    :sad:
    "هنگامي كه دري از خوشبختي به روي ما بسته ميشود ، دري ديگر باز مي شود ولي ما اغلب چنان به دربسته چشم مي دوزيم كه درهاي باز را نمي بينيم." هلن کلر

    دیدگاه


      #47
      پاسخ : برنامه میکرو 8051

      نوشته اصلی توسط فرزانه2
      3-راستش از استاد کارگاهم در مورد استفاده از سگمت پرسیدم و ایشون به من روش بالا را گفت خودم هم فکر می کردم باید از 7447استفاده کنم ولی نکردم دیگه!
      شما یابد به 7سگمنت الگوی شکل عدد رو بدید. حالا یا باید 7447 بزنید یا اینکه الگو رو توی خود میکرو ایجاد کنید.همینجوری که نمیشه.
      برنامه جدید را هم نگاه میکنم، اشکالاتشو میگم . اگر هم کلا سر در نیاوردم سعی میکنم خودم یه نمونه ساده بذارم.

      دیدگاه


        #48
        پاسخ : برنامه میکرو 8051

        سلام
        اولش خواستم یه برنامه کامل بنویسم و بذارم ولی پشیمون شدم. فکر کردم بهتره برنامه خود شما رو رفع اشکال کنیم و قدم به قدم جلو بریم. اینطوری برای شما هم بهتره. تو این پست فعلاً بلوک ثانیه رو بررسی میکنیم.


        نوشته اصلی توسط فرزانه2
        4-برای رسیدن ثانیه به 60از پرچم استفاده کردم وبرای رسیدن به 60دقیقه از شمارنده R2 استفاده کردم .
        وقتی میخواهید با تایمر 59 تا بشمرید و با پرچمِ تایمر، سرریز رو تشخیص بدید باید TH0 رو پر کنید و مقدار 196 = (59 - 255 ) رو در TL0 بریزید.
        --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        من معنی CJNE A,#9,L رو نمی فهمم. فکر کنم با این دستور می خواستید رسیدن یکان ثاینه رو به عدد 9 تشخیص بدید.
        به جای این کار می تونید از خود محتوی رجیستر TL0 با کمی تغییر استفاده کنید و بعد نمایشش بدین. بدین ترتیب که :
        ابتدا TL0 رو در A کپی می کنیم. بعد با دستور SUBB A,#196 عدد ثانیه رو بدست میاریم.
        دلیل این کار اینه که چون تایمر داره صعودی میشمره و ما هم قبلاً مقدار 59 – 255 رو در TL0 ریخته بودیم.
        پس برای بدست آوردن عددی که از اول برنامه تا الان، به TL0 اضافه شده (همون ثانیه) باید عدد 196 رو از ثبات پایینی تایمر کم کنیم.
        بعد با چند خطی که به رنگ بنفش مشخص شده مقدار ثبات A رو که هگز هست به دو نیبل بصورت BCD تبدیل میکنیم.
        تشخیص دلیل استفاده از اون دستورات رو به عهده خودتون میذارم.(راهنمایی: وقتی A رو به 10 تقسیم میکنیم یکانش از دهگانش جدا میشه. عجب راهنمایی ای!! همشو گفتم که !! :biggrin

        MOV TH0,#0FFH
        MOV TL0,#196
        HERE: JNB P3.0,HERE
        AGAIN: SETB TR0
        BACK: MOV A,TL0
        SUBB A,#196
        MOV B,#10
        DIV AB
        SWAP A
        ORL A,B
        CALL MUX
        JNB TF0,BACK
        ---------------------------------------------------------------------------------------------------------------------------------------------------------
        میپرسید CALL MUX چیه؟
        من فکر کردم بهتره برای رفرش کردن سون سگمنتها یه زیر برنامه جداگانه نوشته بشه. بعداً در بارش توضیح میدم.اگه خودتون سعی کنید بنویسید که عالیه!

        فعلاً

        به علت یه مشکل کوچولو در کد ویرایش شد .(11 May)

        دیدگاه


          #49
          پاسخ : برنامه میکرو 8051

          سلام.
          به خاطر اینکه وقت با ارزشتان را در اختیار من قرار دادید ممنون هستم .راستش میکرو درس قشنگیه ومن هم دوستش دارم ولی اصلا استعدادی درآن ندارم ! :redface:اما در مورد برنامه بنفش قبلا نمونه آن را درکتاب دیده بودم وتوانستم منظورتان را بفهمم ولی یک سئوال دیگه شما از تایمر استفاده کردید یا شمارنده؟ راستی یک برنامه کوچولو هم در مورد رفرش کردن سگمنت ها نوشتم که باز هم زحمت چک کردنش را باید خودتان بکشید.
          Mux: mov b,#10
          Mov r1,a
          Div ab
          Mov a,b
          Jnz l
          Setb p1.0
          Mov p2,r1
          Ret
          --------------
          l: setb p1.0
          setb p1.1
          mov p2,r1
          مرسی
          :sad:
          "هنگامي كه دري از خوشبختي به روي ما بسته ميشود ، دري ديگر باز مي شود ولي ما اغلب چنان به دربسته چشم مي دوزيم كه درهاي باز را نمي بينيم." هلن کلر

          دیدگاه


            #50
            پاسخ : برنامه میکرو 8051

            سلام
            نوشته اصلی توسط فرزانه2
            یک سئوال دیگه شما از تایمر استفاده کردید یا شمارنده؟
            همونطور که قرار بود، از شمارنده
            -------------------------------------------------------------------------------------------------------------------------
            و اما در مورد کد شما: لازم نبود از اون دستورات استفاده بکنید. ببینید شما سه تا بایت دارید که توشون ثانیه و دقیقه و ساعت ذخیره شده.
            برای نمایش، اول باید با دستوراتی مثل همون دستورات بنفش (به قول شما) یکان و دهگان رو در دو نیبل جداگانه بریزید. بعد اونها رو پشت سر هم به 7447 بدید.
            بعد با دستور SWAP ، نیبل بعدی همون بایت رو به 7447 که مثلاً روی پایه های P2.0 تا P2.3 قرار داره بدید. و الا آخر....

            روش کلی رفرش کردن اینه:
            شما پایه های A-G همه سگمنت ها رو به هم وصل میکنی و بعد در بازه های زمانی مشخص (معمولا 20 میلی ثانیه) عدد مورد نظرتو روی پایه سگمنت ها که به هم وصل هستند قرار میدی.
            حالا اینکه این عدد، روی کدوم سگمنت نمایش داده بشه رو اینطور تعیین میکنی که فقط تغذیه همون سگمنت برقرار باشه و بقیه سگمنت ها خاموش باشن.
            با تکرار سریع این عمل به دلیل سرعت نمونه برداری پایین چشم انسان ، تصور میشه که همه سگمنت ها روشن هستن و هر کدوم داره عدد خاصی رو نشون میده.
            -------------------------------------------------------------------------------------------------------------------------
            سعی کنید با توضیحاتی که دادم دوباره برنامه رو بنویسید. اگه سوالی داشتید بپرسید
            در ضمن اینقدر این شکلک غمگین را آخر پستهای خود نگذارید :biggrin:

            دیدگاه


              #51
              پاسخ : برنامه میکرو 8051

              سلام.
              باز هم ممنونم یک سئوال می پرسم در مورد قرار دادن نیبل ها در خروجی شاید مسخره باشد ولی نخندید ! اینکه می توانم نیبل ها هر کدام به کد اسکی خودش تبدیل کنم وبعد در خروجی قرارش بدهم؟[move] :exclaim:[/move]
              "هنگامي كه دري از خوشبختي به روي ما بسته ميشود ، دري ديگر باز مي شود ولي ما اغلب چنان به دربسته چشم مي دوزيم كه درهاي باز را نمي بينيم." هلن کلر

              دیدگاه


                #52
                پاسخ : برنامه میکرو 8051

                نوشته اصلی توسط فرزانه2
                می توانم نیبل ها هر کدام به کد اسکی خودش تبدیل کنم وبعد در خروجی قرارش بدهم؟
                که چی بشه؟!
                برای چی می خواین این کارو بکنین؟ اون بیرون اسکی به چه درد میخوره؟
                7447 یا 7سگمنت که اسکی حالیشون نیست!
                شما می خواین یه عدد رو تو یه سگمنت نشون بدین. حالا اونو به 7447 میدین و اون با توجه به اون عدد یه شکل خاص رو روی 7سگمنت نشون میده. همین.......!

                اگه قانع نشدین بیشتر توضیح بدین تا منظورتونو بفهمم

                دیدگاه


                  #53
                  پاسخ : برنامه میکرو 8051

                  سلام.
                  باز هم ممنونم. با آن توضیحاتی که دادید برنامه زیر را برای رفرش کردن سگمنت های ثانیه نوشتم وامتحان هم کردم ولی فقط 00و11و22و...را واضح نشان می دهدوالبته سر ثانیه 00و11و...
                  01و02و03و..را نمی توانم ببینم البته سگمنت در طول نشان دادن00تا11چشمکهایی می زند حالا باز هم باید شما بگویید چکار کنم.

                  setb p1.0
                  mov p2,a
                  swap a
                  setb p1.1
                  mov p2,a
                  مرسی
                  :sad:
                  "هنگامي كه دري از خوشبختي به روي ما بسته ميشود ، دري ديگر باز مي شود ولي ما اغلب چنان به دربسته چشم مي دوزيم كه درهاي باز را نمي بينيم." هلن کلر

                  دیدگاه


                    #54
                    پاسخ : برنامه میکرو 8051

                    سلام
                    خیلی خوبه
                    تقربیاً درسته فقط چند تا نکته رو باید رعایت کنید.
                    همونطور که قبلاً گفتم وقتی می خواهید سگمنت بعدی رو روشن کنید باید قبلی رو خاموش کنید. یعنی بعد از دستور SWAP A باید بنویسیم CLR P1.0 .
                    همچنین باید بعد از نمایش دادن هر سگمنت یه مقدار تاخیر ایجاد کنیم تا تصویر توی چشم حک بشه. مثلاً بعد از خط MOV P2,A بنویسید CALL DLY10MS .
                    فکر می کنم این تاخیر مناسب باشه:
                    ;********************************
                    DLY10MS:MOV 74H,#50
                    M2: MOV 75H,#100
                    M3: DJNZ 75H,M3
                    DJNZ 74H,M2
                    RET
                    ;********************************

                    خب فعلاً

                    دیدگاه


                      #55
                      پاسخ : برنامه میکرو 8051

                      سلام.
                      بابت همه چیز ممنون هستم برای دقیقه هم برنامه زیر رانوشتم ودر پروتئوس جوابم را داد ولی باید سگمنت مربوط به دقیقه را پاک کنم برای همین دقیقه خیلی زود محو می شه لطفا بگویید حالا چه کار کنم ؟
                      Minut :
                      clr a
                      movc a,@a+dptr
                      mov b,#10
                      div ab
                      setb p1.1
                      mov p2,b
                      acall DLY10MS
                      acall DLY10MS
                      clr p1.1
                      setb p1.0
                      mov p2,a
                      acall DLY10MS
                      acall DLY10MS
                      clr p1.0
                      inc dptr
                      ret
                      org 300h
                      db 1d,2d,3d,4d,5d,6d,7,8,9,10,11,12,13,14,15,16,17,18 ,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,3 5,36,37,38,39
                      تا آخراعداد را تا 59 نوشتم.
                      :sad:
                      "هنگامي كه دري از خوشبختي به روي ما بسته ميشود ، دري ديگر باز مي شود ولي ما اغلب چنان به دربسته چشم مي دوزيم كه درهاي باز را نمي بينيم." هلن کلر

                      دیدگاه


                        #56
                        پاسخ : برنامه میکرو 8051

                        سلام
                        این زیر برنامه همونیه که برای رفرش بود؟ چرا از دستور DB استفاده کردید؟ برای تبدیل کردن HEX به BCD ؟
                        قرار شد شما اشکالات زیر برنامه رفرش رو رفع کنید و تکمیلش کنید. من سر در نمیارم اون دستورات سه چهار خط اول برای چیه؟
                        بگذریم......
                        خب الان ما قسمتهای مربوط به شمارش ثانیه و رفرش رو تکمیل کردیم. اگر دقیقه و ساعت رو هم بهش اضافه کنیم دیگه کامل میشه.
                        من دقیقه و ثانیه رو هم بهش اضافه کردم که خیلی سادست و مثل هم هستن. در زیر برنامه MUX هم که مربوط به رفرش بود این مقدار ها رو ابتدا به BCD تبدیل میکنیم و بعد نمایش میدیم.
                        برای اینکه حجم کد پایین بیاد و خواناتر بشه تکه کدی رو که HEX رو به BCD تبدیل میکرد بصورت یه زیر برنامه در آوردم تا هر جا لازم شد اونو فراخوانی میکنیم. در ضمن زیر برنامه تاخیر رو هم تصحیح کردم.
                        کد زیر، برنامه کامل ساعت هست که توی پروتیوس امتحان کردم و مشکلی نداشت:


                        ORG 0000H
                        HERE: JNB P3.0,HERE
                        START: MOV P1,#00H
                        MOV R6,#00H ;MINUTE
                        MOV R7,#00H ;HOUR
                        MOV TMOD,#00000110b
                        MOV TH0,#0FFH
                        MOV TL0,#196
                        AGAIN: SETB TR0
                        BACK: MOV A,TL0
                        SUBB A,#196
                        CALL MUX
                        JNB TF0,BACK
                        CLR TR0
                        CLR TF0
                        MOV TL0,#196
                        SETB TR0
                        INC R6
                        CJNE R6,#60,BACK
                        MOV R6,#00H
                        INC R7
                        CJNE R7,#24,BACK
                        MOV R7,#00H
                        JMP START
                        ;********************************
                        MUX: CALL HEX2BCD
                        MOV P1,#01H
                        MOV P2,A
                        LCALL DELAY
                        SWAP A
                        MOV P1,#02H
                        MOV P2,A
                        LCALL DELAY
                        MOV A,R6
                        CALL HEX2BCD
                        MOV P1,#04H
                        MOV P2,A
                        LCALL DELAY
                        SWAP A
                        MOV P1,#08H
                        MOV P2,A
                        LCALL DELAY
                        MOV A,R7
                        CALL HEX2BCD
                        MOV P1,#10H
                        MOV P2,A
                        LCALL DELAY
                        SWAP A
                        MOV P1,#20H
                        MOV P2,A
                        LCALL DELAY
                        RET
                        ;********************************
                        HEX2BCD:MOV B,#10
                        DIV AB
                        SWAP A
                        ORL A,B
                        RET
                        ;********************************
                        DELAY: MOV R5,#0FH
                        M2: MOV R4,#0FFH
                        M3: DJNZ R4,M3
                        DJNZ R5,M2
                        RET
                        ;********************************
                        END


                        موفق و پیروز باشید

                        دیدگاه


                          #57
                          پاسخ : برنامه میکرو 8051

                          سلام.
                          ببخشید من گفتم که ثانیه را تمامش کردم وجواب هم گرفتم تازه برنامه ای هم که برای دقیقه نوشتم وفرستادم هم جواب داد فقط مشکلش نگه داشتن عدد دقیقه بود حالا برنامه را کامل برایتان می گذارم شما آن را در پروتئوسی که قبلا فرستادم البته به اضافه یک7447 قرار بدهید .فکر می کنم شما در برنامه ساعتتان از دو پورت خروجی استفاده کردید اگر من هم با دو سگمنت دوتایی و دو پورت خروجی این کار را بکنم مشکلم رفع می شه؟
                          تازه delay که فرستادید هم درست جواب داد ! حالا اشکال برنامه من چیه؟ ببخشید فکر کنم خستتون کردم ولی من می خواهم برنامه هایی که می نویسم را خودم اصلاح کنم .
                          org 0000h
                          mov R2,#60
                          mov dptr,#300h
                          MOV TMOD,#00000110b
                          clr p1.0
                          clr p1.1
                          clr p1.2
                          clr p1.3
                          start: MOV TH0,#0ffh
                          mov tl0,#196
                          SETB P3.4
                          HERE: JNB P3.0,HERE
                          AGAIN: SETB TR0
                          BACK: MOV A,TL0
                          subb a,#196
                          MOV B,#10
                          DIV AB
                          SWAP A
                          ORL A,B
                          acall mux
                          JNB TF0,BACK
                          clr tf0
                          clr tr0
                          acall minut
                          sjmp start
                          Mux: setb p1.3
                          mov p2,a
                          acall DLY10MS
                          swap a
                          clr p1.3
                          setb p1.2
                          mov p2,a
                          acall DLY10MS
                          clr p1.2
                          ret
                          DLY10MS: MOV 74H,#50
                          M2: MOV 75H,#100
                          M3: DJNZ 75H,M3
                          DJNZ 74H,M2
                          RET
                          minut:
                          clr a
                          movc a,@a+dptr
                          mov b,#10
                          div ab
                          setb p1.1
                          mov p2,b
                          acall DLY10MS
                          acall DLY10MS
                          clr p1.1
                          setb p1.0
                          mov p2,a
                          acall DLY10MS
                          acall DLY10MS
                          clr p1.0
                          inc dptr
                          ret
                          org 300h
                          db 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 ,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,3 7,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53, 54,55,56,57,58,59,60
                          end
                          مرسی :sad:
                          "هنگامي كه دري از خوشبختي به روي ما بسته ميشود ، دري ديگر باز مي شود ولي ما اغلب چنان به دربسته چشم مي دوزيم كه درهاي باز را نمي بينيم." هلن کلر

                          دیدگاه


                            #58
                            پاسخ : برنامه میکرو 8051

                            نوشته اصلی توسط فرزانه2
                            ببخشید من گفتم که ثانیه را تمامش کردم وجواب هم گرفتم تازه برنامه ای هم که برای دقیقه نوشتم وفرستادم هم جواب داد فقط مشکلش نگه داشتن عدد دقیقه بود حالا برنامه را کامل برایتان می گذارم شما آن را در پروتئوسی که قبلا فرستادم البته به اضافه یک7447 قرار بدهید .
                            برنامه که کامل شد! جاییش نامفهوم بود؟ من نمی فهمم.......... برنامه ای که شما نوشتید خوب همونه دیگه! فقط شما برای دقیقه از یک روش عجیب غریب استفاده کردید.
                            چه میدونم دیتا پوینتر و lookup table و از این جور چیزا .... در حالی که شما اگر دقت کنید میبینید که توی برنامه ای که من فرستادم فقط با 2 خط این کار انجام شده! اصلاً لازم نبوده شما از 0 تا 59 رو در رام ذخیره کنید!

                            فکر می کنم شما در برنامه ساعتتان از دو پورت خروجی استفاده کردید اگر من هم با دو سگمنت دوتایی و دو پورت خروجی این کار را بکنم مشکلم رفع می شه؟
                            نخیر ...همون یک پورت هست. البته به جز 6 تا پایه از p1 که برای انتخاب سگمنت ها بود که شما هم در برنامه هایتان از همین پورتها اسفاده کردید.
                            کلا! همه سون سگمنت ها به هم و به 7447 ی وصل میشوند که به P2 وصل است. پایه com انها هم به p1.0 تا p1.5 . حله؟

                            تازه delay که فرستادید هم درست جواب داد !
                            بله.......... اما این جدیده رو لازم نیست دو بار فراخوانی کنید.

                            حالا اشکال برنامه من چیه؟
                            اشکالش فقط اینه که زیر برنامه ای که برای دقیقه نوشتید کلاً لازم نیست اصلا! :biggrin: مشکلی هم که در رابطه با نمایش اشاره کردید احتمالاً به خاطر همینه.

                            ببخشید فکر کنم خستتون کردم
                            اصلاً :smile:

                            من می خواهم برنامه هایی که می نویسم را خودم اصلاح کنم
                            تا الان هم غیر از این نبوده. فقط اون اول که شما اومدین گفتین عجله دارم و باید پروژه تحویل بدم ، من برنامه حاضری بهتون دادم.
                            این برنامه ای هم که تو پست قبلی واستون فرستادم در باره همه چیش توضیح داده شده و شما کاملاً تو جریان بودید.

                            فکر نمی کنم تغییر خاصی برای برنامه لازم باشه. اما اگه سوالی دارین بپرسین

                            دیدگاه

                            لطفا صبر کنید...
                            X