『壹』 C51單片機程序設計題,要求用C語言做,模擬交通燈控制單片機電路,答案要詳細具體。
晚上隨手寫,也未調試,權當看看
程序有不嚴謹地方還得調試修改
#include<REGX51.H>
#defineSTATUS_1S 1
#defineSTATUS_2S 2
#defineSTATUS_3S 3
#defineSTATUS_4S 4
#defineSTATUS_5S 5
#defineSTATUS_15S 15
#defineSTATUS_28S 28
#defineSTATUS_29S 29
#defineSTATUS_30S 30
unsignedcharflag,status,status_temp=1,status_temp_;
sbitK1 = P0^0;
sbitK2 = P0^1;
sbitRLED = P0^2;
sbitYLED = P0^3;
sbitGLED = P0^4;
voidInit(void)
{
ET0=1;
TR0=1;
RLED=0; //亮
YLED=0;
GLED=0;
while(status_temp)
{
switch(status)
{
caseSTATUS_1S: //1S
{
RLED=1; //滅,閃一次
YLED=1;
GLED=1;
} break;
caseSTATUS_2S: //1S
{
RLED=0; //亮,閃一次
YLED=0;
GLED=0;
} break;
caseSTATUS_3S: //1S
{
RLED=1; //滅
YLED=1;
GLED=1;
status_temp=0;
} break;
}
}
status_temp=1;
ET0=0;
TR0=0;
}
voidInit_Timer0(void)
{
TMOD=0x01;
// ET0=1;
// TR0=1;
EA=1;
TH0=0X3C;
TL0=0XB0; //未計算,偷樓上的
}
voidM_Start(void)
{
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
RLED=0; //紅亮
while(status_temp)
{
switch(status)
{
caseSTATUS_1S:
{
if(status_temp_==1)
{
YLED=0;
}
} break;
caseSTATUS_2S:
{
if(status_temp_==1)
{
YLED=1;
}
} break;
caseSTATUS_3S:
{
if(status_temp_==1)
{
YLED=0;
status_temp_=0;
}
} break;
caseSTATUS_15S: //15S滅,綠亮
{
RLED=1;
GLED=0;
} break;
caseSTATUS_28S:
{
GLED=1;
} break;
caseSTATUS_29S:
{
GLED=0;
} break;
caseSTATUS_30S:
{
GLED=1;
status=0;
status_temp_=1;
} break;
}
}
ET0=0;
TR0=0;
status=0;
status_temp=1;
YLED=1;
}
voidM_End(void)
{
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
RLED=0; //亮1次
YLED=0;
GLED=0;
while(status_temp)
{
switch(status)
{
caseSTATUS_1S: //1S
{
RLED=1; //滅一次
YLED=1;
GLED=1;
} break;
caseSTATUS_2S: //1S
{
RLED=0; //亮二次
YLED=0;
GLED=0;
} break;
caseSTATUS_3S: //1S
{
RLED=1; ////滅二次
YLED=1;
GLED=1;
} break;
caseSTATUS_4S: //1S
{
RLED=0; ////亮三次
YLED=0;
GLED=0;
} break;
caseSTATUS_5S: //1S
{
RLED=1; ////滅三次
YLED=1;
GLED=1;
status_temp=0;
} break;
}
}
status_temp=1;
ET0=0;
TR0=0;
}
main()
{
Init();//單片機初始化
Init_Timer0();//定時器初始化
while(1)
{
if(K1==0)
M_Start();//模擬開始
if(K2==0)
M_End();//模擬結束
}
}
voidinterrupt_time0()interrupt1 //核對頭文件,一致就好
{
TH0=0X3C;
TL0=0XB0;
flag++;
if(flag==20)
{
status++;
flag=0;
}
}
『貳』 單片機C51 C語言編程問題!!!!
voiddisplay(ucharshi,ucharge)
{
uintledout[1],i;//這里應該是ledout[2]
我在proteus上進行了模擬,但是不知道什麼原因,只對共陽極LED數碼管好使。我就把程序稍微做了改動,模擬結果可以正確計時。
我把程序貼在下面供參考
#include<reg52.h>
#define禪悔ucharunsignedchar
#defineuintunsignedint
ucharnum=0,count=0,num2=0,shi=0,ge=0;
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共陽//段選數據表
//ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucharcodewei[2]={0xfe,0xfd};//位選數據表
voiddisplay(uchar,uchar);
voiddelay(uint);
voidmain()
{
TMOD=0x10;//設定定時器1工作在方式1
TH1=(65536-50000)/256;//裝載初值
TL1=(65536-50000)%256;//開總中斷
//開定時器1中斷
ET1=1;//啟動定時器1
TR1=1;//程序在此不停對於數碼管動態掃描等待中斷
EA=1;
while(1)
{
display(shi,ge);//顯示函數
}
}
voiddisplay(ucharshi,ucharge)
{
uintledout[2],i;
ledout[0]=table[shi];雹襲鋒//段選數據十位
ledout[1]=table[ge];//段選數據各個
for(i=0;i<2;i++)
{//用P0輸出位選數據
P0=wei[i];
//這里用查表的方式來賦值
P2=ledout[i];//用P2輸出段選數據
delay(1);//掃描間隔
}
}
//1S中斷函數
voidT1_time()interrupt3
{
TH0=(65536-50000)/256;源晌//重新裝載初值
TL0=(65536-50000)%256;
count++;
if(count==20)//如果到了20次,說明1秒到
{//把COUNT清零重新計數20次
count=0;
num2++;//用NUM2向來數碼管顯示到60後歸零
if(num2==60)
num2=0;
shi=num2/10;//把NUM2分成2個數十位和個位
ge=num2%10;
}
}
voiddelay(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)//延時程序
for(j=110;j>0;j--);
}
『叄』 51單片機的問題
7.定時/計數器工作於定時方式時,是通過89C51片內振盪器輸出經12分頻後的脈沖進行計數,
--對。
直至溢出。
--這要看你的軟體,也可以讓它永遠不溢出。
8.80C51單片機的擴展程序存儲器與片內程序存儲器存儲空間重疊。
--可以重疊,也可以不重疊。
--這要看,是誰設計電路了。
9.在中斷響應時斷點地址自動入棧
--對。
『肆』 求解幾道MCS51單片機的答案
11. C51 中,若定義8 位有符號類型的變數,可定義為 char 型變數,其值域為 -128~127 ;unsigned int 型變數的長度為 無符號整型 ,其值域為 0~65535 。5. 若MCS-51 晶振頻率為12MHz,則T0 工作於計數方式時,可以接受的計數脈沖頻率范圍為 1000000~1000000/65536 。11.欲對300個外部事件計數,可以選用定時器/計數器T1的模式 0 或模式 1 。 10.MCS-51 單片機的串列口工作於方式0 時用於 同步 移位寄存器。MCS-51單片機串列方式0通信時,數據從 Rxd 引腳發送/接收。
『伍』 第八屆藍橋杯單片機組預賽真題解析
第八屆藍橋杯單片機組預賽真題解析如下:
單片機基礎知識:
電路分析:
濾波器類型識別:
邏輯門功能:
數電表達式簡化:
中斷優先順序:
地址分配:
數碼管消除陰影:
存儲區分析:
復位與程序下載:
實驗總結: 本部分真題涵蓋了定時器、濾波器、中斷優先順序等多個單片機領域的核心知識點,要求參賽者具備扎實的理論基礎和實際應用能力。