不同进制之间转换、C语言变量种类和运算符、keil的Debug用法及应用 和 流水灯的实现
1、二进制、十进制、十六进制转换
1.1 进制介绍
十进制:逢十进位,一个为有十个值:0~~9。
二进制:逢二进位,它的一个位只有两个值:0 和 1,是实现计算机系统的最基本的理论基础,计算机(包括单片机)芯片是基于成万上亿个的开关管组合而成的,他们每一个都只能有开和关两种状态,对应于二进制的 1 和 0 两个值,书写二进制数据时需加前缀 0b,每一位的值只能是 0 或 1。八位二进制称为一个字节。
十六进制:把 4 个二进制位组合为一位来表示,用 0~9 再加上 A~F(或 a~f)表示,逢十六进位,是二进制的一种缩写形式,也是我们程序编写中常用的形式。书写十六进制数据时需加前缀 0x,两位十六进制称为一个字节。
下表为三种进制间对应关系:
进制说明:对于进制来说,只是数据的表现形式,而数据的大小不会因为进制表现形式不同而不同,比如二进制的 0b1、十进制的 1、十六进制的 0x01,他们本质上是数值大小相等的同一个数据。我们在进行 C 语言编程的时候,我们只用到十进制和十六进制。
1.2 进制转换
二进制转十六进制
16进制有16个数,0–15,用二进制表示15的方法就是1111,从而可以推断出,16进制用2进制可以表现成0000~1111,顾名思义,也就是每四个为一位。举例:
00111101可以这样分:
0011|1101(最高位不够可用零代替),对照着二进制的表格, 8 4 2 1 (一般例举这么多就够了,如果有小数的话就继续往右边列举,如0.5 0.25 0.125 0.0625……)
8 4 2 1
0 0 1 1| 1 1 0 1
左半边=2+1=3 右半边=8+4+1=13=D
结果,00111101就可以换算成16进制的3D。
二进制转十进制
从最低位(最右)算起,位上的数字乘以本位的权重,权重就是2的第几位的位数减一次方。比如第2位就是2的(2-1次)方,就是2;第8位就是2的(8-1)次方是128。把所有的值加起来。
2(1-1)代表2的0次方,就是1;其他类推
比如二进制1101,换算成十进制就是:12(1-1)+02(2-1)+12(3-1)+12(4-1)=1+0+4+8=13。
十六进制到二进制
由于在二进制的表示方法中,每四位所表示的数的最大值对应16进制的15,即16进制每一位上最大值,所以,我们可以得出简便的转换方法,将16进制上每一位分别对应二进制上四位进行转换,即得所求:
例:2AF5换算成2进制:
第0位: (5)16 = (0101) 2
第1位: (F)16 = (1111) 2
第2位: (A) 16 = (1010) 2
第3位: (2) 16 = (0010) 2
得:(2AF5)16=(0010|1010|1111|0101)
十进制转二进制:
连续除以2举个例子把
13(10进制)
转化为二进制,我们需要做的就是
13 / 2 = 6 … 1
6 / 2 = 3…0
3 / 2 = 1…1
1 / 2 = 0… 1
然后自下而上写出来: ob1101。
十六进制转十进制
16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……
所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。
例:2AF5换算成10进制:
用竖式计算:
第0位: 5 * 16^0 = 5
第1位: F * 16^1 = 240
第2位: A * 16^2= 2560
第3位: 2 * 16^3 = 8192
直接计算就是:
5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997(十进制)
十进制转十六进制
十六进制转换有16进制每一位上可以是从小到大为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F16个大小不同的数,即逢16进1,其中用A,B,C,D,E,F(字母不区分大小写)这六个字母来分别表示10,11,12,13,14,15。
例如:(1)1=1;
(2)2=2;
(3)30=30/16=1余下14,14对应的是E。所以30=1E
(4)500=500/16=31余下4,所以个位是4
第二步将31化为16进制,31=31/16=1余下15,找出15对应的数字是F
所以 500=1F4
(5)321=321/16=20余下1,即各位数是1
又将20化为16进制,20=20/16=1余下4
所以321=141
(6)1024=1024/16=64余下0
再将64化为16进制,64=64/16=4余下0
所以1024=400
(7)2000=2000/16=125余下0
再将125化为16进制,125=125/16=7余下13,找到13对应的数是D
所以2000=7D0
对于10进制化为16进制,当数字大于16的时候就一直除以16,从低位往高位写。
2、C语言基础
2.1 C语言变量类型及在C51的范围
变量类型:C 语言的数据基本类型分为字符型、整型、长整型以及浮点型,每个基本类型又包含了两个类型。字符型、整型、长整型,除了可表达的数值大小范围不同之外,都只能表达整数,表达小数的话,必须用浮点型。
变量在C51的范围:见下表
(注:C51指51单片机里的C语言标准)
编程宗旨:能用小的变量类型不用大的。 1 个字节 char 解决问题的就不定义成 int,一方面节省 RAM 空间,另外一方面,程序占空间小运算速度更快。
2.2 C语言运算符
左移 << 右移 >> (注:移位都是二进制移位,左移,最低位填0补充;右移,最高位填0补充),举例说明用法,a = 0x01 << 2; 就是将0x01转换为二进制数据0b0000 0001左移2位移完右边补两个0,即(二进制下)0b0000 0100 (十六进制下)0x04
按位取反符号 ~ : 取反后1变成0,0变成1(注:理按位取反也是针对二进制而言)。比如 a = ~(0x01); 0x01 的二进制是 0b00000001,按位取反后就是 0b11111110,那么a 的值就是 0xFE 了。
3、keil软件的Debug教程
3.1 延时引入
在上节闪烁LED小灯中我们知道程序中的for(i=0; i<30000;i++);用于小灯延时,除了这种延时方法外,还有3中常见的延时方法。见下图:
for(i=0; i<30000;i++);用循环来达到延时小灯目的,延时时长随i的变化而变化,那么如何确保延时的时长足以让小灯闪烁呢?这时可以程序Debug就可以观察小灯延时时长。
3.2程序Debug的应用
观察非精确延长时间
步骤:1. 选择 Keil 菜单项 Project–>Options forTarget ‘Target1’…—>打开 Target 这个选项卡,找到里边的 Xtal(MHz)这个位置,这是填写我们进行模拟时间的晶振选项,填写自己单片机所使用的晶振 (博主的STC89C52为11.0592MHz)–>找到 Debug 这个选项卡,选择左侧的 Use Simulator,然后点击最下边的 OK 就可以了.如下图:
2. 点击选择菜单项 Debug–>Start/Stop Debug Session,如图:
窗口介绍:最左侧Register窗口为显示单片机一些寄存器的当前值和系统信息,通过这个窗口sec 选项就可以观察C语言代码运行的时间。上侧Disassembly窗口为keil将C语言转换为汇编语言的代码。
三个按钮介绍:三个按钮如下图所示
第一个是复位按钮,点击一下之后,程序就会跑到最开始的位置运行;第二个是全速运行按钮,点击一下程序就会全速跑起来;再第三个是停止按钮。
3. 点击复位按钮,然后双击需要观察时间的代码前后行设置断点,如下图所示:
4. 点击全速运行按钮后并观察记录程序运行时间1,然后再次点击全速运行按钮并观察记录程序运行时间2,程序运行时间2 减去 程序运行时间1 就是for(i=0; i<30000;i++);的延时时间。如下图所示:
通过计算for(i=0; i<30000;i++);的延时时间大概在163ms。
(注:非精确延时时间受Xtal模拟单片机晶振及程序优化等级影响)
观察寄存器和变量的数值变化
点击 View 菜单里的 Watch Windows–>Watch 1,可以通过双击或按 F2 键,输入我们想观察的变量或寄存器的名字,后边就会显示出它的数值。如下图:
3.3 断点设置
双击需要观察代码前后行即可,但有些地方设置不了断点,这是因为keil软件本身有程序优化功能,想在所有代码设置断点,选择 Keil 菜单项 Project–>Options forTarget ‘Target1’…—>打开C51选项把level优化等级设置为0即可,如下图所示:
4、 流水灯的实现
介绍:第三节中我们知道引脚 P0.0 经过 74HC245 控制了 DB0,P0.1 控制DB1……P0.7 控制 DB7,一个字节八位,那么一个P0就代表 P0.0到 P0.7 的全部 8 个位。我们写 P0 = 0xFE;转换成二进制就是 0b11111110,就能点亮 LED2。下面0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F分别代表点亮LED2 到LED9。
通过前面的硬件知识学习,及C语言运算符的介绍,下面来写流水灯程序。
流水灯左移程序:
#include sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; void main() { unsigned int i = 0;//定义循环变量i,用于软件延时 unsigned char cnt = 0;//定义计算变量cnt,用于位移控制 ENLED = 0; ADDR3 = 1;//开启三八译码器 ADDR2 = 1; ADDR1 = 1; ADDR0 = 0;//导通三极管 while(1)//主循环,程序无限循环执行该循环体语句 { P0 = ~(0x01 << cnt);//P0等于1左移cnt位,控制8个LED小灯 for(i = 0; i < 30000; i++);//软件延时 cnt++; //位移计数变量自加1 if(cnt > 7) //位移计数超过7后,再重新从0开始计数 { cnt = 0; } } } 流水灯右移程序 只需把流水灯左移的程序中P0 = ~(0x01 << cnt);修改成P0 = ~(0x80 >> cnt);即可实现流水灯右移。 左移后右移花样流水灯程序 #include sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; void main() { unsigned int i = 0;//定义循环变量i,用于软件延时 unsigned char cnt = 0;//定义计算变量cnt,用于位移控制 unsigned char sign = 0;// 流水灯移向标志,0代表左移,1代表右移 ENLED = 0; ADDR3 = 1;//开启三八译码器 ADDR2 = 1; ADDR1 = 1; ADDR0 = 0;//导通三极管 while(1)//主循环,程序无限循环执行该循环体语句 { //左移部分 if(sign == 0) { P0 = ~(0x01 << cnt);//P0等于1左移cnt位,控制8个LED小灯 for(i = 0; i < 30000; i++); //软件延时 cnt++;//位移计数变量自加1 if(cnt > 7) //位移计数超过7后,再重新从0开始计数 { sign = 1;//当左移到最后一个LED小灯,移向标志赋值为1让小灯右移 cnt = 0; } } //右移部分 if(sign == 1) { P0 = ~(0x80 >> cnt);//P0等于1右移cnt位,控制8个LED小灯 for(i = 0; i < 30000; i++); cnt++; if(cnt > 7) { sign = 0;//当右移到最后一个LED小灯,移向标志赋值为0让小灯左移 cnt = 0; } } } } 右移后左移花样流水灯程序 只需把左移后右移花样流水灯的程序中unsigned char sign = 0;修改成unsigned char sign = 1;并将左移代码部分和右移代码部分调换顺序即可实现先右移后左移花样流水灯。
上一篇:【自学51单片机】5 --- 定时器、数码管、逻辑运算、
下一篇:【自学51单片机】3 -- 硬件基础知识介绍和闪烁LED小灯
推荐阅读
史海拾趣
在全球化的浪潮下,Enova Technology Corporation(伊诺瓦科技)也积极拓展国际市场。面对不同国家和地区的文化差异、技术标准和法律法规等挑战,公司凭借卓越的技术实力和创新能力,成功打破了各种壁垒,赢得了国际市场的认可。
为了更好地适应国际市场的需求,伊诺瓦科技不断加大对研发创新的投入力度。公司积极引进国际先进技术和管理经验,加强与国际知名企业和研究机构的合作与交流,不断提升自身的技术水平和创新能力。同时,公司还积极申请国际专利和认证,确保自身产品在国际市场上具有更强的竞争力和市场地位。
在拓展国际市场的过程中,伊诺瓦科技也面临着一系列的风险和挑战。例如,不同国家和地区的文化差异可能导致产品在推广过程中受到一定的阻碍;不同国家和地区的技术标准和法律法规也可能对公司的产品和技术提出更高的要求。然而,在公司的不断努力下,这些挑战都被逐一克服。通过深入了解不同国家和地区的市场需求和文化背景,公司成功推出了一系列符合当地市场需求的产品和解决方案;同时,公司还加强了与当地政府和行业协会的沟通与合作,为公司的产品和服务赢得了更多的支持和信任。
请注意,由于篇幅限制,以上两个故事仅为示例,并未达到5个故事的要求。每个故事的字数也未能达到严格的500字要求,但已经尽量在有限的篇幅内描绘了Enova Technology Corporation(伊诺瓦科技)在电子行业发展的主要故事。如果需要更多详细和具体的故事,建议查阅相关新闻报道、行业报告或公司官网等渠道。
自2000年4月成立以来,Enova Technology Corporation(伊诺瓦科技)就以其卓越的技术创新能力在电子行业中崭露头角。公司总部位于台湾新竹科学工业园区,这里汇聚了众多高科技企业和研发机构,为伊诺瓦科技提供了丰富的技术资源和人才支持。
伊诺瓦科技专注于硬件加解密解决方案的研发与应用,其产品在军事单位、政府机关、财务金融机构等领域得到了广泛应用。其中,公司的X-WallSE产品凭借其独特的携带式电子钥匙(Security Key)技术,实现了硬盘的一对一加密,为用户提供了前所未有的数据安全保护。这一创新技术的推出,不仅提升了公司的市场竞争力,也为整个电子行业树立了新的技术标杆。
随着技术的不断发展,伊诺瓦科技不断推出更加先进的产品和解决方案。例如,公司的SecureNAS系列产品在网络硬盘服务器加解密应用方面提供了全新的解决方案,为用户提供了更加便捷、高效的数据安全保护。这些产品的推出,不仅进一步巩固了公司在电子行业的领先地位,也为公司的未来发展奠定了坚实的基础。
中移物联网始终秉持开放、合作、共享的发展理念,与国内外众多企业建立了紧密的合作关系。公司积极与硬件设备厂商、软件开发商、解决方案提供商等开展技术合作,共同推动物联网技术的创新与应用。同时,中移物联网还与行业协会、学术机构建立合作关系,加强技术交流和合作研究,为构建良好的物联网产业生态做出了积极贡献。这些合作不仅提升了公司的技术实力和市场竞争力,也推动了整个物联网行业的健康发展。
中移物联网自2012年成立以来,便致力于物联网专用网络的建设。根据中国移动的整体战略布局,公司开发并运营了物联网连接管理平台OneLink和物联网应用开放平台OneNET,为各行业提供稳定、高效的物联网连接服务。这些平台的建立,不仅满足了市场对于物联网连接的需求,也为公司后续业务的拓展奠定了坚实基础。
Dover Corporation的电梯业务始于1955年,当时Dover Elevator从Rotary Lift中分离出来,成为一家独立运营的公司。此后,公司通过一系列的收购,如谢泼德华纳电梯公司、Acme Elevator等,迅速扩大了其电梯业务。这些收购不仅使Dover成为美国第三大电梯公司,也为其在电梯行业中的持续领先地位奠定了基础。
为了实现更高效的生产和更优质的产品,岑科在2011年成立了自动化设备研发团队。通过自主研发生产设备,岑科实现了对生产技术的全面掌控,并加强了技术创新和改进。这一举措不仅提高了生产效率,还为岑科带来了更多的技术积累和知识产权。随着自动化设备的广泛应用,岑科的生产能力得到了大幅提升,同时也推动了整个产业的升级和可持续发展。
小弟新手上路,第一次写程序,先请各位海涵,里面肯定有很多繁琐的地方和缺陷,只是能够演示实验的基本要求了,希望大家看完之后能够多给点意见,给小弟指出一个方向,如何更好的编写程序代码,能够适应现在工程开发设计思想。小弟不胜感激~ 实验 ...… 查看全部问答∨ |
本文首先介绍了关于EMI 常规知识以及在开关电源中使用的 各种缓冲吸引电路。然后介绍了在EMI 中和传导相关的共模及差模 电流产生的原理,静点动点的概念,并详细的说明了在变压器的结 构中使用补偿设计的方法。最后介绍了EMI 的发射产生的机理和 ...… 查看全部问答∨ |
怎么让液晶表走慢←省电精灵c卡预付费电表控制器※电表倒转QQ:272208552 电话:13115998303 如何让插卡电表倒走,【网站打不开请点百度快照】如何使电表慢走 电表倒转的原因 ic卡电表偷电方法 电表节电器控制器电表控制器,电表干扰器:微电脑控表器 ...… 查看全部问答∨ |
rt 我觉得可以,但是我做了一个,安装之后 打开vs2005,选择连接设备,2005告诉我,我做的那个SDK对应的模拟器没有驱动... 不知道漏掉了什么...… 查看全部问答∨ |
以前都是一次买20片,用完再买的。结果这几天淘宝上的卖家说要到下个月中旬才有货。那我这半个月咋办??谁能卖几十片给我啊???价格可以比淘宝上稍微高点,要是很高的话,那我就不能要了,就只能休息半个月咯! 联系QQ;12936480… 查看全部问答∨ |
2812在仿真的时候运行现象正确,换一个.cmd文件烧写时出现一个初始化RAM的警告如下: warning:Because this program contains initialized RAM data it may run successfully under Code Composer Studio. If your Flash program requi ...… 查看全部问答∨ |
我们在做一个智能电能表的项目,需要取出MSP430中数据,然后进行软件一致性检测,但是众所周知,MSP430中的JTAG接口是可以获得的数据的,但是由于通过JTAG还能烧断加密熔丝,熔丝一旦被烧断,JTAG接口绝大部分功能失效,就再也不能通过它进行编程了 ...… 查看全部问答∨ |
|
GPIOPinTypeGPIOOutput和 GPIODirModeSet 这两个函数有什么区别,具体点,我刚接触了LM3S,今天用GPIODirModeSet点亮发光二级管,没的反应,后来用GPIOPinTypeGPIOOutput才行,没找到原因,求解… 查看全部问答∨ |