程序设计目标及程序运行效果说明
(1)用STC ISP默认设置,打开工程中的HEX并下载
(2)下载后观察现象为:8个数码管从00-00-00开始计数,最右边二极管被点亮(默认为最高扫描频率所以秒部分变化很快)
(3)辅助操作:长按下key1数码管扫描频率减半,从右起第二个二极管点亮、第一个灭,上方数码管显示的内容有轻微的闪动;再长按下key1,扫描频率继续减半,从右起第三个二极管点亮、第二个灭,数码管闪动明显;继续按下key1键,跳动现象更加明显…接下来观察单个LED数码管2次被点亮的时间间隔:当key1控制到左起第三个二极管点亮时,左起第5个LED数码管两次点亮的时间间隔为1;当key1控制到左起第二个二极管点亮时,点亮左起第5个LED数码管的间隔为2,从此以后可以看到一次只有一个LED数码管点亮;当key1控制到最左边二极管点亮时,点亮左起第5个LED数码管的间隔为4,此时扫描频率最低;再按key1,最右边二极管点亮,重新以最快速度扫描,如此重复操作。

程序相关电路及工作原理说明
1.LED数码管电路

2.按键电路

3.工作原理
本实验中同时用发光二极管和LED数码管,由于其功用P0口,所以采用分时复用的形式。

代码如下:

#include "STC15F2K60S2.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
#define i1 interrupt 1
sbit ledSel=P2^3; // led or digital tube
sbit key1=P3^2; //控制数码管扫描频率
uchar baseSevenSegment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段选
unsigned char const line=0x40;//横杠的七段码
char timeAddOneFlag=0;    //标记为1,此时需要秒+1
char key1ActionFlag=0;    //值为1时表示按键操作需要执行
unsigned int ledOnFlag=0; //led亮
char tubeOnFlag=0;        //数码管亮
int ledValue=1;           //led显示数值
int myDisplay[8]={0};     //数码管显示内容
unsigned int timeCount=1; //时间计时器
unsigned int currHour=0;
unsigned int currMinute=0;
unsigned int currSecond=0;
unsigned int interruptCount=0;
unsigned int keyDownTime=0;
unsigned int scanTime=1;  //扫描时间
unsigned int currBit=0;   //当前显示的位
void Delay5us()       //@11.0592MHz
{unsigned char i;_nop_();i = 11;while(--i);
}
//设置ledSel,转为数码管显示
void switchToTube()
{ledSel=0;
}
//设置ledSel,转为led设置
void switchToLed()
{P0=0;ledSel=1;
}
/*** 改变其中一位的内容** @param bitNum 位数(第几位)(例如最左那位,则调用1)* @param value 改变后的数字,确保大于0小于10*/
void change1Bit(int bitNum,int value)
{myDisplay[bitNum-1]=baseSevenSegment[value];
}
/*** 改变其中一位的内容(设置七段码)** @param bitNum 位数(第几位)(例如最左那位,则调用1)* @param sevenSegCode 目标七段码*/
void change1Bit_seven(int bitNum,int sevenSegCode)
{myDisplay[bitNum-1]=sevenSegCode;
}
/*** 数码管设置为显示指定的长度** @param num 数字*/
void changeAll(long num)
{int i;for(i=7;i>=0;--i){int foo=num%10;myDisplay[i]=baseSevenSegment[foo];num/=10;}
}
//led亮
void displayLed()
{if(ledOnFlag){switchToLed();P0=ledValue;}
}
//显示数码管
void showTube()
{if(tubeOnFlag){switchToTube();P0=0;P2=currBit;P0=myDisplay[currBit];Delay5us();}
}
//初始化定时器
void timer0Initialize()        //0.1毫秒@12MHz
{AUXR|=0x80;        //定时器时钟1T模式TMOD&=0xF0;        //设置定时器模式TL0=0xAE;        //设置定时器初值TH0=0xFB;        //设置定时器初值TF0=0;        //清除TF0标志TR0=1;        //定时器0开始计时EA=1; //打开总中断ET0=1; //打开定时器0中断
}
//初始化
void initialize()
{P0M0=0xFF;P0M1=0x00;P2M0=0x0f; //设置P2.0-3为推挽模式P2M1=0x00;ledSel=0;timer0Initialize();changeAll(0);//第三位和第六位设置为'-'change1Bit_seven(3,line);change1Bit_seven(6,line);
}
//时间自增1s
void addTime()
{++currSecond;if(currSecond==60){++currMinute;currSecond=0;if(currMinute==60){++currHour;currMinute=0;if(currHour==24)currHour=0;change1Bit(2,currHour%10);change1Bit(1,currHour/10);}change1Bit(5,currMinute%10);change1Bit(4,currMinute/10);}change1Bit(8,currSecond%10);change1Bit(7,currSecond/10);
}
//按下key1要做的事
void key1Action()
{if(key1ActionFlag){if(ledValue==0x80)ledValue=0x01;elseledValue<<=1;if(ledValue==1)scanTime=1;else if(ledValue==2)scanTime=50;else if(ledValue==4)scanTime=100;else if(ledValue==8)scanTime=200;else if(ledValue==16)scanTime=500;else if(ledValue==32)scanTime=1000;else if(ledValue==64)scanTime=2000;else if(ledValue==128)scanTime=5000;key1ActionFlag=0;}
}
//收到中断的信号(是时候自增时间了)
void timeSignalHandler()
{if(timeAddOneFlag){addTime();timeAddOneFlag=0;}
}
//每0.1ms进入一次定时器中断
void interruptFunction()i1
{static const int KEY_TIME_THRESHOLD=500;interruptCount=(interruptCount+1)%20000;//led显示的频率应该低些才有好的显示效果if(interruptCount%12>10){ledOnFlag=1;tubeOnFlag=0;}else{tubeOnFlag=1;ledOnFlag=0;}//数码管的扫描if(interruptCount%scanTime==0)currBit=(currBit+1)%8;//读秒if(interruptCount%10000==0)timeAddOneFlag=1;//按键功能设置if(key1==0){if(keyDownTime<KEY_TIME_THRESHOLD)++keyDownTime;}else{if(keyDownTime>=KEY_TIME_THRESHOLD)key1ActionFlag=1;keyDownTime=0;}
}
int main()
{initialize();while(1){timeSignalHandler();displayLed();showTube();key1Action();}return 0;
}

STC学习:扫描频率可变的电子钟相关推荐

  1. Deep-learning augmented RNA-seq analysis of transcript splicing | 用深度学习预测可变剪切

    可变剪切的预测已经很流行了,目前主要有两个流派: 用DNA序列以及variant来预测可变剪切:GeneSplicer.MaxEntScan.dbscSNV.S-CAP.MMSplice.clinVa ...

  2. HNU小学期计算机系统设计与创新基础训练——基于STC学习板的加密信息存储与游戏操作系统(第一部分设计思路+基础原理)

    HNU小学期计算机系统设计与创新基础训练--加密信息存储与游戏操作系统 一. 选题名称 二. 选题背景 三. 实现功能 1. 主要功能 2. 细节设计 四. 设计思路 五. 基本原理 1. 数码管与发 ...

  3. 湖南大学STC学习板导航键的使用

    前言:发现STC板子上的按键不够用了,想着用导航键,但无奈在网上找了很久都没有任何一个字眼是关于STC学习板导航按键的使用和详细的代码.今天下午我帅帅的学长教会了我如何去使用导航键,为了更好的巩固和理 ...

  4. STC学习:可校准的实时时钟

    程序设计目标及程序运行效果说明 程序设计目标:通过DS1302芯片.晶振.电池和数码管实现实时时钟的数码管显示,并实现实时时钟的时间的准确校准. 程序运行效果说明:将程序下载至芯片,数码管会出现实时的 ...

  5. c语言学习之可变数组

    今天学习了中国大学mooc上翁恺老师<C语言程序设计>的第14课链表.在学习链表之前,老师讲解了普通的可变数组的实现. 前奏:可变数组的实现(有缺陷) 首先定义一个结构体,内部存在一个指针 ...

  6. python不可变的列表被称为_【Python学习】可变类型和不可变类型

    一.可变类型与不可变类型的特点 1.不可变数据类型 不可变数据类型在第一次声明赋值声明的时候, 会在内存中开辟一块空间, 用来存放这个变量被赋的值,  而这个变量实际上存储的, 并不是被赋予的这个值, ...

  7. C语言学习笔记---可变参数

      在C语言中有些函数传递进入的参数数量是不固定的,最常见的就是 printf() 函数,它就是利用可变参数来实现任意格式的数据打印功能. 我们自己也可以编写一个参数可变的函数,每次动态的检测传入的参 ...

  8. STC学习:可变调的蜂鸣器

    程序设计目标及程序运行效果说明 程序下载好后,数码管上显示的每个数字代表着不同的音调.通过按键KEY1可以修改数字的值(0-9):通过KEY2让蜂鸣器发声或者不发声. 程序相关电路及原理说明 当我们给 ...

  9. 深度学习、生成对抗、Pytorch优秀教材推荐

    推荐一批深度学习.生成对抗.Pytorch优秀教材推荐,绝对不容错过. <GANs in Action> Jakub Langr and Vladimir Bok 本书简介: <GA ...

  10. 【NLP】对比学习——文本匹配(二)

    文章目录 d. SimCSE:2021.04 Unsupervised Supervised e. R-Drop(Supervised):2021.06 f. ESimCSE(Unsupervised ...

最新文章

  1. 页面切换语言包使用session不用cookie
  2. IT市场10大技术伟人 Linux之父居首(转)
  3. MyBatis学习--简单的增删改查
  4. 串行通信的波特率高速和低速区别
  5. ESP8266等模块
  6. 使用Servlet上传多张图片——实体层(ProductInfo.java)
  7. 点云法向量与点云平面拟合的关系(PCA)
  8. 妙啊,小米11保护壳先小米11一步上市了...
  9. Python 入门 Day5
  10. DEVC配置C++11标准
  11. 计算机的组装与维修的知识点总结,计算机组装与维修教学总结
  12. 蘑菇街测试开发实习生面经
  13. 2022年终总结——工作第五年
  14. 远程计算机已加入AAD凭据不工作
  15. Twitter Storm: DRPC学习
  16. 清理微信浏览器网页缓存的办法
  17. bim软件电脑配置测试,BIM软件对电脑配置要求
  18. RFID第一期——各种IC卡ID卡详解
  19. 输电线路巡检红外图像与可见光图像融合数据集(含分割标签,1700多张图像),可见光图像,红外灰度图像,一一对应可用于图像配准
  20. oracle.manageddataaccess idataparameter,.net 通過ODP.NET Managed 連接Oracle數據庫

热门文章

  1. angular中的装饰器 详解
  2. 戴尔Any Cloud 助力企业快速实现云转型
  3. Oracle 11g RAC添加一节点过程
  4. 关于MBR、GPT以及BIOS引导模式区分
  5. 【CSON原创】CSS的障眼法:利用border实现图片的翻转
  6. 解决js函数中,参数不能有默认值的方法
  7. Cisco路由器DHCP服务器基本配置
  8. php框架运行流程,thinkphp项目执行流程介绍
  9. 类k-均值算法无法解决非簇状分布的数据聚类问题_无监督机器学习中,有哪些最常见的聚类算法?...
  10. linux git clone 401,Git Eclipse:401未经授权的错误