📄 freqtestpro.c
字号:
#include <reg52.h>
#include <stdio.h>
#include <ctype.h>
#include <intrins.h>
/***************************************************************
* Local Variables
****************************************************************/
sbit led1Ctl = P3^7;
sbit led2Ctl = P3^6;
sbit led3Ctl = P3^5;
#define LED_ON 1
#define LED_OFF 0
#define LED_N1 1
#define LED_N2 2
#define LED_N3 3
/***************************************************************
* Time Delay Functions
****************************************************************/
/* delay time is (2*n+1)*Ts(1us)+2Ts */
static void udelay(unsigned int i)
{
while(--i); // 0: delay 3Ts 1: delay 5Ts 2: delay 7Ts
}
#ifdef SYS_NOP
/* Delay 20Ts */
static void nop(void)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
#endif /* SYS_NOP */
/***************************************************************
* Led Contorl Function
****************************************************************/
void Led_Ctl_Api(unsigned int lednum, unsigned int ledctl)
{
switch(lednum)
{
case LED_N1:
if(ledctl == LED_ON)
{
P3 = P3|(1<<7);
}
else
{
P3 = P3&(~(1<<7));
}
break;
case LED_N2:
if(ledctl == LED_ON)
{
P3 = P3|(1<<6);
}
else
{
P3 = P3&(~(1<<6));
}
break;
case LED_N3:
if(ledctl == LED_ON)
{
P3 = P3|(1<<5);
}
else
{
P3 = P3&(~(1<<5));
}
break;
default:
printf("LED_Ctl_Api Error:: lednum not in range of 1~3 \n");
break;
}
return;
}
/***************************************************************
* Uart Contorl Function
* --------------------------------------------------------------
* 模式1:8位串行数据传送,波特率由计时器1来控制。计时器工作
* 于模式2(自动重新载入模式),此时使用的计数器为TL1,而TH1
* 则用做自动载入及时制计时值的设定。波特率的计算关系如下:
* TH1=256-(2@SMOD*(工作频率))/(384*波特率)
* SCON: B7 B6 B5 B4 B3 B2 B1 B0
* SM0 SM1 SM2 REN TB8 RB8 TI RI
* --------------------------------------------------------------
* TOMD: B7 B6 B5 B4 B3 B2 B1 B0
* T1&T0 GATE C/T M1 M0 GATE C/T M1 M0
* --------------------------------------------------------------
* 串口RS232初始化,传输协议 9600bps 8位 没有校验 1个停止位
* --------------------------------------------------------------
****************************************************************/
/* Uart 1 Init */
void Uart_Init_Api(void)
{
PCON = 0x80; //SMOD=1
//PCO N= 0x00; //SMOD=0
SCON = 0x52; //Smod1 enable REN=1
TMOD = 0x20; //Timer 1 Tmod2
//TH1 = 0xfd; //253 SMOD=0 9600
TH1 = 0xf4; //253 SMOD=1 4800
TL1 = 0xf4;
TCON = TCON|0x40; //TR1=1 启动定时/计数器1
return;
}
/* Uart 1 Rx */
unsigned char Uart_Rx_Api(void)
{
unsigned char tmpval;
if(RI == 1)
{
tmpval = SBUF&0xff;
udelay(2);
RI = 0;
}
else
{
//printf("Uart_Rx_Api Error:: no data be received \n");
return(0);
}
return(tmpval);
}
/* Uart 1 Tx */
void Uart_Tx_Api(unsigned char sendval)
{
unsigned int iloop = 0;
SBUF = sendval;
udelay(2);
for(iloop=0; iloop<32; iloop++)
{
if(TI == 1)
{
break;
}
}
TI = 0;
return;
}
/* Uart 1 Int Process */
unsigned char getdata[32];
unsigned int loopHi = 0;
unsigned int loopLi = 0;
void Uart_Rx_ints(void) //interrupt 4 using 2
{
EA = 0; // Int Lock
if(RI == 0)
{
return;
}
getdata[loopHi] = SBUF;
loopHi++;
loopHi = loopHi%32;
RI = 0;
EA = 1; // Int Unlock
return;
}
#undef UART_CMD
#ifdef UART_CMD
/***************************************************************
* Uart Command Parse
****************************************************************/
void Cmd_Parse_Api(unsigned char command)
{
unsigned char temp;
if(loopLi == loopHi)
{
return;
}
loopLi++;
loopLi = loopLi%32;
temp = getdata[loopLi];
switch (temp)
{
case 0:
break;
case 1:
break;
default:
break;
}
return;
}
#endif /* UART_CMD*/
/***************************************************************
* Interrupt Process
* --------------------------------------------------------------
* interrupt 表示一个中断函数,属性参数为0到31的整常数
* 中断号 中断说明 地址
* 0 外部中断0 0003H
* 1 计时/计数器0 000BH
* 2 外部中断1 0013H
* 3 计时/计数器1 001BH
* 4 串口 0023H
* --------------------------------------------------------------
* 附::(13位)TH0=(8192-C)%32 TL0=(8192-C)/32 Time = C*Ts
* 附::(16位)TH0=(65536-C)%256 TL0=(65536-C)/256 Time = C*Ts
* --------------------------------------------------------------
****************************************************************/
unsigned int timecount = 0;
unsigned int timeflag = 0;
static void Int_T0_Process(void) interrupt 1 using 0
{
TL0 = 256;
TH0 = 256;
timecount++;
//printf("\n Int_T0_Process timecount is %d \n", timecount);
return;
}
static void Int_E0_Process(void) interrupt 0 using 1
{
if(timeflag == 0)
{
timeflag = 1;
TL0 = 256;
TH0 = 256;
TR0 = 1; // Start Timer 0
}
else
{
timeflag = 0;
TR0 = 0; // Close Timer 0
}
return;
}
/***************************************************************
* TCON: B7 B6 B5 B4 B3 B2 B1 B0
* TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
* --------------------------------------------------------------
* IE: B7 B6 B5 B4 B3 B2 B1 B0
* EA -- ET2 ES ET1 EX1 ET0 EX0
* --------------------------------------------------------------
* IP: B7 B6 B5 B4 B3 B2 B1 B0
* -- -- PT2 PS PT1 PX1 PT0 PX0
****************************************************************/
void Int_Init_Api()
{
EA = 0;
//SP = 0x60; // Init Stack
IT0 = 0; // Low Level Trigger Int
//IT0 = 1; // Fall Edge Trigger Int
TL0 = 252;
TH0 = 28;
//ET0 = 0;
ET0 = 1;
//ES=1;
//EX0=1; // Enable Ex INT0
TR0=1; // Start Timer 0
//TR1 = 1; // Start Timer 1
EA = 1;
}
/***************************************************************
* Data (Digital Divide) In Select
* 0: Digital Divide By 64*1*1 = 64
* 1: Digital Divide By 64*2*1 = 128
* 2: Digital Divide By 64*4*1 = 256
* 3: Digital Divide By 64*8*1 = 512
* 4: Digital Divide By 64*8*1 = 512
* 5: Digital Divide By 64*8*2 = 1024
* 6: Digital Divide By 64*8*4 = 2048
* 7: Digital Divide By 64*8*8 = 4096
****************************************************************/
void Freq_Data_Select(unsigned int sel)
{
P2 = P2&0xF8;
P2 = P2|(sel&0x7);
}
/***************************************************************
* Systenm Init
****************************************************************/
void Sys_Init_Api()
{
/* Init I/O */
P1 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0x1f;
/* Init Mc Control */
P2 = P2|(1<<6); // Divide By 64
//P2 = P2&(~(1<<6)); // Divide By 256
/* Init Int */
Int_Init_Api();
/* Init Uart */
Uart_Init_Api();
/* Select Freq */
Freq_Data_Select(0); // Digital Divide By 256
timecount = 0;
return;
}
#define UART_DEBUG
#ifdef UART_DEBUG
/***************************************************************
* Uart Teat
****************************************************************/
void Uart_Run_Api(void)
{
unsigned char tmpc;
tmpc = Uart_Rx_Api();
if(tmpc == 0)
{
return;
}
Uart_Tx_Api(tmpc);
return;
}
#endif
/***************************************************************
* Led Test
****************************************************************/
void Led_Run_Api(void)
{
Led_Ctl_Api(1, LED_ON);
udelay(20000);
Led_Ctl_Api(1, LED_OFF);
}
/***************************************************************
* main
****************************************************************/
void main()
{
Sys_Init_Api();
for(;;)
{
#ifdef UART_CMD
Cmd_Parse_Api();
#endif
Led_Run_Api();
//udelay(200*200);
//printf("\n XinTinG 频率计界面 \n");
#ifdef UART_DEBUG
Uart_Run_Api();
#endif
udelay(100);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -