當打開比較器的時候,再開定時器0,就會開不了。就算是開其它定時器的時候也會造成一些問題。
源代碼
#include "stc8.h"
#include <stdio.h>
unsigned char flag10ms,flag100ms;
unsigned int flag1s,flag10s;
bit flag1ms,readcard;
void init(void)
{
SCON = 0x50; //8位數據,可變波特率
AUXR |= 0x01; //串口1選擇定時器2為波特率發生器
AUXR |= 0x04; //定時器2時鐘為Fosc,即1T
T2L = 0xE0; //設定定時初值
T2H = 0xFE; //設定定時初值
AUXR |= 0x10; //啟動定時器2
// TR1 = 1;
TI = 1;
printf("Start\n");
}
void PWMInt(void)
{
P_SW2 = 0x80;
PWM1CR = 0x00; //PWM0/P2.0
PWMCKS = 0x00; // PWM時鐘為系統時鐘
PWMC = 0x0058; //設置PWM周期為1000H個PWM時鐘
PWM1T1 = 0x0000; //在計數值為100H地方輸出低電平
PWM1T2 = 0x002C; //在計數值為500H地方輸出高電平
PWM1CR = 0x80; //使能PWM1輸出
P_SW2 = 0x00;
PWMCR |= 0x80; //啟動PWM模塊
}
void CMPInt(void)
{
CMPCR2 = 0x00;
CMPCR2 &= ~0x80; //比較器正向輸出
CMPCR2 &= ~0x40; //使能0.1us濾波
CMPCR2 |= 0x3E; //比較器結果經過63個去抖時鐘后輸出
CMPCR1 = 0x00;
CMPCR1 |= 0x30; //使能比較器邊沿中斷
CMPCR1 &= ~0x08; //P3.6為CMP+輸入腳
CMPCR1 |= 0x04; //P3.7為CMP-輸入腳
CMPCR1 &= ~0x02; //禁止比較器輸出
CMPCR1 |= 0x80; //開啟比較器模塊
// EA = 1;
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TL0 = 0xCD; //設置定時初值
TH0 = 0xD4; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0 = 1; //使能定時器中斷
EA = 1;
}
void TM0_Isr() interrupt 1
{
flag1ms=1;
}
/*
void TM1_Isr() interrupt 3
{
flag1ms=1; //測試端口
}
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x40; //定時器時鐘1T模式
TMOD &= 0x0F; //設置定時器模式
TL1 = 0xCD; //設置定時初值
TH1 = 0xD4; //設置定時初值
TF1 = 0; //清除TF1標志
TR1 = 1; //定時器1開始計時
ET1 = 1; //使能定時器中斷
EA = 1;
}/*
void TM3_Isr() interrupt 19
{
flag1ms=1; //測試端口
AUXINTIF &= ~T3IF; //清中斷標志
}
void Timer3Init(void) //1毫秒@11.0592MHz
{
T4T3M |= 0x02; //定時器時鐘1T模式
T3L = 0xCD; //設置定時初值
T3H = 0xD4; //設置定時初值
T4T3M |= 0x08; //定時器3開始計時
IE2 = ET3; //使能定時器中斷
EA = 1;
}
*/
main()
{
//初始化
flag1ms=readcard=0;
flag10ms=flag100ms=flag1s=flag10s=0;
PWMInt();
CMPInt();
init();
Timer0Init();
while (1)
{
if(flag1ms)
{
flag1ms=0;
if(++flag10ms>=10)
{
flag10ms=0;
printf("10MS\n");
}
if(++flag100ms>=100)
{
flag100ms=0;
printf("100MS\n");
}
if(++flag1s>=1000)
{
flag1s=0;
printf("1000MS\n");
}
if(++flag10s>=10000)
{
flag10s=0;
printf("10000MS\n");
}
}
}
}
不知道是我的編譯器問題,還是其它問題,有沒有師兄復現下,看看是我的程序問題還是單片機的bug謝謝了。
|