久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2042|回復: 3
打印 上一主題 下一主題
收起左側

STC15單片機采樣電壓控制調整PWM信號的占空比,改變外部電壓占空比無變化

[復制鏈接]
跳轉到指定樓層
樓主
ID:1038387 發表于 2022-7-5 11:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
P1.0口模擬量輸入   P3.5口  PWM信號輸出
求大神指導下   應該是我的程序沒有嵌套上占空比    求賜教

單片機源程序如下:
#include <reg51.h>
#include "intrins.h"
#define FOSC 10240000L
#define BAUD 9600
typedef unsigned char BYTE;   //這是重新定義一個新的變量類型byte
typedef unsigned int WORD;   //定義了一個unsigned int的同義詞,名字為WORD
#define URMD 0   //0:使用定時器2做波特率發生器
                 //1:使用定時器1的模式0(16位自動重載模式)作為波特率發生器
                 //2:使用定時器1的模式2(8位自動重載模式)作為波特率發生器
sfr T2H = 0xd6;   //定時器2高8位
sfr T2L = 0xd7;   //定時器2低8位
sfr ADC_CONTR=0xBC;   //定義ad轉換電源,周期,標致,開啟,轉換口,數據存儲位置
sfr ADC_RES=0xBD;   //定義轉換完畢數據高高八位數據位置
sfr ADC_LOW2=0xBE;   //定義轉換完畢的低2位數據存放位置
sfr P1ASP=0x9D;   //定義ad轉換的總開關位置
sfr CLK_DIV=0x97;   //定義時鐘分頻寄存器地址
/*ADC操作定義常量*/
#define ADC_POWER 0x80 //ADC的電源控制位,打開,10000000
#define ADC_FLAG 0x10 //ADC完成標志,10000,一定要軟件清零
#define ADC_START 0x08 //ADC的啟動控制點,1000,開始轉換
#define ADC_SPEEDLL 0x00 //540 clocks,00,,00,540個時鐘周期轉換一次
#define ADC_SPEEDL 0x20 //360 clocks,100000,01
#define ADC_SPEEDH 0x40 //180 clocks,1000000,10
#define ADC_SPEEDHH 0x60 //90 clocks,1100000,11
void InitUart();   //初始化Uart,通用異步接收器/發送器,就是通常所說的串行口,
void SendData(BYTE dat);   //byte=char
void delay_ms(WORD n);   //word=int
void InitADC();
BYTE ch = 0;   //ADC通道號,指定p1.0作為A/D輸入來用
/*PWM操作定義常量*/
#define PWM_DUTY 512   //定義PWM的周期,數值為時鐘周期數,假如使用10.24MHZ的主頻,則PWM頻率為10240/512kHZ.
#define PWM_HIGH_MIN 32   //限制PWM 輸出的最小占空比. 用戶請勿修改.
#define PWM_HIGH_MAX(PWM_DUTY-PWM_HIGH_MIN)   //限制PWM 輸出的最大占空比.

typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
sfr P3M1 = 0xB1;   //1011 0001
sfr P3M0 = 0xB2;   //1011 0010

sfr AUXR = 0xBE;   // 10 00 11 10
sfr INT_CLKO = 0xBF;   // 10 00 11 11
BYTE GBTADCResult(BYTE ch);
sbit P_PWM = P3*5;   //定義PWM 輸出引腳.
u16 pwm;  //定義PWM 輸出高電平的時間的變量. 用戶操作PWM 的變量.
u16 PWM_high,PWM_low;   //中間變量,用戶請勿修改.
void delay_ms(unsigned char ms);
void LoadPWM(u16 i);
/********************主函數**************************/
void main(void)
{

P_PWM = 0;  //中斷過程中裝載低電平
P3M1 &=~(1<<5);   //P3.5設置為推挽輸出
P3M0 |= (1<<5);   //p3口為準雙向模式


TR0 = 0;  //停止計時器T0計數,TCON
BT0 = 1;  //允許T0溢出中斷,IE
PT0 = 1;  //高優先級中斷,IP
TMOD &=~0x03;   //工作模式,0:16位自動重裝,~0x03=11111100,
                //與運算這保證后兩位一直為零,16位自動重裝 將RL_THO和RL_TLO分別自動裝入THO和TLO;
AUXR |= 0x80;   //1T;10000000,定時器 0,不分頻
TMOD &=~0x04;   //定時,~0x04=11111011,與運算這保證后第三位一直為零,
                //即保證定時器 0 當作定時器而不是計數器
INT_CLKO|= 0x01;   //輸出時鐘,或運算保證最后一位一定是1,即運行輸出

TH0 = 0;  //定時器 0 高八位為零
TL0 = 0;  //定時器 0 低八位為零
TR0 = 1;  //開始運行,允許定時器 0 開始計數
EA = 1;  //cpu開放中斷,中斷程序將16為PWM_high和PWM_low 的高8位和低8位分別賦給TH0和TL0;
pwm = PWM_DUTY*0.4678;   //給PWM 一個初值
LoadPWM(pwm);   //計算PWM 的高電平時間和低電平時間然后通過中斷將高8位和低8位分別賦給TH0和TL0
delay_ms(800);
InitADC();  //初始化ADC
}
while(1)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL |ADC_START | ch;
  _nop_();
  _nop_();
  _nop_();
  _nop_();   //等待4個nop
  while(!(ADC_CONTR&ADC_FLAG));  //等待ADC轉換完成
  if((ADC_RES*4+ADC_LOW2)<507)
pwm=PWM_DUTY*0.4678571
  if((ADC_RES*4+ADC_LOW2)>531)
pwm=PWM_DUTY*0.4678571*531.948/(ADC_RES*4+ADC_LOW2);
  LoadPWM(pwm);
delay_ms(8);
}
}

//=======================================================================
//函數:voiddelay_ms(unsigned char ms)
//描述:延時函數.
//參數:ms,要延時的 ms 數,這里只支持1~255ms,自動適應主時鐘.
=======================================================================
void delay_ms(unsigned char ms)
{
   unsigned int i;
do{
        i = POSC / 13000;
        while(-i);
}while(-ms);
}

/****************計算PWM重裝值函數*******************/
void LoadPWM(u16 i)
{
u16 j;
if(i>PWM_HIGH_MAX)  i = PWM_HIGH_MAX;   //如果寫入大于最大占空比數據,則強制為最大占空比.
if(i<PWM_HIGH_MIN)  i = PWM_HIGH_MIN;   //如果寫入小于最小占空比數據,則強制為最小占空比.
j = 65536UL - PWM_DUTY + i;   //計算PWM 低電平時間
i = 65536UL - i;              //計算PWM 高電平時間
BA = 0;
PWM_high = i;   //裝載PWM 高電平時間
PWM_low = j;    //裝載PWM 低電平時間
EA = 1;
}


/*********************Timer0 中斷函數************************/
void timer0_int (void) interrupt 1
{
if(P_PWM)
{
       TH0= (u8)(PWM_low>>8);   //如果是輸出高電平,則裝載低電平時間,即TH0等于PWM_low的高八位
                              //(U8)為強制取低八位
       TL0= (u8)PWM_low;
}
else
{
       TH0= (u8)(PWM_high>>8);   //如果是輸出低電平,則裝載高電平時間.
       TL0= (u8)PWM_high;
}
}

/*-----------------------------
         初始ADC函數
-----------------------------*/
void InitADC( )
{
P1ASF = 0x01;   //設置P1口為模擬輸入端口
ADC_RES = 0;    //清除先前的結果
ADC_LOW2 = 0;   //清除先前的結果
ADC_CONTR = ADC_POWER | ADC_SPEEDLL |ADC_START | ch;
delay_ms(2);   //ADC上電并延遲
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1038387 發表于 2022-7-5 11:50 | 只看該作者
求大佬指點下  能調通 必定感謝
回復

使用道具 舉報

板凳
ID:213173 發表于 2022-7-5 17:40 | 只看該作者
P1.0口模擬量輸入  P1.1口默認CCP0/PWM信號輸出。用8位ADC結果直接或取反(按實際需求)賦值CCAP0H寄存器。以下是基本構架。
  1. #include <STC15F2K60S2.H>
  2. #include <intrins.h>       
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. //宏定義ADC的操作命令
  6. #define ADC_POWER   0x80                        //ADC power control dit (宏定義ADC電源控制位)1000 0000
  7. #define ADC_START   0x08                        //ADC start control dit (宏定義ADC啟動控制位)0000 1000
  8. #define ADC_FLAG    0x10                        //ADC complete flag (宏定義ADC完成標志位)    0001 0000
  9. #define ADC_SPEEDLL 0x00                        //420 clocks (宏定義420時鐘)速度控制         0000 0000

  10. /*-------------------------------
  11.   延時程序(11.0592MHz 1T)
  12. -------------------------------*/
  13. void delayms(uint k)
  14. {
  15.         uint i,j;
  16.         for(i=k;i>0;i--)
  17.                 for(j=1150;j>0;j--);
  18. }
  19. /*-----------------------------------------------------------------------------
  20.   InitPWM
  21. -----------------------------------------------------------------------------*/
  22. void PWM_Init(void)
  23. {
  24.         CCON = 0;                                        //初始化PCA控制寄存器
  25.         CL = 0;                                //復位PCA寄存器
  26.         CH = 0;                         //復位PCA寄存器
  27.         CMOD = 0x0E;                                 //設置PCA時鐘源,PWM頻率=11.0592MHZ/8/256=5.400KHZ 185us
  28.         PCA_PWM0 = 0x00;                        //PCA模塊0工作于8位PWM
  29.         CCAP0H = CCAP0L = 0xFF;                //PWM0的占空比為0%
  30.         CCAPM0 = 0x42;                                //允許CCP0腳用作脈寬調節輸出
  31.         CR = 1;                                                //PCA定時器開始工作
  32. }
  33. /*-----------------------------------------------------------------------------
  34.   InitADC 初始化ADC
  35. -----------------------------------------------------------------------------*/
  36. void InitADC(void)
  37. {
  38.         P1ASF=0x01;                                                //設置P1的0通道端口作為模擬輸入
  39.         ADC_RES=0;                                                //清除ADC_RES存儲器以前的結果
  40.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL;//ADC 開啟電源、轉換速度 1000 0000
  41.         delayms(1);                                                //上電延時1ms                                                                                       
  42. }
  43. /*----------------------------------------------------------------------------
  44. Get ADC Result(獲取ADC結果)
  45. ----------------------------------------------------------------------------*/
  46. uchar Read(uchar CHA)                                //獲取ADC結果
  47. {
  48.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL|CHA|ADC_START;//啟動轉換1000 1000
  49.     _nop_();                        //延時確保正確讀到ADC_CONTR寄存器的值
  50.     _nop_();
  51.     _nop_();
  52.     _nop_();
  53.         while(!(ADC_CONTR & ADC_FLAG));        //等待ADC轉換完成
  54.         ADC_CONTR &=~ADC_FLAG;                        //清完成標志置位
  55.         return ADC_RES;                                        //返回8位ADC結果
  56. }


  57. void main()
  58. {         
  59.         P1M0 = 0x02;//P1.1推挽
  60.         P1M1 = 0x01;//P1.0高阻
  61.         P3M0 = 0x00;
  62.         P3M1 = 0x00;
  63.         P5M0 = 0x00;
  64.         P5M1 = 0x00;
  65.         PWM_Init();
  66.         InitADC();
  67.         while(1)
  68.         {        
  69.                 CCAP0H = Read(0);
  70. //                delayms(1);
  71.         }
  72. }


復制代碼
回復

使用道具 舉報

地板
ID:301191 發表于 2022-7-13 15:57 | 只看該作者
頂一下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久成人免费一区二区 | 中文字幕日韩欧美一区二区三区 | 久久精品欧美一区二区三区不卡 | 9久9久9久女女女九九九一九 | 午夜国产一级 | 亚洲视频一区在线观看 | 色精品视频 | 久久久精品影院 | av乱码| 91成人在线 | 久久精品一区二区视频 | av免费网站在线观看 | 中文字幕日本一区二区 | 成人在线免费观看 | 欧美极品一区二区 | 在线观看日韩精品视频 | 999久久久免费精品国产 | 最近日韩中文字幕 | 欧美精品一区二区三区在线 | 国家一级黄色片 | 国产精品18久久久久久白浆动漫 | www.黄色在线观看 | 久在线 | 四虎影院在线播放 | 欧美一区二区视频 | 一区二区国产在线观看 | 国产精品美女久久久久久免费 | 国产日韩欧美另类 | 欧美日韩成人 | 国产精品亚洲视频 | 免费天天干 | 久久偷人| 国产探花在线精品一区二区 | 亚洲交性 | 亚洲国产精品91 | 精品视频一区二区三区在线观看 | 日韩电影免费在线观看中文字幕 | www国产精| 久久亚洲一区二区三区四区 | 日韩欧美国产精品一区 | 国产精品观看 |