找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机PWM产生程序 (256精度)带按键调节

[复制链接]
跳转到指定楼层
楼主



资料下载:
pwm.rar (22.08 KB, 下载次数: 39)


51单片机PWM程序如下:
  1.                  
  2. ////****************************************************************************//
  3. #include <STC12C5A60S2.H>
  4. #include <intrins.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int


  7. /*******PWM模式变量更改**********/
  8. //#define DR_50 0x7f      //50%占空比
  9. //#define DR_10 0x19      //10%占空比

  10. ///*******时钟源选择*******/
  11. #define CLK_4   0x02// 0x08  //Sysclk
  12. //********模式选择********/
  13. #define P_model   0x42  //无中断PWM模式

  14. sbit keyup=P3^4;                   //步进加端口位定义
  15. sbit keydown=P3^5;                   //步进减端口位定义
  16. sbit keyup1=P3^6;                   //步进1加端口位定义
  17. sbit keydown1=P3^7;                   //步进1减端口位定义
  18. uchar num=127;
  19. uchar num1=127;

  20. /*****函数声明*****/
  21. void PP_init(void); //PWM模式初始化
  22. void delay(int);                   //延时函数声明
  23. //          P_model初始化         //
  24. //********************************//
  25. void PP_init(void)
  26. {
  27.    CMOD   = CLK_4;   //时钟源为Sysclk
  28.     CCAPM0 = P_model; //无中断PWM模式
  29.    // CCAP0L = DR_10;   //%50占空比
  30.     CCAP0H = 0x7f;   //当CL值大于CCAP0L时输出为高,反之输出为低
  31.                       //当CL溢出时CCAP0H的值装载到CCAP0L中
  32.           CCAPM1 = P_model; //无中断PWM模式
  33.     //CCAP1L = DR_10;   //%50占空比
  34.     CCAP1H = 0x7f;   //当CL值大于CCAP0L时输出为高,反之输出为低
  35.                       //当CL溢出时CCAP0H的值装载到CCAP0L中
  36.     CR     = 1;       //开启PCA计数器
  37.                       //当不使用定时0溢出为时钟源时,PWM输出的频率=PCA的时钟源/256
  38.                       //使用定时器溢出的时钟源时,可设定定时器的值对输出频率的改变
  39.                       //分频为0-256分频
  40. }

  41. void delay(int x)                   //12M晶振,约1ms延时函数
  42. {
  43.         int i;
  44.         for(;x>0;x--)
  45.         for(i=0;i<123;i++)
  46.                 ;
  47. }
  48. /////////////////////
  49. uchar code byte[]={ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
  50.        
  51.                     0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,

  52.                                         0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
  53.                                                
  54.                     0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,

  55.                                         0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,

  56.                                         0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,

  57.                                         0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,

  58.                                         0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,

  59.                                         0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,

  60.                                         0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,

  61.                                         0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,

  62.                                         0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,

  63.                                         0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,

  64.                                         0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,

  65.                                         0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,

  66.                                         0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff,
  67.                                         };//DA转换数据
  68. void main()
  69. {
  70.     PP_init();
  71.     while(1)
  72.     {
  73.             if(keyup==0)                 //步进加端口为低电平,
  74.                         {       
  75.                                 delay(10);                  //稍作延时,消抖,
  76.                                 if(keyup==0)          //步进加端口依然为低电平,说明的确是被按下,
  77.                                 {       
  78.                                         if(num==255)  //执行电压DA转换数值步进增加一
  79.                                         num=0;
  80.                                         else
  81.                                         num++;
  82.                                 }
  83.                                 while(keyup==0);        //防止按死语句
  84.                          }
  85.                  if(keydown==0)                                 //步进减端口为低电平,
  86.                          {
  87.                                  delay(10);                         //稍作延时,消抖,
  88.                                 if(keydown==0)                 //步进减端口依然为低电平,说明的确是被按下,
  89.                                 {       
  90.                                         if(num==0)                  //执行电压DA转换数值步进减一
  91.                                         num=255;
  92.                                         else
  93.                                         num--;
  94.                                 }
  95.                                 while(keydown==0);          //防止按死语句
  96.                          }
  97.           CCAP0H=byte[num];           //给DA一个数值,转化成相应的电压值
  98.                  delay(10);
  99.                  //////////////////////////////
  100.                  if(keyup1==0)                 //步进加端口为低电平,
  101.                         {       
  102.                                 delay(10);                  //稍作延时,消抖,
  103.                                 if(keyup1==0)          //步进加端口依然为低电平,说明的确是被按下,
  104.                                 {       
  105.                                         if(num1==255)  //执行电压DA转换数值步进增加一
  106.                                         num1=0;
  107.                                         else
  108.                                         num1++;
  109.                                 }
  110.                                 while(keyup1==0);        //防止按死语句
  111.                          }
  112.                  if(keydown1==0)                                 //步进减端口为低电平,
  113.                          {
  114.                                  delay(10);                         //稍作延时,消抖,
  115.                                 if(keydown1==0)                 //步进减端口依然为低电平,说明的确是被按下,
  116.                                 {       
  117.                                         if(num1==0)                  //执行电压DA转换数值步进减一
  118.                                         num1=255;
  119.                                         else
  120.                                         num1--;
  121.                                 }
  122.                                 while(keydown1==0);          //防止按死语句
  123.                          }
  124.           CCAP1H=byte[num1];           //给DA一个数值,转化成相应的电压值
  125.                  delay(10);
  126.     }
  127. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:116826 发表于 2016-7-5 09:45 | 只看该作者
请问没有显示的部分吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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