基于STC系列单片机实现定时器0扫描数码管显示定时器/计数器1作为计数器1产生频率的功能

本文主要是介绍基于STC系列单片机实现定时器0扫描数码管显示定时器/计数器1作为计数器1产生频率的功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
#define NixieTubeSegmentCode P0//自定义数码管段码为单片机P0组引脚
#define NixieTubeBitCode P2//自定义数码管位码为单片机P2组引脚
sbit LED P1^0;//位定义LED灯为单片机P1.0脚
uchar Code NixieTubeBitCodeArray = [0xfe,0xfd,0xfb,0xf7];//定义数码管位码数组变量
uchar NixieTubeDisplayDataArray[0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00];//定义数码管显示0~F数据及符号“—”及熄灭数组变量
uchar NixieTubeCacheDataArray[] = [16,16,16,16];//定义数码管缓存数据数组变量
//uchar NixieTubeBootTimerFlag = 1;//定义数码管开机时间标志位变量
uint KeyPressNumber;//声明按键按下数值变量
//uint NixieTubeBootTimer = 0;//定义数码管开机时间变量
uint Timer0TimeCount;//声明定时器0定时计数变量
//void NixieTubeBootDisplay();//数码管开机显示函数
void NixieTubeDisplayDataSplit();//数码管显示数据分解函数
void NixieTubeDisplayData();//数码管显示数据函数
void Timer0Init(void);//定时器0初始化函数
void Timer1Init(void);//定时器1初始化函数 void main(void)//主函数
{Timer0Init();//定时器0初始化函数 Timer1Init();//定时器1初始化函数 //NixieTubeBootDisplay();//数码管开机显示函数while(1)//主循环{NixieTubeDisplayDataSplit();//数码管显示数据分解函数}}/*****void NixieTubeBootDisplay();//数码管开机显示函数{do{if(NixieTubeBootTimer = 1000 )//如果数码管开机时间等于1sLED = ~ LED;//LED灯亮灭更新}while(NixieTubeBootTimer < 5000);//当数码管开机时间小于5sNixieTubeBootTimerFlag = 0;//数码管开机时间标志位清0LED = 1;//LED灯熄灭}*****/void NixieTubeDisplayDataSplit()//数码管显示数据分解函数{NixieTubeCacheDataArray[0] = KeyPressNumber / 1000;//数码管千位数据显示NixieTubeCacheDataArray[1] = KeyPressNumber / 100 % 10;//数码管百位数据显示NixieTubeCacheDataArray[2] = KeyPressNumber / 10 % 10;//数码管十位数据显示NixieTubeCacheDataArray[3] = KeyPressNumber % 10;//数码管个位数据显示}void NixieTubeDisplayData()//数码管显示数据函数  {  static uchar i = 0;//定义静态数码管位变化变量switch(i)//数码管位变化筛选{case 0 ://数码管千位显示NixieTubeSegmentCode = 0x00;//数码管段码消影NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[0]];//数码管千位的段码显示NixieTubeBitCode = NixieTubeBitCodeArray[0];//数码管千位码显示i++;//数码管位变化自加1break;//跳出case 1 ://数码管百位显示NixieTubeSegmentCode = 0x00;//数码管段码消影NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[1]];//数码管百位的段码显示NixieTubeBitCode = NixieTubeBitCodeArray[1];//数码管百位码显示i++;//数码管位变化自加1break;//跳出 case 2 ://数码管十位显示NixieTubeSegmentCode = 0x00;//数码管段码消影NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[2]];//数码管十位的段码显示NixieTubeBitCode = NixieTubeBitCodeArray[2];//数码管十位码显示i++;//数码管位变化自加1break;//跳出case 3 ://数码管个位显示NixieTubeSegmentCode = 0x00;//数码管段码消影NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[3]];//数码管个位的段码显示NixieTubeBitCode = NixieTubeBitCodeArray[3];//数码管个位码显示i = 0;//数码管位变化清0break;//跳出default:break;//跳出}}/*****关于通过特殊功能寄存器AUXR设定定时器/计数器模式为12T模式需12分频8051系列单片机定时器初值(定时计数初值)计算的知识点*****//****时钟周期(又称振荡周期):单片机晶振频率的倒数 例:单片机晶振频率12MHz 则时钟周期=[1/(12*10^6)Hz]s=0.000000083s=0.000083ms=0.083us机器周期:单片机执行一条指令过程中需要完成一个基本操作(如:取指、译码、执行等基本操作)所需的时间 8051系列单片机的一个机器周期由6个S周期(状态周期)组成 一个时钟周期定义为一个节拍(用P表示) 二个节拍定义为一个状态周期(用S表示) 那么8051单片机的机器周期由6个状态周期组成 也就是说一个机器周期=6个状态周期=12个时钟周期=[12x[1/(12*10^6)Hz]s]s=0.000001s=0.001ms=1us指令周期:单片机取出一条指令且执行完这条指令所需的时间以上三者间的关系:指令周期>机器周期>时钟周期通过特殊功能寄存器AUXR设定定时器/计数器模式为12T模式需12分频8051系列单片机定时器初值(定时计数初值)计算步骤如下(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 1ms=定时计数*1us 定时计数=1ms/1us=1000us/1us=1000次3、定时器初值(定时计数初值)=2^n-定时计数 n为几位定时器 此处n=16 则定时器初值(定时计数初值)=2^16-1000=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256 低八位放TL0=0x18或(65536-64536)%2564、综合公式:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value 5、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:(1)、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000(2)、TL0 = Value相当于TL0 = (65536-10000)%256=55536%256=240 分析:65536-10000=55536转化成二进制为11011000 11110000 55536%256=240转化成二进制为11110000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000取低8位就可以得到55536%256=240的二进制数11110000****/void Timer0Init(void)//定时器0定时1ms初始化函数 晶振为12MHz{TMOD &= 0xf0;//设定定时器/计数器工作模式清0TMOD |= 0x01;//设定定时器/计数器为定时器 工作模式为16位定时器0模式1TH0 = 0xfc;//设定定时器0高8位初值 TL0 = 0x18;//设定定时器0低8位初值TF0 = 0;//定时器0溢出中断标志位清0ET0 = 1;//打开定时器中断开关EA = 1;//打开定时器中断总开关TR0 = 1//打开定时器0开关} void Timer1Init(void)//定时器1计数初始化函数 晶振为12MHz{TMOD &= 0x0f;//设定定时器/计数器工作模式清0TMOD |= 0x50;//设定定时器/计数器为计数器 工作模式为16位计数器1模式1TH1 = 0;//设定定时器1计数高8位初值TL1 = 0;//设定定时器1计数低8位初值TF1 = 0;//定时器1溢出中断标志位清0ET1 = 1;//打开定时器1中断开关EA = 1;//打开定时器中断总开关TR1 = 1//打开定时器1开关} void Timer0(void) interrupt 1//定时器0定时1ms中断函数 晶振为12MHz{TR0 = 0;//关定时器0开关Timer0TimeCount++;//定时器0定时计数自加if(Timer0TimeCount >= 1000)//1s时间到{TR1 = 0;//关闭定时器1开关Timer0TimeCount = 0;//定时器0定时计数清0KeyPressNumber = TH1 * 256 + TL1;//把单片机定时器1引脚P3.5产生的脉冲总数赋给按键按下数值变量TH1 = 0;//定时器1计数高8位清0TL1 = 0;//定时器1计数低8位清0TR1 = 1;//打开定时器1开关}/*****if(NixieTubeBootTimerFlag == 1)//数码管开机时间标志位置1{NixieTubeBootTimer++;//数码管开机时间自加}*****/NixieTubeDisplayData();//数码管显示数据函数TH0 = 0xfc;//设定定时器0高8位初值TL0 = 0x18;//设定定时器0低8位初值TR0 = 1;//开定时器0开关}

这篇关于基于STC系列单片机实现定时器0扫描数码管显示定时器/计数器1作为计数器1产生频率的功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/309723

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount