使用keil编程常遇到c语言问题;main被重复定义了,如何破?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用keil编程常遇到c语言问题;main被重复定义了,如何破?相关的知识,希望对你有一定的参考价值。

#include<reg52.h>
extern main;
void dlay(float k)

unsigned int h,j;
h =k*100;
while(h--)

for(j=8505;j>0;j--) ;

void main()

int T,i; T=0xfe;
while(1)
for(i=8;i>0;i--)
P1=T,T<<=1,T=T+1,dlay(0.1) ;

删除掉extern main;就好了

main这个关键字不能随便定义的
只能存在一个
程序都是从main开始所以也不能被调用,所以根本没必要声明main函数。追问

删掉还不行:
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
SYMBOL: MAIN
MODULE: 流水灯(位移).obj (流水灯(位移))
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?MAIN?流水灯(位移)

追答

追问

追答

果然有多个文件


只留下text2.c其他全部删除

remove file删除其他的


只留下text2.c

如果要其他功能一般是.H .C成对出现

多个C里面还有多个main函数当然不行


最后再吧extern main;注释掉


编译器是keil4的

参考技术A 亲,main关键字不能变成再定义变量的,extern main是不对的,定义的外部变量main用其他变量表示吧追问

求大神,详细些

参考技术B P1=T,T<<=1,T=T+1,dlay(0.1)//这里的逗号都应该变成分号追问

不行

追答

void dlay(float k)

  

unsigned int h,j;

        h =k*100;

while(h--)

for(j=8505;j>0;j--)  ;

     上面的float变成int型的变量就可以了,你的编译器不支持浮点运算,记得把extern main;删掉哦,把我上面发的文件按说明拷进keil中就能支持浮点运算了

追问

还不行:

追答

#include
void dlay(float k)

unsigned int h,j;
h =k*100;
while(h--)

for(j=8505;j>0;j--) ;

void main()

int T,i; T=0xfe;
while(1)
for(i=8;i>0;i--)
P1=T,T<<=1,T=T+1,dlay(0.1) ;

这是你的程序在我电脑上运行正常,看你还有一个c文件,另一个c里面不能再有main函数了

使用Keil语言的嵌入式C编程教程(下)

使用Keil语言的嵌入式C编程教程(下)

8051单片机进行定时器/计数器的计算与编程             

延迟是应用软件开发中的重要因素之一。然而,在实现定时延迟的过程中,正常的延迟并不能给出克服这一问题的宝贵结果。定时器和计数器是微控制器的硬件组成部分,在许多应用中使用它来提供具有计数的宝贵时间延迟脉冲两个任务都是通过软件技术实现的。             

定时器延迟             

WAP使用T1M2(timer1和mode2)生成500us延时?

#include<reg51.h>

void main()
{
unsigned char i;
TMOD=0x20; //set the timer mode//
for(i=0i<2;i++) //double the time daly//
{
TL1=0x19; //set the time delay//
TH1=0x00;
TR1=1; //timer oN//
While(TF1==0); //check the flag bit//
TF1=0;
}
TR1=0; //timer off//
}

Normal Loop Delay

void delay()

{
unsignedint k;
for(k=0;k<30000;k++);
}

基于8051单片机的串行通信计算与编程             

串行通信通常用于发送和接收信号。8051微控制器包括由Rx和Tx引脚发送和接收的信号的UART串行通信。UART接收字节的数据并按顺序发送各个位。寄存器是一种在存储器中收集和存储数据的方法。UART是一种半双工协议。半双工是指传输和接收数据,但不能同时进行。

技术图片

1. WAP将字符“S”传输到串行窗口使用9600作为波特率?             

28800是8051微控制器的最大波特率

28800/9600= 3

That baud rate ‘3’ is stored in the timers

#include<reg51.h>

void main()

{
SCON=0x50; //start the serial communication//
TNOD=0x20; //selected the timer mode//
TH1=3; // load the baud rate//
TR1=1; //Timer ON//
SBUF=’S’; //store the character in the register//
while(TI==0); //check the interrupt register//
TI=0;
TR1=0; //OFF the timer//
while(1); //continuous loop//
}

2. WAP从超级终端接收数据并使用9600波特将数据发送到微控制器的端口0?             

28800是8051微控制器的最大波特率

28800/9600= 3

That baud rate ‘3’ is stored in the timers

#include<reg51.h>

void main()
{
SCON=0x50; //start the serial communication//
TMOD=0x20; //selected the timer mode//
TH1=3; // load the baud rate//
TR1=1; //Timer ON//
PORT0=SBUF; //send the data from SBUF to port0//
while(RI==0); //check the interrupt register//
RI=0;
TR1=0; //OFF the timer//
while(1); //stop the program when character is received//
}

8051单片机中断程序             

中断是强制停止当前程序并立即执行其他程序的信号。8051微控制器提供6个内部和外部中断源。当中断发生时,微控制器暂停当前任务并通过执行ISR处理中断,然后微控制器返回到最近的任务。             

WAP在定时器0中断时执行左移操作,然后在主功能中执行P0的中断操作?

#include<reg51.h>

unsigned char b;

void timer0() interrupt 2 //selected timer0 interrupt//
{
b=0x10;
P1=b<<2;
}
void main()
{
unsigned char a,i;
IE=0x82 //enable the timer0 interrupt//
TMOD=0x01;
TLo=0xFC; //interrupt timer//
TH1=0xFB;
TR0=1;
a=0x00;
while(1)
{
for(i=0;i<255;i++)
{
a++;
Po=a;
}
}
}

8051单片机进行键盘编程             

矩阵键盘是一种模拟开关设备,在许多嵌入式应用中使用,允许用户执行必要的任务。矩阵键盘由行和列中矩阵格式的开关排列组成。行和列连接到微控制器,使得开关行连接到一个管脚,并且每列中的开关连接到另一个管脚,然后执行操作。

技术图片

 1. WAP to toggle the LED by pressing the switch

#include<reg51.h>
sbit a=P3^0;
sbit b=P3^1;
sbit c=P3^2;
sbit d=P3^3;
void delay();
void main()
{
while(1)
{
a=0;
b=1;
c=1;
d=1;
delay();
a=1;
b=0;
c=1;
d=1;
void delay()
{
unsigned char i;
TMOD=0x20; //set the timer mode//
for(i=0i<2;i++) //double the time daly//
{
TL1=0x19; //set the time delay//
TH1=0x00;
TR1=1; //timer oN//
While(TF1==0); //check the flag bit//
TF1=0;
}
TR1=0; //timer off//
}

2. WAP to Switch ON the LED by pressing the key ‘1’ on the keypad?

#include<reg51.h>

sbit r1=P2^0;
sbit c1=P3^0;
sbit LED=P0^1;

void main()
{

r1=0;
if(c1==0)
{

LED=0xff;
}
}

3. WAP to display the number 0,1,2,3,4,5 on the seven segment by pressing the respective key on the keypad?

#include<reg51.h>

sbit  r1=P2^0;

sbit  c1=P3^0;

sbit  r2=P2^0;

sbit  c2=P3^0;

sbit a=P0^1;

void main()

{

r1=0; a=1;

if(c1==0)

{

a=0xFC;

}

If(c2==0)

{

a=0x60;

}

if(c3==0)

{

a=0xDA;

}

If(c4==0)

{

a=0xF2;

}

}

8051单片机进行液晶显示编程             

LCD显示器是一种电子设备,在许多应用中经常用于以文本或图像格式显示信息。液晶显示器是一种可以在屏幕上轻松显示字符的显示器。液晶显示器由8条数据线和3条控制线组成,用于与微控制器接口。

技术图片

 WAP to display the “EDGEFX KITS” on LED display ?

#include<reg51.h>
#define kam P0

voidlcd_initi();
voidlcd_dat(unsigned char );
voidlcd_cmd(unsigned char );
void delay();
void display(unsigned char *s, unsigned char r)

sbitrs=P2^0;
sbitrw=P2^1;
sbit en=P2^2;
void main()
{

lcd_initi();
lcd_cmd(0x80);
delay(100);
lcd_cmd(0xc0);
display(“edgefx kits”,11);
while(1);
}

void display(unsigned char *s, unsigned char r)
{
unsignedint w;
for(w=0;w<r;w++)
{
lcd_data(s[w]);
}
}
voidlcd_initi()
{
lcd_cmd(0×01);
delay(100);
lcd_cmd(0×38);
delay(100);
lcd_cmd(0×06);
delay(100);
lcd_cmd(0x0c);
delay(100);
}
voidlcd_dat(unsigned char dat)
{
kam = dat;
rs=1;
rw=0;
en=1;
delay(100);
en=0;
}
}
voidlcd_cmd(unsigned char cmd)
{
kam=cmd;
rs=0;
rw=0;

en=1;
delay(100);
en=0;
}
void delay( unsigned int n)
{

unsignedint a;
for(a=0;a<n;a++);
}

 

以上是关于使用keil编程常遇到c语言问题;main被重复定义了,如何破?的主要内容,如果未能解决你的问题,请参考以下文章

如何在keil调试中黄色箭头不出现汇编窗口而是停在main主函数上

keil怎样把C语言转换成单片机汇编语言

keil mdk 启动程序(汇编语言写的)仿真时没法跟踪。 怎样让它自动跟踪代码? 像C语言一样

C语言中运行中,main函数被重复定义,后面的就不能运行了怎么办,下午考试,求高手

keil:C语言里面调用汇编程序

Keil中C语言调用汇编函数