关于单片机中 C语言给P1口赋值问题 单片机中对每个P口的控制都是用二进制控制的 即使你对它赋了八进制或十进制或十六进制的数 它也会先转换成二进制然后再进行计算的 所以P1是一个8位寄存器 P1=0x55 0x是16进制的意思 这样化成二进制就是01010101P1=01010101 好的 你对它进行了八进制的赋值 01010101(你可以试一试 对P1进行0~15的简单十进制赋值 赋3 那么二进制进制是00000011 六个亮两个灭 15 11111111 全灭 八进制同理 数值以0开头为八进制)8位寄存器范围0~255 恭喜你 你赋的值超出范围了 那么255后又从0开始计数 直到01010101赋完 得出的数再转换成二进制 就是你灯亮的状态了如果你想对P1口的单独的一个位进行控制 那就可以使用sbit位声明如:第一位就是sbit P1_0=P1^0 其中P1_0只是一个名字而已 你想叫什么就叫什么 对它进行控制 P1_0=0;你对P1口的第一位进行了低电平赋值 类推
总结及分析各种寻址方式。 程序员模型无外乎两个大问题:指令集和寻址方式(立刻寻址,直接寻址,间接寻址,绝对寻址).
MCS51单片机的伪指令有哪些?
帮翻译单片机C语言程序 #include<;reg51.h>;/51单片机头文件include<;stdio.h>;/标准输入2113输出头文件unsigned char speed=5;定义5261一个字符变量,并赋值为5(想4102知道5代表什么可以1653查ASCII码,也可以当数字用)unsigned char rec_buf[5];定义一个可以存5个字符的数组unsigned char rec_idx=0;定义一个字符变量,并赋值为0;char putchar(char c)/实现一个名为putchar的方法,传入一个字符,返回一个字符{/{}括起来的是方法体,代表这里面的内容属于这个方法的ES=0;ES应该是一个寄存器吧,这里是把里面清0,单片机我懂不多SBUF=c;把传入的字符写到SBUF寄存器,while(TI=0);当TI寄存器里值非0时继续,这里是一个条件等待TI=0;把TI 寄存器清0重置ES=1;向ES寄存器写入1return 0;返回0,结束本方法}void delay100ms(unsigned char n)/定义一个无返回值的方法,并需要传入一个字符{/char字符型是可以当成数字来用的unsigned char i,j;定义两个字符变量TMOD=0x20;把寄存器置为 0010 0000 状态for(j=0;j;j)/作n(n是方法传入的字符)次循环{/{}里面的东内容都进行n次循环for(i=0;i;i+)/作20次循环,因为他在n次循环内,实际上是n乘以20次{/外层进行1次,这里就这进行20次THO=0x。
汇编语言
请教8051汇编指令 MCS-51数据传送指令数据传送指令共有29条,数据传送指令一般的操作是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数。如果要求在进行数据传送时,目的操作数不丢失,则不能用直接传送指令,而采用交换型的数据传送指令,数据传送指令不影响标志C,AC和OV,但可能会对奇偶标志P有影响。[1].以累加器A为目的操作数类指令(4条)这4条指令的作用是把源操作数指向的内容送到累加器A。有直接、立即数、寄存器和寄存器间接寻址方式:MOV A,data;(data)→(A)直接单元地址中的内容送到累加器AMOV A,#data;data→(A)立即数送到累加器A中MOV A,Rn;(Rn)→(A)Rn中的内容送到累加器A中MOV A,@Ri;((Ri))→(A)Ri内容指向的地址单元中的内容送到累加器A[2].以寄存器Rn为目的操作数的指令(3条)这3条指令的功能是把源操作数指定的内容送到所选定的工作寄存器Rn中。e69da5e887aae799bee5baa631333262383535有直接、立即和寄存器寻址方式:MOV Rn,data;(data)→(Rn)直接寻址单元中的内容送到寄存器Rn中MOV Rn,#data;data→(Rn)立即数直接送到寄存器Rn中MOV Rn,A;(A)→(Rn)累加器A中的内容送到寄存器Rn中[3]。.
单片机的基本指令有哪些 不知道你是问的哪种单片机下面给你的是MCS-51的,希望对你有帮助,如有,麻烦采纳,谢谢 数据传送指令共有29条,数据传送指令一般的操作是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数。如果要求在进行数据传送时,目的操作数不丢失,则不能用直接传送指令,而采用交换型的数据传送指令,数据传送指令不影响标志C,AC和OV,但可能会对奇偶标志P有影响。[1].以累加器A为目的操作数类指令(4条)这4条指令的作用是把源操作数指向的内容送到累加器A。有直接、立即数、寄存器和寄存器间接寻址方式:MOV A,data;(data)→(A)直接单元地址中的内容送到累加器AMOV A,#data;data→(A)立即数送到累加器A中MOV A,Rn;(Rn)→(A)Rn中的内容送到累加器A中MOV A,@Ri;((Ri))→(A)Ri内容指向的地址单元中的内容送到累加器A[2].以寄存器Rn为目的操作数的指令(3条)这3条指令的功能是把源操作数指定的内容送到所选定的工作寄存器Rn中。有直接、立即和寄存器寻址方式:MOV Rn,data;(data)→(Rn)直接寻址单元中的内容送到寄存器Rn中MOV Rn,#data;data→(Rn)立即数直接送到寄存器Rn中MOV Rn,A;(A)→(Rn)累加器A。
单片机定时器初装,TH,TL高低八位的值,C语言的书上是以十进制,汇编里用十六进制往里装,糊涂了, 单片机定时器的方式一是一个十六位的定时器。但51单片机是8位的,装不下十六位数据,所以,想要用单片机来装一个十六位的数怎么弄?单片机提供了两个寄存器(8位的)来装这个十六位的数。c语言中怎么实现把一个十六位的数装进两个八位的寄存器里?就是:TH1=(65536-50000)/256;把(65536-50000)这个初值的高八位取出来,放在TH1,用十六进制表示是03CHTL1=(65536-50000)%256;把(65536-50000)这个初值的低八位取出来,放在TL1,用十六进制表示是0B0H在c语言中,直接写TH1=0X3C;TL1=0XB0;效果跟TH1=(65536-50000)/256;给计数寄存器赋值,50毫秒时间TL1=(65536-50000)%256;一样的。区别在于一个人工算,直接赋值;一个交给单片机去算。