找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1912|回复: 1
收起左侧

单片机PWM调速程序+Proteus仿真

[复制链接]
ID:726916 发表于 2020-4-11 14:15 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

单片机源程序如下:
  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();                        // 系统初始化
  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, 下载次数: 57)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:730612 发表于 2020-4-16 15:45 | 显示全部楼层
好的 十分感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表