freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

畢業(yè)設(shè)計(jì)-基于單片機(jī)的多任務(wù)程序設(shè)計(jì)-資料下載頁

2024-12-03 18:49本頁面

【導(dǎo)讀】摘要:本文介紹了基于AT89C51單片機(jī)的多任務(wù)程序設(shè)計(jì)。首先介紹了多任務(wù)系統(tǒng)的基本概念,時鐘中斷處理函數(shù)、任務(wù)創(chuàng)建函數(shù)、任務(wù)堆棧初始化函數(shù)以及系統(tǒng)延時函數(shù)。LCD上同時顯示俄羅斯方塊和貪吃蛇游戲的實(shí)例,并給出了游戲流程圖和硬件電路圖。設(shè)計(jì)的多任務(wù)系統(tǒng)具有結(jié)構(gòu)簡單,使用方便靈活的特點(diǎn)。

  

【正文】 include uchar xdata Task_Stack0[LENGTH]。 uchar xdata Task_Stack1[LENGTH]。 uchar xdata Task_Stack2[LENGTH]。 uchar xdata EMPTYTASK[LENGTH]。 sbit LED1=P3^3。 int blocks[]={8*60+27,3*60+22,3*60+27,3*60+32,8*60+27,13*60+27,3*60+27,3*60+32,8*60+27,13*60+27,3*60+27,3*60+22,8*60+27,3*60+27,3*60+32,8*60+32, 8*60+27,3*60+27,8*60+22,3*60+32,8*60+27,3*60+22,3*60+27,8*60+32,8*60+27,13*60+27,13*60+27,3*60+27}。 int block[4]={0}。 void task0(void) reentrant { char a,b,c,f=0。 char d=0,e=0,g,h=0。 for(c=0。c4。c++) block[c]=blocks[c]。 while(1) { if(testbit(2,20)==0) LED1=0。 //Delay(10)。 for(c=0。c4。c++) { a=(block[c]+300)/60。 b=(block[c]+300)%60。 h=0。 if(a0amp。amp。b0) if(testbit(a,b)==0) for(g=0。g4。g++)if((a*60+b)!=block[g])h++。 if(h==4) break。 } for(c=0。c4。c++) if(block[c]/60==57)a=66。 if(a==66||h==4) { f=f+4。 if(f==28)f=0。 removeblock()。 for(c=0。c4。c++) if((block[c]/60)==2) {cleanall()。break。} for(c=0。c4。c++) block[c]=blocks[c+f]。 } for(c=0。c4。c++) { a=block[c]/60。 b=block[c]%60。 EraseBlock1(a,b)。 } switch(DIRECTION) { case 0:d=1。e=0。break。 case 1:d=+1。e=0。break。 case 2:d=0。e=0。Transform(0)。break。 case 3:d=0。e=+2。break。 default:d=0。e=1。break。 } DIRECTION=4。 for(c=0。c4。c++) { b=block[c]%60。 if(b==2amp。amp。d==1||b==57amp。amp。d==1) {d=0。e=1。break。} } for(c=0。c4。c++) 西南大學(xué)本科畢業(yè)論文(設(shè)計(jì)) 33 { a=(block[c]+5*d+e*60*5)/60。 b=(block[c]+5*d+e*60*5)%60。 h=0。 if(a0amp。amp。b0) if(testbit(a,b)==0) for(g=0。g4。g++) if(block[g]==(a*60+b))h++。 if(h==4) { d=0。 e=1。 break。 } } for(c=0。c4。c++) block[c]=block[c]+5*d+e*60*5。 for(c=0。c4。c++) { a=block[c]/60。 b=block[c]%60。 DrawBlock1(a,b)。 } /* a=block[0]/60。 if(a==52||g==5) { f=f+4。 if(f==28)f=0。 for(c=0。c4。c++) block[c]=blocks[c+f]。 } for(c=0。c4。c++) { a=block[c]/60。 b=block[c]%60。 EraseBlock1(a,b)。 } switch(DIRECTION) { case 0:d=1。e=0。break。 case 1:d=+1。e=0。break。 case 2:d=0。e=0。Transform(0)。break。 case 3:d=0。e=+2。break。 default:d=0。e=1。break。 } DIRECTION=4。 for(c=0。c4。c++) { b=block[c]%60。 if(b==2amp。amp。d==1||b==57amp。amp。d==1) {d=0。e=1。break。} } for(c=0。c4。c++) { a=(block[c]+5*d+e*60*5)/60。 b=(block[c]+5*d+e*60*5)%60。 if(testbit(a,b)==0) for(g=0。g4。g++) if(block[g]==(a*60+b))break。 if(g==4) {g=5。break。} } if(g!=5) { for(c=0。c4。c++) block[c]=block[c]+5*d+e*60*5。 for(c=0。c4。c++) { a=block[c]/60。 b=block[c]%60。 DrawBlock1(a,b)。 } } */ Delay(10)。 } } 西南大學(xué)本科畢業(yè)論文(設(shè)計(jì)) 34 void task1(void) reentrant { uint snackbody[10]={61}。 uchar head=0。 uchar tail=0。 uchar a,b,c。 while(1) { DrawBlock(2,3+68)。 if(AA==1) { head++。 snackbody[head]=snackbody[head1]。 AA=0。 } else { a=snackbody[tail]/60。 b=snackbody[tail]%60。 EraseBlock(a,b+68)。 for(a=0。ahead。a++) snackbody[a]=snackbody[a+1]。 } switch(DIRECTION1) { case 0:snackbody[head]=snackbody[head]3。break。 case 1:snackbody[head]=snackbody[head]+3。break。 case 2:snackbody[head]=snackbody[head]180。break。 case 3:snackbody[head]=snackbody[head]+180。break。 default:break。 } a=snackbody[head]/60。 b=snackbody[head]%60。 if(a=0||a=59||DIRECTION1b==58||DIRECTION1b==0) { for(c=0。chead。c++) { a=snackbody[c]/60。 b=snackbody[c]%60。 EraseBlock(a,b+68)。 } head=0。 snackbody[head]=70。 DIRECTION1=1。 } else DrawBlock(a,b+68)。 Delay(20)。 } } void task2(void) reentrant { while(1) { putchar(39。339。)。 Delay(4)。 } } void task3(void) reentrant { while(1) { putchar(39。439。)。 //Delay(9)。 } } void Initial_System() { uchar a,b。 DisplayStartLine(0)。 西南大學(xué)本科畢業(yè)論文(設(shè)計(jì)) 35 SetPageAddress(0)。 for (b=60。b68。b++) for(a=0。a64。a++) ErasePoint(a,b)。 for (b=60。b64。b++) for(a=0。a128。a++) ErasePoint(b,a)。 SCON = 0x52。 PCON = 0x80。 TCON = 0x40。 TMOD |= 0x01。 TH0 = 0x70。 TL0 = 0x00。 TR0=1。 IT0=1。//外部中斷 EX0=1。 EA=1。 DisplayOn()。 CS1=0。 CS2=1。 } //啟動系統(tǒng) void Start_System() { CURRENT_TASK=0。//從 0號任務(wù)開始運(yùn)行 CURRENT=amp。Task_TCB[0]。 NEXT=amp。Task_TCB[0]。 startswitch()。//Task_Switch()。 } //主函數(shù)程序從此處開始執(zhí)行 void main() { Initial_System()。 Task_Create(task0,amp。Task_Stack0[0],0)。 Task_Create(task1,amp。Task_Stack1[0],1)。 Task_Create(task2,amp。Task_Stack2[0],2)。 Task_Create(task3,amp。EMPTYTASK[0],3)。 Start_System()。 } 調(diào)度器函數(shù)文件: include uchar xdata CURRENT_TASK。 struct TCB *xdata CURRENT,*xdata NEXT,*xdata EMPTY。 struct TCB xdata Task_TCB[TASK_NUM+1]。 void Delay(uint count) { uchar a,b。 EA=0。 Task_TCB[CURRENT_TASK].T_delay=count。 Task_TCB[CURRENT_TASK].T_state=waiting。 b=CURRENT_TASK。 for(a=0。aTASK_NUM+1。a++) { if(b==TASK_NUM) b=0。 else b=b+1。 if(Task_TCB[b].T_state==ready) break。 } CURRENT_TASK=b。 NEXT=amp。Task_TCB[b]。 switchtask()。 } void RESETTASKTIMER(void) { uchar a=0。 uchar b=0。 西南大學(xué)本科畢業(yè)論文(設(shè)計(jì)) 36 //空閑任務(wù)一直處于 ready 狀態(tài) //空閑任務(wù)的 Task_ID 始終為 0 //將每個任務(wù)的等待時間片 1 for(a=0。aTASK_NUM+1。a++) { if(Task_TCB[a].T_s
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1