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

滨州五学一做考试网站做网站要用到什么

滨州五学一做考试网站,做网站要用到什么,广东省第二中医院官网进入公众号,3点新闻发布一、定时器 1. 定时器介绍 51单片机的定时器属于单片机的内部资源#xff0c;其电路的连接和运转均在单片机内部完成。 定时器作用#xff1a; #xff08;1#xff09;用于计时系统#xff0c;可实现软件计时#xff0c;或者使程序每隔一固定时间完成一项操作 #…一、定时器 1. 定时器介绍 51单片机的定时器属于单片机的内部资源其电路的连接和运转均在单片机内部完成。 定时器作用 1用于计时系统可实现软件计时或者使程序每隔一固定时间完成一项操作 2替代长时间的Delay提高CPU的运行效率和处理速度 …… 定时器个数3个T0、T1、T2T0和T1与传统的51单片机兼容T2是此型号单片机增加的资源 注意定时器的资源和单片机的型号是关联在一起的不同的型号可能会有不同的定时器个数和操作方式但一般来说T0和T1的操作方式是所有51单片机所共有的 定时器在单片机内部就像一个小闹钟一样根据时钟的输出信号每隔一段时间计数单元的数值就增加一当计数单元数值增加到“设定的闹钟提醒时间”时计数单元就会向中断系统发出中断申请产生“响铃提醒”使程序跳转到中断服务函数中执行。 2. 定时器工作原理 STC89C52的T0和T1均有四种工作模式 模式013位定时器/计数器 模式116位定时器/计数器常用 模式28位自动重装模式 模式3两个8位计数器 时钟给计数器 TL0 和 TH0 提供脉冲。每收到一个脉冲TL0 和 TH0 就加 1 。当加到最大值65535时计数器就会产生溢出溢出之后计数器回到 0 。计数器产生溢出后会产生一个标志位 TF0 告诉中断系统申请终端。 时钟有 2 个来源一个是外部引脚T0 pin一个是系统时钟SYSclk。 SYSclk系统时钟即晶振周期本开发板上的晶振为12MHz 晶振是由压电陶瓷震动产生的固定频率。 C / T ‾ C/\overline{T} C/T 取 1 时是计数器Counter取 0 时是定时器Timer 3. 中断系统 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。 当中央处理器CPU正在处理某件事的时候外界发生了紧急事件请求要求CPU暂停当前的工作转而去处理这个紧急事件处理完以后再回到原来被中断的地方继续原来的工作这样的过程称为中断。实现这种功能的部件称为中断系统请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源当几个中断源同时向CPU请求中断要求为它服务的时候这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队优先处理最紧急事件的中断请求源即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。 当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序)发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序转而去处理优先级更高的中断请求源处理完以后再回到原低级中断服务程序这样的过程称为中断嵌套。这样的中断系统称为多级中断系统没有中断嵌套功能的中断系统称为单级中断系统。 中断流程 STC89C52中断资源 中断源个数8个外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3 中断优先级个数4个 中断号 定时器相关寄存器 二、按键控制LED流水灯模式 1. 初始化定时器0 1工作模式寄存器TMOD 想让定时器0以模式116位定时/计数工作得通过M10和M01选择工作模式并通过 C / T ‾ C/\overline{T} C/T0选择定时模式。然后让GATE0即TR0单独控制定时器工作。 所以TMOD应该等于0000 000116进制为0x01 注意可位寻址可以单独赋值不可位寻址不可单独赋值需要整体赋值。 2控制寄存器TCON TF0是中断标志位要置0 TR0是运行控制位要置1\ 其他的位不管 3定时器TH0和TL0 定时器每隔1微秒1最大值为65535总共定时时间为65535微妙。当设定为64535时差值为1000距离溢出还有1000微秒即定时1毫秒。 所以TH064535/256取出高8位TL064535%256取出低8位 4中断器中的寄存器ET0、EA、PT0 要初始化中断允许控制寄存器、中断优先级控制寄存器。 为了接收到定时器的中断请求需要ET01和EA1 若选择低优先级则需要PT00 初始化代码如下 void Timer0_Init() {TMOD 0x01; // 0000 0001TF0 0;TR0 1;TH064535/256;TL064535%256;ET01;EA1;PT00; }2. 定时器0的中断函数 在中断号中可以看到定时器0的中断函数 在函数体内部编写中断后执行什么操作。 void Timer0_Rountine() interrupt 1 {}3. 中断后执行D1每隔一秒闪烁 1完整代码 #include REGX52.Hvoid Timer0_Init() {TMOD 0x01; // 0000 0001TF0 0;TR0 1;TH064535/256;TL064535%256;ET01;EA1;PT00; } void main() {Timer0_Init();while(1){} }unsigned int T0Count; void Timer0_Rountine() interrupt 1 {T0Count;TH064535/256; //重新赋初值防止溢出后从0开始计数TL064535%256;if(T0Count1000) //每隔一秒执行一次{T0Count 0;P2_0 ~P2_0;} }编译后可以发现主函数中并没有什么内容但是D1却闪烁了。 2代码进化 TMOD TMOD 0xf0; //高四位不变低四位清零 例1010 0011 1111 0000 1010 0011按位与 TMOD TMOD | 0X01; //高四位不变最低位置1 例1010 0000 | 0000 0001 1010 0001按位或 所以TMOD 0x01; // 0000 0001可以替换为 TMOD 0xf0; //高四位不变低四位清零TMOD | 0X01; //高四位不变最低位置1在STC-ISP中点击“定时器计算器”系统频率选择12MHz选择“定时器0”定时长度设为“1毫秒”定时器模式选择“16位”定时器时钟选择“12T (FOSC/12)”。最后点击“生成C代码”。复制粘贴到Keil中。 89C52单片机没有16位自动重载模式只有16位和8位自动重载。选择12T模式是因为下图 若想选6T则需在STC-ISP中给6T打勾。一般都用12T模式。 void Timer0Init(void) //1毫秒12.000MHz {AUXR 0x7F; //定时器时钟12T模式TMOD 0xF0; //设置定时器模式TMOD | 0x01; //设置定时器模式TL0 0x18; //设置定时初值TH0 0xFC; //设置定时初值TF0 0; //清除TF0标志TR0 1; //定时器0开始计时 }98C52没有AUXR寄存器所以需要把AUXR 0x7F;删掉。 我们发现生成的代码没有中断系统的配置需要我们手动加上。 void Timer0Init(void) //1毫秒12.000MHz {TMOD 0xF0; //设置定时器模式TMOD | 0x01; //设置定时器模式TL0 0x18; //设置定时初值TH0 0xFC; //设置定时初值TF0 0; //清除TF0标志TR0 1; //定时器0开始计时ET01;EA1;PT00; }现在用计算器验证一下刚刚我们自己设定的 TH064535/256; //重新赋初值防止溢出后从0开始计数TL064535%256;和自动生成的代码是否一致 TL0 0x18; //设置定时初值TH0 0xFC; //设置定时初值64535 ÷ 256 252…23 商数为252余数为23 252的16进制是FC 23的16进制是17 发现TL0差一位即差了一微秒65535-64535正好等于1000差一位才溢出但还没溢出。需要再1 4. 将定时器模块化 新建Timer.c和Timer.h文件。 在Timer.c文件中写 #include REGX52.H/*** brief 定时器0初始化1毫秒12.000MHz* param 无参数传入* retval 无返回值*/ 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_Rountine() interrupt 1 {static unsigned int T0Count; //静态变量退出函数后不丢失值T0Count;TL0 0x18; //重新赋初值防止溢出后从0开始计数TH0 0xFC;if(T0Count1000) //每隔一秒执行一次{T0Count 0;} } */在Timer.h文件中写 #ifndef __TIMER0__H__ #define __TIMER0__H__void Timer0Init(void);#endif在main.c中写 #include REGX52.H #include Timer0.hvoid main() {Timer0Init();while(1){} }void Timer0_Rountine() interrupt 1 {static unsigned int T0Count; //静态变量退出函数后不丢失值T0Count;TL0 0x18; //重新赋初值防止溢出后从0开始计数TH0 0xFC;if(T0Count1000) //每隔一秒执行一次{T0Count 0;P2_0 ~P2_0;} } 编译一下发现D1一秒闪一下。 5. 按键控制流水灯 之前都是计时器的基础应用现在进入正题。 新建Key.c和Key.h文件。去“6-1矩阵键盘”项目中把Delay.c和Delay.h文件复制到本项目。 然后把Delay.c和Delay.h文件添加到左侧边栏 在Delay.c里写获取独立按键的函数 #include REGX52.H #include Delay.h/*** brief 获取独立按键键码* param 无* retval 按下按键的键码范围0~4无按键按下时返回0*/ unsigned char Key() {unsigned char KeyNumber0;if(P3_10){Delay(20);while(P3_10);Delay(20);KeyNumber1;}if(P3_00){Delay(20);while(P3_00);Delay(20);KeyNumber2;}if(P3_20){Delay(20);while(P3_20);Delay(20);KeyNumber3;}if(P3_30){Delay(20);while(P3_30);Delay(20);KeyNumber4;}return KeyNumber; }在Delay.h里先写上 #ifndef __KEY__H__ #define __KEY__H__unsigned char Key();#endif然后去main.c文件里加上#include Key.h。 现在就可以调用刚刚在Delay.c里定义的函数Key()了。 首先定义一个全局变量unsigned char KeyNum;然后再main()函数里调用Key()即KeyNum Key();。 下面测试一下返回值是否正确Key()函数定义是否正确。 注意要把刚才写的和定时器有关的代码全都注释掉单独测试Key()函数。 在main()函数里写 unsigned char KeyNum;void main() {//Timer0Init();while(1){KeyNum Key();if(KeyNum){if(KeyNum1)P2_1~P2_1;if(KeyNum2)P2_2~P2_2;if(KeyNum3)P2_3~P2_3;if(KeyNum4)P2_4~P2_4;}} }把之前写的void Timer0_Rountine() interrupt 1注释掉。 编译一下可以看到按下K1后D2灯亮再按一下D2灯灭可以看到按下K2后D3灯亮再按一下D3灯灭…… 在main.c中写入#include INTRINS.h是为了调用循环左移_crol_和循环右移_cror_函数。 #include REGX52.H #include Timer0.h #include Key.h #include INTRINS.hunsigned char KeyNum, LEDMode;void main() {P20xFE;Timer0Init();while(1){KeyNum Key();if(KeyNum){if(KeyNum1){LEDMode;if(LEDMode2)LEDMode0;}}} }void Timer0_Rountine() interrupt 1 {static unsigned int T0Count; //静态变量退出函数后不丢失值T0Count;TL0 0x18; //重新赋初值防止溢出后从0开始计数TH0 0xFC;if(T0Count1000) //每隔一秒执行一次{T0Count 0;if(LEDMode0)P2_crol_(P2, 1);if(LEDMode1)P2_cror_(P2, 1);} } 编译一下可以看到按下K1后LED模块开始循环向左移D8-D1按下K2后LED模块开始循环向右移D1-D8。 三、定时器时钟 1. 复制粘贴之前的模块化文件 新建项目“7-2 定时器时钟”和main.c。 把“5-2 LCD1602调试工具”项目文件夹的Delay.c, Delay.h, LCD1602.c, LCD1602.h文件复制粘贴到“7-2 定时器时钟”项目路径中。 把“7-1 按键控制LED流水灯模式”路径中的Timer0.c和Timer0.h文件复制粘贴到“7-2 定时器时钟”项目路径中。 别忘了要在main.c中加上相应的头文件 #include REGX52.H #include LCD1602.h #include Delay.h #include Timer0.h调用LCD1602中的函数 void main() {LCD_Init();LCD_ShowString(1, 1, Clock: );while(1){} }先编译一下看看有没有错误。 可以看到没有错误。 2. 先做个秒钟 #include REGX52.H #include LCD1602.h #include Delay.h #include Timer0.hunsigned char Sec;void main() {LCD_Init(); //LCD初始化Timer0Init(); //定时器初始化LCD_ShowString(1, 1, Clock: );while(1){LCD_ShowNum(2, 1, Sec, 2);} }void Timer0_Rountine() interrupt 1 {static unsigned int T0Count; //静态变量退出函数后不丢失值T0Count;TL0 0x18; //重新赋初值防止溢出后从0开始计数TH0 0xFC;if(T0Count1000) //每隔一秒执行一次{T0Count 0;Sec;} }编译一下发现没有问题。 3. 加入分钟和小时 #include REGX52.H #include LCD1602.h #include Delay.h #include Timer0.hunsigned char Sec55, Min59, Hour23;void main() {LCD_Init(); //LCD初始化Timer0Init(); //定时器初始化LCD_ShowString(1, 1, Clock: );LCD_ShowString(2, 3, :);LCD_ShowString(2, 6, :);while(1){LCD_ShowNum(2, 1, Hour, 2);LCD_ShowNum(2, 4, Min, 2);LCD_ShowNum(2, 7, Sec, 2);} }void Timer0_Rountine() interrupt 1 {static unsigned int T0Count; //静态变量退出函数后不丢失值T0Count;TL0 0x18; //重新赋初值防止溢出后从0开始计数TH0 0xFC;if(T0Count1000) //每隔一秒执行一次{T0Count 0;Sec;if(Sec60){Sec0;Min;if(Min60){Min0;Hour;if(Hour24){Hour0;}}}} }编译一下可以发现时分秒都有了。
http://www.zqtcl.cn/news/533517/

相关文章:

  • 手机网站赏析做外贸女装有哪些网站有哪些
  • 网站建设与管理考察报告建材网站开发
  • 张家港专业做网站网站点击量 哪里查询
  • 网站设计软件开发论文网站建设的参考文献
  • 专业建筑工程网站陇西做网站的公司
  • 请别人做网站会不会被盗有创意的广告图片及赏析
  • qq官方网站在家有电脑怎么做网站
  • 做计量检定的网站网站建设专业可行性分析
  • 上饶市建设局网站电脑课做网站所需的软件
  • 广州论坛建站模板网站开发流程原理
  • 网站开发深入浅出 - python篇四川网络营销
  • 做外贸比较好用的网站有哪些网站logo教程
  • 自适应产品网站模板坪地网站建设信息
  • 如何免费推广网站简历生成网站
  • 专业建站开发影视软件开发定制
  • jsp网站开发什么框架中山h5模板建站
  • 网页qq登陆网站旅游网站开发的国内外现状
  • 电影发布网站模板天津网络维护公司
  • 如何用ae做模板下载网站平面设计线上培训机构
  • 地方宣传网站建设的必要性汕头企业网站建站模板
  • html网站源代码网站非法字符过滤
  • 江苏盐城建筑公司网站网络服务提供商是指什么
  • 汕头网站搜索优化视频广告制作
  • 靖边县建设局网站苏州企业网站建设公司价格
  • 沈阳微网站三好街 网站建设
  • 毕业答辩ppt模板免费下载网站网站域名使用怎么做分录
  • 建设购物网站要求网页制作与网站建设 pdf
  • 众创空间网站建设wordpress上传与安装包
  • 公司网站怎么做seo关键词排名优化销售
  • 企业网站建设如何去规划广西南宁网站建设哪家好