STC12C5A60S2-定时器+数码管
系列文章目录
第2-3章 定时器+74HC573显示8位数码管
文章目录
- 系列文章目录
- 前言
- 一、TIMER0
- 二、74HC573
- 1.原理图
- 2.显示结果
- 大功告成
- 总结
前言
两章合并,主要运用定时器0和开发板上的74HC573点亮8位数码管。计划做一个8位计时器,每秒加1.
一、TIMER0
增强型的51说明书看着头大,主要是功能啰里啰嗦的,一大堆用不到的东西。定时器注意,12C5A向下兼容,所以定时器默认是12T的,若要改为1T,需配置定时器
AUTX|=0X80
另外计算定时器TH0,TL0的值,直接找STC-ISP上有直接计算的。
自己算的话,就是
#define TIMER0_COUNT (24*1000) //24Mhz,1000us
void Timer0_Init(void)
{AUXR|=0X80;TH0=(65536-TIMER0_COUNT)/256;TL0=(65536-TIMER0_COUNT)%256;TMOD|=0X01;TR0=1;ET0=1;EA=1;}
上述即为1T时,24Mhz晶振定时1ms的值。
另外测试定时器发现个问题,折腾了好久:
#define WEILA P0^0
#define DULA P0^1WEILA=1;
上面这么写一直报错,说语法错误,少个分号啥的,没整明白为啥,必须要改成P00才行,不能用P0^0赋值。
另外还有个要注意的点,
sbit WEILA P00;
这么写也是错的,要写成sbit WEILA=P00;
二、74HC573
点亮这玩意又耗费我好长时间,一个是因为开发板不熟,所有数码管要单独供电,跳线帽没插,2是原理图上脚位标的不清楚,脚位搞反了。
1.原理图
直接P2口做573输入,P00,P01分别做位选段选锁存使能。
代码如下(示例):
#define WEILA P00
#define DULA P01
#define LEDS P2
const uchar num_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
const uchar wei_table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};void Timer0_isr(void) interrupt 1
{TH0=(65536-TIMER0_COUNT)/256;TL0=(65536-TIMER0_COUNT)%256;P0^=0X04;tms_1s++;if(tms_1s==1000){tms_1s=0;f_1s=1;}disp_cnt%=8;if(disp_cnt==0){disp_num=disp_count;}WEILA=1;LEDS=wei_table[disp_cnt];WEILA=0;DULA=1;LEDS=num_table[disp_num%10];DULA=0; disp_num/=10;disp_cnt++;
}void main()
{Timer0_Init();while(1){if(f_1s){f_1s=0;disp_count++; }}return;
}
disp_cnt用来切换8个数码管显示哪一位,分时8次动态显示
disp_count是要显示的计数值,每秒加1
disp_num为当前位选要显示的数字,程序中通过不断除10取余得到这个数,靓!
2.显示结果
效果如下:
显示正常,但是有鬼影,应该是段选位选切换的一瞬间WEILA=1;DULA=1时造成的,在置1前将所有IO口重新设置一次。
代码如下(示例):
void Timer0_isr(void) interrupt 1
{TH0=(65536-TIMER0_COUNT)/256;TL0=(65536-TIMER0_COUNT)%256;P0^=0X04;tms_1s++;if(tms_1s==1000){tms_1s=0;f_1s=1;}disp_cnt%=8;if(disp_cnt==0){disp_num=disp_count;}LEDS=0XFF;//消除鬼影WEILA=1;LEDS=wei_table[disp_cnt];WEILA=0;LEDS=0X00;//消除鬼影DULA=1;LEDS=num_table[disp_num%10];DULA=0; disp_num/=10;disp_cnt++;
}
再次看下结果:
大功告成
总结
写了七八年单片机汇编,写程序思路没啥问题,关键是对51的C编译器不太熟,我又喜欢钻牛角尖,影响效率。另外后续再写类似的前先搞个简单的,比如这个点亮8位数码管,我一次程序直接写完,结果调试不好找问题,应该先尝试下只点亮一个的。
今天就整这么多吧,后续整个模板出来。
STC12C5A60S2-定时器+数码管相关推荐
- 合泰单片机数码管c语言,合泰单片机定时器数码管显示
;内容:4位共阴数码管显示0000-9999显示 ;数码管段码接法A-PD0,B-PD1....G-PD6,H-PD7 ;数码管位码接法OM0-PC0...COM4-PC3 ;目的: ;1.查表 ;2 ...
- 基于51单片机的倒计时器秒表定时器数码管显示原理图方案设计
系统的功能分析 (末尾附文件) 框架图: 原理图: 声光报警电路(低电平有效)设计 有源蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机.打印机.复印机.报警器.电子玩具.汽车电 ...
- 用 定时计数器中断 和 动态八段数码管 做一个秒表
用 定时/计数器中断 和 动态八段数码管做一个秒表 目录 用 定时/计数器中断 和 动态八段数码管做一个秒表 1.思路 定时器 数码管 2.主要代码讲解 3.全部代码参考(代码写的很烂,欢迎提出建议) ...
- 51单片机电路原理图_10个定时器精选电路方案带你学习时钟脉冲的工作方式
可编程控制器中的定时器是根据时钟脉冲累积计时的,时钟脉冲有 1ms.10ms.100ms等不同规格.(定时器的工作过程实际上是对时钟脉冲计数)因工作需要,定时器除了占有自己编号的存储器位外,还占有一个 ...
- 10个定时器精选电路方案带你学习时钟脉冲的工作方式
可编程控制器中的定时器是根据时钟脉冲累积计时的,时钟脉冲有 1ms.10ms.100ms等不同规格.(定时器的工作过程实际上是对时钟脉冲计数)因工作需要,定时器除了占有自己编号的存储器位外,还占有一个 ...
- 嵌入式开发学习笔记9-做一个好玩的LED闪烁
嵌入式开发学习笔记9-做一个好玩的LED闪烁 前言 实际操作 程序功能 实现思路 程序源码 实现效果展示 前言 LED小灯闪烁实质是控制单片机上的I/O口,通过向I/O口循环输入高低电平,从而控制LE ...
- 【blue bridge cup】笔记
一. IO 口编程 IO编程,该开发板使用了573锁存器,通过P2口的5,6,7位连接3-8译码器,扩展出了8个口,其中4个口分别连接4个573锁存器,这里以LED的锁存器 ...
- 省赛题第六届到第十二届单独分析
4月2日 第十一届没写完,现在是北京时间二十二点十三分,距离揽江楼关门还有十七分钟,我要收拾书包从五楼下去,明天早起写完,写了差不多五个小时吧 4月3日上午 写完了朋友们 4月5日下午 回来把第十二届 ...
- 51单片机调时电子钟
/************************************************************************************** 程序功能:在8个数码管上 ...
- 蓝桥杯单片机学习过程记录(十四)第六届温度记录
蓝桥杯单片机学习过程记录(十四)第六届温度记录 应用的内容: 定时器 数码管 时钟ds1302 温度传感器ds18b20 独立按键 结果实现的问题: 时钟和定时器两个时间走的不同,定时器5ms下200 ...
最新文章
- AndroidManifest.xml
- 中国互联网+户外广告行业商业模式创新与投资机会深度研究报告
- Android 线程管理
- Node.js 执行webpack命令出现的错误
- android自动创建桌面,Android应用启动后自动创建桌面快捷方式的实现方法
- 在EXT中向弹窗传值或者对象
- 玹疯:这些年我走过的弯路
- mysql 各表charset不同_MySQL表字段字符集不同导致的索引失效问题
- 硬件加速下webview切换闪屏_网页渲染性能优化 —— 性能优化下
- 并发无锁队列学习(单生产者单消费者模型)
- java中包容易出现的错误及权限问题
- Java Web项目漏洞:检测到目标URL存在http host头攻击漏洞解决办法
- 数值分析(5)-分段低次插值和样条插值
- Python基础十七:IO编程一:读写文件
- 红白机基本原理(一)总述
- PHP如何判断图片是否伪造
- 如何编写GIMP插件(三)
- 服务器定时发送qq消息,python实现定时发送qq消息.pdf
- 2022 CCF BDCI数字经济创新应用案例大赛决赛晋级名单
- A Brief History of Just-In-Time 简读