打印

stc12c5a60s2头文件在keil中没法用?

[复制链接]
10870|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangfeng33|  楼主 | 2014-5-6 08:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面那段程序,头文件是<at89x51.h>编译正常在stc89c52中正常运行,当然在stc12c5a32s2中不行,就是我上次提的问题。我把头文件改成<stc12c5a60s2.h>编译出错,提示:
Build target '目标 1'
assembling STARTUP.A51...
compiling 舵机回中.c...
舵机回中.C(33): error C202: 'P2_7': undefined identifier
舵机回中.C(35): error C202: 'P2_7': undefined identifier
目标未创建
应该是没定义p2口。我打开两个头文件看了下,在<at89x51.h>中有
/*------------------------------------------------
P0 Bit Registers
------------------------------------------------*/
sbit P0_0 = 0x80;
sbit P0_1 = 0x81;
sbit P0_2 = 0x82;
sbit P0_3 = 0x83;
sbit P0_4 = 0x84;
sbit P0_5 = 0x85;
sbit P0_6 = 0x86;
sbit P0_7 = 0x87;
之类的内容,在<stc12c5a60s2.h>中却没有,难道<stc12c5a60s2.h>不能单独用?我在代码中加入<at89x51.h>编译出现以下提示:把<at89x51.h>改成<reg51.h>提示也一样。
D:\KEIL\C51\INC\STC12C5A60S2.H(171): error C231: 'SM0': redefinition
D:\KEIL\C51\INC\STC12C5A60S2.H(172): error C231: 'SM1': redefinition
D:\KEIL\C51\INC\STC12C5A60S2.H(173): error C231: 'SM2': redefinition
D:\KEIL\C51\INC\STC12C5A60S2.H(174): error C231: 'REN': redefinition
D:\KEIL\C51\INC\STC12C5A60S2.H(175): error C231: 'TB8': redefinition
D:\KEIL\C51\INC\STC12C5A60S2.H(176): error C231: 'RB8': redefinition
D:\KEIL\C51\INC\STC12C5A60S2.H(177): error C231: 'TI': redefinition
D:\KEIL\C51\INC\STC12C5A60S2.H(178): error C231: 'RI': redefinition
D:\KEIL\C51\INC\STC12C5A60S2.H(180): error C231: 'SBUF': redefinition
目标未创建
请教下该怎么处理啊。我看<stc12c5a60s2.h>头文件中的:
sfr CMOD  = 0xD9; //PCA 工作模式寄存器。   CIDL   -     -     -   CPS2   CPS1  CPS0  ECF   0xxx,x000
/*
CIDL: idle 状态时 PCA 计数器是否继续计数, 0: 继续计数, 1: 停止计数。
CPS2: PCA 计数器脉冲源选择位 2。
CPS1: PCA 计数器脉冲源选择位 1。
CPS0: PCA 计数器脉冲源选择位 0。
   CPS2   CPS1   CPS0
     0      0      0    系统时钟频率 fosc/12。
    0      0      1    系统时钟频率 fosc/2。
    0      1      0    Timer0 溢出。
    0      1      1    由 ECI/P3.4 脚输入的外部时钟,最大 fosc/2。
    1      0      0    系统时钟频率,  Fosc/1
     1      0      1    系统时钟频率/4,Fosc/4
     1      1      0    系统时钟频率/6,Fosc/6
     1      1      1    系统时钟频率/8,Fosc/8


问题是不是在这里?D9是  系统时钟频率  Fosc/1?附实验用的代码:<stc12c5a60s2.h>头文件我在杜老师网站和官网及其他网站都下载了,里面内容都一样。
/****************************************************************************
   硬件连接
  把舵机插入单片机接口中
****************************************************************************/

#include<at89x51.H>
#include <intrins.h>
#define Sevro_moto_pwm     P2_7    //接舵机信号端输入PWM信号调节速度

    unsigned char pwm_val_left  = 0;//变量定义
unsigned char push_val_left =14;//舵机归中,产生约,1.5MS 信号
    unsigned long S=0;
unsigned long S1=0;
unsigned long S2=0;
unsigned long S3=0;
unsigned long S4=0;
unsigned int  time=0;      //时间变量
unsigned int  timer=0;   //延时基准变量
unsigned char timer1=0;   //扫描时间变量     

/************************************************************************/
/*                    PWM信号产生控制舵机                               */
/************************************************************************/
/*                                                                      */
/*调节push_val_left的值改变电机转速,占空比            */
   void pwm_Servomoto(void)
{  

     if(pwm_val_left<=push_val_left)
         Sevro_moto_pwm=1;
else
         Sevro_moto_pwm=0;
if(pwm_val_left>=200)
pwm_val_left=0;

}
/***************************************************/
///*TIMER1中断服务子函数产生PWM信号*/
   void time1()interrupt 3   using 2
{
      TH1=(65536-1111)/256;   //100US定时
  TL1=(65536-1111)%256;   //定时器100US为准。在这个基础上延时
  pwm_val_left++;
   pwm_Servomoto();
}
/***************************************************/
void main(void)
{
TMOD=0X11;
TH1=(65536-1111)/256;   //100US定时
TL1=(65536-1111)%256;
TH0=0;
TL0=0;  
TR1= 1;
ET1= 1;
ET0= 1;
EA = 1;

     push_val_left=14;   //舵机归中

while(1)         /*无限循环*/
{
}
   }
还有在论坛看见一个朋友的代码,也是用的<stc12c5a60s.h>,又能在keil u4中编译成功。刚学习不久,头大了。
#include<STC12C5A60S2.H>        //12MHZ每秒一百万周期
sbit DQ=P1^0;            //定义与18b20连接的单总线
sbit LED=P0^0;
void delay(unsigned int a)
{                //调用函数时用时4US
while(a--);   //执行一次9us
}
unsigned char RST18b20()
{               //复位18b20
unsigned char i;
DQ=1;
delay(8);  
DQ=0;
delay(54); //至少延时480微秒
DQ=1; //检测复位信号
//以上为复位信号发送
delay(7);//复位成功后会在15~60微秒后返回低电平,这个延时就是等待返回信号
i=DQ;
delay(20);
return(i);
}
void main()
{
unsigned char r;
P1M0=0x01;
while(1)
{
    r=RST18b20();
    if(r==0)
{
     LED=~LED;
     delay(60000);
     delay(60000);
     delay(60000);
     delay(60000);
     delay(60000);
    }
}
沙发
mmuuss586| | 2014-5-6 09:20 | 只看该作者
到STC网站上,下载完成的参考程序好了
没必要改

使用特权

评论回复
板凳
Ketose| | 2014-5-6 10:09 | 只看该作者
包了stc12c5a60s2.h,就不要包at89x51.h和reg51.h。
另外貌似STC51里PIN一般都定义成P01,P02而不是P0_1,你写的时候不觉得下划线很难输入吗?

使用特权

评论回复
地板
善水盈渊| | 2014-5-6 10:10 | 只看该作者
自己定义 sfr 。建议到**官网下一个最新版的STC-ISP V6.69 里面有例程和说明,还可以导入头文件

使用特权

评论回复
5
拿起书本| | 2014-5-6 15:27 | 只看该作者
redefinition 指的是对一个变量在同一个作用域内进行了两次或两次以上的赋值,编译器无法判断使用哪个

使用特权

评论回复
6
huangluzhen| | 2014-9-7 11:11 | 只看该作者
这个问题还需有待提高。

使用特权

评论回复
7
gxliu08| | 2014-9-7 23:30 | 只看该作者
看看,学习学习

使用特权

评论回复
8
huzi2099| | 2014-9-8 11:54 | 只看该作者
我一般的都是用到哪个加哪个心理最清楚,再换别的51时好改.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

506

主题

2446

帖子

8

粉丝