基于单片机(c语言控制的)一个4位数码管从左到右依次显示1234程序设计及proteus仿真图
基于单片机的四位BCD编码器电路设计
基于单片机的四位BCD编码器电路设计1 引言BCD码又称二/十进制码,即二进制编码的十进制码,在设计、测试数字电路硬件过程或是面对带有BCD码接口的集成电路时,常常希望方便、快速地产生BCD码来完成当前的工作,检验硬件电路的正确性,例如锁相频率合成集成电路MC145163P带有4位BCD编码接口,用于设置环路N分频器,通过本文介绍而制作完成后的BCD发生器可以提供4位BCD编码输出,方便地控制每位BCD输出,可以快速地得到BCD编码而完成测试或输出BCD编码接到集成电路的BCD编码接口,无需频繁跳线。
另外,BCD编码有8421码、2421码、余3码等多种形式,本文以常见的8421码为例介绍电路的实现和程序的编写。
如果对程序略加修改则可以很方便地实现其他类型的编码方式(如2421码)。
本电路以AT89C2051为核心设计了4×4的矩阵键盘(S0-S15),这样只需在键盘上按下相应的按键(S0-S9)即可以产生一个对应(十进制0-9)的BCD码,通过设置切换按键(S10-S13)可以随意地控制4位中任意的一位,期间用数码管实时地显示当前BCD码对应的十进制数。
电路功能和特点:4位BCD编码输出,利用单片机口线可以扩展位数。
改变软件中键号0-键号9(即S0-S9对应功能)的程序可以实现其他编码形式(如2421码)。
参见软件部分。
电路以常用的8421码为例,并有数码显示出对应的十进制数(也可以省略)。
完整的4×4的矩阵键盘扫描执行程序,可以移植到其他应用电路中。
BCD编码由锁存器实现信号锁存,并引出接口,方便连接其他电路。
“位”控制和0-9编码输出互不影响,直接按下功能键就可以得到需要的BCD 编码输出和“位数”选择。
2 电路框图电路原理图如图1所示。
3 电路分析AT89C2051的P1口组成4×4矩阵键盘(S0-S15),其中P1.0-P1.3作为行线,P1.4-P1.7作为列线,设计键盘扫描程序可以达到预先设想的功能(见软件设计部分)。
pic单片机4位数码管显示 1~9999循环点亮
DS1=0;
PORTD=str1[bit10];
DS2=1; //十位的位选
delay(2);//*延时5mS
DS2=0;
PORTD=str[bit100];
DS3=1; //百位的位选
delay(2);//*延时5mS
DS3=0;
PORTD=str[bit1000];
{
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; //个位的位选
#define DS4 RA5
#define B20 RA4
#define uchar unsigned char
#define uint uconst unsigned char str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; //共阴数码管字码表
#include <pic.h> //调用头文件,可以去PICC软件下去查找PIC16F87XA单片机的头文件
__CONFIG(0x1832);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
#define DS1 RA1
#define DS2 RA2
#define DS3 RA3
(完整word版)pic单片机4位数码管显示 1~9999循环点亮
#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*/}}}}。
单片机 4位时钟数码管
单片机控制4位时钟数码管的方法如下:
连接硬件:将4位数码管的共阳(或共阴)引脚连接到单片机的I/O口,连接数码管的段选引脚到单片机的另外4个I/O口。
同时,连接一个晶振和相关的电容电阻到单片机的时钟输入引脚和地。
设置引脚:在代码中定义每个数码管引脚对应的I/O口为输出模式,用于控制数码管的显示。
编写代码:使用单片机的定时器功能,通过编程计算出每个数码管显示的数字对应的段选编码,并在定时器中断服务程序中更新数码管的显示。
调试程序:将程序下载到单片机中,通过观察数码管的显示效果,调整程序中的参数或代码,以达到预期的显示效果。
需要注意的是,具体的实现方式可能因单片机的型号和数码管的类型而有所不同,需要根据实际情况进行相应的调整。
四位拨动开关控制数码管显示系统设计书
四位拨动开关控制数码管显示系统设计书1.设计背景单片机具有人机对话功能,开关,键盘是实现人机对话的主要输入设备,也是最常用的设备,通过它能发出各种控制指令和数据到单片机。
而二极管,数码管,LED显示器是常用的输出设备,单片机接受一系列指令到,执行一定功能后,可通过这些设备输出。
为了更好的掌握单片机的硬件特性以及用汇编语言进行编程设计,我们运用目前所学的知识,来设计了一个单片机最小系统——用拨码开关控制数码管显示系统。
2.设计方案2.1方案一使用单片机P1口,由4位DIP开关从P1口低四位输入,高四位输出,译码部分采用74LS247译码器,送往共阳极数码管显示。
本方案编程简单,占用I/O端口少,但电路设计较复杂,硬件增多,成本增高。
2.2方案二本方案的译码部分由单片机编程实现,P1口接共阳数码管,由4位DIP开关从P0口低四位输入,经软件译码,送往P1口,在数码管显示相应的数字。
由于译码部分采用了软件实现,省去了译码电路,成本降低,电路设计简单,但编程较方案一复杂,而且占用I/O端口多,占用系统资源。
综合考虑,确定采用方案二实现。
3.方案实施3.1输入输出电路设计该设计以AT89S52单片机为核心部件,AT89S52单片机有4个双向的8位并行I/0口,分别记为P0、P1、P2和P3口。
本次设计中主要使用P0作为输入口,P1作为输出口。
P0口:P0口为一个8位漏级开路双向I/O口,每个脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL 门电流。
P1口管脚写入1后,被部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于部上拉的缘故。
c51单片机外接四个数码管时钟显示汇编
;p0端口接数码显示p0.0-a.....p0.7-h;p1.0-p1.3接位选p1.0-第4个数码管.....p1.3-第1个;p2.0-p2.3接列...p2.4-p2.6接行qq equ 26hqq1 equ 28hx equ 30Hy equ 32Hz0 equ 34H ;数码显示最高位z1 equ 36H ; 数码显示次高位key equ P2 ;键盘控制key1 equ p3.2 ;时分调整控制键org 0000hajmp mainorg 000bhljmp td0org 0100hmain:mov tmod,#01h ;初始化mov tl0,0b0hmov th0,3chsetb easetb et0mov r0,#00mov r1,#00mov r2,#00mov r3,#00mov r4,#00mov r5,#00mov r6,#00mov r7,#00mov x,#00mov y,#00mov z0,#00mov z1,#00mov dptr,#tabsetb tr0;---------------------------------------main1:call a1 ;判断是否有键按下,,jz main2 ;无键按下,跳main2,call b1 ;有键按下,扫描按键确定哪一个被按下,call c0 ;把对应按键设置键码,main2:jnb key1,guangljmp main4guang:call delayjnb key1,guang1ljmp main4guang1:inc r7jnb key1,$main4:call xianshicjne r0,#20,main1 ;一秒定时mov r0,#00cpl p3.0inc r5cjne r5,#60,main1 ;秒mov r5,#00inc r1cjne r1,#10,main1 ;分个位mov r1,#00inc r2cjne r2,#6,main1 ;分十位mov r2,#00inc r3cjne r6,#1,main3cjne r3,#2,main1 ;时十位mov r3,#00mov r4,#00ljmp main1main3:cjne r3,#10,main1 ;时个位mov r3,#00inc r4inc r6ljmp main1 ;主程序循环;----------------------------------------------------- a1:mov key,#0fH ;判断键按下mov a ,keyanl a ,#0fhcjne a,#0fh,a2 ;有键按下跳转mov a,#0 ;无键按下跳转a2:retb1:mov b,#7fh ;判断哪一个键b2:mov a,brr amov b,amov p2,amov a,p2 ;依次判断哪一行anl a,#0fhcjne a,#0fh,B3ajmp b2b3:mov a,key ;把P1的值移出retc0:mov b,key ;处理行数据从下往上为X1,X2,X3.mov a,keyanl a,#0f0hc1:cjne a,#0e0h,c2mov x,#1c2:cjne a,#0d0h,c3mov x,#2c3:cjne a,#0b0h,d0mov x,#3d0:mov a,B ;处理列数据从右往左为Y1,Y2,Y3,Y4 anl a,#0fhd1:cjne a,#0eh,d2mov y,#1d2:cjne a,#0dh,d3mov y,#2d3:cjne a,#0bh,d4mov y,#3d4:cjne a,#7h ,e1mov y,#4e1:dec x ;键码设置mov a,xmov b,#4mul abadd a,yclr cycjne a,#10,e2e2:jc e3mov b,#10div abmov z0,amov z1,bajmp e4e3:mov z0,acjne r7,#0,dier ;当r7=0时调分针个位mov r1,z0dier:cjne r7,#1,dier1 ;当r7=1时调分针十位mov r2,z0dier1:cjne r7,#2,dier2 ;当r7=2时调时针个位mov r3,z0dier2:cjne r7,#3,dier3 ;当r7=3时调时针十位mov r4,z0dier3:cjne r7,#4,e4mov r7,#00e4:ret; --------------------------------------------------------------------- xianshi:clr p1.3 ;第一个数码管显示mov a,r4movc a,@a+dptrmov p0,acall delaysetb p1.3mov dptr,#tab1 ;第二个数码管显示clr p1.2mov a,r3movc a,@a+dptrmov p0,acall delaysetb p1.2mov dptr,#tab ;第三个数码管显示clr p1.1mov a,r2movc a,@a+dptrmov p0,acall delaysetb p1.1clr p1.0 ;第四个数码管显示mov a,r1movc a,@a+dptrmov p0,acall delaysetb p1.0ret; -------------------------------------------------------- delay: ;延时程序mov qq,#10mov qq1,#10del:djnz qq,deldjnz qq1,delret;定时中断td0:inc r0mov tl0,0b0hmov th0,3chretitab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h tab1: db 40h,79h,24h,30h,19h,12h,02h,78h,00h,10h end。
51单片机(四位数码管的显示)程序
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***************************************/。
基于51单片机的4位数码管秒表
原理图:源程序:/*************************************************************标题:定时器中断精确到00.01的秒表效果:能清零重新开始,暂停,继续计时,能精确到0.01秒作者:皖绩小挺说明:使用12M晶振,四位数码管,3个按键****************************************************************/ #include<reg52.h>#define uint unsigned int#define uchar unsigned charuint temp,tt,qian,bai,shi,ge;sbit smg_q=P1^0;sbit smg_b=P1^1;sbit smg_s=P1^2;sbit smg_g=P1^3;sbit key1 = P3^7;sbit key2 = P3^6;sbit key3 = P3^5;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点void keyscan();void display(uint shi,uint ge);void delay(uint z);void init();/**************************************************************主函数******************************************************************/void main(){init();//初始化子程序while(1){if(tt==1){tt=0;temp++;if(temp==10000){temp=0;}qian=temp/1000;bai=temp%1000/100;shi=temp%100/10;ge=temp%10;}keyscan();display(shi,ge);}}/*********************************************************************延时***********************************************************************/ void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*********************************************************************按键控制***********************************************************************/ void keyscan(){if(key1==0) //清零并重新开始计时{temp=0;TR0=1;}if(key2==0) //暂停计时{TR0=0;}if(key3==0) //继续计时{TR0=1;}}/*********************************************************************显示***********************************************************************/ void display(uint shi,uint ge){smg_q=0;P0=table[qian];delay(1);smg_q=1;P0=0xff;smg_b=0;P0=table1[bai];delay(1);smg_b=1;P0=0xff;smg_s=0;P0=table[shi];delay(1);smg_s=1;P0=0xff;smg_g=0;P0=table[ge];delay(1);smg_g=1;P0=0xff;}/*********************************************************************初始化***********************************************************************/ void init(){smg_q=1;smg_b=1;smg_s=1;smg_g=1;temp=0;TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;EA=1;ET0=1;TR0=1;}/*********************************************************************中断***********************************************************************/ void t0() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;tt++;}友情提示:本资料代表个人观点,如有帮助请下载,谢谢您的浏览!。
单片机数码管动态显示1234-9999
一、实验目的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的底八位和高八位;并且高八位和底八位可单独使用。
c语言四位数码管万年历程序
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 万年历&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& #include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code taba[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code tabb[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};uint a,b,c,i,j,n=0,nian=2010,yue=1,ri=1,shi=0,fen=0,miao=0;sbit K1=P3^2;sbit K2=P3^3;sbit K3=P3^4;sbit K4=P3^5;sbit F=P3^0;sbit D=P0^7;void int0()interrupt 1 //T0定时器中断{TH0=(65536-50000)/256;TL0=(65536-50000)%256;i++;if(i==20) i=0,miao++,P1=~P1; //定时满1秒,秒进1,流水灯明灭if(miao==60) miao=0,fen++; //秒钟数满59,秒归0,分进1if(fen==60) fen=0,shi++; //分钟数满59,分归0}void delay(uint j) //延时函数j*1ms{for(a=1;a<=j;a++) //延时j*1msfor(b=1;b<=121;b++);}void del_nian() //实现数码管动态显示年{while(miao<=5&&K1) //显示5秒,--年{P0=taba[nian/1000],P2=0xf7,delay(3),P0=0xff,P2=0xff; //数码管第1位显示P0=taba[nian/100%10],P2=0xfb,delay(3),P0=0xff,P2=0xff; //数码管第2位显示P0=taba[nian%100/10],P2=0xfd,delay(3),P0=0xff,P2=0xff; //数码管第3位显示P0=taba[nian%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;} //数码管第4位显示}void del_yue_ri() //实现数码管动态显示月,日{while(miao<=10&&K1) //显示5秒,--月--日{P0=taba[yue/10],P2=0xf7,delay(3),P0=0xff,P2=0xff; //数码管第1位显示P0=tabb[yue%10],P2=0xfb,delay(3),P0=0xff,P2=0xff; //数码管第2位显示P0=taba[ri/10],P2=0xfd,delay(3),P0=0xff,P2=0xff; //数码管第3位显示P0=taba[ri%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;} //数码管第4位显示}void del_shi_fen() //实现数码管动态显示时,分{while(miao>10&&miao<=60&&K1) //显示50秒,--分--钟{P0=taba[shi/10],P2=0xf7,delay(3),P0=0xff,P2=0xff; //数码管第1位显示P0=tabb[shi%10],P2=0xfb,delay(3),P0=0xff,P2=0xff; //数码管第2位显示P0=taba[fen/10],P2=0xfd,delay(3),P0=0xff,P2=0xff; //数码管第3位显示P0=taba[fen%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;} //数码管第4位显示}void del_tiao_nian(){while(K1) //按下K1返回{switch(n){case 2:{if(K3==0) delay(200),K3=1,nian++; //第2次按K1,按K3加,来调W2 if(K4==0) delay(200),K4=1,nian--;};break;}P0=taba[nian/1000],P2=0xf7,delay(3),P0=0xff,P2=0xff;P0=taba[nian/100%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;P0=taba[nian%100/10],P2=0xfd,delay(3),P0=0xff,P2=0xff;P0=tabb[nian%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;} //用带点数组,表示调整的是哪个值---第四个点---调-年}void del_tiao_yue_ri(){ while(K1) //按下K1返回{switch(n){case 3:{if(K3==0) delay(200),K3=1,yue++; //第3次按K1,按K3加,来调W4 if(K4==0) delay(200),K4=1,yue--;P0=tabb[yue%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;};break; //用带点数组,表示调整的是哪个值---第二个点---调-月case 4:{if(K3==0) delay(200),K3=1,ri++; //第4次按K1,按K3加,来调W4 if(K4==0) delay(200),K4=1,ri--;P0=tabb[ri%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;};break;} //用带点数组,表示调整的是哪个值---第四个点---调-日P0=taba[yue/10],P2=0xf7,delay(3),P0=0xff,P2=0xff;P0=taba[yue%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;P0=taba[ri/10],P2=0xfd,delay(3),P0=0xff,P2=0xff;P0=taba[ri%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;}}void del_tiao_shi_fen(){while(K1) //按下K1返回{switch(n){case 5:{if(K3==0) delay(200),K3=1,shi++; //第5次按K1,按K3加,来调W4if(K4==0) delay(200),K4=1,shi--;P0=tabb[shi/10],P2=0xf7,delay(3),P0=0xff,P2=0xff; //P0=tabb[shi%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;};break; //用带点数组,表示调整的是哪个值---前两个点---调-年case 6:{if(K3==0) delay(200),K3=1,fen++; //第6次按K1,按K3加,来调W4if(K4==0) delay(200),K4=1,fen--;P0=tabb[fen/10],P2=0Xfd,delay(3),P0=0xff,P2=0xff; //P0=tabb[fen%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;};break;} //用带点数组,表示调整的是哪个值---后两个点---调-年P0=taba[shi/10],P2=0xf7,delay(3),P0=0xff,P2=0xff;P0=taba[shi%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;P0=taba[fen/10],P2=0xfd,delay(3),P0=0xff,P2=0xff;P0=taba[fen%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;}}void del_tiao() //暂停调整程序{while(n!=8) //第8次按下,调整循环了一圈,跳回主程序{if(K1==0)delay(300),K1=1,n++; //通过K1改变n值while(K1&&n!=8) //按下K2返回主程序{switch(n){case 1:P0=0x00,P1=0xff,P2=0x00;break; //第1次按下,显示管全亮case 2:del_tiao_nian();break; //第2次按下,进到调--年--状态case 3:del_tiao_yue_ri();break; //第3次按下,进到调--月--状态case 4:del_tiao_yue_ri();break; //第4次按下,进到调--日--状态case 5:del_tiao_shi_fen();break; //第5次按下,进到调--时--状态case 6:del_tiao_shi_fen();break; //第6次按下,进到调--分--状态case 7:P0=0x00,P1=0xff,P2=0x00;break;} //第7次按下,显示管全亮}}}void main() //主函数{TMOD=0X01; //TH0=(65536-50000)/256; //TL0=(65536-50000)%256; ////////定时初始化EA=1; //ET0=1; //while(1){TR0=1; //开启定时器n=0;if(yue==1^yue==3^yue==5^yue==7^yue==8^yue==10) ////实现1,3,5,7,8,10月,有31天{if(ri==32) ri=0,yue++;};if(yue==4^yue==6^yue==9^yue==11) //实现4,6,9,11月,有30天{if(ri==31) ri=0,yue++;};if(!nian%4) //实现闰年有28天{if(yue==2){if(ri==29) ri=0,yue++;}};if(nian%4) //实现平年有29天{if(yue==2){if(ri==30) ri=0,yue++;}};if(yue==12) //在12月份,满31天,年加1,月-日归0 {if(ri==32) ri=0,nian++;};if(shi==24) shi=0,ri++; //实现满24小时,时归0,日加1del_nian(); //调用-年----显示if(!K1) del_tiao(); //有按键按下,进入调整程序del_yue_ri(); //调用-月-日-显示if(!K1) del_tiao(); //有按键按下,进入调整程序del_shi_fen(); //调用-时-分-显示if(!K1) del_tiao(); //有按键按下,进入调整程序}}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 抢答器&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& #include<reg52.h> //头文件#define uchar unsigned char //宏定义#define uint unsigned int //宏定义uchar code table[5]={0xC0,0xF9,0xA4,0xB0,0x99};// 0 , 1 , 2 , 3 , 4 ;uchar code tab[5]={0xF7, 0xFB, 0xFD, 0xFE, 0xFF};//数码管:一亮,二亮,三亮,四亮,全灭uint i,j=0,z=5,x=5,c=5,v=5,a,b;sbit K4=P3^5;sbit L4=P1^0;sbit K3=P3^4;sbit L3=P1^1;sbit K2=P3^3;sbit L2=P1^2;sbit K1=P3^2;sbit L1=P1^3;sbit M=P3^0;void delay(uint i) //延时子函数---延时:i*1ms{for(a=0;a<+i;a++)for(b=0;b<=121;b++);}void del(void) //子函数----倒计时{ for(i=3;i>0;i--) //倒计时3,2,1{P3=0xFF,P2=0xF0;for(j=0;j<=30000;j++) //循环扫描按键{P0=table[i];if(K1==0) { while(1) //数码管二,三闪烁锁定提前抢答者1,蜂鸣器报警{P2=0xF9,P0=table[1],M=0,delay(100),P2=0xFF,M=1,delay(100);}}if(K2==0) { while(1) //数码管二,三闪烁锁定提前抢答者2,蜂鸣器报警{P2=0xF9,P0=table[2],M=0,delay(100),P2=0xFF,M=1,delay(100);;}}if(K3==0) { while(1) //数码管二,三闪烁锁定提前抢答者3,蜂鸣器报警{P2=0xF9,P0=table[3],M=0,delay(100),P2=0xFF,M=1,delay(100);;}}if(K4==0) { while(1) //数码管二,三闪烁锁定提前抢答者4,蜂鸣器报警{P2=0xF9,P0=table[4],M=0,delay(100),P2=0xFF,M=1,delay(100);;}}}};}void main(){ del();if(i==0) M=0,delay(50),M=1; //蜂鸣器响后开始抢答P3=0xFF,j=0;while(1) //实现四人强答,动态显示{ if(K1==0){M=0,L1=0; //蜂鸣器响对应第一流水灯亮if(z==5) z=j++;}P2=tab[z],P0=table[1],delay(4),M=1,P0=0xFF,P2=0xFF;if(K2==0){M=0,L2=0; //蜂鸣器响对应第二流水灯亮if(x==5) x=j++;}P2=tab[x],P0=table[2],delay(4),M=1,P0=0xFF,P2=0xFF;if(K3==0){M=0,L3=0; //蜂鸣器响对应第三流水灯亮if(c==5) c=j++;}P2=tab[c],P0=table[3],delay(4),M=1,P0=0xFF,P2=0xFF;if(K4==0){M=0,L4=0; //蜂鸣器响对应第四流水灯亮if(v==5) v=j++;}P2=tab[v],P0=table[4],delay(4),M=1,P0=0xFF,P2=0xFF;}}。
基于单片机的四位BCD编码器电路设计
基于单片机的四位BCD编码器电路设计1 引言BCD码又称二/十进制码,即二进制编码的十进制码,在设计、测试数字电路硬件过程或是面对带有BCD码接口的集成电路时,常常希望方便、快速地产生BCD码来完成当前的工作,检验硬件电路的正确性,例如锁相频率合成集成电路MC145163P带有4位BCD编码接口,用于设置环路N分频器,通过本文介绍而制作完成后的BCD发生器可以提供4位BCD编码输出,方便地控制每位BCD输出,可以快速地得到BCD编码而完成测试或输出BCD编码接到集成电路的BCD编码接口,无需频繁跳线。
另外,BCD编码有8421码、2421码、余3码等多种形式,本文以常见的8421码为例介绍电路的实现和程序的编写。
如果对程序略加修改则可以很方便地实现其他类型的编码方式(如2421码)。
本电路以AT89C2051为核心设计了4×4的矩阵键盘(S0-S15),这样只需在键盘上按下相应的按键(S0-S9)即可以产生一个对应(十进制0-9)的BCD码,通过设置切换按键(S10-S13)可以随意地控制4位中任意的一位,期间用数码管实时地显示当前BCD码对应的十进制数。
电路功能和特点:4位BCD编码输出,利用单片机口线可以扩展位数。
改变软件中键号0-键号9(即S0-S9对应功能)的程序可以实现其他编码形式(如2421码)。
参见软件部分。
电路以常用的8421码为例,并有数码显示出对应的十进制数(也可以省略)。
完整的4×4的矩阵键盘扫描执行程序,可以移植到其他应用电路中。
BCD编码由锁存器实现信号锁存,并引出接口,方便连接其他电路。
“位”控制和0-9编码输出互不影响,直接按下功能键就可以得到需要的BCD 编码输出和“位数”选择。
2 电路框图电路原理图如图1所示。
3 电路分析AT89C2051的P1口组成4×4矩阵键盘(S0-S15),其中P1.0-P1.3作为行线,P1.4-P1.7作为列线,设计键盘扫描程序可以达到预先设想的功能(见软件设计部分)。
单片机控制的四位数码管动态显示编程
时代农机TIMES AGRICULTURAL MACHINERY第46卷第2期Vol.46No.22019年2月Feb.20192019年第2期摘要:应用仿真软件,设计“2018”动态显示程序并进行计算机仿真。
关键词:程序;动态显示;单片机控制作者简介:谭明良(1998-),男,辽宁大连人,大学本科,主要研究方向:机电一体化技术。
通讯作者:王伟(1957-),男,山东菜州人,硕士,副教授,主要研究方向:机电一体化技术、机床电气与PLC 技术。
单片机控制的四位数码管动态显示编程谭明良,王伟(沈阳工学院,辽宁抚顺113122)1软件介绍与动态说明PROTEUS 软件是英国Lab Center Electronics公司出版的EDA (电子设计自动化)工具软件。
KeilC51是美国Keil Software 公司出品的51系列兼容单片机C 语言软件开发系统。
两软件的联合调试是单片机仿真的基础。
静态显示就是用单片机I/O 口输出固定的数值,每个数码管的驱动电平不会改变,一般用来显示固定的数值。
动态显示,也称扫描显示,是将所有数码管的8段即a~dp 段都连接在一起,分时使各个数码管的位选端有效,也就是在某一个时刻只能有1个数码管在显示。
由于人眼具有“视觉暂留”作用(通常在20ms 左右),因此只要使多个数码管显示的时间间隔较短,人眼一般是感绝不到数码管熄灭的,因此可以形成多个数码管在“静态显示”的假象。
动态显示优点是占用的I/O 接口较少,但需要消耗一定的时间。
2动态显示编程由四位数码管用动态显示“2018”,原理是由单片机的一个I/O 口输出显示段码,另一个I/O 口输出位码。
程序如下:#include<reg52.h>delay ();#define uchar unsigned char P2=0x00;#define uint unsigned intP2=a [2];uchar code a [4]={0x7f ,0x06,0x3f ,0x5b};P1=b [2];uchar code b [4]={0xfe ,0xfd ,0xfb ,0xf7};delay ();uint time ;P2=0x00;void delay ();P2=a [3];void main ()P1=b [3];{P0=0x00;delay ();while (1)P2=0x00;{P2=a [0];}P1=b [0];}delay ();void delay ()P2=0x00;{time=1300;P2=a [1];while (time--);}P1=b [1];3仿真效果4结语动态显示可以同时显示多位数码管,通过不停的刷新I/O 口的数据来实现多位的持续显示。
怎样用keil编写4位数码管显示1234的程序
怎样用keil编写4位数码管显示1234的程序为了帮助网友解决“怎样用keil编写4位数码管显示1234”相关的问题,中国学网通过互联网对“怎样用keil编写4位数码管显示1234”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:怎样用keil编写4位数码管显示1234的程序,具体解决方案如下:解决方案1:你具体哪一步不会呢。
追问:我就是不懂编程,老师让我们做4位LED数码管动态显示设计,用Keil和protues两个软件回答:keil是汇编软件生成hex文件,然后加载到proteus里面就可以仿真了。
你是不懂代码怎么写呢,还是不会用软件呢追问:两个软件都差不多会用了,就是不会写那个程序,你能不能帮帮我呢?回答:/************************************************************** *************标题:数码管的显示效果:显示1234,从这个例子可以学习多位数码管的动态显示技术*************************************************************** ***************///头文件:#include 'reg51.h'//变量定义:unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//表:共阳数码管 0-9//引脚定义:sbit SMG_q = P1^0; //定义数码管阳级控制脚(千位)sbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)//函数声明:void delay(void); //延时子函时//主函数,C语言的入口函数:void main(void){unsigned char i=0; //作为查表的索引号while(1) //不停的循环扫描,不扫描则不显示或显示不正确,即为动态显示,{ //数码管显示 1234,可自行修改SMG_q=0; //选择千位数码管P0=table[1]; //查找'1'定义好的数码管段值与P0口输出,显示相应的1delay(); //加入短暂延时P0=0XFF; //清除数码管显示,因是共阳型,所以不是0SMG_q=1; //关闭千位数码管SMG_b=0; //选择百位数码管P0=table[2]; //查找'2'定义好的数码管段值与P0口输出,显示相应的2delay(); //加入短暂延时P0=0XFF; //清除数码管显示,因是共阳型,所以不是0SMG_b=1; //关闭百位数码管SMG_s=0; //选择十位数码管P0=table[3]; //查找'2'定义好的数码管段值与P0口输出,显示相应的2delay(); //加入短暂延时P0=0XFF; //清除数码管显示,因是共阳型,所以不是0SMG_s=1; //关闭十位数码管SMG_g=0; //选择个位数码管P0=table[4]; //查找'2'定义好的数码管段值与P0口输出,显示相应的2delay(); //加入短暂延时P0=0XFF; //清除数码管显示,因是共阳型,所以不是0SMG_g=1; //关闭个位数码管}}//延时子函数,短暂延时void delay(void){unsigned char i=10;while(i--);}追问:额,我在那个Keil软件里就写这个吗?全部都要写吗?回答:恩,不清楚再问我。
51单片机(四位数码管的显示)程序
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***************************************/。