#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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)