#include <reg52.h>
/*
本程序功能,輸出方波,頻率1-25ms
[email protected] /12T
*/
sbit Pulse=P1^1; //---方波
sbit Add=P3^2; //---頻率加
sbit Dec=P3^3; //---頻率減
sbit Start = P1^3; //---開關鍵
sbit Display_Ten_Bit = P2^0;
sbit Display_Bit_Bit = P2^1;
code unsigned char TH0_Reload[21] = {
0x00,0x0B,0x0B,0x26,0x0B,0x3C,0x5D,
0x74,0x0B,0x26,0x3C,0x4E,0x5D,0x69,
0x74,0x7D,0x85,0x8D,0x93,0x99,0x9E
};
code unsigned char TL0_Reload[21] = {
0x00,0xDC,0xDC,0xFC,0xDC,0xB0,0x3D,
0x7D,0xDC,0xFC,0xB0,0x71,0x3D,0xC2,
0x7E,0xCB,0xEE,0x1C,0x7E,0x34,0x58
};
code unsigned char Pre_Freq[21] = {255,8,4,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1};
#define TH1_RELOAD 0xF4//---定時器1初始值,定時3ms
#define TL1_RELOAD 0x48//---定時器1初始值,定時3ms
data unsigned char Freq = 20; //---頻率值
data unsigned char Fre_Cnt = 0; //---計數值
bit Display_Bits = 0;
//----共陽數碼管-----------------------------------------------------------------------
code unsigned char Seg_Table[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//----用于按鍵去抖動的延時-------------------
void Key_Delay(void)
{
unsigned short i = 60000;
while(i++);
}
void main()
{
//----定時器1,定時3ms,用于動態顯示-----------
TH1 = TH1_RELOAD;
TL1 = TL1_RELOAD;
//----用于輸出脈沖波--------
TH0 = TH0_Reload[0];
TL0 = TL0_Reload[0];
//----兩定時器都工作于方式1,且都開中斷--------
TMOD = 0x11;
ET0 = 1;
ET1 = 1;
EA = 1;
//----開啟定時器1,即顯示----------------------
TR1 = 1;
while(1)
{
if(Add == 0) //---如果"頻率+"鍵 按下
{
Key_Delay(); //---按鍵去抖
if(Add == 0)
{
if(Freq<20) Freq++; //----如果頻率值小于20,則加1
while(Add == 0); //---等待按鍵送開
}
}
if(Dec == 0) //---如果"頻率-"鍵 按下
{
Key_Delay();
if(Dec == 0)
{
if(Freq>1) Freq--; //----如果頻率值大于1,則減1
while(Dec == 0); //---等待按鍵送開
}
}
if(Start == 0)//---如果"啟動/暫停"鍵 按下
{
Key_Delay(); //---按鍵去抖
if(Start == 0)TR0 = 1; //---啟動定時器0,輸出方波
}
else
{
TR0 = 0; //---關閉定時器0,暫停輸出
}
}
}
void ISR_Timer0_Pulse () interrupt 1
{
//----定時器0重載-----------------------------------
TH0 = TH0_Reload[Freq];
TL0 = TL0_Reload[Freq];
//----計數值自加------------------------------------
Fre_Cnt++;
//----如果計數值不小于頻率值,翻轉一次---------------
if(Fre_Cnt >= Pre_Freq[Freq])
{
Pulse = ~Pulse;
Fre_Cnt = 0; //---清零計數值--------------------
}
}
void ISR_Timer0_Display() interrupt 3
{
//----定時器1重載-----------------------------------
TH1 = TH1_RELOAD;
TL1 = TL1_RELOAD;
//----決定顯示十位還是個位--------------------------
Display_Bits = ~Display_Bits;
//----數碼管驅動------------------------------------
if(Display_Bits) //----顯示十位
{
Display_Bit_Bit = 1; //---關閉個位的位選
P0 = Seg_Table[Freq/10]; //---送十位的段碼
Display_Ten_Bit = 0; //---打開十位位選
}
else //----顯示個位
{
Display_Ten_Bit = 1; //---關閉十位的位選
P0 = Seg_Table[Freq%10]; //---送個位的段碼
Display_Bit_Bit = 0; //---打開個位的位選
}
}
有不明白的歡迎追問