51单片机控制4个数码管显示09999
- 格式:doc
- 大小:19.00 KB
- 文档页数:3
4位秒表的设计与制作一、任务要求该任务要求设计并制作一个4位秒表,秒表有启动、停止和清零功能,显示时间为0到9999秒。
该任务是综合应用数码管动态显示、单片机定时计数器和中断系统设计一个具有启动、停止、清零和校时功能的,能显示0到9999秒的4位秒表。
二、设计方案提示4位秒表的设计与1位秒表设计基本相似,所不同的是4位秒表要显示4位数据,而且要有校时功能,所以它只是综合了键盘、定时器、中断系统和动态显示的应用。
多位数显示器是用数码管显示4位十进制数,如果采用数码管静态显示方法,4个数码管要占用4个I/O端口,将占用单片机的所有I/O口而无法实现其他功能,因此不能用静态显示方法实现多位数据的显示。
如何用单片机控制数码管实现多位数据的现实,而又不占用太多的I/O口呢?这就要用到--------数码管的动态显示。
4位秒表设计与1位秒表的设计在原理上是一样的,不同的是:4位秒表要显示4位数,利用前面的数码管显示方法需要4个并行I/0口,而启动停止和清零要占用2个I/O线,89C52单片机只有4个并行I/O口,因此这种显示方法不能满足4位秒表的功能。
那么,如何实现4位秒表的设计呢?这就是该任务的关键------数码管动态显示技术三、系统硬件设计参考:4位秒表电路原理图如图3-21所示,有启动停止、清零和校时电路;数码管的位选端分别接P2口的P2.0~P2.3,段选端接P0口,74LS245是驱动电路。
图3-21 4位秒表电路原理图硬件电路设计图3-17 4位数据显示器的硬件原理图图3-17是4位数据显示器的硬件原理图,数码管是共阳连接,P2口输出显示段码,74LS245驱动数码管显示,CE是片选端,低电平有效;4位数码管的公共端分别由P3.0、P3.1、P3.2、P3.3控制。
四、系统软件设计参考程序//功能:4位数码管动态显示“1234”//函数名:delay50ms//函数功能:采用定时器1、工作方式1实现50ms延时,晶振频率12MHz//形式参数:无//返回值:无void delay50ms(){ TH1=0x3c; // 置定时器初值TL1=0xb0;TR1=1; // 启动定时器1while(!TF1); // 查询计数是否溢出,即定时到,TF1=1TF1=0; // 50ms定时时间到,将定时器溢出标志位TF1清零}void main() //主函数{unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92}; //设置数字0~5字型码unsigned char i,w;TMOD=0x10; //设置定时器1工作方式1while(1) {w=0x01; //位选码初值为01Hfor(i=0;i<4;i++){P2=~w; //位选码取反后送位控制口P2口w<<=1; //位选码左移一位,选中下一位LEDP1=led[i]; //显示字型码送P1口delay50ms(); //延时50ms}}}4位秒表流程图如图3-22所示:包括主函数流程、定时器中断函数和显示函数流程图。
#include <pic.h> //调用头文件,可以去PICC软件下去查找PIC16F87XA单片机的头文件__CONFIG(0x1832);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡#define DS1 RA1#define DS2 RA2#define DS3 RA3#define DS4 RA5#define B20 RA4#define uchar unsigned char#define uint unsigned intunsigned char unm;const unsigned char str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; //共阴数码管字码表const unsigned char str1[]={0x0bf,0x86,0x0db,0x0cf,0x0e6,0x0ed,0x0fd,0x87,0x0ff,0x0ef}; //个位带小数点字码表//const unsigned char wei[4]={COL1+COL2+COL3+COL4};//{0x001,0x002,0x004,0x008};/**********ds1820程序************/void delay(unsigned int i) //延时1微秒{for(i=100;i--;);}void init(void) //主板初始化{TRISD=0X00;TRISA=0X00;PORTA=0X00;PORTD=0X00;}/************主程序**********/uchar smg(){init();unsigned char j;unsigned int i,a,bit1000,bit100,bit10,bit1;DS1=1;DS2=1;DS3=1;DS4=1;while(1){for( i=1; i <= 9999;i++){a=i;bit1000=a/1000;//提取千位a=a%1000;bit100=a/100;//提取百位a=a%100;bit10=a/10;//提取十位bit1=a%10;//提取个位for( j=1; j <= 20;j++){DS4=0;PORTD=str[bit1];DS1=1; //个位的位选delay(2);//*延时5mS*DS1=0;PORTD=str1[bit10];DS2=1; //十位的位选delay(2);//*延时5mSDS2=0;PORTD=str[bit100];DS3=1; //百位的位选delay(2);//*延时5mSDS3=0;PORTD=str[bit1000];DS4=1; //千位的位选delay(2);//*延时5mS*/}}}}。
数码管显示0000-9999计数器数码管显示0-9999计数器,两个按键,一个按键复位,一个按键累加计数。
要求提供程序和原理图悬赏分:50 | 解决时间:2011-6-9 13:40;===========================================最佳答案:用PROTEUS仿真的电路图,可以吗?追问:可以的。
回答:仿真电路图如下:图片链接:/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/c37bb52264e093 0c9922ed33.html#实际制作时,应采用共阳数码管,PNP三极管驱动“位”,还要有限流电阻。
;===========================================;下列程序经过实验,可以满足题目要求.ORG 0000HLJMP MAINORG 0030HMAIN:MOV 70H, #0 ;显示缓冲区.MOV 71H, #0MOV 72H, #0MOV 73H, #0MOV 74H, #12H ;计数单元.MOV 75H, #34H ;都是BCD 码.;-------------------------------M_LOOP:LCALL DISPJNB P3.2, JIA_YIJNB P3.3, QING_LAJMP M_LOOP;-------------------------------JIA_YI:LCALL DISPJB P3.2, M_LOOPMOV A, 75HADD A, #1DA AMOV 75H, AMOV A, 74HADDC A, #0DA AMOV 74H, AJ_L:LCALL DISPJNB P3.2, J_LAJMP M_LOOP;-------------------------------QING_L:LCALL DISPJB P3.3, M_LOOPMOV 74H, #0MOV 75H, #0AJMP M_LOOP;-------------------------------DISP:MOV R0, #70HMOV A, 74HSWAP AANL A, #0FHMOV @R0, AINC R0MOV A, 74HANL A, #0FHMOV @R0, AINC R0MOV A, 75HSWAP AANL A, #0FHMOV @R0, AINC R0MOV A, 75HANL A, #0FHMOV @R0, AMOV DPTR, #D_TABMOV R2, #254MOV R0, #70HD_LOOP:MOV A, @R0MOVC A, @A+DPTRMOV P2, #255 ;消隐.MOV P0, A ;输出段码.MOV P2, R2 ;输出位码.LCALL DL_1MSMOV A, R2RL AMOV R2, AINC R0CJNE R0, #74H, D_LOOPRETD_TAB:DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H DB 80H, 90H, 88H, 83H, 86H, 0A1H, 86H, 8EH ;-------------------------------DL_1MS:DJNZ R7, $RET;-------------------------------END;===========================================下面做而论道把自己编写的“消除无效0的程序”公布出来,希望能够抛砖引玉。
51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。
stm共阳数码管动态显示0~9999对应的代码文章主题:STM共阳数码管动态显示0~9999对应的代码在嵌入式系统开发领域,常常会使用到数码管来显示数字信息。
而对于STM32系列单片机来说,共阳数码管是一种常用的显示设备。
本文将以 STM 单片机为例,介绍如何动态显示 0 到 9999 对应的代码,并讨论其实现原理。
一、STM32单片机简介STM32 是意法半导体推出的 32 位 Flash 型存储器嵌入式微控制器产品系列。
它广泛应用于工业控制、消费类电子、电源管理、医疗保健和自动控制等领域。
STM32 单片机具有丰富的外设和强大的性能,因此备受开发者的青睐。
二、共阳数码管原理共阳数码管是一种常见的 LED 数码显示器件。
在共阳数码管中,所有的 LED 二极管的阳脚都连接在一起,而阴极则分别连接到对应的引脚上。
当将对应的引脚置为低电平时,LED 点亮,从而显示出相应的数字或字母。
三、动态显示 0 到 9999 对应的代码在 STM32 单片机中,动态显示 0 到 9999 对应的代码需要通过定时器和中断的方式来实现。
在初始化阶段,需要设置定时器的时钟周期和中断频率。
然后在中断服务函数中,根据需要显示的数字进行位选和段选操作,以便在共阳数码管上显示出对应的数字。
具体代码如下:```#include "stm32f10x.h"uint8_t dis_buf[4]; // 数码管显示缓存void TIM_Configuration(void){// 设置定时器的时钟周期和中断频率// ...}void NVIC_Configuration(void){// 设置中断优先级和使能// ...}void GPIO_Configuration(void) {// 设置数码管引脚对应 STM32 的引脚 // ...}void Number_Display(uint16_t num) {// 数字分解dis_buf[0] = num / 1000;dis_buf[1] = (num % 1000) / 100; dis_buf[2] = (num % 100) / 10;dis_buf[3] = num % 10;// 依次显示// ...}void TIM2_IRQHandler(void){// 中断服务函数,动态显示数字// ...}int main(void){// 初始化// ...while (1){// 主循环// ...}}```四、个人观点和理解动态显示共阳数码管需要较为复杂的逻辑控制和定时器中断处理,但通过合适的代码编写和优化,可以实现可靠、高效的数字显示效果。
一、实验目的1.掌握Keil软件的基本使用2.学习和掌握C语言编写程序的一般格式3.了解数码管与单片机的接口方法;4.了解数码管性能及动态显示编程方法;5.了解并掌握单片机系统中定时器中断控制的基本方法;二、实验内容用定时器中断实现四位数码管动态显示从1234-9999。
三、实验原理3.1基础知识介绍A.数码管是LED的升级,每位数码管里面继承了8个LED,点亮数码管就是点亮数码管里面的LED。
要在数码管上面显示相应的值,就是点亮不同位置的LED。
数码管有共阴和共阳两种,共阴数码管公共端是所有LED的负极连接在一起,相反共阳数码管公共端是所有LED的正极连接在一起。
一般公共端称作“位选”,控制每一个LED的称为“段选”。
数码管主要是利用视觉暂留的效果,通过快速循环点亮数码管方式,将数据呈现出来。
数码管如图1.2所示1.2数码管1.3数码管实物图/B.定时器定时器也可看作是对计算机机器周期的计数器。
因为每个机器周期包含12个振荡周期,故每一个机器周期定时器加1,可以把输入的时钟脉冲看成机器周期信号。
故其频率为晶振频率的1/12。
如果晶振频率为12MHz,则定时器每接收一个输入脉冲的时间刚好为1μs。
定时器有两种工作模式,分别为计数模式和定时模式。
对Px,y 的输入脉冲进行计数为计数模式。
定时模式,则是对MCU的主时钟经过12分频后计数。
因为主时钟是相对稳定的,所以可以通过计数值推算出计数所经过的时间。
计数器的计数值存放于特殊功能寄存器中。
T0(TL0-0x8A, TH0-0x8C), T1(TL1-0x8B, TH1-0x8D)定时器工作原理如下图由上图可见与定时器相关的寄存器主要有下面这几个:TMOD、TCON、TL0、TH0、TL1、TH1。
下面介绍一下这几个寄存器16位加法计数器:是定时计数器的核心,其中TL0、TH0、是定时计数器0的底八位和高八位;TL1、TH1是定时计数器1的底八位和高八位;并且高八位和底八位可单独使用。
51单片机驱动4位数码管的实现方法EA /VP 31X119X218RE SET 9RD 17W R 16INT 012INT 113T014T115P101P112P123P134P145P156P167P178P0039P0138P0237P0336P0435P0534P0633P0732P2021P2122P2223P2324P2425P2526P2627P2728PSE N29AL E/P 30TX D 11RX D 10U18051AB C D abcd efg d pL1A 7B 1C 2D 6LT 3BI 4LE5A 13B 12C 11D 10E 9F 15G14U24511VCCY1CRYSTA LC133pC233pR110kC310uFS1VCCR21k R31k R41k R51k R61k R71k R81k12345678161514131211109RP 1VCCS2电路如图所示。
相应的C 语言程序为: #includeunsigned int a0,a1,a2,a3,a; int t;sbit key=P0^2;void showit();//用于在数码管上显示的子程序 void delay_n40us(unsigned int n);void delay_n40us(unsigned int n) {unsigned int i; unsigned char j; for(i=n;i>0;i--) for(j=0;j<2;j++) ; }void showit() { t=10;while(t--) { a3=a/1000; a2=(a00)/100; a1=(a0)/10; a0=a;P1=0xe0+a0;delay_n40us(200);P1=0xd0+a1;delay_n40us(200);P1=0xb0+a2;delay_n40us(200);P1=0x70+a3;delay_n40us(200);}}void main(){a=6999;while(1){if(key==1){a=a-1;showit();}else showit();}}最后说说这个电路都实现了什么功能:即整机供电后,数码管从“6999”开始倒计数,此过程中如果开关S2被按下,则会停止倒计时,松开开关后倒计时继续。