数码管显示问题:写的c程序在运行时,2位数码管只能每一...

数码管显示问题:写的c程序在运行时,2位数码管只能每一...,第1张

#include reg52h>

#define uint unsigned int

#define uchar unsigned char

sbit PRESS1=P1^0;

sbit PRESS2=P1^1;

sbit PRESS3=P1^2;

uint a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0到9

uint b[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

int miao=45,fen=58,shi=15;

uint jishu;

uint miaog,miaos,feng,fens,shig,shis;

int ji;

void init()//初始化函数设置中断寄存器的值。

{

jishu=0;

TMOD=0x01;

TR0=1;

ET0=1;

EA=1;

TH0=0x3c;

TL0=0xb0;

}

void delay(x)//延时函数。

{

uint i,j;

for(i=x;i>0;i--)

for(j=120;j>0;j--);

}

void xian()//把时分秒送到数码管显示。

{

uint i;

miaog=miao%10;

miaos=miao/10;

feng=fen%10;

fens=fen/10;

shig=shi%10;

shis=shi/10;

for(i=0;i8;i++)

{

switch(i)

{

case 0:P3=b[7];P2=a[miaog];break;

case 1:P3=b[6];P2=a[miaos];break;

case 2:P3=b[5];P2=0x40;break;

case 3:P3=b[4];P2=a[feng];break;

case 4:P3=b[3];P2=a[fens];break;

case 5:P3=b[2];P2=0x40;break;

case 6:P3=b[1];P2=a[shig];break;

case 7:P3=b[0];P2=a[shis];break;

}

delay(1);

};

}

void jiance()//检测键是否按下按不同键实现不同的处理。

{

if(PRESS1==0)

{

delay(2);

if(PRESS1==0)

{

while(!PRESS1);

ji++;

if(ji>=4)

ji=0;

}

}

if(ji==1)

{

if(PRESS2==0)

{

delay(1);

while(!PRESS2);

miao++;

if(miao>=60)

{

miao=0;

fen++;

}

}

if(PRESS3==0)

{

delay(1);

while(!PRESS3);

miao--;

if(miao0)

{

miao=59;

}

}

}

if(ji==2)

{

if(PRESS2==0)

{

delay(1);

while(!PRESS2);

fen++;

if(fen>=60)

{

fen=0;

sh顺一门有百福 平安二字值千金 万象更新

兄弟,你刚学的吧,不知道你是大学生还是非大学生的,如果是大学生的话我觉得我不应该回答了,俺只是说方法,不会给什么程序的,当然并不是程序简单我就不写,不是这样的,而是你要弄清电路的工作原理,弄清程序和电路的关系,弄清的硬件,结合程序看就应该能弄清楚了。

数码的显示方式:静态和动态

静态简单,动态是用扫描技术,进行扫描的,就是显示的数据是一样的,不过利用的扫描后,就造成显示的数据不一样了,原因是显示的速度是非常快的,人的眼是分辨不出的。而你的电路采用的静态显示,那么就是数码的共极部分,当然proteus里的数码应该是共阴极的吧,而阳极是送显示的数据,这样显示的方式是静态显示

P0 P2是数码管送显示的数据,当然这两数码管一个显示个位,一个显示十位,那么你要对显示的数据进行处理一下,比如是要显示99:

uint a,b;

uint k=99;

a=99/10;//这里只取十位而已,也就是9

b=99%10//这是求模,相当于数学里说的取余数

然后再将这a和b的数据指向一个数码管显示的代码数组[弄清数码管的显示就知道怎么写出显示代码了]

第一个是个位,先显示个位,数组的运用是利用下标控制的,我们用变量b控制下标。

第二个是十位,也是利用下标控制数组的。

当然这个变量k我们可以先不赋值,让它自增或自减从最大值一直减到最小,就是从99显示到0了,

当然你的电路有些浪费I/O口,两个数码管你把段全部连在一起不就行了,然后把共极各自连接I/O口,利用动态显示,你上图所示的,根本就是静态显示,浪费资源啊,当你在设计产品时是浪费I/O口的,

我认为应该是这样的,这样节省资源,控制也非常方便的,一点儿也不能,这个才是动态显示,利用动态扫描就搞定了,要不然会浪费资源的,俺的基础有限,再说也是自学的,也好久没弄51了,现在在做其经类型的MCU了,兄弟祝你学习有成。

注意要外接上拉电阻的,P0内部没带上拉电阻,要自己接上哦,俺没画上,你做实际产品时不要忘记了。

两位数码管显示00~99,无需采用数码管扫描,通常采用静态显示。

给你提供一个两位数码管00~99循环加法计数的CC语言程序。

程序中,采用了软件延时的方法,每半秒自动加1。

#include<reg52h>

unsigned char count=0;

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段码

void delay500ms(); //延时子程序声明

void display(unsigned char X); //显示子程序声明

void main()

{

while(1)

{

delay500ms();

count++;

if(count>=100)count=0;

display(count);

}

}

void delay500ms()

{

unsigned char i,j,k;

for(i=5;i>0;i--)

for(j=200;j>0;j--)

for(k=248;k>0;k--);

}

void display(unsigned char X)

{

P0=table[X/10];

P2=table[X%10];

}

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

sbit lcden=P2^7;

sbit rs=P2^6;

sbit rw=P2^5;

sbit DQ=P3^6;

uchar tempL=0;

uchar tempH=0;

uint sdate;

uchar xiaoshu1;

uchar xiaoshu2;

uchar xiaoshu;

bit fg=1;

uchar m;

uchar code table1[]="test temperature";

uchar code table2[]=" 0000";

uchar code table3[]="0123456789";

uchar disbuf[8]={0,0,0,0,0,0,0,0};

void delay(unsigned char i)

{

while(i--);

}

/

函数名称 : delay1ms(unsigned char i)

函数功能 : 延时函数

/

void delay1ms(unsigned char i)

{

for(i=124;i>0;i--); //延时1248+10=1002us

}

/

函数名称 : Init_DS18B20(void)

函数功能 : 初始化

/

void Init_DS18B20(void)

{

unsigned char x=0;

DQ=1; //DQ先置高

delay(8); //稍延时

DQ=0; //发送复位脉冲

delay(80); //延时(>480us)

DQ=1; //拉高数据线

delay(5); //等待(15~60us)

x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1

delay(20);

}

/

函数名称 : ReadOneChar()

函数功能 : 读一个字节

/

ReadOneChar() //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号

{

unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期

unsigned char dat=0;

for (i=8;i>0;i--) //一个字节有8位

{

DQ=1;

delay(1);

DQ=0;

dat>>=1;

DQ=1;

if(DQ)

dat|=0x80;

delay(4);

}

return(dat);

}

/

函数名称 : WriteOneChar(unsigned char dat)

函数功能 : 写一个字节

/

void WriteOneChar(unsigned char dat)

{

unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,

for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。

{

DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。

DQ=dat&0x01;

delay(5);

DQ=1;

dat>>=1;

}

delay(4);

}

/

函数名称 : ReadTemperature(void)

函数功能 : 读温度值(低位放tempL;高位放tempH;)

/

void ReadTemperature(void)

{

Init_DS18B20(); //初始化

WriteOneChar(0xcc); //跳过读序列号的 *** 作

WriteOneChar(0x44); //启动温度转换

delay(125); //转换需要一点时间,延时

Init_DS18B20(); //初始化

WriteOneChar(0xcc); //跳过读序列号的 *** 作

WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)

tempL=ReadOneChar(); //读出温度的低位LSB

tempH=ReadOneChar(); //读出温度的高位MSB

if(tempH>0x7f) //最高位为1时温度是负

{

tempL=~tempL; //补码转换,取反加一

tempH=~tempH+1;

fg=0; //读取温度为负时fg=0

}

sdate = tempL/16+tempH16; //整数部分

xiaoshu1 = (tempL&0x0f)10/16; //小数第一位

xiaoshu2 = (tempL&0x0f)100/16%10;//小数第二位

xiaoshu=xiaoshu110+xiaoshu2; //小数两位

disbuf[3] = sdate/10;

disbuf[2] = sdate%10;

disbuf[1] = xiaoshu1;

disbuf[0] = xiaoshu2;

}

void delay1(uchar aa)

{

uchar i,j;

for(i=aa;i>0;i--)

for(j=110;j>0;j--);

}

void write_com(uchar com)

{

rs=0;

P0=com;

lcden=0;

delay1(5);

lcden=1;

}

void write_data(uchar date)

{

rs=1;

P0=date;

lcden=0;

delay1(5);

lcden=1;

}

void vision()

{

write_com(0x80+0x40+0x0b);

write_data(table3[disbuf[3]]);

delay1(500);

write_com(0x80+0x40+0x0c);

write_data(table3[disbuf[2]]);

delay1(500);

write_com(0x80+0x40+0x0e);

write_data(table3[disbuf[1]]);

delay1(500);

write_com(0x80+0x40+0x0f);

write_data(table3[disbuf[0]]);

delay1(500);

}

void main()

{

uchar i;

rw=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x80);

for(i=0;i<16;i++)

{

write_data(table1[i]);

}

write_com(0x80+0x40);

for(i=0;i<16;i++)

{

write_data(table2[i]);

}

while(1)

{

ReadTemperature();

vision();

}

}

以上就是关于数码管显示问题:写的c程序在运行时,2位数码管只能每一...全部的内容,包括:数码管显示问题:写的c程序在运行时,2位数码管只能每一...、求用51单片机接两个数码管,0-99动态显示程序(用C语言)、求用单片机驱动数码二级管的C语言程序,要求二级管显示00~99等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9774972.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存