
C51及C52单片机在内核结构上完全一样,两者的主要差别在RAM和ROM上,C51是128byte RAM,4K ROM,C52是256Byte,8K ROM。
//程序名:闪烁的LED灯
//MCU:AT89S52
//晶振:12MHZ
#include <reg52h>//单片的头文件
sbit LED=P0^0;//led在P0_0口
//功能:延时(ms)
void _delay_ms(unsigned int x)
{
unsigned char i;
while(x--)for(i=0;i<125;i++);
}
//主函数
void main(void)
{
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
while(1)
{
LED=~LED;
_delay_ms(100);//LED以100ms闪烁
}
}
C51和C52的程序是可以一样的!
keil C 语言中嵌入汇编语言进行混合编程,方法如下:
1、在C 文件中要嵌入汇编代码片以如下方式加入汇编代码
#pragma ASM
; Assembler Code Here
#pragma ENDASM
2、在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ”
在d出的对话框中,点击右边的
“Generate Assembler SRC File”
和“Assemble SRC File”
使检查框由灰色变成黑色(有效)状态
3 、根据选择的编译模式, 把相应的库文件( 如Small 模式时, 是
Keil\C51\Lib\C51SLib)加入工程中, 该文件必须作为工程的最后文件,在默认
安装盘KEIL/C51/LIB/C51SLib
4、编译,即可生成目标代码
实例:
#include<reg52h>
#define uchar unsigned char
sbit LED1=P1^0;
//C 嵌入汇编例程
void delay_ms(void)
{
#pragma asm
MOV R0,#0FFH
MOV R1,#0FFH
D_LOOP1:
DJNZ R0,D_LOOP1
MOV R0,#0FFH
DJNZ R1,D_LOOP1
#pragma endasm
}
void main(void)
{
uchar i;
P1 = 0xFF;
while(1)
{
i++;
delay_ms();
if(i>=7)
{
LED1 =~LED1;
i=0;
}
}
}
step 1:新建一个工程
step 2:选择芯片类型(因为不同芯片包含的函数不一样)
step 3:新建空白文件,然后加入到工程里边
step 4:在空白软件中编写程序
PS:其实也可以先编写再添加,但为了防止忘了保存或者数据丢失,建议新建空文件时就加到工程里去。
你如果是想学习ARM为最终目的,那我建议你就不必要去学习单片机了,因为单片机就算你达到精通,那也对你学习ARM没有太多帮忙,当然不能说没有帮忙,至少你可以知道一个大体的硬件框架,但这要付出的时间却是很多。但以你的实际情况来看
你是从事自动监控行业的,若是你现在的工作有部分涉及到单片机和ARM,那我还是建议你先学习单片机,因为单片机也可以让你在这行业上要作得得心应手,而且单片机的学习不像ARM那样复杂,单片机你可以在一个月的时间就可以学得差不多,但对于ARM,你没有一年时间是不可能学到什么的,我就是这样过来的。单片机我玩得很顺手,然后去学ARM,才发现那东西不像单片机那么容易上手,好在我还学过DSP,这才算是有点入门帮忙。
所以ARM的学习是不能急的。
单片机的学习,我想你就不必要去学习51了,直接学习AVR,你就算学了51,但对你学习AVR没有什么帮忙,因为这两个单片机相差太多了,我想51也要快过时了。
学习avr,最好你用AVR16或8来学习,这样比较有典型。
开发板吗,我想对初学者来说,用PROTUES这个软件就是最好的开发板,你可以试试,
现在都是用c来写代码的,你以前学过,现在要再拿起应该不是难。你在网上找几个C的例子来看一看就差不多可以上手,然后自己不看,重新写一次,重要的是要自己重写一次(千万别想当然)
用CVAVR这个软件吧,它是专门对AVR的
这个上手更加容易
最后再用soureinsigth这个软件编写
SUBDATA:
CLR C
MOV A,41H
SUBB A,43H
MOV A,40H
SUBB A,42H
JC SUBD1
MOV 44H,40H
MOV 45H,41H
MOV 46H,42H
MOV 47H,43H
RET
SUBD1:
MOV 44H,42H
MOV 45H,43H
MOV 46H,40H
MOV 47H,41H
RET
#include<reg51h>
#define uchar unsigned char
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //0到9
uchar num,cnt,disn;
uchar keyval,disk;
uchar led[]={1,2,3,4};
void dealdat(uchar a)
{
led[0]=0;
led[1]=0;
led[2]=0;
led[3]=0;
led[a]=disk;
}
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<1000;j++);
}
void t0isr() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
switch(num)
{
case 0:P2=0x01;break;
case 1:P2=0x02;break;
case 2:P2=0x04;break;
case 3:P2=0x08;break;
default:break;
}
P0=~tab[led[num]];
num++;
num&=0x03;
cnt++;
if(cnt>100)
{
cnt=0;
disn++;
disn%=4;
dealdat(disn);
}
}
uchar kbscan(void)
{
unsigned char sccode,recode;
P3=0x0f; //发0扫描,列线输入
if ((P3 & 0x0f) != 0x0f) //有键按下
{
// delay(20); //延时去抖动
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行扫描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //无键按下,返回0
}
void getkey(void)
{
unsigned char key;
key=kbscan();
if(key==0){keyval=0xff;return;}
switch(key)
{
case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}
}
main()
{
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
getkey();
if(keyval!=0xff)disk=keyval;
delay(10);
}
}
以上就是关于单片机写程序C51和C52区别大吗全部的内容,包括:单片机写程序C51和C52区别大吗、在C51语言中如何嵌入汇编语言、简述keilc51从编写程序到运行程序的流程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)