001.jpg (66.52 KB, 下載次數: 87)
下載附件
2021-2-4 16:08 上傳
單片機源程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
ulong cnt;
uint cnt_T1, high, low;
uchar TH0_H, TL0_H, TH0_L, TL0_L, T1H1, T1L1, flag = 0;
uchar duty[19] = {5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95};
sbit out = P3^7;
uchar shuying = 0;
void delay_fy(uchar fy, uchar dy);
void time_1(uchar ms);
void sm_du(uchar dy);
void main()
{
TMOD = 0X11; // 定時器0/1都工作在方式1,是2^16計數
EA=1;
delay_fy(100, 5);
time_1(50);
while(1);
}
void delay_fy(uchar fy, uchar dy) // 輸入頻率fy,占空比dy
{
cnt = (11059200/fy)/12; // 要產生頻率為fy,定時器0所要計的數值
high = (cnt*dy)/100; // 計算出高電平所要計的數值
low = cnt - high; // 計算出低電平所要計的數值
high = 65536 - high; // 確定定時器0,從哪個初值開始計時,記錄的是高電平
low = 65536 - low; // 確定定時器0,從哪個初值開始計時,記錄的是低電平
TH0_H = (uchar)(high>>8); // 高電平,給TH0預備重裝初值
TL0_H = (uchar)high; // 高電平,給TL0預備重裝初值
TH0_L = (uchar)(low>>8); // 低電平,給TH0預備重裝初值
TL0_L = (uchar)low; // 低電平,給TL0預備重裝初值
TH0 = TH0_H;
TL0 = TL0_H;
out = 1;
ET0 = 1;
TR0 = 1;
}
void time_1(uchar ms)
{
ulong temp;
temp = 11059200/1000;
temp = (temp*ms)/12;
cnt_T1 = 65536 - temp;
T1H1 = (uchar)(cnt_T1>>8);
T1L1 = (uchar)cnt_T1;
TH1 = T1H1;
TL1 = T1L1;
ET1=1;
TR1=1;
}
void sm_du(uchar dy)
{
high = (cnt*dy)/100;
low = cnt - high;
high = 65536 - high;
low = 65536 - low;
}
void time_0() interrupt 1
{
if(out==0) // 準備產生高電平
{
TH0 = TH0_H; // 高電平產生 初值重裝
TL0 = TL0_H;
out = 1;
}
else
{
TH0 = TH0_L; // 低電平產生 初值重裝
TL0 = TL0_L;
out = 0;
}
}
void T1_Timer1() interrupt 3
{
TH1 = T1H1;
TL1 = T1L1;
sm_du(duty[shuying]);
if(0 == flag) // flag=0時,表示呼吸燈由暗變亮
{
shuying++;
if(shuying >=18)
{
flag = 1;
}
}
}
}
詳見附件
經典兩定時器控制呼吸燈001.rar
(16.56 KB, 下載次數: 20)
2021-2-4 16:09 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|