当前位置:首页 » 编程语言 » 89c51c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

89c51c语言

发布时间: 2022-05-19 20:28:38

⑴ 请问单片机89C51中c语言int和char类型跟占用多少字节谢谢

对于该款单片机,int类型的变量占据2个字节,char类型的占据1个字节。不过一般大家为了节约空间,大部分会使用char类型,同时89C51是一款8位的单片机,所以推荐使用char类型的变量进行运算,即使我们在代码中写入int类型的变量进行运算,也是编译器编译成为了8位的运算模式进行运算的。体现不了硬件的优势。

⑵ 如何用单片机(89C51)C语言访问片外ROM当ram和rom同时外扩时该如何区别

EA/VPP(引脚):当EA端保持高电平时,访问内部程序存储器,反之访问外部程序存储器,
与之相关的三根引脚psen,rd,wr你都很清楚了,就不多说了,
使用外部存储器,需要使用编程器将你的程序写到外部rom中。
psen是rom的选通线,因此,外部rom及外部ram是不会干扰的,你根本不用考虑这个问题,按教材连线就可以了,当然,stc的单片机需要注意,它内部有扩展ram,在使用外部ram时需要屏蔽内部ram。
总之,内部还是外部,你的代码完全一样,只是EA/VPP脚接高低电平不同。
望采纳!谢谢.

⑶ 单片机89C51 C语言编程问题

第一步:将开关状态存入temp中,其过程是,将高四位(开关状态值)右移四位,移入低四位中,高四位补零,并存入temp。第二步:用temp的值与0xf0或运算。第三步:将运算后的值给P1端口输出。
比方说仿真电路中我们按下K4,这时读P1口应该是0111 xxxx,将这个数右移四位,高位补零后得到0000 0111,并存入temp。然后用0000 0111与1111 0000相或,得到1111 0111,将新的值给P1输出。P1.3为低电平L4亮。

⑷ C语言编写单片机89C51初始化程序

方法类似,补写程序如下:
#include
#define
uint
unsigned
int
#define
uchar
unsigned
char
sbit
led=p0^0;
sbit
led1=p0^1;
void
delay1ms
(uint
z)
{
uint
x,y;
for
(x=z;x>0;x--)
for
(y=110;y>0;y--);
}
void
exter()
interrupt
2
{
delay1ms(600);
led=0;
delay1ms(200);
led=1;
}
void
exter0()
interrupt
0
{
delay1ms(600);
led1=1;
delay1ms(200);
led1=0;
}
main()
{
ea=1;
//开总中断
ex1=1;
//开外部中断1
ex0=1;
//开外部中断0
it1=0;
//外部中断边沿触发,下降沿触发
it0=0;
//外部中断0边沿触发,下降沿触发
}

⑸ 89C51的C语言编程

main()
{
int max,i;
long a=1;
scanf("%d",&max);
for(i=1;i<=max;i++)
{
a*=i;
}
printf("%d",a);
}

⑹ 求高手用C语言写一下89C51单片机内部定时器中断典型运用

说一下思路吧,使用两个定时器(T0和T1),T0为P0.0的接的LED定时,T1为P0.1接LED定时,需要两个变量led1_time和led2_time来计时(单位是秒),然后分别根据LED的状态来判断led1_time(或led2_time)需要计多少秒,按照你的要求,LED1(P0.0)亮时led1_time需要计时3秒,LED1灭时led1_time需要计时7200秒,即两个小时,对于LED2(P0.1)也是一样的道理。那么,废话说完了,接下来看代码吧!!!

#include<reg51.h>

typedefunsignedcharuint8;
typedefunsignedintuint16;

sbitled1=P0^0;
sbitled2=P1^1;

staticuint16led1_time=0x00;
staticuint8led2_time=0x00;
staticuint8led1_a_second=0x00;
staticuint8led2_a_second=0x00;

#defineA_SECOND(0x14)/*定时50ms,20中断得一秒钟*/
#defineTH_VALUE(0x3c)/*定时器溢出值,高位*/
#defineTL_VALUE(0xb0)/*定时器溢出值,地位*/
#defineLED1_ON_TIME(0x03)/*LED1亮3秒*/
#defineLED2_ON_TIME(0x01)/*LED2亮1秒*/
#defineLED1_OFF_TIME(0x1c20)/*LED1灭7200秒,两个小时*/
#defineLED2_OFF_TIME(0x02)/*LED2灭2秒*/

#defineLED_ON1/*高电平LED亮*/
#defineLED_OFF0/*低电平LED灭*/
/*
*初始化定时器函数
*/
staticvoidinit_time(void){

TMOD=0x11;/*使用T0、T1两个定时器,均选择模式1,定时模式*/
TH0=TH_VALUE;
TL0=TL_VALUE;
TH1=TH_VALUE;
TL1=TL_VALUE;
ET0=1;/*允许T0中断*/
ET1=1;/*允许T1中断*/
EA=1;/*打开总中断*/
TR0=1;/*开启定时器T0*/
TR1=1;/*开启定时器T1*/
}

voidmain(void){

led1=LED_ON;/*上电点亮LED1、LED2*/
led2=LED_ON;

init_time();/*初始化定时器*/

while(1){
/*
*检测LED1状态,如果LED1处于亮的状态,
*那么3秒后熄灭LED1;如果LED1是灭的,
*那么两个小时后点亮LED1。
*/
if(led1==LED_ON){

if(led1_time>=LED1_ON_TIME){

led1_time=0x00;
led1=LED_OFF;
}
}elseif(led1==LED_OFF){

if(led1_time>=LED1_OFF_TIME){

led1_time=0x00;
led1=LED_ON;
}
}
/*
*检测LED2状态,如果LED2处于亮的状态,
*那么1秒后熄灭LED2;如果LED2是灭的,
*那么2秒后点亮LED2。
*/
if(led2==LED_ON){

if(led2_time>=LED2_ON_TIME){

led2_time=0x00;
led2=LED_OFF;
}
}elseif(led2==LED_OFF){

if(led2_time>=LED2_OFF_TIME){

led2_time=0x00;
led2=LED_ON;
}
}
}

}
/*
*T0定时器中断向量值为1,中断地址为0x000b
*/
voidP0_0_timing(void)interrupt1{

TH0=TH_VALUE;
TL0=TL_VALUE;
/*
*如果计时满1秒,则led1_time加一,
*led1_time的单位是秒。
*/
led1_a_second++;
if(led1_a_second>=A_SECOND){

led1_a_second=0x00;
led1_time++;
}
}
/*
*T1定时器中断向量值为3,中断地址为0x001b
*/
voidP0_1_timing(void)interrupt3{

TH1=TH_VALUE;
TL1=TL_VALUE;
/*
*如果计时满1秒,则led2_time加一,
*led2_time的单位是秒。
*/
led2_a_second++;
if(led2_a_second>=A_SECOND){

led2_a_second=0x00;
led2_time++;
}
}

有用点一下采纳,谢谢!

⑺ 89c51系列用c语言编写跑马灯程序

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit k1=P2^0;
sbit k2=P2^1;
sbit k3=P2^2;
sbit k4=P2^3;
sbit beep=P3^0;

uchar idex,,count;
uchar flag;

void display_lcd() //流水灯
{
switch(count) //四种不同的变化
{
case 1 :

P0=0x01<<idex;
if(idex>8)
idex=0;

break;

case 2 :

P0=0x80>>idex;
if(idex>8)
idex=0;

break;

case 3 :

P0=0x03<<idex;
if(idex>8)
idex=0;

break;

case 4 :

P0=0xaa<<idex;
if(idex>2)
idex=0;

break;
}
switch(flag)
{
case 0 : //开始
TR0=1;
break;

case 1 :
TR0=0; //暂停
break;
}

}

void scan_key() //按键
{
if(!k1)
=2;

if(!k2)
=4;

if(!k3)
{
count++;
while(!k3);
}
if(count>4)
count=0;

if(!k4)
{
flag++;
while(!k4);
}
if(flag>1)
flag=0;

}

void beep_b() //蜂鸣器
{
if(P2==0xff)
{
beep=1;
}
else
{
beep=0;
}
}

void Init() //定时器初始化
{
TMOD=0X01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
EA=1;
ET0=1;
=1;
}

void main()
{
Init();
while(1)
{
display_lcd();
scan_key();
beep_b();
}
}

void timer0() interrupt 1
{
uint time;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
time++;
if(time>299*)
{
time=0;
idex++;
}

}

⑻ 用C语言实现89C51串口通信程序

void
Send_Byte(uchar
i)
{
WDI
=
~WDI;
TI
=
0;
SBUF
=
i;
while(TI==0)
WDI
=
~WDI;
TI
=
0;
}
void
Send_String(uchar
*string)
{
while(*string!=0)
{
Send_Byte(*string);
string
++;
}
}
void
Com_A_Int()
interrupt
4
{
uchar
idata
status;
status
=
SBUF;
RI
=
0;
if
(status
==
0x02)
Send_String("HELLO")
if
(status
==
0x55)
Send_String("THIS
IS
A
WELL
BEGIN!")
}
这是串口中断程序,其他的你可以自己根据实际情况编写

⑼ 怎么用c语言写单片机89C51的程序,要写的程序是,0~99秒的秒表,到99s停止,并且有滴的一声

可根据以下程序修改:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a , b=0;
sbit wei1=P1.0;
sbit wei2=P1.1;
//共阴数码管七段码
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};
void Delay1ms(uint i) //1ms延时程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<164;j++)
{;}
}
}
void display( uchar a)) //显示程序
{
P0= table[a/10];//十位
wei1=1;
Delay1ms(2) ;
wei1=0;
P0= table[a%10];//个位
wei2=1;
Delay1ms(2) ;
wei2=0;
}
void main(void )//主程序
{
TMOD=0x01;// 定时器1工作方式一
ET0=1;
EA=1;
TH0=(65536-50000)/256;//定时50ms
TL0=(65536-50000)%256;
TR0=1;
while(1)
{
display(b);
}
}

//中断子程序
//因为 中断程序很短,只花不到1ms,而中断间隔50ms,完全没必要关中断
void Timer0(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==100)//100次是5 秒
{ a=0;b++;}
if(b==100)
{ b=0;}
}