登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 中断与数码管显示

[复制链接]
发表于 2022-1-23 19:29:13 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 中断与数码管显示
开始时间: 2022-01-22
结束时间: 2022-01-23
一,数组
从概念上讲,数组是具有相同数据类型的有序数据的组合,一般来讲,数组定义后满足
以下三个条件。
1、具有相同的数据类型;
2、具有相同的名字;
3、在存储器中是被连续存放的。

一维数组的声明格式如下:
数据类型 数组名 [数组长度];
例如: unsigned char LedChar[16] = {
            0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
            0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
        };  
QQ截图20220123191703.png
二,数码管动态显示
999999的倒计时
  1. #include <reg52.h>

  2. sbit P20=P2^0;
  3. sbit P21=P2^1;
  4. sbit P22=P2^2;

  5. sbit ENLED=P1^1;

  6. unsigned char code LedChar[]={
  7.         0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  8.         0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
  9. };
  10. unsigned char LedBuff[6]={
  11.         0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
  12. };


  13.         unsigned char i = 0;
  14.         unsigned int cnt = 0;
  15.         unsigned char flagls = 0;
  16.         signed long sec = 999999;
  17. void main()
  18.         {

  19.        
  20.        
  21.         ENLED = 0;
  22.         EA = 1;                   //打开中断总开关
  23.         TMOD = 0x01;
  24.         TH0 = 0xF5;
  25.         TL0 = 0x56;
  26.         ET0 = 1;                         //设置T0中断
  27.         TR0 = 1;                  //打开T0
  28.        
  29.         while(1)
  30.         {
  31.                         if(flagls==1)
  32.                         {
  33.                                 flagls=0;
  34.                                
  35.                                 LedBuff[0] = LedChar[sec%10];
  36.                                 LedBuff[1] = LedChar[sec/10%10];
  37.                                 LedBuff[2] = LedChar[sec/100%10];
  38.                           LedBuff[3] = LedChar[sec/1000%10];
  39.                                 LedBuff[4] = LedChar[sec/10000%10];
  40.         LedBuff[5] = LedChar[sec/100000%10];
  41.                                 sec--;
  42.                           }
  43.                         }
  44.                 }
  45.         void InterruptTimer0() interrupt 1         //定时器溢出自动进入中断
  46.         {
  47.                 TH0=0xF5;
  48.                 TL0=0x56;                              //硬件清零无需TF0=0
  49.                 cnt++;
  50.                 if(cnt>=1000)
  51.                 {
  52.                         cnt = 0;
  53.                         flagls=1;
  54.                 }
  55. P0=0xFF;                                  //显示消隐
  56.                         switch(i)                                //加入if else语句使数码管只显示有效位
  57.                         {
  58.                                 case 0:P22=1;P21=0;P20=1;i++;P0=LedBuff[0];break;
  59.                                 case 1:P22=1;P21=0;P20=0;i++;P0=LedBuff[1];break;
  60.         case 2:P22=0;P21=1;P20=1;i++;P0=LedBuff[2];break;
  61.         case 3:P22=0;P21=1;P20=0;i++;P0=LedBuff[3];break;
  62.         case 4:P22=0;P21=0;P20=1;i++;P0=LedBuff[4];break;
  63.         case 5:P22=0;P21=0;P20=0;i=0;P0=LedBuff[5];break;
  64.                                 default:break;
  65.                         }
  66.                 }
复制代码
高位不显示的计时(定时器T1和中断)
  1. #include <reg52.h>

  2. sbit P20=P2^0;
  3. sbit P21=P2^1;
  4. sbit P22=P2^2;

  5. sbit ENLED=P1^1;

  6. unsigned char code LedChar[]={
  7.         0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  8.         0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
  9. };
  10. unsigned char LedBuff[6]={
  11.         0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
  12. };


  13.         unsigned char i = 0;
  14.         unsigned int cnt = 0;
  15.         unsigned char flagls = 0;
  16.         unsigned long sec = 0;
  17. void main()
  18.         {

  19.        
  20.        
  21.         ENLED = 0;
  22.         EA = 1;                   //打开中断总开关
  23.         TMOD = 0x10;              //定时器T1
  24.         TH1 = 0xF5;
  25.         TL1 = 0x56;
  26.         ET1 = 1;                         //设置T1中断
  27.         TR1 = 1;                  //打开T1
  28.        
  29.         while(1)
  30.         {
  31.                         if(flagls==1)
  32.                         {
  33.                                 flagls=0;
  34.                                 sec++;
  35.                                 LedBuff[0] = LedChar[sec%10];
  36.                                 LedBuff[1] = LedChar[sec/10%10];
  37.                                 LedBuff[2] = LedChar[sec/100%10];
  38.                           LedBuff[3] = LedChar[sec/1000%10];
  39.                                 LedBuff[4] = LedChar[sec/10000%10];
  40.         LedBuff[5] = LedChar[sec/100000%10];
  41.                           }
  42.                         }
  43.                 }
  44.         void InterruptTimer0() interrupt 3         //定时器溢出自动进入中断
  45.         {
  46.                 TH1=0xF5;
  47.                 TL1=0x56;                              //硬件清零无需TF1=0
  48.                 cnt++;
  49.                 if(cnt>=1000)
  50.                 {
  51.                         cnt = 0;
  52.                         flagls=1;
  53.                 }
  54. P0=0xFF;
  55.                         switch(i)                                //加入if else语句使数码管只显示有效位
  56.                         {
  57.                                 case 0:P22=1;P21=0;P20=1;i++;P0=LedBuff[0];break;
  58.                                 case 1:P22=1;P21=0;P20=0;i++;if(sec>9){P0=LedBuff[1];}else{P0=0xFF;}break;
  59.         case 2:P22=0;P21=1;P20=1;i++;if(sec>99){P0=LedBuff[2];}else{P0=0xFF;}break;
  60.         case 3:P22=0;P21=1;P20=0;i++;if(sec>999){P0=LedBuff[3];}else{P0=0xFF;}break;
  61.         case 4:P22=0;P21=0;P20=1;i++;if(sec>99999){P0=LedBuff[4];}else{P0=0xFF;}break;
  62.         case 5:P22=0;P21=0;P20=0;i=0;if(sec>999999){P0=LedBuff[5];}else{P0=0xFF;}break;
  63.                                 default:break;
  64.                         }
  65.                 }
复制代码










好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表