80c51单片机汇编程序!!!!急急急急急
//f=6MHzsbit pout=p1^0;unsigned char cnt;void main(){ Init(); while(1) { PCON=0x01; //休眠 }}void Init(){ TMOD=0x2; //方式2:8位自装入 TH0=0x6; //基础定时500us TL0=0x6; TR0=1; ET0=1; EA=1;} void Timeon() interrupt 1 //定时器{ if(--cnt==0) { pout=~pout; if(pout==1) { cnt=80; } else { cnt=120; } }}
按k1键计数,并且数字在动态数码管上显示,
计数到10以后停止,
然后再按k2键以后数码管上数字清零,
--------
满足这个要求,也用不着定时器呀!
程序中 T1,是干嘛的?
#define uchar unsigned char
#define uint unsigned int
unsigned char x=0,m=0,y=128;
sbit WR_DA=P2^1;
sbit CS_DA=P2^0;//DA与单片机的接口
sbit S0=P3^0; //波形选择,每次按下将产生不同的波形
sbit S1=P3^1; //频率减
sbit S2=P3^2; //频率加
sbit S3=P3^3; //调节方波的占空比
uchar code SinTab[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5
,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5
,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd
,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda
,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99
,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51
,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16
,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15
,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e
,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 };
void delayms(uint t)
{
uint i;
while(t--)
{
for (i=0;i<125;i++);//对于11.0592M时钟,约延时1ms
}
}
void delay(uint t)
{
uint i;
for (i=t;i>0;i--);
}
void time0_init()
{
TMOD|=0x01; //定时器设置 16位
TH0=-50000/256;
TL0=-50000%256;//初始化值
ET0=1;
TR0=1;
EA=1;
}
void time0_int(void) interrupt 1
{
TR0=0;//关闭定时器
TH0=-50000/256;
TL0=-50000%256;//重装初值
if(S0==0)
{
delayms(10);//按键消抖
if(S0==0) m++;
while(!S0);//松手检测
}
if(S1==0)
{
delayms(10);
if(S1==0) x=x+1;
while(!S1);//松手检测
}
if(S2==0)
{
delayms(10);
if(S2==0) x=x-1;
while(!S2);//松手检测
}
if(S3==0)
{
delayms(10);
if(S3==0) y=y+5;
while(!S3);//松手检测
}
if(y>254) y=0;
if(m>5) m=0;
if(x>50) x=0;
TR0=1;//启动定时器
}
void fangbo() //方波
{
uchar i,j;
j=255-y;
CS_DA=0;
WR_DA=0;
for(i=y;i>0;i--)
{
P0=0;
delay(x);
}
while(j--)
{
P0=255;
delay(x);
}
}
void juchi() //锯齿波
{
uchar i;
CS_DA=0;
WR_DA=0;
for(i=255;i>0;i--)
{
P0=i;
delay(x);
}
}
void sanjiao() //三角波
{
uchar i;
CS_DA=0;
WR_DA=0;
for(i=0;i<255;i++)
{
P0=i;
delay(x);
}
while(i--)
{
P0=i;
delay(x);
}
}
void tixing() //梯形波
{
uchar i=255,j,k;
CS_DA=0;
WR_DA=0;
while(i--)
{
P0=i;
delay(x);
}
for(j=0;j<100;j++)
{
P0=0;
delay(x);
}
for(k=0;k<255;k++)
{
P0=k;
delay(x);
}
}
void sin() //正弦波
{
uchar a;
CS_DA=0;
WR_DA=0;
for(a=0;a<255;a++)
{
P0=SinTab[a];
delay(x);
}
}
main()
{
time0_init();
while(1)
{
switch(m)
{
case 0:
fangbo(); //方波
break;
case 1:
juchi(); //锯齿波
break;
case 2:
sanjiao(); //三角波
break;
case 3:
sin(); //正弦波
break;
case 4:
tixing(); //梯形波
break;
default: fangbo();
}
}
}
建议楼主把楼上的C语言按着他的思路改成汇编
Q我
51单片机开始要学汇编吗?
我不知道你究竟是问的哪个问题,挨个说一下个人的看法吧!1.学习51单片机不一定要学汇编,用Keil C足够了,不过如果学习了汇编并对51寄存器组比较熟的话,对调试和查找问题会有很大好处的。2.如果你是搞硬件的话,可以尽最大能力学就是了,学到可以自己调试板子,就足够了。当然,如果学的能编一个...
单片机MCS-51汇编语言中的A B C指的是什么
A是指累加器A,B寄存器是为执行乘法和除法操作设置的, 当然也可以做普通寄存器来用。C和A\/ B不同,C是指进位 位,是一个位,而A,B 是八位呢,呵呵,如果说寄存器还有, 位标志也有许多,希望多去网站或者多看看书,才能了解。个人推荐看C语言,简单些。如果不是考试课程,就不要研究汇编了,...
求C51单片机汇编语言控制两位数码管倒计时程序,最好能说明下思路_百度...
查询方式:ORG 00H START: MOV R0,#20 MOV R4,#60 LP0: MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H MOV DPTR,#TABLE SETB TR0 LP1: JBC TF0,LP2 ACALLDISP AJMP LP1 LP2: DJNZ R0,LP0 CLR TR0 MOVR0,#20 MOV A,R4 CJNE A,#0,DEC1 MOV R4...
单片机MCS-51汇编语言中的“A、B、C”指的是什么?
它们的含义分别为:A是累加器,是使用频率最高的特殊寄存器。B是通用寄存器,也是唯一可以参与乘、除运算指令的寄存器。C是进位位,属于位存储器,也是布尔处理机进行位运算最常用的位寄存器,同时受某些算术、逻辑运算指令影响,表征结果的状态。单片机是指一个集成在一块芯片上的完整计算机系统。单片机是一...
C51单片机汇编语言
用LCALL或者ACALL命令调用子程序时会把当前的程序地址压入堆栈当前点,在遇到RET指令时就会把保存的断点地址弹回PC寄存器,继续调用之前的执行,但是JMP系列指令不会保存断点地址,所以RET时就会把堆栈当前点数据装入PC,上电后RAM中未初始化的单元都是0,所以就会把0装入PC,于是程序就回到0地址了。
51单片机,将1个C语言短程序改为汇编,很快的。加分
ORG 0000H MAIN:LCALL DIS SJMP MAIN DELAY_MS:MOV R2,#250 DELAYM:NOP NOP DJNZ R2,DELAYM DJNZ R7,DELAY_MS RET DELAY:MOV R2,#10 DJNZ R2,RET DIS:MOV DPTR,#TABLE7 MOV R0,#0 MOV R3,#1 DISLP:MOV A,R0 MOVC A,@A+DPTR MOV P0,A MOV A,R3 RL A MOV R3,A CPL A MOV...
MCS51单片机的伪指令有哪些?
汇编起始伪指令:ORG;结束伪指令:END;字节数据定义伪指令:DB;字数据定义伪指令:DW;空间定义伪指令:DS;赋值伪指令:EQU;位地址符号定义伪指令:BIT ;片内RAM直接字节地址定义伪指令:DATA;片外RAM直接字节地址定义伪指令:XDATA;一共9个 ...
谁能给我一些简单的51单片机的汇编程序,然后用c语言翻译一下啊_百度知...
for(a=0;a<7;a++){ P2=_crol_(P1,1);delay();} for(a=0;a<7;a++){ P2=_cror_(P1,1);delay();} } } void delay(){ uchar s,i;for(s=10;s>0;s--)for(i=100;i>0;i--);} c语言就不多说啦,仅供参考。不过我觉得还是用c语言单片机编程简单。 电路连接见仿真图 ...
51单片机的指令是汇编语言吗?
还是会经过编译器转换成来汇编程序,再转换成二进制的指令,下载到芯片中去。这样就方便学习和推广。比如说,如果你懂C语言的话,就可以写很多体系CPU的应用程序。但如何转换为二进制指令的话,就由编译器来完成了。所以强列建议你去学习C语言,这是一种经典的语言。对于应用开发很有用。
51单片机,有了c语言的程序,如何把它变换成汇编语言
可以实现,但转换的结果不是太理想,跟反汇编差不多,需要自己去整理,其转移的标号需要自己重新定义,转换结果里是用行地址替代的
柘追澳朗: 假设P3.0接K1信号,P3.1接K2信号,P3.2接K3信号 ORG 4000H LJMP START START:MOV A,P3 ANL A,#07H //屏蔽P3口高5位,只有P3.0-P3.2 JZ L1 // A=0,说明P3.0-P3.2全为0 CJNE A,#07H,L2 //A=7,说明P3.0-P3.2全为1 L1: MOV P1,#...
揭阳市18559132166: 80c51单片机中,写一段汇编程序 在40H~7FH 中查找 一个数01H 若存在 - ?
柘追澳朗: MOV R2,#63 MOV R0,#40H LP: MOV A,@R0 XRL A,#1 INC R0 JNZ LP DEC R0 MOV A,#1 MOV 20H,R0 ;01H所在地址存20H中 SJMP $
揭阳市18559132166: 大学80C51单片机编程题,请使用汇编语言编写,谢谢! - ?
柘追澳朗: 1:MOV A,R1 ANL A,#0F0H XCH A,R2 ANL A,#0FH ORL A,R2 MOV R3,A2:MOV R0,#30H MOV 40H,#0 MOV 41H,#0 MOV R2,#16 LOOP: MOV A,@R0 ADD A,40H MOV 40H,A MOV A,41H ADDC A,#0 MOV 41H,A INC R0 DJNZ R2,LOOP RET3...
揭阳市18559132166: 单片机80c51,汇编语言. - ?
柘追澳朗: 定时中断应该是 ORG 000BH org 0100h;添加主程序地址 TIMER0:;********* MOV TH0,#00HMOV TL0,#00H ;************添加中断赋值语句 PUSH ACC MOV TL0,#0B0H MOV TH0,#3CH DJNZ TIMER,LP MOV TIMER,#20H LCALL TIME_INC LP: POP ACC RETi;中断程序应该用reti返回 而且没有主程序 要在后面写一个主函数 main: MOV TMOD,#00HMOV TH0,#00HMOV TL0,#00H MOV IE,#82H start:jmp start
揭阳市18559132166: 基于单片机80c51使用汇编语言编写一个简单程序(keil环境下) - ?
柘追澳朗: 这题目...CLR A MOV 30H,A MOV 31H,A ;结果清零 MOV R7,#01H LOOP:MOV A,R7 MOV B,A MUL AB ADD A,30H ;低8位 MOV 30H,A MOV A,B ADDC A,31H MOV 31H,A ;高8位 INC R7 CJNE R7,#11,LOOP;;;;;;;;;;;;; END
揭阳市18559132166: 单片机,汇编,求程序. 80C51单片机P1口上接8只发光二极管(高电平亮,低电平灭),若晶振频率 - ?
柘追澳朗: 你要发出不同颜色的光,不同亮度的光,则必须使得三种颜色的灯的电流必须是可连续变化(即亮度可连续变化),三种颜色的亮度不同而进行不同的组合(红+绿+蓝)就可变成不同颜色、不同亮度的光.举例:1、假设把电流分为256级(8位...
揭阳市18559132166: 单片机80c51,用汇编,编写一个延时子程序,通过调用此程序实现在p1.0输出周期为10ms的方波 - ?
柘追澳朗: ORG 0000HAJMP MAINORG 000BHT0MS EQU NOT 5000 ; 定义定时器初值 12M晶振 5 mS = 5000 10 mS = 10000MOV TL0, #LOW T0MSMOV TH0, #HIGH T0MSCPL P1.0 ; P1.0 取反 输出 10 mS的方波REIT MAIN:MOV TMOD,#01HMOV TL0, #LOW T0MSMOV TH0, #HIGH T0MSSETB TR0 ; 启动定时器SETB ET0 ; 开 T0 中断SETB EA ; 开 总 中断SJMP $END
揭阳市18559132166: 用 80C51 单片机汇编语言程序设计 - ?
柘追澳朗: 1.MOV A,45HANL A,#0FHORL A,#0FHMOV 45H,A2.MOV DPTR,#2000HMOVX A,@DPTRMOV 20H,A
揭阳市18559132166: 用汇编语言编写80c51单片机程序,求内部RAM中50H~59H十个单元内容的平均值,并存放在5AH单元. - ?
柘追澳朗: 结合1,2,3楼,考虑了溢出问题.花了好多时间才想出来了.希望对你有帮助.ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV R0,#50H MOV R7,#10 MOV R2,#00H MOV A,#00H LOOP:CLR CADD A,@R0 JNC BBB INC R2 CLR C BBB: ...
揭阳市18559132166: 初学单片机80C51,关于几个简单的指令的汇编语言编程~~~ - ?
柘追澳朗: 1】将R0的内容传送到R1 MOV A, R0 MOV R1, A2】内部RAM单元60H的内容传送到寄存器R2 MOV R2, 60H3】外部RAM单元1000H的内容传送到内部RAM单元60H MOV DPTR, #1000H MOVX A, @DPTR MOV 60H, A4】外部RAM单元1000H的内容传送到寄存器R2 MOV DPTR, #1000H MOVX A, @DPTR MOV R2, A5】外部RAM单元1000H的内容传送到外部RAM单元2000H MOV DPTR, #1000H MOVX A, @DPTR MOV DPTR, #2000H MOVX @DPTR, A ;谢谢提示.