单片机程序流程图有哪些(单片机程序设计流程图)

单片机程序流程图有哪些(单片机程序设计流程图)p p p 以 AT89C51 单片机为核心的时钟电路的程序设计 p p 设计中采用定时器 T0 中断完成 其余状态循环调用显示子程序 系统主流程图如图所示 p p style text align center p

大家好,我是讯享网,很高兴认识大家。



 <p></p><p>   以AT89C51单片机为核心的时钟电路的程序设计</p><p>   设计中采用定时器T0中断完成,其余状态循环调用显示子程序。系统主流程图如图所示</p><p style="text-align: center;"><img alt="单片机四位时钟电路设计方案汇总" src="https://dfsimg1.hqewimg.com/group1/M00/0C/AB/wKhk7VyTgpiAWRWWAABDZvEBrxo884.jpg" /></p><p>   时钟采用11.0256MHZ的脉冲控制, 闹铃采用整点报时功能。</p><p style="text-align: center;"><img alt="单片机四位时钟电路设计方案汇总" src="https://dfsimg2.hqewimg.com/group1/M00/0C/AA/wKhk7lyTgm2AXC5yAABJaQzzEEA637.jpg" /></p><p>   码管显示的数据存放在内存单元70H-75H中,其中70H~71H存放秒数据,72H~73H存放分数据,74H~75H存放时数据,每一地址单元内均为十进制BCD码。由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。显示时,先取出70H~75H某一地址中的数据,然后查的对应的显示段码从P1口输出。P3口将对应的数码管选中,就是显示该地址单元的数据值,每个LED数码管亮1MS时间再逐位循环。</p><p style="text-align: center;"><img alt="单片机四位时钟电路设计方案汇总" src="https://dfsimg1.hqewimg.com/group1/M00/0B/BE/wKhk71yTgm2AJhEaAABOZeHB-7o966.jpg" /></p><p>   P0口输出段码数据,P1.0-P1.2口作扫描输出,P0.1&amp;mdash;P0.4口接按钮开关S1,S2,S3,S4,S5,rest 接S6复位按键。P0.0控制秒的调整,每按一次加1秒;P0.1控制分的调整,每按一次加1分;P0.2控制时的调整,每按一次加1个小时。</p><p style="text-align: center;"><img alt="单片机四位时钟电路设计方案汇总" src="https://dfsimg3.hqewimg.com/group1/M00/0C/AB/wKhk7VyTgpiAAaXuAABoEoLhYfE135.jpg" /></p><p><img alt="单片机四位时钟电路设计方案汇总" src="https://dfsimg1.hqewimg.com/group1/M00/0C/AA/wKhk7lyTgm2AeiNnAACImGCsWUc883.jpg" /><br /><img alt="单片机四位时钟电路设计方案汇总" src="https://dfsimg3.hqewimg.com/group1/M00/0B/BE/wKhk71yTgm2AB86WAABfjS6Zjjk791.jpg" /></p><p>   通过S1、S2、S3和S4四个按键,对时间进行修改和闹钟的设置,S0控制闹钟的启动和停止。按下S4键显示闹钟,松开后显示时间;按下S1键进入时间修改模式,再按S1键时间的时加1,按S3分加1,调整结束后按下S4恢复正常显示;按下S2键进入闹钟修改模式,再按S3键闹钟的时加1,按S3分加1,调整结束后按下S4恢复正常显示。在按键按下和放开时会出现抖动现象。通过延时程序,可以进行去抖动设计。</p><p style="text-align: center;"><img alt="单片机四位时钟电路设计方案汇总" src="https://dfsimg2.hqewimg.com/group1/M00/0C/AB/wKhk7VyTgpmAS5bAAABL1m6kcGM726.jpg" /></p><p>   Proteus仿真电路</p><p style="text-align: center;"><img alt="单片机四位时钟电路设计方案汇总" src="https://dfsimg3.hqewimg.com/group1/M00/0C/AA/wKhk7lyTgm6AebE6AABrsS27J4Q058.jpg" /><br /></p><p><br /></p><p>   通过4位数码管来显示时间,系统晶振11.0592MHZ,仿真图中用二极管代替时钟冒号闪烁,非门代替三极管,让仿真速度与真实速度达到一致,本设计用了6个按钮来对时间及闹钟时间的调节、关闭,p3.2接时间分加1按钮,p3.3接时间时加1按钮,p3.4接闹钟时间与当前时间切换按钮,按住不放显示闹钟的时间,闹钟初始化为00:00,放开按钮则显示当前时间,p3.5接闹钟加1按钮,p3.6接闹钟时加1按钮,p3.7接关闭闹钟按钮。</p><p style="text-align: center;"><img alt="单片机四位时钟电路设计方案汇总" src="https://dfsimg1.hqewimg.com/group1/M00/0B/BE/wKhk71yTgm6AEUHoAAEALpyLG773.jpg" /></p><p>   程序源代码:</p><p>   org 0000h</p><p>   ajmp main ;调至主程序</p><p>   org 000bh ;T0中断入口地址</p><p>   ljmp inTI0</p><p>   org 001bh ;T1中断入口地址</p><p>   ljmp inTI1</p><p>   org 0030h</p><p>   main:mov tmod,#11h ;设T0、T1为模式1</p><p>   mov ie,#8ah ;开T0、T1中断允许</p><p>   mov th0,#4ch ;赋T0 50ms初值</p><p>   mov tl0,#00h</p><p>   mov th1,#4ch ;赋T1 50ms初值</p><p>   mov tl1,#00h</p><p>   mov sp,#60h ;设置堆栈指针</p><p>   mov r0,#20 ; T0 50ms计数20次</p><p>   mov 31h,#00 ;时间秒初始化</p><p>   mov 32h,#00 ;时间分初始化</p><p>   mov 33h,#00 ;时间时初始化</p><p>   mov 38h,#00 ;闹钟分初始化</p><p>   mov 39h,#00 ;闹钟时初始化</p><p>   setb tr0 ;启动T0</p><p>   setb tr1 ;启动T1</p><p>   loop:lcall display ;调用时间显示子程序</p><p>   lcall key ;调用时间调节按键子程序</p><p>   lcall keynz ;调用闹钟按键子程序</p><p>   ajmp loop</p><p>   inTI0:push psw ;保护现场</p><p>   push acc</p><p>   clr ea ;关中断</p><p>   mov th0,#4ch ;重赋50ms初值</p><p>   mov tl0,#00h</p><p>   djnz r0,out ;对50ms计数判断</p><p>   mov r0,#20 ;重赋50ms计数值</p><p>   inc 31h ;秒加1</p><p>   cpl p2.2 ;P2.2取反输出</p><p>   mov a,31h</p><p>   cjne a,#60,out ;判秒是否加到60,没有加到中断返回</p><p>   mov 31h,#00 ;秒加到60,对秒清零</p><p>   inc 32h ;分加1</p><p>   mov a,32h</p><p>   cjne a,#60,out ;判分是否加到60,没有加到就中断返回</p><p>   mov 32h,#00 ;分加到60,对分清零</p><p>   inc 33h ;时加1</p><p>   mov a,33h</p><p>   cjne a,#24,out ;判时是否加到24,没有就中断返回</p><p>   mov 33h,#00 ;时加到24,对时清零</p><p>   out: setb ea ;开中断</p><p>   pop acc ;恢复现场</p><p>   pop psw</p><p>   reTI ;中断返回</p><p>   inti1:push psw ;保护现场</p><p>   push acc</p><p>   clr ea ;关中断</p><p>   mov th1,#4ch ;赋50ms初值</p><p>   mov tl1,#00h</p><p>   inc 3ah</p><p>   mov a,3ah</p><p>   cjne a,#20,out1 ;判断50ms计数是否到20,没到就中断返回</p><p>   mov 3ah,#00 ;50ms计数到20,将计数单元清零</p><p>   mov a,32h</p><p>   cjne a,38h,out1 ;闹钟分与时间分判断</p><p>   mov a,33h</p><p>   cjne a,39h,out1 ;闹钟时与时间时判断</p><p>   clr p1.0 ;相等就清p1.0输出</p><p>   out1: setb ea ;开中断</p><p>   pop acc ;恢复现场</p><p>   pop psw</p><p>   reti ;中断返回</p><p><img alt="单片机四位时钟电路设计方案汇总" src="https://dfsimg2.hqewimg.com/group1/M00/0C/AB/wKhk7VyTgpmAT2_BAACS897pgtg671.jpg" /></p><p>   附:源程序</p><p>   /*</p><p>   标题: 定时器中断 24小时时钟程序</p><p>   效果: 数码管显示24小时制时钟(具有调时功能)</p><p>   说明: 使用12M晶振 ,key1=P3^7; key2=P3^6; key3=P3^5; key4=P3^4; 数码管位选P1.0~P1.3 ,段选P0,共阳数码管</p><p>   /</p><p>   #include《reg52.h》</p><p>   #define uchar unsigned char; #define uint unsigned int;</p><p>   uchar position; uchar tt; uchar second; uchar minute; uchar hour;</p><p>   uchar code table[]=</p><p>   {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0--9</p><p>   sbit smg_q = P1^0; //数码管千位引脚 sbit smg_b = P1^1; sbit smg_s = P1^2; sbit smg_g = P1^3;</p><p>   sbit key1=P3^7; //按键定义 sbit key2=P3^6; sbit key3=P3^5; sbit key4=P3^4;</p><p>   void keyscan(); //函数声明</p><p>   void display(unsigned char hour,unsigned char minute); void delay(unsigned int timer); void init();</p><p>   /*</p><p>   主函数</p><p>   */</p><p>   void main() {</p><p>   init(); while(1) {</p><p>   if(tt==20) { tt=0; second++;</p><p>   if(second==60) {</p><p>   second=0; minute++;</p><p>   if(minute==60) {</p><p>   minute=0; hour++;</p><p>   if(hour==24) hour=0; } } }</p><p>   keyscan();</p><p>   display(hour,minute); delay(1); } }</p><p>   /*</p><p>   调时</p><p>   */ void keyscan() {</p><p>   if(key1==0) //小时加1 {</p><p>   TR0=0; hour++;</p><p>   if(hour==24) hour=0; delay(200) ; TR0=1; }</p><p>   if(key2==0) // 小时减 {</p><p>   TR0=0; hour--;</p><p>   if(hour《0) hour=23; delay(200) ; TR0=1; }</p><p>   if(key3==0) // 分钟加 {</p><p>   TR0=0; minute++;</p><p>   if(minute==60) minute=0; delay(200) ; TR0=1; }</p><p>   if(key4==0) // 分钟减 {</p><p>   TR0=0;</p><p>   minute--;</p><p>   if(minute《0)</p><p>   minute=59; delay(200) ; TR0=1; } }</p><p>   /*</p><p>   初始化</p><p>   */ void init() {</p><p>   tt=0;</p><p>   position=0; second=0; minute=0; hour=0; smg_q=1; smg_b=1; smg_s=1; smg_g=1; key1=1; key2=1;</p><p>   TMOD=0X01;</p><p>   TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; }</p><p>   /*</p><p>   定时器TO中断</p><p>   */ void t0() interrupt 1 {</p><p>   TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++; }</p><p>   /*</p><p>   显示</p><p>   */</p><p>   void display(unsigned char hour,unsigned char minute) {</p><p>   P0=0XFF; switch(position) {</p><p>   case 0: smg_g=1; smg_q=0;</p><p>   P0=table[hour/10]; break;</p><p>   case 1:</p><p>   smg_q=1; smg_b=0;</p><p>   P0=table[hour%10];</p><p>   if(tt》=10)</p><p>   P0&amp;=0x7f; //小数点以半秒的时间闪烁 break;</p><p>   case 2:</p><p>   smg_b=1; smg_s=0; P0=table[minute/10]; break;</p><p>   case 3: smg_s=1; smg_g=0;</p><p>   P0=table[minute%10]; break; }</p><p>   position++; if(position》3) position=0; }</p><p>   /*</p><p>   延时</p><p>   *</p><p>   / void delay(unsigned int time) {</p><p>   unsigned int x,y; for(x=time;x》0;x--) for(y=110;y》0;y--);</p><p> 

讯享网


讯享网

讯享网 <p></p><p>步步高AB217主功放板电路图。</p><p><br /></p><center><img width="674" height="920" src="https://dfsimg1.hqewimg.com/group1/M00/0C/AA/wKhk7lyTgm-AMooUAAJqaCsH3Y0844.jpg" /></center><p>步步高AB217主功放板电路</p><p> 

(本文来源网络整理,目的是传播有用的信息和知识,如有侵权,可联系管理员删除)


小讯
上一篇 2025-05-22 16:44
下一篇 2025-06-10 15:49

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/164363.html