欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC15F204W開雙定時器問題
[打印本頁]
作者:
zwmwcj
時間:
2017-5-5 21:58
標題:
STC15F204W開雙定時器問題
#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr AUXR = 0x8e; //輔助寄存器
sfr S2CON = 0x9a; //UART2 控制寄存器
sfr S2BUF = 0x9b; //UART2 數據寄存器
sfr T2H = 0xd6; //定時器2高8位
sfr T2L = 0xd7; //定時器2低8位
sfr IE2 = 0xaf; //中斷控制寄存器2
WORD vel=0;
sbit P10=P1^0;
bit busy;
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位數據,可變波特率
AUXR |= 0x04; //定時器2時鐘為Fosc,即1T
T2L = 0xE0; //設定定時初值
T2H = 0xFE; //設定定時初值
AUXR |= 0x01; //串口1選擇定時器2為波特率發生器
AUXR |= 0x10; //啟動定時器2
}
void Timer0Init(void) //10微秒@11.0592MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x02; //設置定時器模式
TL0 = 0x91; //設置定時初值
TH0 = 0x91; //設置定時重載值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
}
/*----------------------------
發送串口數據
----------------------------*/
void SendData(BYTE dat)
{
while (busy); //等待前面的數據發送完成
busy = 1;
SBUF = dat; //寫數據到UART數據寄存器
}
void main()
{
UartInit();
Timer0Init();
while(1);
}
void timer0 (void) interrupt 1
{
if(vel==200)
{
P10=~P10;
SendData(P10);
}
vel++;
}
void Uart() interrupt 4 using 1
{
if (RI)
{
RI = 0; //清除RI位
}
if (TI)
{
TI = 0; //清除TI位
busy = 0; //清忙標志
}
}
復制代碼
我想開啟兩個定時器,定時器0和定時器2,定時器0做定時使用,定時器2做串口調試使用,單個定時器我都能成功開通,但兩個一起開,串口能正常工作,定時器0不能正常工作。串口讀取不到P10送出的值,單獨開通串口能正常工作,不知我那里寫錯了,會的朋友能指導下。
作者:
iofree
時間:
2019-2-4 11:21
傳統51的串口是使用T1定時器的,樓主用的STC15F204W是STC自行擴展的標準,要使用STC的頭文件才能用上T2產生波特率,建議樓主仔細看下STC數據手冊和例程
作者:
angmall
時間:
2019-2-4 16:21
之所以不能使用串口中斷,是因為你的定時器設置太小,已經等于小于串口機器周期。而定時器中斷優先級高于串口中斷,所以不能執行串口中斷。解決方法1定時器時間改長一點2把串口優先級設高于定時器。
作者:
dzbj
時間:
2019-2-5 03:23
我也是你這么用的 都挺好 你對比一下 另外 11.0592下 10微秒太小了 0誤差至少要17微秒
下面是定時器0的初始化 上面是官網 下面是你的 對比一下
/*STC官網范例
void Timer0Init(void) //5毫秒@11.0592MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0x00; //設置定時初值
TH0 = 0x28; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
}*/
//你的程序
void Timer0Init(void) //10微秒@11.0592MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x02; //設置定時器模式
TL0 = 0x91; //設置定時初值
TH0 = 0x91; //設置定時重載值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
}
//串口初始化
//你的程序
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位數據,可變波特率
AUXR |= 0x04; //定時器2時鐘為Fosc,即1T
T2L = 0xE0; //設定定時初值
T2H = 0xFE; //設定定時初值
AUXR |= 0x01; //串口1選擇定時器2為波特率發生器
AUXR |= 0x10; //啟動定時器2
}
//我的程序
void Init_UART1() //串口初始化 1T/定時器2作波特率發生器
{
SCON = 0x50; //8位數據,可變波特率
AUXR |= 0x01; //串口1選擇定時器2為波特率發生器
AUXR |= 0x04; //定時器2時鐘為Fosc,即1T
T2L = BAUD1L; //設定定時初值
T2H = BAUD1H; //設定定時初值
AUXR |= 0x10; //啟動定時器2
ES=1; //開串口中斷
}
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1