OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6886|回复: 1

求教这个程序能否在P1^0 产生一个占空比和频率可调的方波

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2013-3-31
在线时间
0 小时
发表于 2013-3-31 12:35:32 | 显示全部楼层 |阅读模式
/****************************************************************************** 
*                                                                            * 
*关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 * 
*设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样* 
*可以设定占空比可从1-100变化。即0.01ms*100=1ms                               * 
******************************************************************************/ 
#include <REGX51.H> 
#define uchar unsigned char      
/***************************************************************************** 
* TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256;         * 
* TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器* 
* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 * 
* 间为1ms*65536=65.536ms                                                     * 
******************************************************************************/                
#define V_TMOD 0X01                  

void init_sys(void);            /*系统初始化函数*/ 
void Delay5Ms(void); 

unsigned char ZKB1; 

void main (void) 
{
  static uchar click=0;   
  unsigned int x=65536-1000;
  TMOD=V_TMOD; 
  TH0=x/256; 
  TL0=x%256; 
  TR0=1; 
  ET0=0; 
  ZKB1=40;            /*占空比初始值设定*/ 
  while(1) 
  { 
       if (!P1_4) 
      { 
       Delay5Ms(); 
       if (!P1_4) 
         { 
         ZKB1++; 
         } 
      } 

       if (!P1_5) //如果按了-键,减少占空比 
      { 
       Delay5Ms(); 
       if (!P1_5) 
         { 
         ZKB1--; 
         } 
      }  
if (ZKB1>99) ZKB1=1; 
if (ZKB1<1) ZKB1=99;
 
 if (!P1_5) 
      { 
       Delay5Ms(); 
       if (!P1_5) 
         { 
         x++; 
         } 
      } 
 
 if (!P1_6) 
      { 
       Delay5Ms(); 
       if (!P1_6) 
         { 
         x--; 
         } 
      } 
if (x>(65536-500)) x=65536-2000; 
if (x<(65536-2000)) x=65536-500;
while(TF0){
TF0=0;                
TH0=x/256;                                   
TL0=x%256; 
++click; 
if (click>=100) click=0; 
if (click<=ZKB1){      
  P1_0=0; 
  P1_2=0;
  }
else 
{
P1_0=1;
  P1_2=1;   
  }
  }
 }
/****************************************************** 
*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/ 

//延时 
void Delay5Ms(void) 
unsigned int TempCyc = 1000; 
while(TempCyc--); 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-3-31 15:27:28 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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