|
本帖最后由 jmkl128 于 2018-3-20 19:01 編輯
76_1150973_7f3ea3f97047774.jpg (155.21 KB, 下載次數(shù): 40)
下載附件
2018-3-20 18:45 上傳
很簡(jiǎn)單的東西,輸出方波的頻率還比較準(zhǔn)。程序中按鍵部分采用了新的方法。
//晶振:12M (6T使能)
/*T0-計(jì)時(shí)25 微秒溢出中斷一次;P1.3 P1.4為增加、減少鍵P3.3 輸出方波
變量的定義: pwm 設(shè)定的頻率數(shù)
connter_1 根據(jù)設(shè)定頻率計(jì)算后的,定時(shí)器溢的出次數(shù)值
connter : 定時(shí)器0計(jì)數(shù)溢出數(shù)
led_seg_code: 數(shù)碼管7 段碼
*/
/*用單片機(jī)產(chǎn)生頻率可調(diào)的方波信號(hào)。輸出方波的頻率范圍為1Hz-200Hz,頻率誤差比小于0.5%。
要求用"增加"、"減小"2 個(gè)按鈕改變方波給定頻率,按鈕每按下一次,給定頻率改變的步進(jìn)步長(zhǎng)為1Hz,
當(dāng)按鈕持續(xù)按下的時(shí)間超過(guò)2 秒后,給定頻率以10 次/秒的速度連續(xù)增加(減少),輸出方波的頻率要求在數(shù)碼管上顯示。
P1.3,P1.4分別為增加和減小按鍵*/
#include<reg52.h>
#include<intrins.h>
#include <math.h>
sbit led_1=P2^4;
sbit led_2=P2^3;
sbit led_3=P2^2;
sbit led_4=P2^1;
sbit out=P2^0;
sbit pwm_out=P3^3;
unsigned char pwm;
unsigned int counter,counter_1;
unsigned char Trg; //點(diǎn)按
unsigned char Cont; //長(zhǎng)按
unsigned char cnt_plus; //長(zhǎng)按延時(shí)
unsigned char cnt_plus_time; //長(zhǎng)按速度
unsigned char code seg_table[10]= {0xfa,0x22,0xb9,0xab,0x63,0x0cb,0x0db,0xa2,0xfb,0xeb}; //1~~~~9段選碼
/**************************************
****************定時(shí)器初始化函數(shù)****************
**************************************/
void InitTimer(void)
{
TMOD &= 0xFF; //設(shè)置定時(shí)器模式 T0,8位自動(dòng)加載,25us定時(shí)中斷。T1,16位,20ms,用于按鍵檢測(cè)
TMOD |= 0x12; //設(shè)置定時(shí)器模式
TL0 = 0xCE; //設(shè)置定時(shí)初值
TH0 = 0xCE; //設(shè)置定時(shí)重載值 25us
TF0=0; //清除中斷標(biāo)記
ET0 = 1; //TO使能
TR0 = 1; //T0開(kāi)始計(jì)時(shí)
TL1 = 0xC0; //設(shè)置定時(shí)初值
TH1 = 0x63; //設(shè)置定時(shí)初值 20ms
TF1=0; //清除中斷標(biāo)記
ET1=1; //T1使能
TR1=1; //T1開(kāi)始計(jì)時(shí)
EA = 1; //開(kāi)總中斷
}
/**************************************
****************延時(shí)1ms****************
**************************************/
void delay1ms(void) //@12.000MHz
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j)
{
;
}
}
while (--i);
}
/**************************************
****************按鍵檢測(cè)****************
**************************************/
void Key(void)
{
unsigned char ReadData=P1^0xff;
Trg=ReadData&(ReadData^Cont);
Cont=ReadData;
if (Cont==0)
{
cnt_plus=0; //長(zhǎng)按標(biāo)志清0
}
if (Trg&0x10) //按下P1.3
{
pwm++;
if(pwm==201)
{
pwm=1;
}
}
if (Trg&0x08) //按下P1.4
{
pwm--;
if(pwm==0)
{
pwm=200;
}
}
if (cnt_plus<50)
{
cnt_plus++; //開(kāi)始長(zhǎng)按延時(shí)
}
if (cnt_plus>=50) //長(zhǎng)按1秒后開(kāi)始動(dòng)作
{
cnt_plus_time++; //長(zhǎng)按時(shí)速度變化
if (cnt_plus_time>10)
{
cnt_plus_time=0;
if (Cont&0X10) //長(zhǎng)按P1.3
{
if(pwm<=190)
{
pwm=pwm+10;
}
else
{
pwm++;
}
if(pwm==201)
{
pwm=1;
}
}
if (Cont&0X08) //長(zhǎng)按P1.4
{
if(pwm>=10)
{
pwm=pwm-10;
}
else
{
pwm--;
}
if(pwm==0)
{
pwm=200;
}
}
}
}
}
/**************************************
****************顯示函數(shù)****************
**************************************/
void display()
{
P0=seg_table[pwm/100];
led_1=0;
led_2=1;
led_3=1;
led_4=1;
delay1ms();
led_1=1;
P0=seg_table[(pwm%100-(pwm%10))/10];
led_1=1;
led_2=0;
led_3=1;
led_4=1;
delay1ms();
led_2=1;
P0=seg_table[pwm%10];
led_1=1;
led_2=1;
led_3=0;
led_4=1;
delay1ms();
led_3=1;
P0=0x73;
led_1=1;
led_2=1;
led_3=1;
led_4=0;
delay1ms();
led_4=1;
}
/**************************************
****************T0中斷溢出數(shù)計(jì)算****************
**************************************/
unsigned int get_T0_over_num(unsigned char p) //p 為頻率數(shù)
{
unsigned int h;
double f,*k;
f=(double)p; //轉(zhuǎn)化為浮點(diǎn)數(shù)
f=0.5/f; //半個(gè)周期的時(shí)間
f=f/0.0000272; //中斷溢出數(shù)=f/0.000025;
h=f; //取整
if (modf(f,k)>=0.5)//四舍五入
{
h=h+1;
}
return h;
}
/* C51 有專門(mén)的庫(kù)文件MATH.H,里面有個(gè)函數(shù)
它是這樣定義的extern float modf(float x, float *ip);
調(diào)用它之后,整數(shù)部分被放入*ip, 小數(shù)部分作為返回值。
*/
/**************************************
****************主函數(shù)***************
**************************************/
void main ()
{
InitTimer();
pwm = 15;
while(1)
{
counter_1=get_T0_over_num(pwm);
display();
}
}
/**************************************
****************T0中斷,用于改變方波頻率****************
**************************************/
void Timer0Interrupt(void) interrupt 1
{
counter++;
if(counter==counter_1)
{
counter = 0 ;
pwm_out = ~pwm_out;
out= pwm_out;
}
}
/**************************************
****************T1中斷,用于檢測(cè)按鍵****************
**************************************/
void tm1_isr() interrupt 3 using 1
{
TR1=0; //關(guān)閉定時(shí)器T1
Key(); //執(zhí)行鍵盤(pán)掃描
TL1 = 0xC0; //設(shè)置定時(shí)初值
TH1 = 0x63; //設(shè)置定時(shí)初值
TR1=1; //啟動(dòng)定時(shí)器T1
}
方波.rar
(1.96 KB, 下載次數(shù): 73)
2018-3-20 18:49 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|