⑴ 請問單片機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;}
}