找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1125|回复: 19
打印 上一主题 下一主题
收起左侧

单片机C程序报错,编译不通过error C129: missing ';' before 'P36_o_74f161_clr_n'

[复制链接]
跳转到指定楼层
楼主
麻烦大家帮我检查一下C程序,运行结果是这样的
Build target 'Target 1'

Text3.c(3): warning C318: can't open file 'sfr.h'
Text3.c(4): warning C318: can't open file 'os.h'
TEXT3.C(7): error C129: missing ';' before 'P36_o_74f161_clr_n'
Target not created


// 8051单片机初始源程序
//
#include <sfr.h>
#include <os.h>
#include <stdlib.h>
#include <stdio.h>
_sfrbit P36_o_74f161_clr_n = _p3^6; //
_sfrbit P35_o_74f161_enp = _p3^5; //外部计数器F161有效(Enable)
_sfrbit P30_io_74hc393_clr_hold = _p3^0;  //外部计数器HC393复位/HOLD输入
_sfrbit P37_i_prescaler = _p3^7; // 64分频的预分频器
//
//七段LED字形数据
// hgfedcba
#define DIG0 0xC0 // 11000000b ; 0 P2.0
#define DIG1 0xF9 // 11111001b ; 1 +-----a-----+
#define DIG2 0xA4 // 10100100b ; 2 | |
#define DIG3 0xB0 // 10110000b ; 3 P2.5 f b P2.1
#define DIG4 0x99 // 10011001b ; 4 | |
#define DIG5 0x92 // 10010010b ; 5 | P2.6 |
#define DIG6 0x82 // 10000010b ; 6 +-----g-----+
#define DIG7 0xD8 // 11011000b ; 7 | |
#define DIG8 0x80 // 10000000b ; 8 P2.4 e c P2.2
#define DIG9 0x98 // 10011000b ; 9 | |
// ; | P2.3 |
#define DIGM 0xBF // 10111111b ; - +-----d-----+ * h P2.7
#define DIGP 0x7F // 01111111b ; .
#define DIGB 0xFF // 11111111b ; "Blank"(“空白”)
//
const char segment_pattern[] = { DIG0, DIG1, DIG2,\
DIG3, DIG4, DIG5, DIG6, DIG7, DIG8, DIG9 };
//
const char segment_select[] = { 0xFE, 0xFD, 0xFB, \
0xF7, 0xEF, 0xDF, 0xBF, 0x7F };
//
unsigned long trailer;
unsigned long task;
unsigned int trimer;
unsigned char fnd[8];
unsigned char mfnd[8];
unsigned int int_state;
unsigned char fnd_state;
unsigned char boat;
bit hold;
//
//
void _interrupt IVN_TIMER1 time_base() {
//////////////////////////////////////////////
_tl1 = 0x60; _th1 = 0xF0; // 4000 2 M Sec 500 Times
//////////////////////////////////////////////
_p0 = 0xff;
_p2 = segment_select[fnd_state];
_p0 = fnd[fnd_state++];
fnd_state &= 0x07;
//////////////////////////////////////////////
if(int_state == 0) { //
P35_o_74f161_enp = 0; //外部计数器F161计数禁止
P30_io_74hc393_clr_hold = 1; //外部计数器HC393复位
P36_o_74f161_clr_n = 0; //外部计数器F161复位
_tl0 = 0x00; _th0 = 0x00; //内部计数器复位
hold = P30_io_74hc393_clr_hold; //  HOLD(保持)键状态输入
P36_o_74f161_clr_n = 1; // 外部计数器F161有效(Enable)
P30_io_74hc393_clr_hold = 0; //  外部计数器HC393有效(Enable)
P35_o_74f161_enp = 1; //  外部计数器F161进行计数
}
//////////////////////////////////////////////
if(int_state == 316) { //  10GHz状态(64分频的预分频器)
if (!P37_i_prescaler) { //  门控时间为0.64秒
for (trimer = 0; trimer<202; trimer++) ; //  15个机器周期单位
// 测试信号24MHz输入
boat++; // 15360000 用于显示,需调整
boat++; //  延迟1个机器周期(12个时钟周期)
boat++; // 15359988
boat++; // 15360000
// boat++; // 15360012
P35_o_74f161_enp = 0; //  外部计数器停止
trailer = _th0;
trailer = (trailer << 20) & 0x0ff00000;
task = _tl0;
task = (task << 12) & 0x000ff000;
trailer |= task;
task = _p3;
task = (task << 7) & 0x00000f00;
trailer |= task;
task = _p1 & 0x000000ff;
trailer |= task;
P35_o_74f161_enp = 1; // ?? ??? ???? ?????
// 电流消耗,
// 外部计数器将重新开始。
}
}
//////////////////////////////////////////////
if(int_state == 494) { // 100 MHz Mode 1 Sec Gate Time
if (P37_i_prescaler) { // 1 Sec Gate Time
for (trimer = 0; trimer<248; trimer++) ; //  15个机器周期单位
// 测试24MHz信号源输入
boat++; // 24000000 用于显示,需调整
boat++; //
boat++; //
boat++; //
boat++; //  延迟1个机器周期(12个时钟周期)
boat++; // 23999988
boat++; // 24000000
// boat++; // 24000012

P35_o_74f161_enp = 0; // 外部计数器停止
trailer = _th0;
trailer = (trailer << 20) & 0x0ff00000;
task = _tl0;
task = (task << 12) & 0x000ff000;
trailer |= task;
task = _p3;
task = (task << 7) & 0x00000f00;
trailer |= task;
task = _p1 & 0x000000ff;
trailer |= task;
P35_o_74f161_enp = 1; // ?? ??? ???? ?????
// 电流消耗,以时间表
// 外部计数器重新开始。
}
}
//////////////////////////////////////////////
if(int_state == 506) { //  1Hz数字显示
boat = trailer % 10;
mfnd[7] = segment_pattern[boat & 0xf];
trailer /= 10;
}
//////////////////////////////////////////////
if(int_state == 507) {
boat = trailer % 10;
mfnd[6] = segment_pattern[boat & 0xf];
trailer /= 10;
}
//////////////////////////////////////////////
if(int_state == 508) {
boat = trailer % 10;
mfnd[5] = segment_pattern[boat & 0xf];
trailer /= 10;
}
//////////////////////////////////////////////
if(int_state == 509) {
boat = trailer % 10;
mfnd[4] = segment_pattern[boat & 0xf];
trailer /= 10;
}
//////////////////////////////////////////////
if(int_state == 510) {
boat = trailer % 10;
mfnd[3] = segment_pattern[boat & 0xf];
trailer /= 10;
}
//////////////////////////////////////////////
if(int_state == 511) {
boat = trailer % 10;
mfnd[2] = segment_pattern[boat & 0xf];
trailer /= 10;
}
//////////////////////////////////////////////
if(int_state == 512) {
boat = trailer % 10;
mfnd[1] = segment_pattern[boat & 0xf];
trailer /= 10;
}
//////////////////////////////////////////////
if(int_state == 513) {
boat = trailer % 10;
mfnd[0] = segment_pattern[boat & 0xf];
trailer /= 10;
}
//////////////////////////////////////////////
int_state++;
//////////////////////////////////////////////
if(int_state >= 514) {
int_state = 0;
if (hold) {
fnd[0] = mfnd[0];
fnd[1] = mfnd[1];
fnd[2] = mfnd[2];
fnd[3] = mfnd[3];
fnd[4] = mfnd[4];
fnd[5] = mfnd[5];
fnd[6] = mfnd[6];
fnd[7] = mfnd[7];
if (P37_i_prescaler) {
fnd[1] &= 0x7F; // MHz点
} else {
fnd[0] &= 0x7F; // GHz点
}
}
}
//////////////////////////////////////////////
}
main()
{
_tmod = 0x15; // 0b00010101 Timer0 = Mode1, Counter, use TR0
// Timer1 = Mode1, Timer, use TR1
_tl0 = 0X0; _th0 = 0X0;
_tl1 = 0X0; _th1 = 0X0;
_tr0 = 1; // Timer 0 计数开始
_tr1 = 1; // Timer 1 计数开始
_et1 = 1; // 设置定时器1中断状态
_ea = 1; //    设置全局中断状态
while(1) ;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2023-4-24 15:29 | 只看该作者
应该把 _sfrbit 改为 sbit
回复

使用道具 举报

板凳
ID:655665 发表于 2023-4-24 15:43 | 只看该作者
xuyaqi 发表于 2023-4-24 15:29
应该把 _sfrbit 改为 sbit

谢谢大神, 刚试过了,还是一样报错.
回复

使用道具 举报

地板
ID:883242 发表于 2023-4-24 15:48 | 只看该作者
赶脚不是Keil C51,更像是SDCC或IAR8051,问提供文件的人,到底用什么编译器。
回复

使用道具 举报

5#
ID:655665 发表于 2023-4-24 16:01 | 只看该作者
Hephaestus 发表于 2023-4-24 15:48
赶脚不是Keil C51,更像是SDCC或IAR8051,问提供文件的人,到底用什么编译器。

源资料说使用Crossware 8051 C 编译器
回复

使用道具 举报

6#
ID:384109 发表于 2023-4-24 16:43 | 只看该作者
还是先解决找不到头文件的问题吧
回复

使用道具 举报

7#
ID:883242 发表于 2023-4-24 16:59 | 只看该作者
hmsd 发表于 2023-4-24 16:01
源资料说使用Crossware 8051 C 编译器

那你就去找这个编译器呗,用Keil只有死路一条。
回复

使用道具 举报

8#
ID:655665 发表于 2023-4-24 17:07 | 只看该作者
人中狼 发表于 2023-4-24 16:43
还是先解决找不到头文件的问题吧

两个头文件在网上找到了,但编译时头文件也抱错.大神给看看头文件有错误吗.

os.h头文件
/* Copyright (c) 2001 Crossware Associates */

/* Interrupt vector numbers */

/* Definitions for _interrupt n for Cygnal chips
*
* For example:  
*
*  void _interrupt IVN_TIMER1 Timer1InterruptHandler()
*  {
*  }
*
*/

#ifdef __C8051F02X

#define IVN_INTERRUPT0      0
#define IVN_TIMER0          1
#define IVN_INTERRUPT1      2
#define IVN_TIMER1          3
#define IVN_SERIALPORT      4
#define IVN_SERIALPORT0     4
#define IVN_TIMER2          5
#define IVN_SPI             6
#define IVN_SMBUS           7
#define IVN_ADC0WINDOW      8
#define IVN_PCA0            9
#define IVN_CP0FALLING      10
#define IVN_CP0RISING       11
#define IVN_CP1FALLING      12
#define IVN_CP1RISING       13
#define IVN_TIMER3          14
#define IVN_ADC0CONVERSION        15
#define IVN_TIMER4          16
#define IVN_ADC1CONVERSION  17
#define IVN_INTERRUPT6      18
#define IVN_INTERRUPT7      19
#define IVN_SERIALPORT1     20
#define IVN_OSC             21

#elif defined(__C8051F0XX)

#define IVN_INTERRUPT0      0
#define IVN_TIMER0          1
#define IVN_INTERRUPT1      2
#define IVN_TIMER1          3
#define IVN_SERIALPORT      4
#define IVN_SERIALPORT0     4
#define IVN_TIMER2          5
#define IVN_SPI             6
#define IVN_SMBUS           7
#define IVN_ADC0WINDOW      8
#define IVN_PCA0            9
#define IVN_CP0FALLING      10
#define IVN_CP0RISING       11
#define IVN_CP1FALLING      12
#define IVN_CP1RISING       13
#define IVN_TIMER3          14
#define IVN_ADC0CONVERSION        15
#define IVN_INTERRUPT4      16
#define IVN_INTERRUPT5      17
#define IVN_INTERRUPT6      18
#define IVN_INTERRUPT7      19
#define IVN_OSC             21

#elif defined(__C8051F2XX)

#define IVN_INTERRUPT0      0
#define IVN_TIMER0          1
#define IVN_INTERRUPT1      2
#define IVN_TIMER1          3
#define IVN_SERIALPORT      4
#define IVN_SERIALPORT0     4
#define IVN_TIMER2          5
#define IVN_SPI             6
#define IVN_ADC0WINDOW      8
#define IVN_CP0FALLING      10
#define IVN_CP0RISING       11
#define IVN_CP1FALLING      12
#define IVN_CP1RISING       13
#define IVN_ADC0CONVERSION        15
#define IVN_INTERRUPT4      16
#define IVN_INTERRUPT5      17
#define IVN_INTERRUPT6      18
#define IVN_INTERRUPT7      19
#define IVN_OSC             21

#elif defined(__C8051F31X)

#define IVN_INTERRUPT0      0
#define IVN_TIMER0          1
#define IVN_INTERRUPT1      2
#define IVN_TIMER1          3
#define IVN_SERIALPORT      4
#define IVN_SERIALPORT0     4
#define IVN_TIMER2          5
#define IVN_SPI             6
#define IVN_SMBUS           7
#define IVN_ADC0WINDOW      9
#define IVN_ADC0CONVERSION        10
#define IVN_PCA0            11
#define IVN_CP0             12
#define IVN_CP1             13
#define IVN_TIMER3          14

#elif defined(__C8051F32X)

#define IVN_INTERRUPT0      0
#define IVN_TIMER0          1
#define IVN_INTERRUPT1      2
#define IVN_TIMER1          3
#define IVN_SERIALPORT      4
#define IVN_SERIALPORT0     4
#define IVN_TIMER2          5
#define IVN_SPI             6
#define IVN_SMBUS           7
#define IVN_USB             8
#define IVN_ADC0WINDOW      9
#define IVN_ADC0CONVERSION        10
#define IVN_PCA0            11
#define IVN_CP0             12
#define IVN_CP1             13
#define IVN_TIMER3          14
#define IVN_VBUS_LEVEL      15

#elif defined(__C8051F3XX)

#define IVN_INTERRUPT0      0
#define IVN_TIMER0          1
#define IVN_INTERRUPT1      2
#define IVN_TIMER1          3
#define IVN_SERIALPORT      4
#define IVN_SERIALPORT0     4
#define IVN_TIMER2          5
#define IVN_SMBUS           6
#define IVN_ADC0WINDOW      7
#define IVN_ADC0CONVERSION        8
#define IVN_PCA0            9
#define IVN_CP0FALLING      10
#define IVN_CP0RISING       11

#else

#error        No appropriate variant defined

#endif
-------------------------------------
sfr.h头文件
系统头文件(sfr.h)
REG51.H

Header file for generic 80C51 and 80C31 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __REG51_H__
#define __REG51_H__

typedef unsigned char uint8;
typedef unsigned short int uint16;
typedef unsigned int uint32;

/* BYTE Register */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;

/* BIT Register */
/* PSW */
sbit CY = 0xD7;
sbit AC = 0xD6;
sbit F0 = 0xD5;
sbit RS1 = 0xD4;
sbit RS0 = 0xD3;
sbit OV = 0xD2;
sbit P = 0xD0;

/* TCON */
sbit TF1 = 0x8F;
sbit TR1 = 0x8E;
sbit TF0 = 0x8D;
sbit TR0 = 0x8C;
sbit IE1 = 0x8B;
sbit IT1 = 0x8A;
sbit IE0 = 0x89;
sbit IT0 = 0x88;

/* IE */
sbit EA = 0xAF;
sbit ES = 0xAC;
sbit ET1 = 0xAB;
sbit EX1 = 0xAA;
sbit ET0 = 0xA9;
sbit EX0 = 0xA8;

/* IP */
sbit PS = 0xBC;
sbit PT1 = 0xBB;
sbit PX1 = 0xBA;
sbit PT0 = 0xB9;
sbit PX0 = 0xB8;

/* P3 */
sbit RD = 0xB7;
sbit WR = 0xB6;
sbit T1 = 0xB5;
sbit T0 = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD = 0xB1;
sbit RXD = 0xB0;

/* SCON */
sbit SM0 = 0x9F;
sbit SM1 = 0x9E;
sbit SM2 = 0x9D;
sbit REN = 0x9C;
sbit TB8 = 0x9B;
sbit RB8 = 0x9A;
sbit TI = 0x99;
sbit RI = 0x98;

#endif







回复

使用道具 举报

9#
ID:655665 发表于 2023-4-24 17:11 | 只看该作者
Hephaestus 发表于 2023-4-24 16:59
那你就去找这个编译器呗,用Keil只有死路一条。

这个编译器是有的,不过已经过期了不能用了.也没有新版本.
回复

使用道具 举报

10#
ID:655665 发表于 2023-4-24 17:28 | 只看该作者
人中狼 发表于 2023-4-24 16:43
还是先解决找不到头文件的问题吧

两个头文件sfr.h  os.h找到了,编译时头文件os.h也报错.
回复

使用道具 举报

11#
ID:155507 发表于 2023-4-24 18:09 | 只看该作者
hmsd 发表于 2023-4-24 17:28
两个头文件sfr.h  os.h找到了,编译时头文件os.h也报错.

你贴出来,我们替你想办法解决掉啊。
回复

使用道具 举报

12#
ID:655665 发表于 2023-4-24 18:17 | 只看该作者
angmall 发表于 2023-4-24 18:09
你贴出来,我们替你想办法解决掉啊。

os.h头文件
//系统头文件(os.h)
#include"c8051f.h"
#include"OS_INIT_SP.H" //系统初始化头文件
#include"Init_Task.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define SYSCLK 11059200   //晶振频率
#define SYTIMEISR 50    //系统时钟中断时间(ms)
#define NULL (void *)0L
#define OK 1

/*任务状态*/
#define WAIT_MSG 0X00      
#define WAIT_TIME 0X01
#define READY 0X02  
#define TEST 1   //测试代码条件编译

/*任务表*/
typedef struct task_b
{
uchar xdata *sp_start;  //任务堆栈底指针
uchar sp_size;          //任务堆栈长度
uchar flg;              //任务状态
//uchar prio;           //任务指针
//struct task_msg *msg ; //任务接收消息结构体指针
uchar timedal;                //任务挂起延迟时间
}task_link;
extern task_link xdata OSPCB[N+1]; //TASK zhuang tai link


/*操作系统全局变量*/
extern uchar data Prio;     //当前运行的任务优先级
extern uchar data *spend;   //系统堆栈底指针
extern uchar data ISR_num;   //中断嵌套次数
extern uchar data OSRdyGrp;   //任务就绪表全局变量
extern uchar data OSRdyTab[TASK_8N];//任务优先级表1
extern uchar code OSMapTab[8];      //任务优先级表2
extern uchar code OSUnMapTab[256];  //任务优先级表3


/*操作系统全局函数*/
extern void Task_Init(uchar i,void(*addr)(void),uchar xdata *Task_sta);//系统初始化函数
extern void OS_RdyTask(uchar prio);         //使一个任务就绪
extern void OSTask_TimeDal(uchar TimeDal);  //使一个任务时间延迟
extern void OSISR_Task_Sched(void);         //切换任务函数
extern void OSInit_task();                  //任务堆栈初始化
回复

使用道具 举报

13#
ID:883242 发表于 2023-4-24 18:23 | 只看该作者
hmsd 发表于 2023-4-24 17:11
这个编译器是有的,不过已经过期了不能用了.也没有新版本.

版本新了可能还不好用,过期好办,放虚拟机里面运行,给个假时间就可以了。
回复

使用道具 举报

14#
ID:655665 发表于 2023-4-24 18:32 | 只看该作者
angmall 发表于 2023-4-24 18:09
你贴出来,我们替你想办法解决掉啊。

000.jpg (155.13 KB, 下载次数: 51)

000.jpg
回复

使用道具 举报

15#
ID:155507 发表于 2023-4-24 18:43 | 只看该作者
你这个是韩的频率计
8051内部16比特计数器及外部12比特(其中74F161 4比特, 74HC393 8比特)共 28 比特计数器,8位数字显示100MHz频率计数器。
回复

使用道具 举报

16#
ID:155507 发表于 2023-4-24 18:47 | 只看该作者
你这个是韩的频率计 开源的基于C51的频率计100兆赫频率计数器/脉冲计数器
本机为使用8051的8位100MHz的频率计数器。
8051内部16比特计数器及外部12比特(其中74F161 4比特, 74HC393 8比特)共 28 比特计数器,8位数字显示100MHz频率计数器。

51hei3.gif (25.12 KB, 下载次数: 47)

51hei3.gif

51hei1.gif (29.02 KB, 下载次数: 46)

51hei1.gif

51hei2.gif (23.44 KB, 下载次数: 47)

51hei2.gif

51hei0.gif (23.53 KB, 下载次数: 49)

51hei0.gif
回复

使用道具 举报

17#
ID:655665 发表于 2023-4-24 18:48 | 只看该作者
Hephaestus 发表于 2023-4-24 18:23
版本新了可能还不好用,过期好办,放虚拟机里面运行,给个假时间就可以了。

我把程序放上来,大神看看能不能编译

Crossware 8051 C 编译器.rar

10.93 MB, 下载次数: 4

回复

使用道具 举报

18#
ID:655665 发表于 2023-4-24 18:53 | 只看该作者
angmall 发表于 2023-4-24 18:47
你这个是的频率计 开源的基于C51的频率计100兆赫频率计数器/脉冲计数器
本机为使用8051的8位100MHz的 ...

是的,基于C51的频率计100兆赫频率计,就是想编译一下固件.
回复

使用道具 举报

19#
ID:155507 发表于 2023-4-24 21:06 | 只看该作者

给你改了一下试试






  1. //#include <sfr.h>
  2. //#include <os.h>
  3. #include <reg52.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. sbit P36_o_74f161_clr_n      = P3^6; //外部计数器F161复位
  7. sbit P35_o_74f161_enp        = P3^5; //外部计数器F161有效(Enable)
  8. sbit P30_io_74hc393_clr_hold = P3^0; //外部计数器HC393复位/HOLD输入
  9. sbit P37_i_prescaler         = P3^7; // 64分频的预分频器
  10. //
  11. //七段LED字形数据
  12. // hgfedcba
  13. #define DIG0 0xC0 // 11000000b ; 0 P2.0
  14. #define DIG1 0xF9 // 11111001b ; 1 +-----a-----+
  15. #define DIG2 0xA4 // 10100100b ; 2 | |
  16. #define DIG3 0xB0 // 10110000b ; 3 P2.5 f b P2.1
  17. #define DIG4 0x99 // 10011001b ; 4 | |
  18. #define DIG5 0x92 // 10010010b ; 5 | P2.6 |
  19. #define DIG6 0x82 // 10000010b ; 6 +-----g-----+
  20. #define DIG7 0xD8 // 11011000b ; 7 | |
  21. #define DIG8 0x80 // 10000000b ; 8 P2.4 e c P2.2
  22. #define DIG9 0x98 // 10011000b ; 9 | |
  23. // ; | P2.3 |
  24. #define DIGM 0xBF // 10111111b ; - +-----d-----+ * h P2.7
  25. #define DIGP 0x7F // 01111111b ; .
  26. #define DIGB 0xFF // 11111111b ; "Blank"(“空白”)
  27. //
  28. code char segment_pattern[] = { DIG0, DIG1, DIG2,\
  29. DIG3, DIG4, DIG5, DIG6, DIG7, DIG8, DIG9 };
  30. //
  31. code char segment_select[] = { 0xFE, 0xFD, 0xFB, \
  32. 0xF7, 0xEF, 0xDF, 0xBF, 0x7F };
  33. //
  34. unsigned long trailer;
  35. unsigned long task;
  36. unsigned int trimer;
  37. unsigned char fnd[8];
  38. unsigned char mfnd[8];
  39. unsigned int int_state;
  40. unsigned char fnd_state;
  41. unsigned char boat;
  42. bit hold;
  43. //
  44. //
  45. //void _interrupt IVN_TIMER1 time_base() {
  46. void time_base()  interrupt 3
  47. {
  48.         //////////////////////////////////////////////
  49.         TL1 = 0x60; TH1 = 0xF0; // 4000 2 M Sec 500 Times
  50.         //////////////////////////////////////////////
  51.         P0 = 0xff;
  52.         P2 = segment_select[fnd_state];
  53.         P0 = fnd[fnd_state++];
  54.         fnd_state &= 0x07;
  55.         //////////////////////////////////////////////
  56.         if(int_state == 0) { //
  57.                 P35_o_74f161_enp = 0; //外部计数器F161计数禁止
  58.                 P30_io_74hc393_clr_hold = 1; //外部计数器HC393复位
  59.                 P36_o_74f161_clr_n = 0; //外部计数器F161复位
  60.                 TL0 = 0x00; TH0 = 0x00; //内部计数器复位
  61.                 hold = P30_io_74hc393_clr_hold; //  HOLD(保持)键状态输入
  62.                 P36_o_74f161_clr_n = 1; // 外部计数器F161有效(Enable)
  63.                 P30_io_74hc393_clr_hold = 0; //  外部计数器HC393有效(Enable)
  64.                 P35_o_74f161_enp = 1; //  外部计数器F161进行计数
  65.         }
  66.         //////////////////////////////////////////////
  67.         if(int_state == 316) { //  10GHz状态(64分频的预分频器)
  68.                 if (!P37_i_prescaler) { //  门控时间为0.64秒
  69.                         for (trimer = 0; trimer<202; trimer++) ; //  15个机器周期单位
  70.                         // 测试信号24MHz输入
  71.                         boat++; // 15360000 用于显示,需调整
  72.                         boat++; //  延迟1个机器周期(12个时钟周期)
  73.                         boat++; // 15359988
  74.                         boat++; // 15360000
  75.                         // boat++; // 15360012
  76.                         P35_o_74f161_enp = 0; //  外部计数器停止
  77.                         trailer = TH0;
  78.                         trailer = (trailer << 20) & 0x0ff00000;
  79.                         task = TL0;
  80.                         task = (task << 12) & 0x000ff000;
  81.                         trailer |= task;
  82.                         task = P3;
  83.                         task = (task << 7) & 0x00000f00;
  84.                         trailer |= task;
  85.                         task = P1 & 0x000000ff;
  86.                         trailer |= task;
  87.                         P35_o_74f161_enp = 1; // 소비 전류가 일정하게 하기위하여
  88.                         // 电流消耗,
  89.                         // 外部计数器将重新开始。
  90.                 }
  91.         }
  92.         //////////////////////////////////////////////
  93.         if(int_state == 494) { // 100 MHz Mode 1 Sec Gate Time
  94.                 if (P37_i_prescaler) { // 1 Sec Gate Time
  95.                         for (trimer = 0; trimer<248; trimer++) ; //  15个机器周期单位
  96.                         // 测试24MHz信号源输入
  97.                         boat++; // 24000000 用于显示,需调整
  98.                         boat++; //
  99.                         boat++; //
  100.                         boat++; //
  101.                         boat++; //  延迟1个机器周期(12个时钟周期)
  102.                         boat++; // 23999988
  103.                         boat++; // 24000000
  104.                         // boat++; // 24000012

  105.                         P35_o_74f161_enp = 0; // 外部计数器停止
  106.                         trailer = TH0;
  107.                         trailer = (trailer << 20) & 0x0ff00000;
  108.                         task = TL0;
  109.                         task = (task << 12) & 0x000ff000;
  110.                         trailer |= task;
  111.                         task = P3;
  112.                         task = (task << 7) & 0x00000f00;
  113.                         trailer |= task;
  114.                         task = P1 & 0x000000ff;
  115.                         trailer |= task;
  116.                         P35_o_74f161_enp = 1; // 소비 전류가 일정하게 하기위하여
  117.                         // 电流消耗,以时间表
  118.                         // 外部计数器重新开始。
  119.                 }
  120.         }
  121.         //////////////////////////////////////////////
  122.         if(int_state == 506) { //  1Hz数字显示
  123.                 boat = trailer % 10;
  124.                 mfnd[7] = segment_pattern[boat & 0xf];
  125.                 trailer /= 10;
  126.         }
  127.         //////////////////////////////////////////////
  128.         if(int_state == 507) {
  129.                 boat = trailer % 10;
  130.                 mfnd[6] = segment_pattern[boat & 0xf];
  131.                 trailer /= 10;
  132.         }
  133.         //////////////////////////////////////////////
  134.         if(int_state == 508) {
  135.                 boat = trailer % 10;
  136.                 mfnd[5] = segment_pattern[boat & 0xf];
  137.                 trailer /= 10;
  138.         }
  139.         //////////////////////////////////////////////
  140.         if(int_state == 509) {
  141.                 boat = trailer % 10;
  142.                 mfnd[4] = segment_pattern[boat & 0xf];
  143.                 trailer /= 10;
  144.         }
  145.         //////////////////////////////////////////////
  146.         if(int_state == 510) {
  147.                 boat = trailer % 10;
  148.                 mfnd[3] = segment_pattern[boat & 0xf];
  149.                 trailer /= 10;
  150.         }
  151.         //////////////////////////////////////////////
  152.         if(int_state == 511) {
  153.                 boat = trailer % 10;
  154.                 mfnd[2] = segment_pattern[boat & 0xf];
  155.                 trailer /= 10;
  156.         }
  157.         //////////////////////////////////////////////
  158.         if(int_state == 512) {
  159.                 boat = trailer % 10;
  160.                 mfnd[1] = segment_pattern[boat & 0xf];
  161.                 trailer /= 10;
  162.         }
  163.         //////////////////////////////////////////////
  164.         if(int_state == 513) {
  165.                 boat = trailer % 10;
  166.                 mfnd[0] = segment_pattern[boat & 0xf];
  167.                 trailer /= 10;
  168.         }
  169.         //////////////////////////////////////////////
  170.         int_state++;
  171.         //////////////////////////////////////////////
  172.         if(int_state >= 514) {
  173.                 int_state = 0;
  174.                 if (hold) {
  175.                         fnd[0] = mfnd[0];
  176.                         fnd[1] = mfnd[1];
  177.                         fnd[2] = mfnd[2];
  178.                         fnd[3] = mfnd[3];
  179.                         fnd[4] = mfnd[4];
  180.                         fnd[5] = mfnd[5];
  181.                         fnd[6] = mfnd[6];
  182.                         fnd[7] = mfnd[7];
  183.                         if (P37_i_prescaler) {
  184.                                 fnd[1] &= 0x7F; // MHz点
  185.                         } else {
  186.                                 fnd[0] &= 0x7F; // GHz点
  187.                         }
  188.                 }
  189.         }
  190.         //////////////////////////////////////////////
  191. }
  192. void main()
  193. {
  194.         TMOD = 0x15; // 0b00010101 Timer0 = Mode1, Counter, use TR0
  195.         // Timer1 = Mode1, Timer, use TR1
  196.         TL0 = 0X00; TH0 = 0X00;
  197.         TL1 = 0X00; TH1 = 0X00;
  198.         TR0 = 1; // Timer 0 计数开始
  199.         TR1 = 1; // Timer 1 计数开始
  200.         ET1 = 1; // 设置定时器1中断状态
  201.         EA = 1; //    设置全局中断状态
  202.         while(1) ;
  203. }
复制代码



评分

参与人数 1黑币 +10 收起 理由
hmsd + 10 很给力!

查看全部评分

回复

使用道具 举报

20#
ID:655665 发表于 2023-4-25 08:12 | 只看该作者
angmall 发表于 2023-4-24 21:06
给你改了一下试试

谢谢大神, 编译通过了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表