久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機PWM波的誤差問題
[打印本頁]
作者:
haoaini
時間:
2019-6-2 16:29
標題:
51單片機PWM波的誤差問題
小組在玩51單片機的開發板的時候發現,代碼上設計的PWM波為100Hz,用示波器測只有80Hz左右,出現的誤差是什么造成的
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;
//--定義使用的IO口--//
sbit PWM=P2^1;
bit DIR;
//--定義一個全局變量--//
u16 count,value,timer0;
/*******************************************************************************
* 函 數 名 : Timer1Init
* 函數功能 : 定時器1初始化
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer0Init(void) //40微秒@11.0592MHz
{
// AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0x01; //設置定時器模式
TL0 = 0xDB; //設置定時初值
TH0 = 0xFF; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
Timer0Init(); //定時器0初始化
while(1)
{
if(count>300)//多長時間變一次
{
count=0;
if(DIR==1) //DIR控制增加或減小
{
value++;
}
if(DIR==0)
{
value--;
}
}
if(value==250)
{
DIR=0;
}
if(value==0)
{
DIR=1;
}
if(timer1>250) //PWM周期為40*250=10ms,f=100Hz
{
timer1=0;
}
if(timer1 <value)
{
PWM=1;
}
else
{
PWM=0;
}
}
}
/*******************************************************************************
* 函 數 名 : Time1
* 函數功能 : 定時器1的中斷函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Time1(void) interrupt 1 //3 為定時器1的中斷號 1 定時器0的中斷號 0 外部中斷1 2 外部中斷2 4 串口中斷
{
TL0 = 0xDB; //
TH0 = 0xFF;
timer1++;
count++;
}
復制代碼
HC6800-ES V2.0 新版.pdf
2019-6-2 16:29 上傳
點擊文件名下載附件
759.71 KB, 下載次數: 7
作者:
xuyaqi
時間:
2019-6-2 17:55
調整定時器參數,修改PWM波的誤差。
作者:
honey_teck
時間:
2019-6-2 18:01
是你的count變量造成的啊,count變量就是80HZ啊。
作者:
1直到世界盡頭
時間:
2019-6-2 19:59
你先查看一下你的晶振頻率對不對 然后看一下定時進入中斷時間對不對
作者:
lele5211314
時間:
2019-6-3 13:22
你的定時器初始值需要考慮,還需要考慮的你的晶振是12MHz? 還是11.0592MHz的
作者:
wulin
時間:
2019-6-4 06:53
樓主的程序沒有打開中斷,根本就無法正常運行。定時器改8位自動重裝模式更合理些。
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;
//--定義使用的IO口--//
sbit PWM=P2^1;
bit DIR;
//--定義一個全局變量--//
u16 count,value,timer1;
/*******************************************************************************
* 函 數 名 : Timer1Init
* 函數功能 : 定時器1初始化
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer0Init() //40微秒@11.0592MHz
{
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x02; //設置定時器8位自動重裝模式
TL0 = 0xDB; //設置定時初值
TH0 = 0xDB; //設置定時重載值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
EA=1; //開總中斷
ET0=1; //開定時器0中斷
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
Timer0Init(); //定時器0初始化
while(1)
{
if(count>300)//多長時間變一次
{
count=0;
if(DIR==1) //DIR控制增加或減小
{
value++;
}
if(DIR==0)
{
value--;
}
}
if(value==250)
{
DIR=0;
}
if(value==0)
{
DIR=1;
}
if(timer1>250) //PWM周期為40*250=10ms,f=100Hz
{
timer1=0;
}
if(timer1 <value)
{
PWM=1;
}
else
{
PWM=0;
}
}
}
/*******************************************************************************
* 函 數 名 : Time1
* 函數功能 : 定時器1的中斷函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Time1(void) interrupt 1 //3 為定時器1的中斷號 1 定時器0的中斷號 0 外部中斷1 2 外部中斷2 4 串口中斷
{
// TL0 = 0xDB;
// TH0 = 0xFF;
timer1++;
count++;
}
復制代碼
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产精品日日做人人爱
|
午夜精品视频在线观看
|
一区中文字幕
|
国产人成精品一区二区三
|
日本三级日产三级国产三级
|
国产最新精品视频
|
欧美国产日韩一区二区三区
|
日韩欧美在线观看
|
亚洲激情在线
|
久久精品亚洲欧美日韩久久
|
亚洲免费在线观看
|
91精品国产日韩91久久久久久
|
国产盗摄视频
|
97国产精品视频
|
亚洲精品免费在线观看
|
欧美性大战久久久久久久蜜臀
|
密色视频
|
亚洲高清成人
|
久久精品成人一区
|
国产精品久久久久免费
|
中文在线亚洲
|
av成人在线观看
|
在线看av的网址
|
久热精品在线
|
懂色av一区二区三区在线播放
|
亚洲毛片在线观看
|
国产成人精品一区二区三区视频
|
午夜在线视频
|
久久久久久成人
|
欧美无乱码久久久免费午夜一区
|
日本aⅴ中文字幕
|
国产精品一区久久久
|
欧洲成人免费视频
|
久久久久国产一区二区三区四区
|
欧美区日韩区
|
日韩网站在线
|
一级中国毛片
|
国产精品欧美精品
|
日韩毛片播放
|
成人在线观看黄
|
欧美一区二区激情三区
|