|

楼主 |
发表于 2020-9-9 13:50:39
|
显示全部楼层
全部源程序
- #include "AT89X52.h"
- #include "stdio.h"
- typedef unsigned char uint8_t;
- typedef unsigned int uint16_t;
- typedef unsigned long uint32_t;
- sbit CLR = P2^0;
- sbit CLK = P2^1;
- sbit CLKEN = P2^2;
- sbit LED = P2^3;
- sbit LED2 = P2^4;
- extern bit flag = 0;
- extern unsigned char Cont1[8] = {0};
- const unsigned char ADD_data[8] = {0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef};
- unsigned int timer2_ctr = 0;
- unsigned long int0_count = 0;
- void timer0_isr() interrupt 1
- {
- //!!!注意!!! 定时器2必须由软件对溢出标志位清零,硬件不能清零,这里与定时器0和定时器1不同!!!
- TL0 = 0xB0; //设置定时初值
- TH0 = 0x3C; //设置定时初值
- timer2_ctr++;
-
- if(timer2_ctr>=5)
- {
- flag = 1;
- TR0 = 0;
- }
- }
- void Uart_Isr() interrupt 4
- {
- if (RI)
- RI = 0; //Clear receive interrupt flag
- if (TI)
- TI = 0; //Clear transmit interrupt flag
- }
- //-----------------------------------------------------------------------------------
- //--外部中断0
- //-----------------------------------------------------------------------------------
- void exint0() interrupt 0 //(location at 0003H)
- {
- int0_count++;
- if(int0_count>=1000000000){
- int0_count = 0;
- flag = 1;
- }
- }
- char putchar(char c){
- TI = 0;
- SBUF = c;
- while(!TI);
- TI = 0;
- return c;
- }
- void Timer0Init(void) //50毫秒@12.000MHz
- {
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01;
- TL0 = 0xB0; //设置定时初值
- TH0 = 0x3C; //设置定时初值
- TF0 = 0; //清除TF0标志
- // TR0 = 1; //定时器0开始计时
- ET0=1; //开启定时器0中断
- }
- void init_serialcom(void) //串口配置 2400 波特率
- {
- SCON=0x50;
- TCON=0x40;
- TMOD=0x20; //直接赋值,init_serialcom应在Timer0Init前
- TL1 = 0xf3; //设定定时初值
- TH1 = 0xf3; //设定定时初值
- IP=0x00;
- IE=0x00;
- PCON=0x00;
- REN=1;
- ES=1;
- TR1 = 1;
-
- // IT0 = 1; //set INT0 int type (1:Falling下降沿触发 0:Low level低电平触发)
- // EX0 = 1; //enable INT0 interrupt
-
- EA = 1; //open global interrupt switch
- }
- //-----------------------------------------------------------------------------------
- //--主函数
- /*
- C1=00007800
- C2=0098967F //9999999
- F= 30720.0030Hz
- C1=00008000
- C2=00989680 //10000000
- F= 32768.0000Hz
- C1=000186A0
- C2=00989680
- F= 100000.000Hz
- C1=000F423B
- C2=0098964E
- F= 1000000.00Hz
- */
- //-----------------------------------------------------------------------------------
- void main(void)
- {
- unsigned char i = 0 ;
- unsigned char dbuff[8] = 0;
- unsigned long d1,d2;
- P0 = 0xff; //读590口
- P1 = 0xff; //590的OE
- P2 = 0xff;
-
- init_serialcom();
- Timer0Init();
- CLK = 1;
- CLR = 1;
-
- printf("test\r\n");
-
- CLR = 0; // 重置590
- CLR = 1;
- timer2_ctr = 0;
- TR0 = 1;
- CLKEN = 0;
-
- while(1)
- {
- if(flag==1)
- {
- CLKEN = 1; //关闭590计数器
- flag=0;
- CLK = 0;
- CLK = 1; //上升沿:存入590寄存器
-
- for(i=0;i<8;i++)
- {
- //P0 = 0xff;
- P1 = ADD_data[i];
- Cont1[i] = P0;
- }
- for(i=0;i<4;i++)
- {
- d1 += Cont1[i];
- d1<<=8;
- d2 += Cont1[i+4];
- d2<<=8;
- }
- printf("%lu %lu %fkHz\r\n",d1,d2,(float)(d1*10000.00/d2));
-
- CLR = 0; // 低电平:重置590
- CLR = 1;
- timer2_ctr = 0;
- TR0 = 1;
- CLKEN = 0; // 使能590计数
- }
- }
- }
复制代码
补充内容 (2020-9-18 10:13):
代码有个地方错了,160行应该在159行前面,162行应该在161行前面 |
|