亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

麻煩把下面的C語言轉成單片機匯編語言!

麻煩把下面的C語言轉成單片機匯編語言!

慕的地8271018 2022-06-16 15:11:39
include "AT89C51.H"//#include "intrins.h"//#include <AT89X52.H>//#define uchar unsigned char//#define uint unsigned int/*延時程序由Delay 參數確定延遲時間*/void mDelay(unsigned int Delay){ unsigned int i;for(;Delay>0;Delay--){for(i=0;i<10000;i++);}//200ms}void main(){unsigned int x;while(1) /*while語句,后面括號里1,表示無終止執行循環語句*/{P1=0xFF;//P1口作為輸入口省. /*把0xFF這個數賦值給P1這個變量*/x=P1&&0x0F; /*P1&&0x0F的運算結果是1,再把1賦值給x */P1=0x00; /*把0賦值給P1,這時P1的值就變成0啦*///P0=0xFF;//P0口的特殊之處就是需要先初始化然后再讀入正確的值P1_7=1; /*電磁閥2開啟*/P1_6=0; /*電磁閥1關閉*/mDelay(x+1); /*調用mDelay這個函數,相當于把這邊括號里的x+1代入到上面mDelay函數里的Delay變量*/P1_7=0; /*電磁閥2關閉*/mDelay(16-x); /*又一次調用mDelay函數*/P1_6=1; /*電磁閥1開啟*/mDelay(16); /*再一次調用mDelay函數*/P1_7=1; /*電磁閥2開啟*/P1_6=0; /*電磁閥1關閉*/}}
查看完整描述

2 回答

?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

org 0000h
sjmp main
_mDelay:
; SOURCE LINE # 9
;---- Variable 'Delay?040' assigned to Register 'R6/R7' ----
; { unsigned int i;
; SOURCE LINE # 10
; for(;Delay>0;Delay--)
; SOURCE LINE # 11
?C0001:
SETB C
MOV A,R7
SUBB A,#00H
MOV A,R6
SUBB A,#00H
JC ?C0007
; {for(i=0;i<10000;i++);}//200ms
; SOURCE LINE # 12
;---- Variable 'i?041' assigned to Register 'R4/R5' ----
CLR A
MOV R5,A
MOV R4,A
?C0004:
INC R5
CJNE R5,#00H,?C0013
INC R4
?C0013:
CJNE R4,#027H,?C0004
CJNE R5,#010H,?C0004
?C0003:
MOV A,R7
DEC R7
JNZ ?C0001
DEC R6
?C0014:
SJMP ?C0001
; }
; SOURCE LINE # 13
?C0007:
RET
; END OF _mDelay

; void main()

main:
USING 0
; SOURCE LINE # 14
; {
; SOURCE LINE # 15
?C0008:
; unsigned int x;
; while(1) /*while語句,后面括號里1,表示無終止執行循環語句*/
; SOURCE LINE # 17
; {
; SOURCE LINE # 18
; P1=0xFF;//P1口作為輸入口省. /*把0xFF這個數賦值給P1這個變量*/
; SOURCE LINE # 19
MOV P1,#0FFH
; x=P1&&0x0F; /*P1&&0x0F的運算結果是1,再把1賦值給x */
; SOURCE LINE # 20
MOV A,P1
MOV R6,#00H
JZ ?C0010
MOV R7,#01H
SJMP ?C0011
?C0010:
MOV R7,#00H
?C0011:
;---- Variable 'x?142' assigned to Register 'R2/R3' ----
MOV R3,AR7
MOV R2,AR6
; P1=0x00; /*把0賦值給P1,這時P1的值就變成0啦*/
; SOURCE LINE # 21
CLR A
MOV P1,A
; //P0=0xFF;//P0口的特殊之處就是需要先初始化然后再讀入正確的值
; P1_7=1; /*電磁閥2開啟*/
; SOURCE LINE # 23
SETB P1^7
; P1_6=0; /*電磁閥1關閉*/
; SOURCE LINE # 24
CLR P1^6
; mDelay(x+1); /*調用mDelay這個函數,相當于把這邊括號里的x+1代入到上面mDelay函數里的Delay變量*/
; SOURCE LINE # 25
MOV A,R3
ADD A,#01H
MOV R7,A
CLR A
ADDC A,R2
MOV R6,A
LCALL _mDelay
; P1_7=0; /*電磁閥2關閉*/
; SOURCE LINE # 26
CLR P1^7
; mDelay(16-x); /*又一次調用mDelay函數*/
; SOURCE LINE # 27
CLR C
MOV A,#010H
SUBB A,R3
MOV R7,A
CLR A
SUBB A,R2
MOV R6,A
LCALL _mDelay
; P1_6=1; /*電磁閥1開啟*/
; SOURCE LINE # 28
SETB P1^6
; mDelay(16); /*再一次調用mDelay函數*/
; SOURCE LINE # 29
MOV R7,#010H
MOV R6,#00H
LCALL _mDelay
; P1_7=1; /*電磁閥2開啟*/
; SOURCE LINE # 30
SETB P1^7
; P1_6=0; /*電磁閥1關閉*/
; SOURCE LINE # 31
CLR P1^6
; }
; SOURCE LINE # 32
SJMP ?C0008
; END OF main

END


查看完整回答
反對 回復 2022-06-20
?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

#include <reg52.h>
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
#define DAC0800 P0 //DAC0800數據總線接P3
uchar code led[]={ 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,
0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x00 }; //數碼管碼表
uchar code scan[]={ 0xf7,0xfb,0xfd,0xfe }; //鍵盤行掃描碼
uchar code sin[256]=
{ 127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,
176,179,182,184,187,190,193,195,198,200,203,205,208,210,213,215,
217,219,221,224,226,228,229,231,233,235,236,238,239,241,242,244,
245,246,247,248,249,250,251,251,252,253,253,254,254,254,254,254,
254,254,254,254,254,254,253,253,252,251,251,250,249,248,247,246,
245,244,242,241,239,238,236,235,233,231,229,228,226,224,221,219,
217,215,213,210,208,205,203,200,198,195,193,190,187,184,182,179,
176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,
127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,
78,75,72,70,67,64,61,59,56,54,51,49,46,44,41,39,
37,35,33,30,28,26,25,23,21,19,18,16,15,13,12,10,
9,8,7,6,5,4,3,3,2,1,1,0,0,0,0,0,
0,0,0,0,0,0,1,1,2,3,3,4,5,6,7,8,
9,10,12,13,15,16,18,19,21,23,25,26,28,30,33,35,
37,39,41,44,46,49,51,54,56,59,61,64,67,70,72,75,
78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124 };
uchar disp[4]={16,16,16,16}; //數碼管顯示緩沖區
//數碼管位選接P1低四位,段選接P0
//鍵盤接P2
sbit LOCK=P1^4; //74573鎖存端
uchar keyval=16; //鍵值
uchar keydigitcount=0; //數字鍵計數
uchar keyselcount=0; //選擇鍵計數
uint x,freq; //頻率參數
void Delay(uint x);
void Display();
void Keyscan();
void Keydisp();
void RecWave(uchar t);
void ZigWave(uint t);
void TriWave(uchar t);
void SinWave(uchar t);
/*------------------ 主函數 --------------------*/
void main()
{
x = 0;
freq = 2;
while(1)
{
Display(); //調用數碼管顯示函數
// Keyscan(); //調用鍵盤掃描函數
TriWave(2);
}
}
/*------------------ 方波產生 ------------------*/
void RecWave(uchar t)
{
uchar i;
DAC0800 = 0xff;
for(i=0;i<255;i++)
Delay(t);
DAC0800 = 0x00;
for(i=0;i<255;i++)
Delay(t);
}
/*----------------- 鋸齒波產生 -----------------*/
void ZigWave(uint t)
{
uchar i;
for(i=0;i<255;i++)
{
DAC0800 = i;
Delay(t);
}
DAC0800=255;
Delay(t);
}
/*----------------- 三角波產生 -----------------*/
void TriWave(uchar t)
{
uchar i;
for(i=0;i<255;i++)
{
DAC0800 = i;
Delay(t);
}
for(i=255;i>0;i--)
{
DAC0800 = i;
Delay(t);
}
}
/*----------------- 正弦波產生 -----------------*/
void SinWave(uchar t)
{
uchar i;
for(i=0;i<255;i++)
{
DAC0800 = sin[i];
Delay(t);
}
DAC0800=124;
Delay(t);
}
/*-------------------- 延時 --------------------*/
void Delay(uint x)
{
uint i;
for(i=x;i>0;i--);
}
/*----------------- 數碼管顯示 -----------------*/
void Display()
{
uchar i,j;
j=0x08;
for(i=0;i<4;i++)
{
P1=j; //數碼管位碼輸出
LOCK=1; //打開鎖存
P0=led[disp[i]]; //數碼管段碼輸出
LOCK=0; //關閉鎖存
j=j>>1; //調整位碼
Delay(125);
P0=0x00;
}
}
/*------------------ 鍵盤掃描 ------------------*/
void Keyscan()
{
uchar col,i;
P2=0xf0; //行線輸出全低
col=P2&0xf0;
if(col==0xf0) return; //無鍵,返回
Delay(20); //延時消抖
P2=0xf0; //重新檢測有鍵按下否
col=P2&0xf0;
if(col==0xf0) return; //無鍵,返回
switch(col) //判斷按鍵所在的列
{
case 0xe0: keyval=0; break;
case 0xd0: keyval=1; break;
case 0xb0: keyval=2; break;
case 0x70: keyval=3; break;
}
for(i=0;i<4;i++)
{
P2=scan[i]; //輸出鍵盤掃描碼
col=P2&0xf0;
if(col!=0xf0) break; //有鍵按下
}
keyval+=i*4; //計算鍵值
while(col!=0xf0) //等待按鍵松開
{
Display();
col=P2&0xf0;
}
Keydisp(); //調用鍵盤處理函數
}
/*------------------ 鍵盤處理 ------------------*/
void Keydisp()
{
if(keyval==10) //選擇鍵處理
{
keyselcount++;
switch(keyselcount) //選擇信號波形
{
case 1:
RecWave(freq); //調用方波產生函數
break;
case 2:
ZigWave(freq); //調用鋸齒波產生函數
break;
case 3:
TriWave(freq); //調用三角波產生函數
break;
case 4:
SinWave(freq); //調用正弦波產生函數
break;
}
if(keyselcount==4) keyselcount=1;
}
if(keyval<10) //數字鍵處理
{
keydigitcount++;
disp[keydigitcount-1] = keyval;
x = x*10 + x; //計算信號頻率
if(keydigitcount==4)
{
keydigitcount=1;
freq = x;
x = 0;
}
}
}
如何轉換


查看完整回答
反對 回復 2022-06-20
  • 2 回答
  • 0 關注
  • 195 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號