標題: 單片機PWM調(diào)速程序+Proteus仿真 [打印本頁]

作者: 1216864428    時間: 2020-4-11 14:15
標題: 單片機PWM調(diào)速程序+Proteus仿真
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <REG52.H>
  2. #include <STDIO.H>
  3. #include <LM1602.H>
  4. #include <BUTTON.H>
  5. #include <DS18B20.H>
  6. #include <Interface.H>

  7. #define FOSC 11059200L      //System frequency
  8. #define BAUD 9600               //UART baudrate

  9. sbit PWM = P3^5;

  10. extern unsigned int frequency = 0;                                        // 頻率
  11. extern unsigned char Interface = 1;                                        // 正在處于的界面
  12. extern unsigned char Menu_option = 1;                                // 菜單選項
  13. extern unsigned char hour = 8, min = 0, sec = 0;        // 時間變量
  14. extern bit update_time_state = 0;                                        // 更新時間標志
  15. extern bit update_temp_state = 0;                                        // 更新溫度標志
  16. extern unsigned int PWM_val;                                                // PWM的設置等級
  17. extern unsigned int time_count = 0;                                        // 時鐘計時
  18. void Initial();                        // 系統(tǒng)初始化
  19. void Timer_Init();                // 中斷初始化
  20. void Count_second();        // 秒計更新計時
  21. void Count_temp();                // 溫度更新計時
  22. void PWM_control();                // PWM控制

  23. void Main()
  24. {
  25.         Initial();
  26.         while(1)
  27.         {
  28.                 KeyProc();
  29.                 Update_data();
  30.         }
  31. }

  32. void Timer1()interrupt 3
  33. {
  34.         TL1 = 0x00;                //設置定時初值
  35.         TH1 = 0xDC;                //設置定時初值
  36.         Count_second();
  37.         Count_temp();
  38.         PWM_control();
  39. }

  40. void Uart()interrupt 4
  41. {
  42.         if(RI)                                                         /*        RI:串口接收中斷申請標志位  */
  43.         {
  44.                 RI=0;                                                //必須重新對RI清
  45.         }
  46. }

  47. void Count_second()
  48. {
  49.         if(++time_count == 100)
  50.         {
  51.                 time_count = 0;
  52.                 update_time_state = 1 ;
  53.                 frequency = TH0<<8 | TL0;
  54.                 TH0 = TL0 = 0;
  55.                 if(++sec == 60)
  56.                 {
  57.                         sec = 0;
  58.                         if(++min == 60)
  59.                         {
  60.                                 min = 0;
  61.                                 if(++hour == 24)
  62.                                 {
  63.                                         hour = 0;
  64.                                 }
  65.                         }
  66.                 }
  67.         }
  68. }

  69. void PWM_control()
  70. {
  71.         static bit w;
  72.         static unsigned char count;
  73.         if(PWM_val == 0)
  74.         {
  75.                 PWM = 0;
  76.         }
  77.         else if(PWM_val == 15)
  78.         {
  79.                 PWM = 1;
  80.         }
  81.         else
  82.         {
  83.                 if(w == 0)
  84.                 {
  85.                         if(++count == PWM_val)
  86.                         {
  87.                                 count = 0;
  88.                                 PWM = 0;
  89.                                 w = 1;
  90.                         }
  91.                 }
  92.                 else
  93.                 {
  94.                         if(++count == (15 - PWM_val))
  95.                         {
  96.                                 count = 0;
  97.                                 PWM = 1;
  98.                                 w = 0;
  99.                         }
  100.                 }
  101.         }
  102. }

  103. void Count_temp()
  104. {
  105.         static unsigned int temp_count;
  106.         if(++temp_count == 20)
  107.         {
  108.                 temp_count = 0;
  109.                 update_temp_state = 1;
  110.         }
  111. }

  112. void Timer_Init()
  113. {
  114.         SCON=0x50;
  115.         T2CON=0x34;
  116.         TH2=RCAP2H=(65536-(FOSC/32/BAUD)) >> 8;
  117.         TL2=RCAP2L=(65536-(FOSC/32/BAUD));
  118.         ES=1;
  119.         ET1 = 1;
  120.         TMOD = 0x15;
  121.         TL1 = 0x00;                //設置定時初值
  122.         TH1 = 0xDC;                //設置定時初值
  123.         TR1 = 1;
  124.         TR0 = 1;
  125.         TF0 = 0;        
  126.         EA = 1;
  127. }

  128. void Initial()
  129. {
  130.         DS18B20();
  131.         Init_1602();
  132.         display_1602(0,0,"*Function Board*");
  133.         display_1602(1,1,"Welcome to use");
  134.         Timer_Init();
  135.         while((P2&0x1e) == 0x1e);
  136.         while((P2&0x1e) != 0x1e);
  137.         Init_1602();
  138.         display_1602(0,0,"Function Menu:  ");
  139.         Updata_Menu(Menu_option);
  140.         Timer_Init();
  141. }
復制代碼
全部資料51hei下載地址:
電子工程實訓.zip (157.25 KB, 下載次數(shù): 57)


作者: aqiang123    時間: 2020-4-16 15:45
好的 十分感謝




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1