51单片机数码管的程序代码

51单片机数码管的程序代码
51单片机数码管的程序代码

1 动态显示

#include

#define uchar unsigned char

#define uint unsigned int

sbit line= P1^3; //点阵

sbit led= P1^2; //流水灯sbit wela=P1^1; //位选

sbit dula=P1^0; //段选unsigned char code table []=

{0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

uint y,x;

void delay ( uint);

void main ()

{

P0=0X00;

line =0;

P0=0xff;

led=0;

while (1)

{

dula=1;

P0=table [0];

dula=0;

P0=0xff;

wela=1;

P0=0xfe;

wela=0;

delay (500);

dula=1;

P0=table [1];

dula=0;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delay(500);

dula=1;

P0=table [2];

dula=0;

wela=1;

P0=0xfb; wela=0; delay(500);

dula=1;

P0=table [3]; dula=0;

P0=0xff; wela=1;

P0=0xf7; wela=0; delay(500);

dula=1;

P0=table [4]; dula=0;

P0=0xff; wela=1;

P0=0xef; wela=0; delay(500);

dula=1;

P0=table [5]; dula=0;

P0=0xff; wela=1;

P0=0xdf; wela=0; delay(500);

dula=1;

P0=table [6]; dula=0;

P0=0xff; wela=1;

P0=0xbf; wela=0; delay(500);

dula=1;

P0=table [7];

P0=0xff;

wela=1;

P0=0x7f;

wela=0;

delay(500);

}

}

void delay (uint m)

{

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

for (y=100;y>0;y--); }

2.点亮一个数码管

#include

#define uint unsigned int

#define uchar unsigned char sbit led= P1^2;

sbit wei =P1^1;

sbit line=P1^3;

sbit duan=P1^0;

uint a,x,y;

uchar code table[]=

{0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void delay (uint);

void main ()

{

P0=0x00;

line =0;

P0=0xff;

led=0;

wei=1;

P0=0x7f;

wei=0;

while (1)

{

for (a=0;a<10;a++)

{

duan=1;

P0=table[a];

duan=0;

delay (500);

}

}

}

void delay (uint s)

{

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

for (y=100;y>0;y--);

}

3.依次流水作业

#include

#define uchar unsigned char

#define uint unsigned int

sbit line= P1^3; //点阵

sbit led= P1^2; //流水灯

sbit wela=P1^1; //位选

sbit dula=P1^0; //段选unsigned char code table []=

{0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

unsigned char code weisn[]=

{

0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uint y,s,a,b;

void delay ( uint);

void main ()

{

P0=0X00;

line=0;//关闭点阵

P0=0xff;

led=0;//关闭led

while (1)

{

for (a=0;a<8;a++)

{ wela=1;

P0=weisn[a];

wela=0;

for (b=0;b<10;b++)

{

dula=1;

P0=table [b];

wela=0;

delay (200);

}

}

}

}

void delay (uint m)

{

for (s=m;s>0;s--)

for (y=100;y>0;y-- );

}

4.数码管动态显示

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void delay(unsigned int);

sbit wei=P1^1; //位控制端

sbit duan=P1^0; //段控制端

sbit Leden=P1^2;//LED灯控制端

sbit Line=P1^3;//点阵行控制端

unsigned int i,j;

unsigned char code DM[]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/ / 显示段码值0~9

unsigned char code WM[]={0x0e,0x0d,0x0b,0x07,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码

/*------------------------------------------------

主函数

------------------------------------------------*/

main()

{

unsigned char x=0,num;

unsigned int y;

P0=0X00; //关闭点阵

Line=0;

P0=0XFF; //关闭LED灯

Leden=0;

while(1)

{

duan=1;

P0=DM[num+x]; //取显示数据,段码

duan=0;

wei=1;

P0=WM[x]; //取位码

wei=0;

delay(5); // 扫描间隙延时,时间太长会闪烁,太短会造成重影

x++;y++;

if(4==x) //检测4位扫描完全结束?如扫描完成则从第一个开始再次扫描8位

x=0;

if(y==400) //检测当前数值显示了一小段时间后,需要显示的数值加1,实现数据显示的变化

{

y=0;

num++;

if(num==13)

num=0;

}

}

}

void delay(unsigned int sm)

{

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

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

}

5,DS18B20温度计程序代码

#include "reg52.h"

#include "intrins.h"

#define uchar unsigned char

#define uint unsigned int

sbit ds=P1^4; //18B20信号端口

sbit duan=P1^0; //数码管段码控制端

sbit wei=P1^1; //数码管位码控制端

sbit LeDen=P1^2; //led灯控制端

sbit Line=P1^3; //点阵行控制端

uchar flag ;

uint temp; //参数temp一定要声明为int 型

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码

uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,

0x87,0xff,0xef}; //带小数点数字编码

/*延时函数*/

void TempDelay (uchar us)

{

while(us--);

}

void delay(uint count) //延时子函数

{

uint i;

while(count)

{

i=100;

while(i>0)

i--;

count--;

}

}

/*串口初始化,波特率9600,方式1 */

void init_com()

{

TMOD=0x20; //设置定时器1为模式2

TH1=0xfd; //装初值设定波特率

TL1=0xfd;

TR1=1; //启动定时器

SM0=0; //串口通信模式设置

SM1=1;

PCON=0; //波特率不倍频

}

/*数码管的显示*/

void display(uint temp)

{

uchar qian, bai,shi,ge;

qian=temp/1000;

bai=temp%1000/100;

shi=temp%100/10;

ge=temp%100%10;

duan=1;

P0=table[qian]; //显示千位

_nop_();

_nop_();

_nop_();

duan=0;

P0=0xff;

wei=1;

P0=0xFe;

wei=0;

delay(3);

duan=1;

P0=table1[bai]; //显示百位

_nop_(); //从0到1,有个上升沿,解除锁存,显示相应段_nop_();

_nop_();

duan=0; //从1到0再次锁存

P0=0xff;

wei=1;

P0=0xFd;

wei=0;

delay(3); //延时约3ms

duan=1;

P0=table[shi]; //显示十位

_nop_();

_nop_();

_nop_();

duan=0;

P0=0xff;

wei=1;

P0=0xFb;

wei=0;

delay(3);

duan=1;

P0=table[ge]; //显示个位

_nop_();

_nop_();

_nop_();

duan=0;

P0=0xff;

wei=1;

P0=0xF7;

wei=0;

delay(3);

}

void ds_reset(void)

{

ds=1;

_nop_(); //1us

ds=0;

TempDelay(68); //当总线停留在低电平超过480us,总线上所以器件都将被复位,这里//延时约530us总线停留在低电平超过480μs,总线上的所有器件都

//将被复位。

_nop_();

ds=1; //产生复位脉冲后,微处理器释放总线,让总线处于空闲状态

TempDelay(10); //释放总线后,以便从机18b20通过拉低总线来指示其是否在线,

//存在检测高电平时间:15~60us,所以延时44us,

_nop_();

_nop_();

_nop_();

if(ds==0)

flag=1;

else

flag=0;

TempDelay(20); //存在检测低电平时间:60~240us,所以延时约140us

_nop_();

_nop_();

ds=1; //再次拉高总线,让总线处于空闲状态

/**/

}

/*----------------------------------------

读/写时间隙:

DS1820 的数据读写是通过时间隙处理

位和命令字来确认信息交换。

------------------------------------------*/

bit ds_read_bit(void) //读一位

{

bit dat;

ds=0; //单片机(微处理器)将总线拉低

_nop_(); //读时隙起始于微处理器将总线拉低至少1us

ds=1; //拉低总线后接着释放总线,让从机18b20能够接管总线,输出有效数据

_nop_();

_nop_(); //小延时一下,读取18b20上的数据,因为从ds18b20上输出的数据

//在读"时间隙"下降沿出现15us内有效

dat=ds; //主机读从机18b20输出的数据,这些数据在读时隙的下降沿出现//15us 内有效

TempDelay(20); //所有读"时间隙"必须60~120us,这里77us

return(dat); //返回有效数据

}

uchar ds_read_byte(void ) //读一字节

{

uchar value,i,j;

value=0; //一定别忘了给初值

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

{

j=ds_read_bit();

value=(j<<7)|(value>>1); //这一步的说明在一个word文档里面

}

return(value); //返回一个字节的数据

}

void ds_write_byte(uchar dat) //写一个字节

{

uchar i;

bit onebit; //一定不要忘了,onebit是一位

for(i=1;i<=8;i++)

{

onebit=dat&0x01;

dat=dat>>1;

if(onebit) //写1

{

ds=0;

_nop_();

_nop_(); //看时序图,至少延时1us,才产生写"时间隙"

ds=1; //写时间隙开始后的15μs内允许数据线拉到高电平

TempDelay(20); //所有写时间隙必须最少持续60us

}

else //写0

{

ds=0;

TempDelay(20); //主机要生成一个写0 时间隙,必须把数据线拉到低电平并保持至少60μs,这里64us

ds=1;

_nop_();

_nop_();

}

}

}

void tem_change() //温度转换

{

ds_reset();

delay(3); //约2ms

ds_write_byte(0xcc); //写跳过读ROM指令

ds_write_byte(0x44); //写温度转换指令

}

/*----------------------------------------

获得温度:

------------------------------------------*/

uint get_temperature() //读取寄存器中存储的温度数据

{

float wendu;

uchar a,b;

ds_reset();

delay(3); //约2ms

ds_write_byte(0xcc);

ds_write_byte(0xbe);

a=ds_read_byte(); //读低八位

b=ds_read_byte(); //读高八位

temp=b;

temp<<=8; //两个字节组合为一个字节

temp=temp|a;

wendu=temp*0.0625; //一次读取十六位,之后将低11位转换为十进制后乘以0.0625便使所测实际温度

temp=wendu*100+0.5; // 乘以100表示读取小数点后面2位,+0.5表示四舍五入return temp; //temp是整型

}

/*******************主函数***********************/

void main()

{

uint a;

/*********关闭LED灯跟点阵*****/

P0=0XFF;

LeDen=0;

P0=0X00;

Line=0;

/********************/

init_com();

while(1)

{

tem_change(); //12位转换时间最大为750ms

for(a=20;a>0;a--)

{

display( get_temperature()); //获取温度并显示

}

}

}

相关文档
最新文档