目测显示部分的函数存在问题。。。你的程序没全呀。。。。
#includereg51.h
#includeintrins.h
#define uchar unsigned char
#define uint unsigned int
sbit D18B20=P3^7; //温度传感器信号线
uint temp=0;float f_temp=0;
bit flag=0;
void TempDelay (unsigned char idata us) //延时函数,精确延时时间由软件仿真可得。0调用时用时12us
{
while(us--);
}
/************************************************************
*Function:18B20初始化
*parameter:
*Return:
*Modify:
*************************************************************/
void Init18b20 (void)
{
D18B20=1;
_nop_();
D18B20=0;
TempDelay(90); //delay 551 uS//80
D18B20=1;
TempDelay(14); //delay 95 uS//14
if(D18B20==0)
flag = 1; //detect 1820 success!
else
flag = 0; //detect 1820 fail!
TempDelay(25); //20 delay 164us
D18B20 = 1;
}
/************************************************************
*Function:向18B20写入一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
void WriteByte (unsigned char idata wr) //单字节写入
{
unsigned char idata i;
for (i=0;i8;i++)
{
D18B20 = 0;
TempDelay(0); //delay 12us
D18B20=wr0x01;
TempDelay(3); //delay 30 uS //5
_nop_();
_nop_();
D18B20=1;
wr = 1;
TempDelay(3);
}
}
/************************************************************
*Function:读18B20的一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
unsigned char ReadByte (void) //读取单字节
{
unsigned char idata i,u=0;
for(i=0;i8;i++)
{
u = 1; //5us的时间
D18B20 = 0;
_nop_();
_nop_();
D18B20 = 1;
if(D18B20==1)
u |= 0x80;
TempDelay (2);
_nop_();
D18B20 = 1;
}
return(u);
}
void tempchange(void) //DS18B20 开始获取温度并转换
{
Init18b20();
WriteByte(0xcc); // 写跳过读ROM指令
WriteByte(0x44); // 写温度转换指令
}
uint get_temp() //读取寄存器中存储的温度数据
{
uchar a=0,b=0;
Init18b20();
WriteByte(0xcc);
WriteByte(0xbe);
a=ReadByte(); //读低8位
b=ReadByte(); //读高8位
Init18b20();
temp=b;
temp=8; //两个字节组合为1个字
temp=temp|a;
f_temp=temp*0.0625; //温度在寄存器中为12位 分辨率位0.0625°
temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入
f_temp=f_temp+0.05;
return temp; //temp是整型
}
以上是读取数据部分。。。。。最后读取的数据为整数
数码管的公共端没有连接。51单片机数码管显示不了是因为数码管的公共端没有连接。数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件。
51单片机 按键转数码管,仿真例程 参考
#includereg51.h
#define uchar unsigned char
uchar temp;
int key1,key,disbuf;// 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f
unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char ledx[8];
bit s0,s1;
void delay(uchar z)
{
uchar i,j;
for(i=0;i120;i++)
for(j=0;jz;j++);
}
void scan() //要是按键了,扫描键盘编码值
{
P1=0xF0;
delay(1);
temp=P1;
switch(temp)
{
case 0xe0: key1=0;
break;
case 0xd0: key1=1;
break;
case 0xb0: key1=2;
break;
case 0x70: key1=3;
break;
}
P1=0x0f;
delay(1);
temp=P1;
switch(temp)
{
case 0x0E: key=key1+0;
break;
case 0x0D: key=key1+4;
break;
case 0x0B: key=key1+8;
break;
case 0x07: key=key1+12;
break;
default : key=-1;
}
if((key1+1)(key+1)) disbuf=key;
}
void ejjc() //判断是否按键
{
P1=0xF0;
if(P1!=0xF0) { scan();s0=1;}
else { s0=0; s1=1;}
}
void main()
{
uchar i;
while(1)
{
ejjc();
if(s0==1 s1==1)
{
s0=0;s1=0;
for(i=0;i8;i++)
{ ledx[i]=ledx[i+1]; ledx[8]=disbuf; }
}
P0=0xff;
P2=LED7Code[ledx[0]];
P0=0xfe;
delay(5);
P0=0xff;
P2=LED7Code[ledx[1]];
P0=0xfd;
delay(5);
P0=0xff;
P2=LED7Code[ledx[2]];
P0=0xfb;
delay(5);
P0=0xff;
P2=LED7Code[ledx[3]];
P0=0xf7;
delay(5);
P0=0xff;
P2=LED7Code[ledx[4]];
P0=0xef;
delay(5);
P0=0xff;
P2=LED7Code[ledx[5]];
P0=0xdf;
delay(5);
P0=0xff;
P2=LED7Code[ledx[6]];
P0=0xbf;
delay(5);
P0=0xff;
P2=LED7Code[ledx[7]];
P0=0x7f;
delay(5);
}
}
数码管(其实就是LED)如果是共阳极,那么单片机可以驱动显示。如果是共阴极,单片机则不能驱动显示(或者灯光微弱),因为单片机的IO口无法提供足够高的电流,此时需要外部电路器件提供一个大电流驱动的芯片。
51单片机介绍
51单片机是对兼容英特尔8051指令系统的单片机的统称。51单片机广泛应用于家用电器、汽车、工业测控、通信设备中。因为51单片机的指令系统、内部结构相对简单,所以国内许多高校用其进行单片机入门教学。
设备上,一般是建议购买一个仿真器,例如,的双功能下载线就具有良好的稳定性和较快的下载速度,上位机可扩展,可以下载更多的单片机及嵌入式芯片。
通过实验,这样才可以进行实际的,全面的学习。日后在工作上,仿真器也大有用处。还有,一般光有仿真器是不行,还得有一个实际的电路,即学习板,如图,即为,单片机最小系统。
学习板以强大的接口为主,单片机的学习分两方面,一方面是单片机的原理及内部结构,另一方面是单片机的接口技术。这些都是需要平时多积累,多动手,多思考,这样才能学好单片机技术。
单片机51数码管仿真的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:单片机51数码管仿真