找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3612|回复: 3
打印 上一主题 下一主题
收起左侧

51单片机spwm程序

[复制链接]
跳转到指定楼层
楼主
ID:328361 发表于 2018-5-12 17:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg52.h>
  2. #define unint unsigned int
  3. #define unchar unsigned char

  4. unchar code pwm[5][120]={
  5.          { 4 ,         12 ,         20 ,         27 ,         35 ,         43 ,         51 ,         58 ,         66 ,         74 ,        
  6.                  81 ,         88 ,         96 ,         103 ,         110 ,         117 ,         124 ,         131 ,         137 ,         144 ,        
  7.                  150 ,         156 ,         162 ,         168 ,         174 ,         180 ,         185 ,         190 ,         195 ,         200 ,        
  8.                  205 ,         209 ,         213 ,         217 ,         221 ,         224 ,         228 ,         231 ,         234 ,         237 ,        
  9.                  239 ,         241 ,         243 ,         245 ,         246 ,         247 ,         248 ,         249 ,         250 ,         250 ,        
  10.                  250 ,         250 ,         249 ,         248 ,         247 ,         246 ,         245 ,         243 ,         241 ,         239 ,        
  11.                  237 ,         234 ,         231 ,         228 ,         224 ,         221 ,         217 ,         213 ,         209 ,         205 ,        
  12.                  200 ,         195 ,         190 ,         185 ,         180 ,         174 ,         168 ,         162 ,         156 ,         150 ,        
  13.                  144 ,         137 ,         131 ,         124 ,         117 ,         110 ,         103 ,         96 ,         88 ,         81 ,        
  14.                  74 ,         66 ,         58 ,         51 ,         43 ,         35 ,         27 ,         20 ,         12 ,         4
  15.      },
  16.          { 8 ,         24 ,         39 ,         55 ,         70 ,         85 ,         99 ,         113 ,         127 ,         140 ,        
  17.                  153 ,         165 ,         177 ,         187 ,         198 ,         207 ,         215 ,         223 ,         229 ,         235 ,        
  18.                  240 ,         244 ,         247 ,         249 ,         250 ,         250 ,         249 ,         247 ,         244 ,         240 ,        
  19.                  235 ,         229 ,         223 ,         215 ,         207 ,         198 ,         187 ,         177 ,         165 ,         153 ,        
  20.                  140 ,         127 ,         113 ,         99 ,         85 ,         70 ,         55 ,         39 ,         24 ,         8},
  21.          { 10 ,         29 ,         49 ,         68 ,         87 ,         105 ,         122 ,         139 ,         155 ,         170 ,        
  22.                  184 ,         196 ,         208 ,         218 ,         227 ,         234 ,         241 ,         245 ,         248 ,         250 ,        
  23.                  250 ,         248 ,         245 ,         241 ,         234 ,         227 ,         218 ,         208 ,         196 ,         184 ,        
  24.                  170 ,         155 ,         139 ,         122 ,         105 ,         87 ,         68 ,         49 ,         29 ,         10 },
  25.          { 16 ,         47 ,         77 ,         106 ,         134 ,         159 ,         182 ,         202 ,         219 ,         232 ,        
  26.                  242 ,         248 ,         250 ,         248 ,         242 ,         232 ,         219 ,         202 ,         182 ,         159 ,        
  27.                  134 ,         106 ,         77 ,         47 ,         16},
  28.          {20,58,96,130,162,190,213,231,243,249,249,243,231,213,190,162,130,96,58,20 }};
  29.           // 反正弦变化

  30. unchar i=0;
  31. unchar m=0;
  32. unchar dr=0;

  33. sbit output=P0^0;                           //脉冲输出
  34. sbit key=P3^0;                                         //频率转换键

  35. void init();
  36. void delay(unint);

  37. void main()
  38. {
  39.         init();
  40.         TR0=1;                                   //启动定时器0
  41.         output=1;                           //给脉冲
  42.         TR1=1;                                   //启动定时器1
  43.         while(1)
  44.         {
  45.                 if(key==0)
  46.                 {
  47.                         delay(5);
  48.                         if(key==0)
  49.                         {
  50.                                 while(1)
  51.                                         if(key==1)
  52.                                         {
  53.                                                 i++;                   //关光标
  54.                                                 if(i==5)
  55.                                                         i=0;
  56.                                                 break;
  57.                                         }
  58.                          }
  59.                 }
  60.                 switch (i)
  61.                 {
  62.                         case 0: m=100;break;                 //20Hz 100个数据
  63.                         case 1: m=50;break;                         //40HZ 50个数据
  64.                         case 2: m=40;break;                         //50HZ 40个数据
  65.                         case 3: m=25;break;                        // 80Hz        25个数据
  66.                         case 4: m=20;break;                         //100HZ 20个数据
  67.                 }        
  68.         }
  69. }

  70. void init()
  71. {
  72.         TMOD=0x11;
  73.         TH0=(65536-500)/256;
  74.         TL0=(65536-500)%256;
  75.         TH1=(65536-100)/256;
  76.         TL1=(65536-100)%256;
  77.         EA=1;                                                        //开总中断
  78.         ET0=1;                                                        //开定时器0中断
  79.         ET1=1;                                                        //开定时器1中断
  80. }

  81. /****************************延时*****************************/
  82. void delay(unint z)
  83. {
  84.         unint x,y;
  85.         for(x=z;x>0;x--)
  86.                 for(y=110;y>0;y--);        
  87. }

  88. void time0() interrupt 1
  89. {
  90.         TH0=(65536-500)/256;
  91.         TL0=(65536-500)%256;
  92.         output=1;
  93.         TR1=1;                                                          //启动定时器1               
  94. }

  95. void time1()  interrupt 3   
  96. {
  97.         output=0;
  98.         TR1=0;                                                         //停止定时器1
  99.         TH1=(65536-pwm[i][dr])/256;
  100.         TL1=(65536-pwm[i][dr])%256;
  101.         dr++;
  102.         if(dr==m)
  103.                 dr=0;            
  104. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:89286 发表于 2018-5-12 18:30 | 只看该作者
thanks for sharing
回复

使用道具 举报

板凳
ID:39808 发表于 2018-5-12 19:33 | 只看该作者
调制频率是多少?
回复

使用道具 举报

地板
ID:782212 发表于 2021-6-3 17:08 | 只看该作者
这是频率多大的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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