当前位置: 首页 > news >正文

网站设计重要性网站上传安装

网站设计重要性,网站上传安装,微信官网下载2020最新版,网站编辑能在家做一、51单片机定时器 1.定时器介绍 1.1为什么要使用定时器 在前面的学习中#xff0c;用到了 Delay 函数延时#xff0c;这里学习定时器以后#xff0c;就可以通过定时器来完成#xff0c;当然定时器的功能远不止这些#xff1a; 51 单片机的定时器既可以定时#xff…一、51单片机定时器 1.定时器介绍 1.1为什么要使用定时器 在前面的学习中用到了 Delay 函数延时这里学习定时器以后就可以通过定时器来完成当然定时器的功能远不止这些 51 单片机的定时器既可以定时又可以计数故称之为定时器/计数器定时器/计数器和单片机的 CPU 是相互独立的定时器/计数器工作的过程是自动完成的不需要 CPU 的参与相比于 Delay 函数需要 CPU 才能运行节约了 CPU 资源51 单片机中的定时器/计数器有两种计时/计数方式一是机器内部的时钟二是外部的脉冲信号对寄存器中的数据加 1通过定时器/计数器可以增加单片机的效率一些简单的重复加 1 的工作可以交给定时器/计数器处理CPU 转而处理一些复杂的事情同时可以实现精确定时作用。 1.2定时器的结构 定时器/计数器的结构示意图如下 T0 和 T1 引脚对应单片机的 P34 和 P35 管脚定时器由两个特殊功能的寄存器控制工作方式寄存器TMOD用于确定工作方式和功能、控制寄存器TCON用于控制 T0、T1 的启动和停止及设置溢出标志 工作方式寄存器TMOD其低四位用于 T0高四位用于 T1不可位寻址 GATE 是门控位 C/T 定时/计数模式选择位C/T 0 为定时模式C/T 1 为计数模式 M1和 M0工作方式设置位00 01 10 11 分别代表 方式0 方式1 方式2 方式3。 控制寄存器TCON低 4 位用于控制外部中断高 4 位用于控制定时/计数器的启动和中断申请可位寻址 TF1T1 溢出中断请求标志位T1 计数溢出时由硬件自动置 TF1为 1CPU 响应中断后 TF1 由硬件自动清 0 TR1T1 运行控制位TR1 置 1 时T1 开始工作TR1 置 0 时T1 停止工作 TF0 和 TR0 同上只不过是针对 T0 号引脚 IE1外部中断 1 中断请求标志位 IT1外部中断 1 中断请求标志位 IT0 和 IE0 同理 TL0和TH0机器周期脉冲它们每个占4字节两个组成了8字节TL0是低4位TH0高4位。每发出一次脉冲计数器 1最大值为65535超过最大值就会导致中断位置1。可以为其设置初始值计算每一次脉冲需要多少时间然后得到固定时间如 1ms 会发生多少次脉冲这样就能达到计时效果。 1.3定时器工作原理 上面介绍定时器的工作方式有四种我们主要使用方式1 16位定时计数器其工作模式结构体如下 STC89C52RC 单片机内有两个可编程的定时/计数器 T0、T1 和一个特殊功能定时器 T2定时/计数器的实质是加 1 计数器16 位由高 8 位和低 8 位两个寄存器 TH0 和 TL0 组成最大值为 65535如图时钟系统每来一个脉冲计数系统就自动加 1当加到计数器为全 1 时再输入一个脉冲就使计数器溢出回零同时使相应的中断标志位 TF0 置 1向 CPU 发出中断请求。如果是在计数模式表明计数已满类似于我们 while 循环时回写一个计数器每运行一次1、定时模式表示定时时间已满类似于之前用的delay函数延时已到SYSclk系统时钟即晶振周期晶振是一个能发生固定频率振动的器件本开发板上的晶振为11.0592MHz前面说错了但不影响代码逻辑C/T 为0时使用系统时钟功能相当于定时器T0 Pin单片机外部引脚C/T 为 1 时使用 T0 引脚功能相当于计数器GATE上面介绍它是门控位它能决定是否能够由 TR0 或 TR1 单独控制启动定时器。如果 GATE 为 0 经过非门为 1 经过或门不管外部中断 INTO 是什么结果还是 1 然后与上 TR0 或 TR1TR0 或 TR1 为 1 代表打开计数器为 0 关闭可以单独控制计数器开关状态不受外部中断 INTO 的影响计数器初值与计数个数的关系为X2^16 - NX 为初值N 为个数。 1.5定时器与中断 中断系统是为了使 CPU 具有对外界紧急事件的实时处理能力而设置的。 原理图 如图所示当我们正在运行某个程序的时候发出了某些特定的 “信号” 如计时器结束或计数器达到预定值的时候就会发出中断请求CPU 收到中断请求暂停主程序转而去执行中断程序等中断程序执行完成再返回继续执行主程序。 STC89C52RC 单片机提供了 8 个中断请求源外部中断0(INTO)、外部中断 1(INT1)、外部中断 2(INT2)、外部中断 3(INT3)、定时器 0中断、定时器 1 中断、定时器 2 中断、串口(UART)中断。当多个中断发生的时候具体先执行哪个中断程序要看中断的优先级优先级高的先执行低的后执行。如果一个中断程序正在执行但是有一个中断优先级更高的中断请求这暂停当前中断程序去执行优先级更高的中断程序这个叫中断嵌套。 中断内部结构图 说明目前不使用外部中断因此外部中断暂时不讲 T0 对应的是 P3.4 口的附加功能TF0TCON.5,片内定时/计数器 T0 溢出中断请求标志当定时/计数器 T0 溢出时TF0位置 1 并向 CPU 申请中断。T1 对应的是 P3.5 口的附加功能TF1TCON.7片内定时/计数器 T1溢出中断请求标志当定时/计数器 T1 溢出时TF1位置1并向 CPU 申请中断。EA1 时打开总中断开关ET01开时钟中断 0PT00/1选择中断触发方式。 2.定时器案例 2.1按键控制流水灯左右移动 代码演示Timer0.c #include REGX52.H// 手动写的 void Timer0_Init() {// 配置 TMOD// TMOD0x01;TMODTMOD0xF0;TMODTMOD|0x01;// 配置 TCONTF00; // 默认中断是关闭的TR01; // 开启0号定时器// 赋初值TH00xFC; // 1111 1100TL00x18; // 0001 1000// 配置中断ET01;EA1;PT00; }// 软件生成的 void Timer0Init(void) //1毫秒12.000MHz {TMOD 0xF0; //设置定时器模式TMOD | 0x01; //设置定时器模式TL0 0x18; //设置定时初值TH0 0xFC; //设置定时初值TF0 0; //清除TF0标志TR0 1; //定时器0开始计时// 软件生成的不包括中断配置要手动添加ET01;EA1;PT00; }// 定时器中断函数模板因为定时器会用到主函数的一些东西 // 不太方便模块化 /*// 发生中断请求时执行的中断函数 void Timer0_Routine() interrupt 1 { // 定义变量用于计算中断函数执行次数应设置静态否则函数每次调用结束就释放了永远无法加到1000static unsigned int Count0;// 赋初值TH00xFC;TL00x18;Count;if(Count 1000) // 设置1000即执行中断函数1000次1000ms1s{Count0;} }*/配置 TMOD 的时候可以直接给它赋值如TMOD0x01但这样有个坏处就是只能给 Timer0 设置如果本来 Timer1 就有设置那么这种写法会将高四位置0将 Timer1 的设置清空。因此可以先将原本的 TMOD 按位与清空低四位TMODTMOD0xF0按位与遇 1 不变遇 0 置 0 再将 TMOD 按位与上对应的断码只设置低四位TMOD | 0x01。这样就完成了只针对 Timer0 的设置同时不影响 Timer1 这里的 TMOD 配置使用方式1定时模式Timer1 时钟TR0 单独控制参照表格将对应位赋值就行 配置 TCON 的时候TF00将中断默认设置为关闭如果设置 1 的话那么一运行就会发生中断 计数器赋初值的时候因为其由两个四位组成因此分别对高 4 位和低 4 位赋值。单片机内部时钟频率是外部时钟的 12 分频12MHZ 晶振单片机内部的时钟频率就是 12/12MHZ机器周期1/1M1us即每 1 纳秒发送一个脉冲计数器加一那么要想定时 1ms 就需要 1000 次脉冲但计数器最大值为 65535 65536时溢出中断因此只需要将初始值赋为 64535 即可 64535 1111 1100 0001 1000;将其分为高低4位就是 TH00xFC; // 1111 1100 TL00x18; // 0001 1000不过还另外一种写法 TH065534/256; TL065534%256;中断函数不需要放到主函数里去运行当发出中断信号的时候会触发其自动调用。每执行一次中断函数都要为其赋初值因为溢出后计数器会变 0不赋初值下一次会从 0 开始计数而不是从我们指定值开始。 Timer0.h #ifndef __TIMER0_H__ #define __TIMER0_H__// 软件生成的 void Timer0Init(void);#endifKey.c #include REGX52.H #include Delay.hunsigned char Key() {unsigned char Num0;if(P3_10){Delayxms(20);while(P3_10);Delayxms(20);Num1;}if(P3_00){Delayxms(20);while(P3_00);Delayxms(20);Num2;}if(P3_20){Delayxms(20);while(P3_20);Delayxms(20);Num3;}if(P3_30){Delayxms(20);while(P3_30);Delayxms(20);Num4;}return Num; }Key.h #ifndef __KEY_H__ #define __KEY_H__unsigned char Key();#endifmain.c #include REGX52.H #include Timer0.h #include Key.h #include INTRINS.H// KeyNum用于保存独立按键的键盘对应数值 // LEDMode用于保存流水灯方向的状态值为1流水灯从 D1 - D8 反之 D8 - D1 unsigned char KeyNum,LEDMode;void main() {// 设置默认 D1 亮P20xFE;// 初始化定时器Timer0Init();while(1){KeyNumKey();if(KeyNum){if(KeyNum1){// 按键控制 LEDMode 在 0 和 1 之间切换LEDMode;if(LEDMode2)LEDMode0;}}} }void Timer0_Routine() interrupt 1 {static unsigned int Count;// 赋初值TL0 0x18; TH0 0xFC; Count; if(Count500) // 每 0.5 s执行一次中断函数{Count0;if(LEDMode0)P2_crol_(P2,1); // 左移函数if(LEDMode1)P2_cror_(P2,1); // 右移函数} }说明 上面代码执行的效果默认执行流水灯 D1 - D8 每 0.5 秒移动一个按一次 K1 就变成 D8 - D1 移动再按一次又恢复 D1 - D8 移动如此循环_crol_和_cror_是官方只带的库函数使用时需要包含头文件#include INTRINS.H分别代表左移和右移第一个参数是要操作的8位寄存器第二个参数是每次移动的步数要清除这里的左移右移并不是对于我们单片机上的 LED 的左移右移因为有的 LED 是左到右由低到高排列的有点是由高到低。其实际是相对一个一字节寄存器的8位就行左右移动的一般左为低位右为高位左移就是低位到高位右移就是高位到低位。因此_crol_函数可以理解为是低位到高位移动_cror_函数是高位到低位移动。 2.2 LCD1602 显示时钟 代码演示 #include REGX52.H #include LCD1602.h #include Timer0.hunsigned char Hour, Min, Sec, flag;void main() {// 初始化 LCD1602LCD_Init();// 初始化 Timer0Timer0Init();LCD_ShowChar(2, 3, :);LCD_ShowChar(2, 6, :);while(1){// 显示时间LCD_ShowNum(2, 1, Hour, 2);LCD_ShowNum(2, 4, Min, 2);LCD_ShowNum(2, 7, Sec, 2);} }void Timer0_Routine() interrupt 1 { static unsigned int Count;// 赋初值TH00xFC;TL00x18;Count;if(Count 1000){flag;if(flag2)flag0;if(flag0)LCD_ShowString(1, 1, MyClock ^_^ );else if(flag1)LCD_ShowString(1, 1, MyClock ^.^ );Count0;Sec;if(Sec60){Sec0;Min;if(Min60){Min0;Hour;if(Hour24){Hour0;}}}} }说明代码运行效果就是一个普通的时钟显示以24小时格式显示上面的小表情每秒变换一次这个代码的逻辑很简单就不详细解释了。 二、串口通信 1.串口通信介绍 1.1串口通信方式分类 51单片机内部自带UARTUniversal Asynchronous Receiver Transmitter通用异步收发器可实现单片机的串口通信。 按数据传输方式分为 串行通信指使用一条数据线将数据一位一位地依次传输每一位数据占据一个固定的时间长度。只需要少数几条线就可以在系统间交换信息适用于计算机与计算机、计算机与外设之间的远距离通信。可以理解为只有一条通道传输同一时间只能过一位数据并行通信通常是将数据字节的各位用多条数据线同时进行传送通常是 8位、16 位、32 位等数据一起传输。可以理解为一条通道同一时间只能传输一位数据但它是多条通道因此同一时间可以传输多位数字。 按数据同步方式分为 异步通信指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调要求发送和接收设备的时钟尽可能一致同步通信要建立发送方时钟对接收方时钟的直接控制通信双方靠一根时钟线来约定通信速率使双方达到完全同步。 按数据传输方向分为 单工通信只能由一方发送到另一方不能反向传输半双工通信双方可以互相传输数据但必须分时复用一根数据线即同一时刻只能一方给另外一方发不能同时给对方发全双工通信双方可以在同一时刻互相传输数据。 1.2硬件电路 简单双向串口通信有两根通信线发送端TXD和接收端RXDTXD与RXD要交叉连接即一台计算机的TXD要与另外一台电脑的RXD连接当只需单向的数据传输时可以直接一根通信线发送的计算机接TXD接收的计算机接RXD当电平标准不一致时需要加电平转换芯片。 1.3电平标准 串口常用的电平标准有如下三种 TTL电平5V 表示 10V 表示 0电平值是相对于 GND 而言的RS232电平-3~-15V 表示13~15V 表示 0电平值是相对于 GND 而言的RS485电平两线压差 2~6V 表示1-2~-6V 表示 0差分信号电平值是两根导线的压差。 1.4UART的工作模式 STC89C52的UART有四种工作模式 模式0同步移位寄存器00模式18位UART波特率可变常用01模式29位UART波特率固定10模式39位UART波特率可变11。 1.5串口参数和时序图 串口参数 波特率串口通信的速率发送和接收各数据位的间隔时间因为这里的串口通信是异步通信没有时钟线因此为保证收发数据的准确性需要保证两个设备的波特率一致比特率每秒钟传输二进制代码的位数单位是位秒 bps检验位用于数据验证校验方法有奇校验(odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)停止位用于数据帧间隔。 9位数据格式比8位数据格式多了1位数据是检验位主要用于检验数据是否有误。 因为数据是一位一位的发每发一字节8位数据就会在接收端重组这八位数据得到一字节数据每字节前后会有起始位和停止位就是为了标记什么时候开始的一字节数据传输什么时候一字节传输完成接收方可以重组数据了。 1.6串口模式图 SBUF串口数据缓存寄存器物理上是两个独立的寄存器但占用相同的地址。写操作时将数据写入发送寄存器来发送读操作时将接收到的数据读到接收寄存器通过时钟 Timer1 的溢出率控制波特率经过 2 分频或 16 分频来控制收发控制器的采样时间当有数据发送或者有数据接收完成的时候都会产生中断申请执行中断函数。 1.7串口相关寄存器 串口控制寄存器 SCON FE用来检测帧错误这里我们用不到SM0 和 SM1 为工作方式选择位有四种模式1.4节有介绍这里我们使用模式1赋值 01SM2 是模式2和模式3使用的这里不介绍可以去看单片机手册REN 允许/禁止串口接收数据为 1 允许为 0 禁止TI 发送中断标志位RI 接收中断标志位。 电源控制寄存器 PCONSMOD 波特率倍增位。在串口方式 1、方式 2、方式 3 时波特率与 SMOD 有关当 SMOD1 时波特率提高一倍。复位时SMOD0。 2.串口通信案例 2.1通过串口发送数据到电脑 代码演示Uart.c: #include REGX52.Hvoid Uart_Init() {// 串口配置PCON 0x7F; // 将第八位置0其他位不变SCON0x40; // 0100 0000// 定时器配置TMOD 0x0F; //设置定时器模式TMOD | 0x20; //设置定时器模式TL1 0xFA; //设定定时初值TH1 0xFA; //设定定时器重装值ET1 0; //禁止定时器1中断TR1 1; //启动定时器1 }void Uart_SendByte(unsigned char Byte) {SBUFByte;while(TI0);TI0; }说明 该案例只接收数据不发送数据什么模式一通信因此SCON0x40TI发送中断标志位在中断服务程序中必须用软件将其清 0取消此中断申请因此这里的函数中加上了TI0这里配置时钟是配置的 Timer1 初始化函数可以通过软件生成但是要设置好对应参数如图 Uart.h: #ifndef __UART_H__ #define __UART_H__void Uart_Init(); void Uart_SendByte(unsigned char Byte);#endifmain.c: #include REGX52.H #include Delay.h #include Uart.hunsigned char sec;void main() {// 初始化串口Uart_Init();while(1){// 通过串口发送数据Uart_SendByte(sec);Delayxms(1000);sec;} }说明其运行的结果是单片机通过串口每秒给电脑发送一个字节的数据从0开始递增显示格式位十六进制。 2.2电脑通过串口控制 LED 代码演示Uart.c: #include REGX52.Hvoid Uart_Init() {// 串口配置PCON 0x7F; // 将第八位置0其他位不变SCON0x50; // 0101 0000 允许接收// 定时器配置TMOD 0x0F; //设置定时器模式TMOD | 0x20; //设置定时器模式TL1 0xFA; //设定定时初值TH1 0xFA; //设定定时器重装值ET1 0; //禁止定时器1中断TR1 1; //启动定时器1// 使能中断EA1;ES1; }void Uart_SendByte(unsigned char Byte) {SBUFByte;while(TI0);TI0; }// 中断函数用于电脑给单片机发送数据模板 /* void Uart_Routine() interrupt 4 {if(RI1){P2~SBUF;Uart_SendByte(SBUF);RI0;} } */ Uart.h: #ifndef __UART_H__ #define __UART_H__void Uart_Init(); void Uart_SendByte(unsigned char Byte);#endifmain: #include REGX52.H #include Delay.h #include Uart.hunsigned char sec;void main() {// 初始化串口Uart_Init();while(1){} }void Uart_Routine() interrupt 4 {if(RI1){P2~SBUF;Uart_SendByte(SBUF);RI0;} }代码演示效果通过电脑给单片机发送一字节数据如发送 ff 单片机 LED 灯全亮同时单片机会回给电脑相同的数据这里将SCON0x50设置为允许接收数据同时相比上一个案例添加了中断使能RI接收中断标志位在中断服务程序中必须用软件将其清 0取消此中断申请因此这里的中断函数中加上了RI0因为这里的RI 和 TI是或门不管谁中断标志位置1了都会发送中断请求因此需要在这里判断到底是谁发出来中断请求中断序号查询下表
http://www.dnsts.com.cn/news/215050.html

相关文章:

  • 怎么才能搜索到自己做的网站普通的宣传网站用什么做
  • 广州市做网站广州建站模板厂家
  • 微信网站建设费用网页游戏魔域来了
  • 如何申请做网站韩国展厅设计网站
  • 网站开发前端和后端的区别网站开发发送短信
  • 个人网站首页界面深圳宝安区天气
  • 网站手机版二维码怎么做宝塔面板怎么做自己的网站
  • 即墨网站建设怎么开通微信小程序商店
  • 光谷做网站推广价格建站工具word
  • 网站建设黄页视频网站建设的具体步骤
  • 郑州网站设计收费低北京故宫网站建设分析
  • 主体负责人和网站负责人不能是同一个人电商网站建设系统
  • 如何做电视剧的短视频网站长春招聘会最新招聘时间
  • 电商公司网站建设财务核算网站开发优势
  • php完整网站开发源码网站整体运营
  • 用asp.net开发网站的优势软件商店安装
  • 服务器网站配置wordpress 层实现
  • 网站建设 服饰鞋帽用户体验做的好的网站
  • 不同类型网站比较及网站域名设计基于asp的网络课程网站开发
  • 井冈山保育院网站建设搜狐做app的网站
  • 互助平台网站建设西安网络科技有限公司
  • 河南省建设劳动学会网站百度广告位价格
  • 在谷歌上做国际网站wordpress显示阅读量
  • 南通做网站公司数据库修改wordpress登录密码
  • 我找客户做网站怎么说做百度推广员赚钱吗
  • 深圳做网站做得比较好的公司做网站首选九零后网络
  • 如何推销自己的产品快速提高网站关键词排名优化
  • 活动网站怎么建设织梦医院网站源码
  • 360网站提交收录网址wordpress默认主题twenty
  • 长春建站方案厦门做网站优化