定时器介绍、数码管静态显示、逻辑运算符和逻辑电路符号
1、逻辑运算和逻辑电路
引入逻辑概念:在生活中,逻辑存在 ‘真’ 和 ‘假’ 两个逻辑值,而逻辑对应到C语言和数字电路中, ‘真’ 对应C语言或数字电路中的一切 ‘非0值’,而 ’假‘ 对应为 ’0值‘。
1.1 C语言逻辑运算符
假定两个字节变量A和B,两者进行某种逻辑运算后结果为F。
以下为逻辑运算符(按变量整体值进行运算)
&& 逻辑与:F = A && B,当 A、B 的值都为真(即非 0 值,下同)时,其运算结果 F
为真(具体数值为 1,下同);当 A、B 值任意一个为假(即 0,下同)时,结果 F 为假(具体数值为 0,下同)。
|| 逻辑或:F = A || B, A、B 值任意一个为真, F 为真; A、B 值都为假, F 为假。
! 逻辑非:F = !A,A 值为假, F 为真; A 值为真, F 为假。
以下为按位运算符(按变量的每一个位进行运算)
& 按位与:F = A & B,将 A、B 两个字节中的每一位都进行与运算,得到的每一位结果组合为总结果 F,例如 A = 0b00111100,B = 0b11011101,则结果 F 就等于0b00011100。
| 按位或: F = A | B,例如 A = 0b00111100,B = 0b11011101, F 就等于 0b11111101。
~ 按位取反: F = ~A,就是将 A 字节内的每一位进行非运算(就是取反),例如 A = 0b00111100, F 就等于 0b11000011;
^按位异或:异或的意思是,如果运算双方的值不同(即相异)则结果为真,双方值相
同则结果为假。F = A ^ B,A = 0b00111100,B = 0b11011101 , 结果 F 就等于 0b11100001。
1.2 逻辑电路符号
以下图为数字电路常用电路符号,重点认识国外流行符号,通过查阅来记住即可。
2、定时器学习(重点非难点)
2.1 时钟周期和机器周期的介绍
时钟周期:是时序中最小的时间单位,计算方法:时钟周期 = 1 / 时钟源频率。(注:1. 单位为秒 2.时间源频率就是单片机的晶振,博主STC89C52RC的晶振电路晶振为:11.0592M)
机器周期:单片机完成一个操作的最短时间。标准架构下的51单片机的一个机器周期等于12个时钟周期(12 / 时钟周期 S),有的增强型51单片机一个机器周期等于4个时钟周期或等于1个时钟周期,以下讲解标准框架下的51单片机。
2.2 定时器的介绍
单片机中定时器和计数器是内部的同一模块,计数器功能读者自己去了解,我们来介绍定时器功能。
定时器:用于定时,标准51单片机有T0和T1两个定时器。定时器内部有一个寄存器,该寄存器的值每通过一个机器周期自动加1,可以把机器周期理解为定时器的计数周期,如同钟表,每经过一秒,数字自动加1,而寄存器每通过12/11059200秒,数值自动加1。当钟表加到60秒后,秒自动跳为0,这种情况在单片机和计算机中叫溢出,定时器不同工作模式,溢出的情况也不同,假如16位定时器,加到65535后,再加1就溢出,溢出后值直接变为0。
2.2.1 定时器寄存器介绍
定时器这模块有6个寄存器,下面来一一介绍,读者用到这些寄存器查手册即可。
定时值存储寄存器
表5-1中有四个寄存器,用于存储定时器的计数值,其中TH0和TL0用于定时器0,TH1和TL1用于定时器1。
TCON–定时器控制寄存器
(注:可位寻址指的是可以对该寄存器的每个位单独操作,比如该寄存器的一位TR1,可以直接用程序进行TR1 = 1操作)
(注:只要写到硬件置 1 或者清 0 的,就是指一旦符合条件,单片机将自动完成的动作,只要写软件置 1 或者清 0 的,是指我们必须用程序去完成这个动作)
表 5-2 是定时器控制寄存器 TCON 的位分配,表 5-3 是则是对每一位的具体含义的描述。TCON寄存器中TF0和TR0用于定时器0,TF1和TR1用于定时器1。我们以定时器1为例讲解,定时器0同理,TR1等于1,定时器值每过一个机器周期加1,若等于0,则停止加1。 TF1的作用是告诉们定时器溢出了,比如定时器16位模式下,每经过一个机器周期会使TL1加1,加到255后,再加1后,TL1变为0,而TH1加1,如此循环,待TL1和TH1为255后,再加1就会溢出,此时TL1和TH1变为0,TF1自动变成1,提供给读者一个溢出信号。
TMOD–定时器模式寄存器
(注:不可位寻址指的是不可以对该寄存器的每个位单独操作,对 TMOD 里的位比如M1 (T1)= 1 这样的操作就是错误的。我们要操作就必须一次操作这整个字节,也就是必须一次性对 TMOD 所有位操作)
上表为TMOD的位分配。
表5-5为TMOD的位描述,GATE位读者自行了解,C/T位为选择定时器或计数器功能,C/T=0为选择定时器功能,C/T=1为选择计数器功能。
表5-6为TMOD4中模式介绍,模式0和3现在很少应用,读者自行了解,下面介绍模式1和2。
模式1: 是 THn 和 TLn 组成了一个 16 位的定时器,计数范围是 0~65535,溢出后,只要不对 THn 和 TLn 重新赋值,则从 0 开始计数。
模式2: 是 8 位自动重装载模式,只有 TLn做加 1 计数,计数范围 0~255,THn 的值并不发生变化,而是保持原值,TLn 溢出后,TFn就直接置 1 了,并且 THn 原先的值直接赋给 TLn,然后 TLn 从新赋值的这个数字开始计数。 比如该模式下,TH1 = 0x66,TL1=0x00,每经过一个机器周期TL1加1,当TL1=0xFF时,再加1后TF1就会变为1,并且TL1会被赋值为TH1的值后计数,即TL1从0x66开始计数,而TH1的值保持不变。
2.2.2 定时器模式工作电路逻辑图
定时器模式一工作电路逻辑图
讲解:以定时器1为讲解,定时器0同理,OSC为时钟源频率,d为单片机机器周期对于时钟周期的倍数。
当C/T = 0打开定时器功能,C/T = 1打开计数器功能。
要达到控制效果,TR1和或门构成的电路要进行与运算,与运算两个为真才为真,所以TR1要为1,并且或门构成的电路进行或运算后结果要为1,
或门输出为1的方式有两种9:(1).当INT1引脚为1时,不过GATA位为什么,或运算后结果都为1,定时器1模式1开启。(2). 当GATA为0时,经过非运算后为1,不管INT1为什么,进行或运算结果都为1,定时器1模式1开启。
定时器模式二工作电路逻辑图
讲解: 模式二的电路逻辑图和模式一的相似,就不进行详细讲解,此模式下定时器作为可自动重装载的8位计数器(TLn), TLn的溢出,不仅置为TFn,而且将THn的内容重新装载到TLn,THn内容由软件预置,重装时THn内容不变。
2.3 定时器的应用
2.3.1 使用定时器的步骤
下面以使用定时器0为例,定时器1同理。
设置定时器模式寄存器TMOD,选择好定时器工作模式。
设置计数寄存器TH0和TL0的初值。
设置定时器控制寄存器TCON,使TR0 置1让定时器开始计数。
通过判断TCON中的TF0位,监测定时器的溢出情况。
2.3.2计算如何用定时器定时时间
我们知道标准51单片机机器周期为12个时钟周期,以STC89C52RC单片机为例,它的机器周期为:12/11059200秒,如果定时0.02s,设要经过x个机器周期,那么 x* (12/11059200) =0.02, 通过计算x等于18432,因16位定时器溢出值为65536,那么先让TH0和TL0等于初值y,经过18432个机器周期后溢出,这样就实现了定时0.02s,y值通过65536- 18432计算出为47104,转换为十六进制就是0xB800(链接:进制转换方法),即TH0 = 0xB8,TL0 = 0x00。
2.3.3通过定时器控制小灯的闪烁
控制小灯进行0.5HZ频率闪烁的程序
#include sbit LED = P0^7; sbit ADDR3 = P1^3; sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; void main() { unsigned char cnt = 0;//定义一个计数变量,记录T1的溢出次数 ENLED = 0; ADDR3 = 1; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; TMOD = 0x10;//配置T1的工作模式 TH1 = 0xB8; TL1 = 0x00;//为T1赋初值 TR1 = 1;//启动T1 while(1) { if(TF1 == 1)//判断T1是否溢出 { cnt++;// 计数值自加1 TF1 = 0;//T1溢出后,清零中断标志 TH1 = 0xB8;//并在重新赋初值 TL1 = 0x00; if(cnt >= 50)//判断是否溢出50次 { LED = ~LED;//LED取反,1--->0、0--->1 cnt = 0;//达到50次后计数值清零 } } } } 通过定时器控制左右流水灯程序 #include sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; void main() { unsigned char cnt = 0;//定义计数变量,记录溢出次数 unsigned char dir = 0;//定义移位方向变量,用于改变流水灯流向 unsigned char shift = 0x01;//定义循环移位变量shift,并赋初值0x01 ENLED = 0;//使能U3 ADDR3 = 1; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; TMOD = 0x10;//设置T1为模式一 TH1 = 0xB8;//为T1赋初值 TL1 = 0x00; TR1 = 1;//开启T1 while(1)//主循环,程序无限执行该循环 { P0 = ~shift;//P0等于循环移位变量shift取反,控制8个LED小灯 while(TF1 == 0);//当TF1=0时循环执行空语句,直到定时器溢出 TF1 = 0;//TF1清零 TH1 = 0xB8;//重新为T1赋初值 TL1 = 0x00; cnt++;//每溢出一次,cnt加一 if(cnt >= 10)//判断是否溢出10次 { cnt = 0;//溢出次数置零 if(dir == 0)//移位方向变量为0时,左移 { shift = shift << 1;//循环移位变量shift左移一位 if(shift == 0x80) //左移到最左端,改变移位方向变量 { dir = 1; } }else //移位方向变量不为零时,右移 { shift = shift >> 1;//循环移位变量右移一位 if(shift == 0x01) //右移到最右端,改变移位方向变量 { dir = 0; } } } } } 3、数码管学习 3.1 数码管介绍 一个数码管由8个LED小灯组成。数码管分为共阳数码管和共阴数码管,共阳数码管的8个LED小灯阳极连在一起, 阳极为公共端,由阴极控制单个小灯亮灭。共阴数码管同理,数码管内部结构见下图5-4。 下图5-3为数码管的原理图 com引脚为公共端,图中有两个com公共端,为什么有两个公共端呢? 一方面,为了起对称效果,刚好10个引脚,另一方面,因并联电流之和等于总电流,可以降低单条线路承受的电流。 3.2 数码管静态显示原理 下图为KST-51开发板中数码管电路图 从上图可以知道数码管每个LED小灯阳极都接在5v(VCC)上,所以上图6个数码管都是共阳数码管,下面讲解数码管点亮原理。 首先根据分析点亮数码管要先导通数码管对应连接的三极管,即让每个三极管的基极b输出低电平,也就是控制三八译码器将对应Y编号的引脚输出为低电平即能导通三极管,我们第三章中已经介绍了如何应用三八译码器,使用时查看芯片手册即可,就不再介绍。 P0的所有引脚对应连接DB编号引脚,控制P0引脚的输出电平,即可让数码管显示不同的数值。比如让数码管显示8,那么P0要为0b10000000,转换为十六进制就为0x80(链接:进制转换方法)。 3.3数码管真值表 数码管的 8 个段,我们直接当成 8 个 LED 小灯来控制,那就是 a、b、c、d、e、f、g、dp 一共 8 个 LED 小灯。我们控制这8个小灯来让数码管显示不同数值,而数码管显示的数字字符对应给 P0 的赋值,我们叫做数码管的真值表。 数码管真值表见下表5-7。 3.4 数码管的应用 让数码管静态显示字符程序 #include sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; void main() { ENLED = 0;//使能U3,导通三极管Q9, ADDR3 = 1; ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = 0x80;//点亮数码管DS4的a、b、c、d、e、f和g段,让数码管显示字符8 while(1);//让数码管DS4一直显示字符8 } 数码管静态显示秒表先计时后倒计时程序 先介绍C51中的关键字code,前面定义变量时使用关键字unsigned char或unsigned int,这样定义的变量都是放在单片机RAM中,并且程序中可以随意更改这些变量的值,而运用code关键字修饰下定义的变量,则可以存储到程序空间FLASH中,大大节省单片机RAM空间,但程序中不能更改这些变量的值。下面我们来看看运用了code关键字的程序。 #include sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; //用数组存储数码管真值表,数组将在下一章详细介绍 unsigned char code Ledchar[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; void main() { unsigned char cnt = 0;//定义溢出计数变量,记录溢出次数 signed char sec = 0;//记录经过的秒数 unsigned char dir = 0;//定义选择变量,0代表秒表,1代表倒计时 ENLED = 0;//使能U3,导通三极管Q8,准备点亮数码管DS5 ADDR3 = 1; ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; TMOD = 0x01;//配置T0为工作模式一 TH0 = 0xB8;//为T0赋初值 TL0 = 0x00; TR0 = 1;//打开定时器T0 while(1) { if(TF0 == 1)//判断T0是否溢出 { TF0 = 0;//软件将溢出标志清零 TH0 = 0xB8;//为T0重新赋值 TL0 = 0x00; cnt++;//计数值自加1, if(cnt >= 50)//判断T0是否溢出50次 { cnt = 0;//达到50次后计数值清零 if(dir == 0)//选择变量dir等于0,实现秒表功能 { P0 = Ledchar[sec];//当前秒数对应的真值表中的值送到P0口 sec++;//秒数记录自加一 if(P0 == 0x8E)//当P0值使数码管显示字符F时, { dir = 1;//将选择变量置为1,准备实现倒计时功能 sec = 14;//将秒数置为14 } }else //实现倒计时功能 { P0 = Ledchar[sec];//当前秒数对应的真值表中的值送到P0口 sec--;//秒数记录自减一 if(sec < 0)//当秒数小于0后 { dir = 0;//将选择变量置为0,准备实现秒表功能 sec = 1;//将秒数置为1 } } } } } }
上一篇:【自学51单片机】6 ---数码管动态显示、中断系统介绍
下一篇:【自学51单片机】4---进制转换、C语言变量种类和运算符
推荐阅读
史海拾趣
在激烈的市场竞争中,Arima Lasers Corp始终保持着创新的步伐。公司不断投入研发资源,探索激光技术在各个领域的应用潜力。其中,一项关于激光通信技术的创新项目引起了业界的广泛关注。这项技术利用激光束进行高速数据传输,具有传输速率快、安全性高等优点。随着该技术的商业化应用,Arima Lasers Corp在通信领域取得了重大突破,引领了市场变革的潮流。
随着时间的推移,Harris公司逐渐与国防工业建立了紧密的联系。在二战及随后的冷战时期,Harris为军事机构提供了大量的通信设备和技术支持,包括雷达系统、导航系统以及加密通信设备等。这些技术不仅帮助军队在战场上保持高效的通信能力,还极大地提升了国家的国防安全水平。Harris在国防领域的卓越表现,进一步巩固了其在电子行业中的领先地位。
在电子行业的早期,CAMDENBOSS公司以其对技术的深入研究和不断创新而崭露头角。公司研发团队通过不懈努力,成功开发出一款具有革命性的连接器产品,该产品在信号传输效率和稳定性上取得了显著突破。这一技术突破不仅为公司赢得了市场的广泛认可,也奠定了其在电子连接器领域的领先地位。
在快速发展的同时,CAMDENBOSS公司始终注重品质管理。公司建立了严格的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格把控。此外,公司还积极引进先进的生产设备和技术,不断提升生产效率和产品质量。通过持续改进和优化,公司确保了产品品质的稳定性和可靠性。
2016年,Atmel被美国芯片制造商Microchip以35.6亿美元收购。这一收购事件标志着Atmel发展史上的一个重要转折点。在被收购后,Atmel成为了Microchip的一部分,继续发挥其在微控制器领域的优势,同时也获得了Microchip在技术支持、市场渠道等方面的强大支持。这使得Atmel能够更快地推出新产品、拓展新市场,进一步巩固其市场地位。
AZ Displays公司最初是一家专注于研发和生产TFT面板与LCD模块的初创企业。在电子行业激烈的竞争中,AZ Displays凭借其专业的技术团队和对市场的敏锐洞察,成功开发出一系列具有竞争力的产品。公司不断追求技术创新,持续优化生产工艺,逐渐在行业中树立起良好的口碑。
这个程序调了很久啦,不知道为啥读出来的L_temp 和H_temp都是FF、FF 要疯啦 ,呜呜呜..... 有哪位朋友做过相关的东西,帮我看看吧 ,不胜感激啊 #include <c8051f410.h> //SFRdeclarations #include <intrins.h ...… 查看全部问答∨ |
|
有关2410的usb从设备驱动—无法相应irq中断 1.中断屏蔽寄存器没有屏蔽对应位。它的值为FDFFFFFF,usbd中断对应25位等于0,没有被屏蔽。 2.当板子的usb从口与计算机相连时,为何底层驱动接收不到对应的中断。计算机则显示无法识别usb设备。 在 ...… 查看全部问答∨ |
把WINCE420下的显示驱动移植到WINCE600下。600之前的版本是把图形、窗口、事件子系统编译为GWES.exe,而到了600,却编译成GWES.dll,我编译是出现这样的错误: BUILD: [01:0000002555:PROGC ] Linking C:\\WINCE600\\platform\\XSBASE255\\target\ ...… 查看全部问答∨ |
MAX16832是一款很简单的HD LED驱动芯片,简单的8脚SOIC封装,外围电路就是几个十分常见的分立元件,不需要外接MOSFET管。电流取样电阻只要买1/4W普通碳膜电阻,1分钱左右,不需要精密电阻。 MAX16832工作在 ...… 查看全部问答∨ |
|
我想用Msp430G2452通过IIC做从方式来与一个主MCU通信, 主MCU这边的clock是400kb/s左右,但是占空比只有24%, 理论上用MSP430自带的IIC模块能做到吗?谢谢!… 查看全部问答∨ |
|
最近在做一个小玩意,就是模拟方波的合成过程。我想用桥式震荡电路产生正弦波然后再进行处理和叠加用来合成方波。 于是我用了下面的电路 现在波形也有了,但是频率受温度变化比较大,我用手触摸电容周期就变化,有没有办法加反馈让频率稳定呢 ...… 查看全部问答∨ |
零漂移可编程增益仪表放大器 PGA281 PGA281 借助这款下一代的零漂移可编程增益仪表放大器,实现了新一级的精度和创新。 PGA281 的零漂移架构针对精度、过热漂移和长期稳定性制定了新标准。PGA281 的主要特性包括:从衰减 (1/8V/V) 到 128V/V 的 ...… 查看全部问答∨ |