下面那段程序,头文件是<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);
}
}
|