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
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()); //获取温度并显示
}
}
}