您的位置:首页 > 编程语言 > C语言/C++

51单片机C语言程序(三)数…

2014-04-26 23:34 85 查看
原文地址:51单片机C语言程序(三)数码管作者:飞扬程序一

利用动态扫描方法在六位数码管上显示出稳定的654321.

时钟频率为11.0592M

#include<reg52.h>
//52单片机头文件

#include <intrins.h>
//包含有左右循环移位子函数的库

#define uint unsigned
int
//宏定义

#define uchar unsigned char //宏定义

sbit
dula=P2^6;
//数码管段选锁存端

sbit
wela=P2^7;
////数码管位选锁存端

uchar code table[]={
//数码管显示编码

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

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

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

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

void display(uchar,uchar,uchar,uchar,uchar,uchar); //函数声明

void delay(uint);

void main()

{

while(1)

{

display(6,5,4,3,2,1);
//始终显示

}

}

void display(uchar
one,uchar two,uchar three,uchar four,uchar five,uchar six)

{


dula=1;

P0=table[one];
//送段数据

dula=0;

P0=0xff; //送位数据前关闭所有显示,防止打开位选锁存后段选数据通过位选锁存器

wela=1;

P0=0xfe;

wela=0;

delay(1);

dula=1;

P0=table[two];

dula=0;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delay(1);

dula=1;

P0=table[three];

dula=0;

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

delay(1);

dula=1;

P0=table[four];

dula=0;

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

delay(1);

dula=1;

P0=table[five];

dula=0;

P0=0xff;

wela=1;

P0=0xef;

wela=0;

delay(1);

dula=1;

P0=table[six];

dula=0;

P0=0xff;

wela=1;

P0=0xdf;

wela=0;

delay(1);

}

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

{

uint x,y;

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

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

}

程序二

用动态扫描方法和定时器1在数码管的前三位显示出秒表,

精确到1%秒,即最后一位显示1%秒,一直循环下去

#include<reg52.h>
//52单片机头文件

#include <intrins.h>
//包含有左右循环移位子函数的库

#define uint unsigned
int
//宏定义

#define uchar unsigned char //宏定义

sbit
dula=P2^6;
//数码管段选锁存端

sbit
wela=P2^7;
////数码管位选锁存端

uchar ge,shi,bai;

uint tt;

uchar code table[]={

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

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

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

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

void display(uchar,uchar,uchar); //函数声明

void delay(uint);

void main()

{

TMOD=0x10;//设置定时器1为工作方式1

TH1=(65536-10000)/256;

TL1=(65536-10000)%256;

EA=1;//开总中断

ET1=1;//开定时器1中断

TR1=1;//启动定时器1

while(1)

{

display(bai,shi,ge);

}

}

void exter0()
interrupt 3 // 定时器1中断

{

TH1=(65536-10000)/256;

TL1=(65536-10000)%256;

tt++;

if(tt==1000)

tt=0;

bai=tt/100;

shi=tt%100/10;

ge=tt%10;

}

void display(uchar
one,uchar two,uchar three)

{


dula=1;

P0=table[one];
//送段数据

dula=0;

P0=0xff; //送位数据前关闭所有显示,防止打开位选锁存后段选数据通过位选锁存器

wela=1;

P0=0xfe;

wela=0;

delay(1);

dula=1;

P0=table[two];

dula=0;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delay(1);

dula=1;

P0=table[three];

dula=0;

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

delay(1);

}

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

{

uint x,y;

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

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

}





程序三

利用动态扫描和定时器1在数码管上显示

出从765432开始以1/10秒的速度往下递减

直至765398并保持显示此数,与此同时利

用定时器0以500MS速度进行流水灯从上至

下移动,当数码管上数减到停止时,实验

板上流水灯也停止然后全部开始闪烁,3秒

后(用T0定时)流水灯全部关闭、数码管上

显示出"HELLO"。到此保持住。

#include<reg52.h>
//52单片机头文件

#include <intrins.h>
//包含有左右循环移位子函数的库

#define uint unsigned
int
//宏定义

#define uchar unsigned char //宏定义

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={
//显示数据编码

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

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

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

0x39,0x5e,0x79,0x71,

0x76,0x79,0x38,0x3f,0};

uchar temp,t0,t1,bai,shi,ge,flag,flag1;

uint shu;

void
init();
//函数声明

void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar
ge);

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

{

uint x,y;

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

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

}

void
main()
//主函数

{

init();

while(1)

{

if(flag1!=1)
//如果flagi不再等于1则显示数据

display(7,6,5,bai,shi,ge);

else

display(16,17,18,18,19,20);
//否则显示hello

}

}

void
init()
//初始化函数

{

shu=432;

temp=0xfe;

P1=temp;

TMOD=0x11;

TH0=(65536-50000)/256;
//定时器初始化

TL0=(65536-50000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1;

ET0=1;

ET1=1;

TR0=1;

TR1=1;

}

void timer0()
interrupt 1 //定时器0中断

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

t0++;

if(flag!=1)
//flag不等于1时进行流水灯

{

if(t0==10)

{

t0=1;

temp=_crol_(temp,1);

P1=temp;

}

}

else
//否则进行灯闪烁

{

if(t0%4==0)
//小灯每200毫秒变化一次

P1=~P1;

if(t0==60)

{

TR0=0;
//3秒后关闭定时器0,关闭灯,并置flag=1

P1=0xff;

flag1=1;

}

}

}

void timer1()
interrupt 3 //定时器1中断函数

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

t1++;

if(t1==2)

{

t1=0;

shu--;

bai=shu/100;

shi=shu%100/10;

ge=shu%10;

if(shu==398)
//当到398时把原来T0中的数清除,重新加裁初值让小灯闪烁

{

TR0=0;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

flag=1;

t0=0;

P1=0xff;

TR1=0;

}

}

}

void display(uchar
aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge) //显示子函数

{


dula=1;

P0=table[aa];

dula=0;

P0=0xff;

wela=1;

P0=0xfe;

wela=0;

delay(1);


dula=1;

P0=table[bb];

dula=0;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delay(1);


dula=1;

P0=table[cc];

dula=0;

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

delay(1);


dula=1;

P0=table[bai];

dula=0;

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

delay(1);

dula=1;

P0=table[shi];

dula=0;

P0=0xff;

wela=1;

P0=0xef;

wela=0;

delay(1);

dula=1;

P0=table[ge];

dula=0;

P0=0xff;

wela=1;

P0=0xdf;

wela=0;

delay(1);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: