file-type

STC12C5A60S2单片机CH452驱动数码管显示教程

5星 · 超过95%的资源 | 下载需积分: 22 | 26KB | 更新于2025-05-02 | 25 浏览量 | 19 下载量 举报 收藏
download 立即下载
STC12C5A60S2是一款8051内核的单片机,广泛应用于工业控制领域,具有高性能和低功耗的特点。CH452是一款集成了USB主机/设备功能和常用外设接口的芯片,可以方便地实现USB到串口、USB到I2C、USB到键盘接口等功能。在本应用中,STC12C5A60S2和CH452结合使用,可以驱动数码管显示。 首先,我们需要了解数码管的工作原理。数码管是一种显示设备,可以显示数字和一些字符。它通常由若干个发光二极管组成,通过控制各个二极管的亮灭,可以显示不同的数字和字符。数码管可以分为共阴和共阳两种类型,共阴数码管是指所有的阴极都是连接在一起,通过给某个阳极加上高电平来点亮对应的段,共阳数码管则是所有的阳极都是连接在一起,通过给某个阴极加上低电平来点亮对应的段。 在本应用中,我们需要使用STC12C5A60S2单片机来控制数码管的显示。具体步骤如下: 1. 初始化CH452芯片。首先需要通过USB接口对CH452进行初始化,设置其工作模式和相关的参数。 2. 配置CH452的端口。CH452具有多个可配置的端口,可以根据需要配置为输入输出端口,或者配置为特殊功能端口,如PWM输出、ADC输入等。在这个应用中,我们需要将CH452的一些端口配置为输出端口,用于驱动数码管。 3. 编写显示控制程序。通过编程控制CH452的输出端口,可以控制数码管的显示。由于数码管是通过控制各个段的亮灭来显示数字和字符的,因此需要编写相应的控制程序,用于选择和控制相应的段。 4. 实现动态扫描。由于数码管的段数较多,如果同时点亮所有的段,将会消耗大量的电流,不利于节能。因此,通常采用动态扫描的方式来控制数码管的显示。动态扫描是指轮流点亮各个数码管,由于人眼的视觉暂留效应,看起来会感觉所有的数码管都是同时点亮的。 5. 显示数据更新。当需要改变数码管显示的数据时,只需要更新控制程序中的显示数据,并重新进行动态扫描即可。 在这个应用中,STC12C5A60S2单片机和CH452芯片的结合使用,可以有效地驱动数码管显示,实现了硬件资源的有效利用和功能的扩展。同时,由于CH452芯片具有USB接口,可以方便地实现与计算机的通信,便于进行数据的传输和处理。因此,该应用具有很好的实用性和应用前景。

相关推荐

filetype

#include <STC12C5A60S2.H> #include <icc.h> #include <onewire.h> #include <ds1302.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int unsigned int FREQUENTCY; //NE5555频率 unsigned char count,count2,flag_1s,sec,key_val,flag_100ms; unsigned char show_switching = 1,collect_flag=1,show,S5_flag=1,L4_flag,L5_flag,L6_flag; unsigned char adc_val,t_para=30,count_triggle,count3,count_sec; unsigned char temp=0,humidity,i,last_hour,last_min; unsigned char t[3],h[3]; char led=0xff; #define on(x) led&=~(1<<x); //打开灯光 #define off(x) led|=1<<x; //关闭灯光 #define tog(x)led^=1<<x; //灯光闪烁 ds1302 date = {23,59,55}; //初始化时间为23-59-55 code unsigned int DuanMa[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90, 0xbf, //- 10 0xff, 0x88, //A 0x83, //b 0xc6, //C 14 0xa1, //d 0x86, //E 0x8e, //F 17 0x89, // H 18 0x8C, // P 19 0x88 // R 20 0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; //对应着0-9和-共11个字符加上全灭 //573锁存器的控制 void control(char x,y) { switch(x) { case 4:P2=(P2 & 0x1f)|0x80;break; //Y4C为高电平 case 5:P2=(P2 & 0x1f)|0xa0;break; //5 case 6:P2=(P2 & 0x1f)|0xc0;break; case 7:P2=(P2 & 0x1f)|0xe0;break; } P0=y; P2 &= 0x1f; //P2 = P2 & 0x1f; } //延时1ms的函数 void aloneSMG(char pos,value) { control(7,0xff); //消影 control(6,0x01<<pos); //位选 x=0 x=7 control(7,DuanMa[value]);//段码 } void control_led(char wei,on_off) {if(on_off){ switch(wei){ case 1:on(1);break; case 2:on(2);break; case 3:on(3);break; } } else{switch(wei){ case 1:off(1);break; case 2:off(2);break; case 3:off(3);break; }};} void SysInit() { control(5,0x00); control(6,0x00); control(4,0xff); } void show_switch() {unsigned char t_max,h_max; int t_avr,h_avr; date = ReadTimeFrom1302(); temp = rd_temperature(); t_max = max(t), h_max = max(h); t_avr = (t[0]+t[1]+t[2])/3.0 * 10; h_avr = (h[0]+h[1]+h[2])/3.0 * 10; if(show != 1){ if(show_switching == 1){ //时间显示界面 aloneSMG(0,date.hour/10)

hero260186221
  • 粉丝: 1
上传资源 快速赚钱