文档库 最新最全的文档下载
当前位置:文档库 › ds12c887数码管显示

ds12c887数码管显示

ds12c887数码管显示
ds12c887数码管显示

单片机数码管动态扫描程序DS12C887红外遥控ds18b20

/DS12C887+8位数码管定时器中断动态扫描遥控时钟单片机程序模块

[功能] 0: 8位数码管定时器中断动态扫描显示

1:通过单片机解码红外遥控编码并按上图方式显示出来

2:可通过遥控器调整时间,日期以及闹钟

3:时钟芯片采用DS12C887+,内部集成电池与晶体,不怕掉电丢时间信息

4:在调整时间过程中会有动态效果(正在调试中!!!以经搞好了)

5:在下一版本中会增计算器功能,也是用遥控器操作值得大家期待!

6: ds18b20温度显示(正在弄这个ds18b20)

7:数码管扫描数据在P0口通过锁存器(74HC573)输出,ds12c887的双向数据则直接接P0口

//以下是C源文件============================================================================== #include //80C51头文件

#define uint unsigned int//16bit无符整型0~465536

#define ulint unsigned long int//32bit无符长整0~4294967295

#define uchar unsigned char//8bit宏定义无符字符型0-256

#define c(x) (x*120000/120000)// (x*216000/120000) //定义时钟频率便于红外遥控解码

//单片机硬件设置

sbit duan = P2^0;//数码管段选定义

sbit wei = P2^1;//数码管位选定义

sbit Ir_Pin=P3^3;//红外接收端口

sbit beep = P2^7;//蜂鸣器

//时钟芯片ds12c887控制引脚与单片机连接

sbit dscs = P2^6;//时钟片选

sbit dsas = P2^5;//地址选取通

sbit dsrw = P2^4;//读写输入

sbit dsds = P2^3;//数据选通或输入

sbit dsirq= P2^2;//中断请求输出

sbit DQ =P2^2;//定义温度传感器(18b20)通信端口

//字符码表

uchar code Led_Tab[]={//共阳数码管字符码

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0---f,ff全灭,

0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xfe,0xbf,0xf7,0xc6,0x9c};//上,中,下3短横线

uchar code Led_Sel[]={//位码

0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

//定义各个变量

uchar shan_xia=0,zuo_you=8,Ir_Buf[4],ds_temp=0,i;//上下变量,左右变量,遥控数字,红外结果

bit ok=0,power=0,mute,ds=0,i_k=0;//ds为0时才准读时钟芯片,减少频繁读时钟, i_k为5秒延时开关

uint ms;//屏闪时基变量,温度传感变量

//以下是动态扫描变量

uchar Led_Buf[8],Led_Buf_temp[8],Led_Index;//显示缓冲区,调时闪动缓冲区,位码索引

//声明子函数

void init();//初始化

void write_ds(uchar add,uchar date);//时钟芯片写函数

uchar read_ds(uchar add);//时钟芯片读函数

void delay(uint z);//延时

void hyyk();//红外遥控

uint Ir_Get_Low();//低电平时间采集

uint Ir_Get_High();//高电平时间采集

//遥控调时,数值放入显示缓冲区同步显示,预写时钟

//经数据采集函数(time_set())根据各项格式显示特征识别后

//按mute键写时钟芯片相应地址达到调整时钟信息的目的

void ykm_set();

void time_set();//时间调整数据采集分析写调时缓冲区函数

void ykm_out();//遥控码显示

void led_out(uchar add_1,uchar add_2,uchar add_3,uchar add_4);//送出地址,读出信息,更新显示缓冲区

void led_flash(uchar k,uchar z);//调时闪烁K为闪动开关Z为闪动内容

//温度显示子函数声明

void delay_18b20(uint i);//延时

Init_DS18B20(void);//初始化函数

WriteOneChar(uchar dat);//写一个字节

ReadOneChar(void);//读一个字节

ReadTemperature(void);//读取温度

void out_18b20();//显示

//主程序=============================================================================== ===

void main()//程序入口

{

init();//初始化

while(1)//循环等待中断

{

hyyk();//遥控

if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x14))//POWER键值翻转并响铃

{

ok=0;zuo_you=8;shan_xia=0;//有遥控power时复位ok与上下,左右值,取消闪屏显示时间

power=(!power);

if(power==0)

{

delay(10);

beep=0;

delay(20);

beep=1;

}

Ir_Buf[2]=0xff;

}

if (power==1){uchar i;mute=1; for(i=0;i<8;i++) Led_Buf_temp[i]=16;}//在power标志为1时关屏关铃

if(power==0)//power标志为0时根据shan_xia键值显示内容

{

ykm_set();//遥控调时,调整好后按mute键写时钟

led_flash(ok,shan_xia);

if(ok==0){ds=0;i_k=0;ds_temp=0;}

if(ds==0)

{

if(shan_xia==0)led_out(4,2,0,19);//时间

else if(shan_xia==1)led_out(9,8,7,17);//日期

else if(shan_xia==2)led_out(5,3,1,18);//闹钟

else if(shan_xia==3)led_out(6,6,6,18);//星期

else if(shan_xia==4)out_18b20();//温度

else ykm_out();//遥控码

}

ds=1;//关时钟芯片读与显存刷新,在中断扫描时会打开

//只有在需要显示具体内容时才会访问时钟芯片对应的具体地址并更新显示缓冲区

//ok键值翻转

if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x15))

{

if((ok==1)&&(zuo_you<8)){zuo_you=8;i_k=1;i=1;}//如果是位闪状态按ok键就进入全闪状态

else {ok=(!ok);zuo_you=8;}//否则闪<==>不闪状态翻转一次

//if(ok==0){i_k=0;ds_temp=0;}//不闪时可以刷新数据

Ir_Buf[2]=0xff;

}

//MUTE键值翻转并响铃

if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x0c))

{

if(((ok==1)&&(zuo_you>7))&&(ds_temp>0))time_set();//如果从位闪变为全闪并且8秒写时钟窗口打开则写时钟

else mute=(!mute);//否则此键为静音转换功能

if(mute==0)

{

delay(10);

beep=0;

delay(20);

beep=1;

}

Ir_Buf[2]=0xff;

}

//按遥控器左键加一

if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x11))

{

if(ok==0)mute=1;//如果没有闪屏按此键关闭声音

if(ok==1)

{

if(++zuo_you>7) zuo_you=0;//左移,超出苑围转到最右边

while(Led_Buf[zuo_you]>9){if((++zuo_you)>7) zuo_you=0;}//正在如果要闪动的位不是十则一直数还

Ir_Buf[2]=0xff;

}

}

//按遥控器右键减一

if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x10))

{

if(ok==0)mute=0;//如果没有闪屏按此键打开声音

if(ok==1)

{

if((--zuo_you)==255) zuo_you=7;//右移,超出苑围转到最左边

while(Led_Buf[zuo_you]>9){if((--zuo_you)==255) zuo_you=7;}//正在闪动的位不是十进制数则一直移动开遥控

Ir_Buf[2]=0xff;

}

}

//按遥控器上键加一

if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x12))

{

if((ok==1)&&(zuo_you<8))

{

Led_Buf[zuo_you]++;//位闪状态有上键按下对应位加一

if(Led_Buf[zuo_you]>9)Led_Buf[zuo_you]=0;//超出为0

}

else

{

zuo_you=8;//改变显示内容时位闪变全屏闪

if(++shan_xia>5) shan_xia=0;//超出为0

}

Ir_Buf[2]=0xff;

}

//按遥控器下键减一

if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x13))

{

if((ok==1)&&(zuo_you<8))

{

Led_Buf[zuo_you]--;//位闪状态有上键按下对应位减一

if(Led_Buf[zuo_you]==255)Led_Buf[zuo_you]=9;//超出则为9

}

else

{

zuo_you=8;//改变显示内容时位闪变全屏闪

if((--shan_xia)==255) shan_xia=5;//自减,超出则为4

}

Ir_Buf[2]=0xff;

}

}

}

}

//数码管扫描=============================================================== timer0() interrupt 1 using 1//定时中断发生,运行中断函数

{

ms++;//屏闪时基

if(ms>=500) ms=0;

if(i_k==1) //不闪屏时允许刷新读写信息

{

if(ms==0){if((++i)>8)i=0;}//延时8秒给mute键的写时钟芯片时间窗口,

ds_temp=i;

}

if(ds_temp==0)i_k=0;

if(((ok==1)&&(zuo_you<8))||(ds_temp>0))ds=1;//在全屏闪5秒内和位闪调时时不允许刷新显存

else ds=0;//ds为何0时才允许刷新显存

TL0=0x25;//12M 2ms(测试这个晶振误差后的初值)

TH0=0xf8;

//以下9行消隐

dscs=1;//关掉时钟片选让数据接收口(74hc573数码管的位码和段码锁存器)得到纯净的数据信号

duan=0; // 关闭段选

wei=0; // 关闭位选

P0=0x00; // 消陷码

wei=1; // 打开位选

wei=0; // 关闭位选,锁存消隐码

P0=0xff; // 消隐码

duan=1; // 打开段选

duan=0; // 关闭段选,锁存消隐码

//数字显示在锁存器的锁存端出现下降沿时锁存数据

P0=Led_Tab[Led_Buf_temp[Led_Index]];// 数模段码送P0口

duan=1;// 打开段选

duan=0;// 关闭段选,锁存段码

P0=Led_Sel[Led_Index];// 位码数据送P0口

wei=1;// 打开位选

wei=0;// 关闭位选,锁存位码

if(++Led_Index>7) Led_Index=0;

}

//初始化============================================================================= void init()

{

//以下9行消隐在开机瞬间消除屏闪

dscs=1;//关掉时钟片选让数据接收口(74hc573为数码管的位码和段码锁存器)得到纯静净的数据信号

duan=0;// 关闭段选

wei=0;// 关闭位选

P0=0xff;// 消隐码

duan=1;// 打开段选

duan=0;// 关闭段选,锁存消隐码

P0=0x00;// 消陷码

wei=1;// 打开位选

wei=0;// 关闭位选,锁存消隐码

//定时器设置

TMOD=0x11;

TL0=0xc5;//重装初值

TH0=0xf1;//数码管的刷新频率2ms

EA=1;//开定时总中断

ET0=1;//开定时器0中断用于遥控高低电平时间采集

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

TR0=1;//启动定时器1 用于数码管定时中断扫描

//以下是初始化时钟芯片的控制寄存器A和B

write_ds(0x0A,47); //写时钟芯片DS12C887+A寄存器,打开振荡器,启动记时输出2HZ方波

write_ds(0x0B,126); //写时钟芯片B

}

//写时钟芯片DS12C887+时序========(请参考DS12C887芯片手册)

void write_ds(uchar add,uchar date)

{dscs=0;dsas=0;dsas=1;dsrw=1;dsds=1;P0=add;dsas=0;dsrw=0;P0=date;dsrw=1;dsas=1;dscs=1;}

//读时钟芯片DS12C887+时序========(请参考DS12C887芯片手册)

uchar read_ds(uchar add)

{uchar ds_date;dscs=0;dsas=0;dsas=1;dsrw=1;dsds=1;P0=add;dsas=0;

dsds=0;P0=0xff;ds_date=P0;dsds=1;dsas=1;dscs=1;return ds_date;}

//根据具体内容格式化输出函数

void led_out(uchar add_1,uchar add_2,uchar add_3,uchar add_4)

{

uchar a,b,c,d=add_4,i;

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

{

if(i==0) a=read_ds(add_1);

if(i==1) b=read_ds(add_2);

if(i==2) c=read_ds(add_3);

if(i==3) d=read_ds(add_4);

}

if(add_1==4)d=18;//时钟间隔位

if(add_1==5)d=16;//闹钟间隔位

if(add_1==4||add_1==5)//按不同的内容用不同的格式输出(参数特征决定输出内容) {

Led_Buf[7]=a/10;//分离小时位数据

Led_Buf[6]=a%10;

Led_Buf[4]=b/10;//分离分钟位数据

Led_Buf[3]=b%10;

Led_Buf[1]=c/10;//分离秒钟位数据

Led_Buf[0]=c%10;

Led_Buf[5]=d; //间隔位

Led_Buf[2]=d;

}

else if(add_1==9)

{

Led_Buf[7]=2; //分离小时位数据

Led_Buf[6]=0;

Led_Buf[5]=a/10;

Led_Buf[4]=a%10;//分离分钟位数据

Led_Buf[3]=b/10;

Led_Buf[2]=b%10;

Led_Buf[1]=c/10;//分离秒钟位数据

Led_Buf[0]=c%10;

}

else for(i=0;i<8;i++) Led_Buf[i]=a;

}

//遥控码显示========================================================================

void ykm_out()

{

uchar y;//由于使用过的键会对用户码全置1操作,所以在此根据用户反码取反操作还原用户码

if(Ir_Buf[0]==0x02)y=(~Ir_Buf[3]);

else y=Ir_Buf[2];

Led_Buf[0]=Ir_Buf[3]&0xf;//结果装入显示缓冲区

Led_Buf[1]=(Ir_Buf[3]/16)&0xf;//数据反码

Led_Buf[2]=y&0xf;

Led_Buf[3]=(y/16)&0xf;//数据码

Led_Buf[4]=Ir_Buf[1]&0xf;

Led_Buf[5]=(Ir_Buf[1]/16)&0xf;//用户反码

Led_Buf[6]=Ir_Buf[0]&0xf;

Led_Buf[7]=(Ir_Buf[0]/16)&0xf;//用户码

}

//遥控数字键直接预调时=============================================================================== ===

void ykm_set()//从最左第一位开始直接输入一个0--9的数时显示出来后自动右移一位,当到最右边时转到最左边

{

if((ok==1)&&((Ir_Buf[0]==0x02)&&(Ir_Buf[2]<10)))

{

if(zuo_you>7){zuo_you=7;ds=1;}//ds=1;保证此函数结束后不从写Led_Buf[7]

while(Led_Buf[zuo_you]>9){if((--zuo_you)==255) zuo_you=7;}//闪动的第7位不是十进制数则一直移动

if(Ir_Buf[2]<9)Led_Buf[zuo_you]=Ir_Buf[2]+1;//因为我的遥控器按1时数据码是0x00,按2是0x01...,按0是0x09

else Led_Buf[zuo_you]=0;

if((--zuo_you)==255) {zuo_you=8;i_k=1;i=1;}//先右移,如果到最右边一位则转到最左边一位while(Led_Buf[zuo_you]>9){if((--zuo_you)==255)zuo_you=8;}//正在闪动的位不是十进制数则一直移动

Ir_Buf[2]=0xff;

}

if((ok==0)&&((Ir_Buf[0]==0x02)&&(Ir_Buf[2]<10)))

{

if(Ir_Buf[2]<6)shan_xia=Ir_Buf[2];

}

}

//调时闪动函数========================================================================

void led_flash(uchar k,uchar z)//K为闪动开关,Z为闪动内容

{

uchar x,y,a=k;

if(z==1)y=17;

else if(z==2)y=18;

else y=19;

if(a==0)for(x=0;x<8;x++)Led_Buf_temp[x]=Led_Buf[x];//正常状态不闪动

else//当K值不为0里闪动

{

if(ms>220)for(x=0;x<8;x++){Led_Buf_temp[x]=Led_Buf[x];}//MS为闪动时基

else

{

if(zuo_you<=7)Led_Buf_temp[zuo_you]=y;

else for(x=0;x<8;x++)Led_Buf_temp[x]=y;

}

}

}

//延时void delay(uint z)

{ uint x,y;for(x=z;x>0;x--)for(y=500;y>0;y--);}

//红外遥控=========================================================================

void hyyk()

{

uint temp;

uchar i,j;

temp=Ir_Get_Low();//低电平时间采集

if(tempc(9500)) goto restart;//引导脉冲低电平在9ms 附近

temp=Ir_Get_High();//高电平时间采集

if(tempc(5000)) goto restart;//引导脉冲高电平在4。5ms 附近

for(i=0;i<4;i++)//4个字节

for(j=0;j<8;j++)//每个字节8位共32bit装入Ir_Buf[4]

{

temp=Ir_Get_Low();

if(tempc(800)) goto restart;//低电平时间符合

temp=Ir_Get_High();

if(tempc(2000)) goto restart;//高电平时间符合

Ir_Buf[i]>>=1;//数据右移一位

if(temp>c(1120)) Ir_Buf[i]|=0x80;//高电平时间分析,大于1120us为1否则为0

}

if(mute==0)//静音功能,默认打开

{

beep=0;

delay(15);

beep=1;

}

restart://无效信号匀跳转至此加速循环提高程式运行效率

TR1=0;//关定时器1中断

}

//红外低电平时间采集=======================================================================

uint Ir_Get_Low()

{ //定时器清0

TL1=0;

TH1=0;//开始记数

TR1=1;//完成一次记数

while(!Ir_Pin && (TH1&0x80)==0);

TR1=0;//关定时器

return TH1*256+TL1;//反回记数值

}

//红外高电平时间采集uint Ir_Get_High()

{

TL1=0;

TH1=0;

TR1=1;

while(Ir_Pin && (TH1&0x80)==0);

TR1=0;

return TH1*256+TL1;

}

//时间调整数据采集分析写调时缓冲区函数

void time_set()

{

uchar write[3]//write[3]为预写缓冲区

ok=0;//当写时钟芯片后不闪,并可以马上刷新屏幕

if((Led_Buf[2]==16)||(Led_Buf[2]==18))//此时显示的是闹钟或时间,那么预写缓冲区的数到显示缓冲区相应的数

{

write[0]=Led_Buf[0]+Led_Buf[1]*10; //预写秒位

write[1]=Led_Buf[3]+Led_Buf[4]*10; //预写分位

write[2]=Led_Buf[6]+Led_Buf[7]*10; //预写时位

if(Led_Buf[2]==18) //是时间格式特征

{

write_ds(0x04,write[2]); //写时向时钟芯片ds12c887+写信息

write_ds(0x02,write[1]); //写分

write_ds(0x00,write[0]); //写秒

}

if(Led_Buf[2]==16) //是闹钟格式特征

{

write_ds(0x05,write[2]); //写时(闹钟) 向时钟芯片ds12c887+写信息

write_ds(0x03,write[1]); //写分(闹钟)

write_ds(0x01,write[0]); //写秒(闹钟)

}

}

if((Led_Buf[7]==2)&&(Led_Buf[6]==0)&&(Led_Buf[3]<2)&&(Led_Buf[1]<4))//是日期的格式特征

{

write[0]=Led_Buf[0]+Led_Buf[1]*10;//预写日

write[1]=Led_Buf[2]+Led_Buf[3]*10;//预写月

write[2]=Led_Buf[4]+Led_Buf[5]*10;//预写年

write_ds(0x09,write[2]); //写年向时钟芯片ds12c887+写信息

write_ds(0x08,write[1]); //写月

write_ds(0x07,write[0]); //写日

}

if((Led_Buf[1]==Led_Buf[2])&&(Led_Buf[6]==Led_Buf[7]))//是星期格式特征(先排除时间与闹钟格式再排除日期格式)

{

write[0]=Led_Buf[7];

// if(write[0]>7)write[0]=0;

write_ds(0x06,write[0]); //写星期向时钟芯片ds12c887+写信息}

}

//以下全为温度传感函数

//延时

void delay_18b20(uint i)

{while(i--);}

//初始化函数

Init_DS18B20(void)

{

uchar x=0;

DQ = 1; //DQ复位

delay_18b20(8); //稍做延时

DQ = 0; //单片机将DQ拉低

delay_18b20(80); //精确延时大于480us

DQ = 1; //拉高总线

delay_18b20(14);

x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败

delay_18b20(20);

}

//读一个字节

ReadOneChar(void)

{

uchar i=0;

uchar dat = 0;

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

{

DQ = 0; //给脉冲信号

dat>>=1;

DQ = 1; //给脉冲信号

if(DQ)

dat|=0x80;

delay_18b20(4);

}

return(dat);

}

//写一个字节

WriteOneChar(unsigned char dat)

{

unsigned char i=0;

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

{

DQ = 0;

DQ = dat&0x01;

delay_18b20(5);

DQ = 1;

dat>>=1;

}

delay_18b20(4);

}

//读取温度

ReadTemperature(void)

{

unsigned char a=0;

unsigned char b=0;

unsigned char t=0;

Init_DS18B20();

WriteOneChar(0xCC);// 跳过读序号列号的操作

WriteOneChar(0x44);// 启动温度转换

Init_DS18B20();

WriteOneChar(0xCC);//跳过读序号列号的操作

WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();//读取温度值低位

b=ReadOneChar();//读取温度值高位

a=a>>4;//低位右移4位,舍弃小数部分

t=b<<4;//高位左移4位,舍弃符号位

t=t|a;

return(t);

}

void out_18b20()//温度显示函数

{

int temp_18b20;

temp_18b20=ReadTemperature();

Led_Buf[7]=16;

Led_Buf[6]=16;

Led_Buf[5]=16;

Led_Buf[4]=16;

Led_Buf[3]=temp_18b20/10;

Led_Buf[2]=temp_18b20%10;

Led_Buf[1]=20;

Led_Buf[0]=21;

}

基于DS12C887时钟芯片的高精度时钟的设计

华侨大学厦门工学院 本科生毕业设计(论文)题目:基于DS12C887时钟芯片的高精度时钟的设计姓名:吴挺 学号:0902106019 系别:电气工程 专业:电气工程及其自动化 年级:2009 指导教师:刘晓东 年月日

独创性声明 本毕业设计(论文)是我个人在导师指导下完成的。文中引用他人研究成果的部分已在标注中说明;其他同志对本设计(论文)的启发和贡献均已在谢辞中体现;其它内容及成果为本人独立完成。特此声明。 论文作者签名:日期: 关于论文使用授权的说明 本人完全了解华侨大学厦门工学院有关保留、使用学位论文的规定,即:学院有权保留送交论文的印刷本、复印件和电子版本,允许论文被查阅和借阅;学院可以公布论文的全部或部分内容,可以采用影印、缩印、数字化或其他复制手段保存论文。保密的论文在解密后应遵守此规定。 论文作者签名:指导教师签名:日期:

基于DS12C887时钟芯片的高精度时钟的设计 摘要 随着社会的发展人们的生活节奏越来越快,每天的工作,学习,休息的时间都安排的很紧,需要一个时钟准确的报时。人们对时钟的要求越来越高,不仅要求每天的的时间误差小于几毫秒,还要求具有定时闹钟,具有万年历等功能。传统的日历电子钟元器件多、维修麻烦、误差大、功能更新不方便。DS12C887时钟芯片能够自动显示年、月、日、时、分、秒等时间信息,同时还具有校时,报时,闹钟等功能。DS12C887也可以很方便的由软件编程进行功能的调整或增加。所以设计基于DS12C877时钟芯片的高精度时钟的设计具有十分重要的现实意义和实用价值。 关键词:DS12C887,时钟芯片,单片机STC89C52,高精度时钟

实验三 数码管显示实验

实验十九数码管显示实验 一、实验目的 1、了解数码管的显示原理; 2、掌握数码管显示的编程方法。 二、实验内容 1、编写数码管显示程序,循环显示0-F字符 三、实验设备 1、硬件: JX44B0实验板; PC机; JTAG仿真器; 2、软件: PC机操作系统(WINDOWS 2000); ARM Developer Suite v1.2; Multi-ICE V2.2.5(Build1319); 四、基础知识 1、掌握在ADS集成开发环境中编写和调试程序的基本过程。 2、了解ARM 应用程序的框架结构; 3、了解数码管的显示原理; 五、实验说明 1、LED显示原理 发光二极管数码显示器简称LED显示器。LED显示器具有耗电低、成本低、配置简单灵活、安装方便、耐震动、寿命长等优点,目前广泛应用于各类电子设备之中。 7段LED由7个发光二极管按“日”字排列。所有发光二极管的阳极连接在一起称共阳极接法,阴极连接在一起称为共阴极接法。一般共阴极可以不需要外接电阻。 其中各二极管的排列如上图在共阳极接法中,如果显示数字“5”,需要在a、c、d、f、g端加上高电压,其它加低电压。这样如果按照dp、g、fe、d、c、b、a的顺序排列的话对应的码段是:6DH。其它的字符同理可以得到。

2、数码管显示驱动 数码管的显示一般有动态显示和静态显示两大类,另外按照驱动方式又分串行驱动和并行驱动两种方式。串行驱动主要是提供串-并转换,减少控制线数量;并行驱动对每一个段提供单独的驱动,电路相对简单。这方面参看数字电路相关内容。 下面主要介绍静态显示和动态显示: 1)静态显示: LED数码管采用静态接口时,共阴极或共阳极节点连接在一起地或者接高电平。每个显示位的段选线与一个8位并行口线相连,只要在显示位上的段选位保持段码电平不变,则该位就能保持相应的显示字符。这里的8位并行口可以直接采用并行I/O口,也可以采用串行驱动。相应的电路如下: 很明显采用静态显示方式要求有较多的控制端(并行)或较复杂的电路(串行)。但是在设计中对器件的要求低。

数码管显示程序注释

/***************************************************** (本程序基于本人单片机实际电路开发,只需改动个别地方,即可实现) 数码管显示其实就是利用视觉停留来显示 实际上它是一个接着一个亮,但人以为是一起亮的 当然它也可以全部一起亮(不同数字)但物理连接麻烦得多,成本高,所以一般不采用(个人理解) ***************************************************/ #include #define unint unsigned int #define unchar unsigned char /***************************************************** 位声明 ***************************************************/ sbit guan1=P2^4; //位选:第1个数码管io sbit guan2=P2^5; //位选:第2个数码管io sbit guan3=P2^6; //位选:第3个数码管io sbit guan4=P2^7; //位选:第4个数码管io unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管编码 /***************************************************** 函数功能:延时 ***************************************************/ void delay(unsigned int i) { unsigned char j; for(;i>0;i--) for(j=110;j>0;j--); } void display(unint num)//带参数显示函数 { unchar ge,shi,bai,qian,sh,fe; //存储个,十,百,千位的空间 sh=num/100; //将num数的前两位分离并存储在sh fe=num%100;//将num数的后两位分离并存储在fe guan1=0;//P2=0Xbf;//11101111 第一个数码管亮位选开 qian=sh/10; //分离千位 P0=table[qian];//段选 delay(60); //延时 guan1=1; //位选关 guan2=0;//P2=0X7f;//11011111 bai=sh%10; //分离百位 P0=table[bai]; //段选

用七段数码管显示简单字符

用七段数码管显示简单字符——译码器及其应 用 一、实验目的 1、了解显示译码器的结构和理解其工作原理。 2、学习7段数码显示译码器设计。 3、学习用基逻辑门、3-8译码器、4-1选择器控制显示器的显示。 二、实验内容 1、了解逻辑门、3-8译码器、4-1选择器的工作原理,设计基本电路,实现以下功能: C2C1C0是译码器的3个输入,用C2C1C0的不同取值来选择在七段数码管上输出不同字符。七段数码管是共阳极的。 图1 七段译码器 C2C1C0的不同取值对应显示的字母如下: 图2 字符编码

三、实验仪器及设备: 一、PC 机 二、 Quartus Ⅱ 9.0 三、 DE2-70 四、显示器 四、实验步骤 1、列出真值表,计算要实现以上功能时数码管的0-7段对应的逻辑函数式。 真值表如下: 函数表达式如下: “0”=' 02C C + “1”=“2”=0'1'012C C C C C ++ “3”=(2C +1C +'0C )(2C +0C +'1C )(2C +' 1C +'0C ) “4”=“5”=2C “6”=2C +1C +02C C 2、新建一个 quartusII 工程,用以在DE2_70平台上实现所要求的电路。 建立一个BDF 文件,基于SSI ,实现七段译码器电路,用SW3_SW1作为输入C2C1C0, DE2_70平台上的的数码管分别为HEX0~HEX7,输出接HEX1。 参照de2_70_pin_assignments.csv 中的引脚分配表配置引脚。 新建仿真文件,给出输入信号,观察输出信号是否符合要求。 编译工程,完成后下载到FPGA 中。 拨动波段开关并观察七段数码管HEX0的显示,以验证设计的功能是否正确。 基于3-8译码器和4-1选择器重复上述2.、中的步骤完成设计。

6位7段LED数码管显示

目录 1. 设计目的与要求..................................................... - 1 - 1.1 设计目的...................................................... - 1 - 1.2 设计环境...................................................... - 1 - 1.3 设计要求...................................................... - 1 - 2. 设计的方案与基本原理............................................... - 2 - 2.1 6 位 8 段数码管工作原理....................................... - 2 - 2.2 实验箱上 SPCE061A控制 6 位 8 段数码管的显示................... - 3 - 2.3 动态显示原理.................................................. - 4 - 2.4 unSP IDE2.0.0 简介............................................ - 6 - 2.5 系统硬件连接.................................................. - 7 - 3. 程序设计........................................................... - 8 - 3.1主程序......................................................... - 8 - 3.2 中断服务程序.................................................. - 9 - 4.调试............................................................... - 12 - 4.1 实验步骤..................................................... - 12 - 4.2 调试结果..................................................... - 12 - 5.总结............................................................... - 14 - 6.参考资料........................................................... - 15 - 附录设计程序汇总.................................................... - 16 -

七段数码管显示

七段数码管显示设计报告 目录 一、设计任务 二、题目分析与整体构思 三、硬件电路设计 四、程序设计 五、心得体会

一.设计任务 数码的显示方式一般有三种:第一种是字型重叠式;第二种是分段式;第三种是点阵式。目前以分段式应用最为普遍,主要器件是七段发光二极管(LED)显示器。它可分为两种,一是共阳极显示器(发光二极管的阳极都接在一个公共点上),另一是共阴极显示器(发光二极管的阳极都接在一个公共点上,使用时公共点接地)。 数码管动态扫描显示,是将所用数码管的相同段(a~g 和p)并联在一起,通过选位通 信号分时控制各个数码管的公共端,循环依次点亮各个数码管。当切换速度足够快时,由于人眼的“视觉暂留”现象,视觉效果将是数码管同时显示。 根据七段数码管的显示原理,设计一个带复位的七段数码管循环扫描程序,本程序需要着重实现两部分: 1. 显示数据的设置:程序设定4 位数码管从左至右分别显示1、2、3、4; 2. 动态扫描:实现动态扫描时序。 利用EXCD-1 开发板实现七段数码管的显示设计,使用EXCD-1 开发板的数码管为四位共阴极数码管,每一位的共阴极7 段数码管由7 个发光LED 组成,7 个发光LED 的阴极连接在一起,阳极分别连接至FPGA相应引脚。四位数码管与FPGA 之间通过8 位拨码开关(JP1)进行连接。 二.题目分析与整体构思 使用EXCD-1 开发板的数码管为四位共阴极数码管,每一位的共阴极7 段数码管由7 个发光LED 组成,呈“”字状,7 个发光LED 的阴极连接在一起,阳极分别连接至FPGA 相应引脚。SEG_SEL1、SEG_SEL2、SEG_SEL3 和SEG_SEL4 为四位7 段数码管的位选择端。当其值为“1”时,相应的7 段数码管被选通。当输入到7 段数码管SEG_A~ SEG_G 和SEG_DP 管脚的数据为高电平时,该管脚对应的段变亮,当输入到7 段数码管 SEG_A~SEG_G 和SEG_DP 管脚的数据为低电平时,该管脚对应的段变灭。该四位数码管与FPGA 之间通过8 位拨码开关(JP1)进行连接,当DIP 开关全部拨到上方时(板上标示为:7SEGLED),FPGA 的相应IO 引脚和四位7 段数码管连接,7 段数码管可以正常工作;当DIP 开关全部拨到下方时(板上标示为:EXPORT5),FPGA 的相应IO引脚与7 段数码管断开,相应的FPGA 引脚用于外部IO 扩展。 注意:无论拨码开关断开与否,FPGA 的相应IO 引脚都是与外部扩展接口连接的,所 以当正常使用数码管时,不允许在该外部扩展接口上安装任何功能模块板。 数码管选通控制信号分别对应4 个数码管的公共端,当某一位选通控制信号为高电平时,其对应的数码管被点亮,因此通过控制选通信号就可以控制数码管循环依次点亮。一个数码管稳定显示要求的切换频率要大于50Hz,那么4 个数码管则需要50×4=200Hz 以上的切换频率才能看到不闪烁并且持续稳定显示的字符。 三.硬件电路设计 设计结构图如下:

基于51单片机的DS12C887时钟芯片的程序

#include #define uchar unsigned char #define uint unsigned int uchar code table[]=" 2011-10-03 MON"; uchar code table1[]=" 00:00:00"; sbit lcden=P2^7; sbit lcdrs=P2^6; sbit lcdrw=P2^5; sbit dscs=P1^0; sbit dsas=P1^1; sbit dsrw=P1^2; sbit dsds=P1^3; sbit dsirq=P3^3; sbit s1=P3^0; sbit s2=P3^1; sbit s3=P3^2; sbit rd=P3^7; uchar num,nian,yue,ri,zhou,s1num,flag; char miao,fen,shi; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) { lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_date(uchar date) { lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0; }

void write_ds(uchar add,uchar date) { dscs=0; dsas=1; dsds=1; dsrw=1; P0=add; dsas=0; dsrw=0; P0=date; dsrw=1; dsas=1; dscs=1; } uchar read_ds(uchar add) { uchar ds_date; dsas=1; dsds=1; dsrw=1; dscs=0; P0=add; dsas=0; dsds=0; P0=0xff; ds_date=P0; dsds=1; dsas=1; dscs=1; return ds_date; } void write_sfm(uchar add,uchar date) { uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge); } void write_nyr(uchar add,uchar date) {

数码管显示程序(汇编语言)

实验三数码显示 一、实验目的 了解LED数码管动态显示的工作原理及编程方法。 二、实验内容 编制程序,使数码管显示“DJ--88”字样。 三、实验程序框图 四、实验步骤 联机模式: (1)在PC机和实验系统联机状态下,运行该实验程序,可用鼠标左键单击菜单栏“文件”或工具栏“打开图标”,弹出“打开文件”的对话框,然后打开598K8ASM

文件夹,点击S6.ASM文件,单击“确定”即可装入源文件,再单击工具栏中编译装载,即可完成源文件自动编译、装载目标代码功能,再单击“调试”中“连续运行”或工具图标运行,即开始运行程序。 (2)数码管显示“DJ--88”字样。 脱机模式: 1、在P.态下,按SCAL键,输入2DF0,按EXEC键。 2、数码管显示“DJ--88”字样。 五、实验程序清单 CODE SEGMENT ;S6.ASM display "DJ--88" ASSUME CS:CODE ORG 2DF0H START: JMP START0 PA EQU 0FF20H ;字位口 PB EQU 0FF21H ;字形口 PC EQU 0FF22H ;键入口 BUF DB ?,?,?,?,?,? data1: db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0 c6h,0a1h db 86h,8eh,0ffh,0ch,89h,0deh,0c7h,8ch,0f3h,0bfh,8FH,0F0H START0: CALL BUF1 CON1: CALL DISP JMP CON1 DISP: MOV AL,0FFH ;00H MOV DX,PA OUT DX,AL MOV CL,0DFH ;显示子程序 ,5ms MOV BX,OFFSET BUF DIS1: MOV AL,[BX] MOV AH,00H PUSH BX MOV BX,OFFSET DATA1 ADD BX,AX MOV AL,[BX] POP BX MOV DX,PB

7段数码管显示电路

4.4 显示模块 4.4.1 7段数码管的结构与工作原理 7段数码管一般由8个发光二极管组成,其中由7个细长的发光二极管组成 数字显示,另外一个圆形的发光二极管显示小数点。 当发光二极管导通时,相应的一个点或一个笔画发光。控制相应的二极管导通,就能显示出各种字符,尽管显示的字符形状有些失真,能显示的数符数量也有限,但其控制简单,使有也方便。发光二极管的阳极连在一起的称为共阳极数码管,阴极连在一起的称为共阴极数码管,如图4.9所示。 4.4.2 7段数码管驱动方法 发光二极管(LED 是一种由磷化镓(GaP )等半导体材料制成的,能直接将电能转变成光能的发光显示器件。当其内部有一一电流通过时,它就会发光。 7段数码管每段的驱动电流和其他单个LED 发光二极管一样,一般为5~10mA ;正向电压随发光材料不同表现为1.8~2.5V 不等。 7段数码管的显示方法可分为静态显示与动态显示,下面分别介绍。 (1) 静太显示 所谓静态显示,就是当显示某一字符时,相应段的发光二极管恒定地寻能可截止。这种显示方法为每一们都需要有一个8位输出口控制。对于51单片机,可以在并行口上扩展多片锁存74LS573作为静态显示器接口。 静态显示器的优点是显示稳定,在发光二极管导通电注一定的情况下显示器的亮度高,控制系统在运行过程中,仅仅在需要更新显示内容时,CPU 才执行一次显示更新子程序,这样大大节省了CPU 的时间,提高了CPU 的工作效率;缺点是位数较多时,所需I/O 口太多,硬件开销太大,因此常采用另外一种显示方式——动态显示。

(2)动态显示 所谓动态显示就是一位一位地轮流点亮各位显示器(扫描),对于显示器的每一位而言,每隔一段时间点亮一次。虽然在同一时刻只有一位显示器在工作(点亮),但利用人眼的视觉暂留效应和发光二极管熄 灭时的余辉效应,看到的却是多个字符“同时”显示。显示器亮度既与点亮时的导通电流有关,也与点亮时间和间隔时间的比例有关。调整电流和时间参烽,可实现亮度较高较稳定的显示。若显示器的位数不大于8位,则控制显示器公共极电位只需一个8位I/O 口(称为扫描口或字位口),控制各位LED 显示器所显示的字形也需要一个8位口(称为数据口或字形口)。 动态显示器的优点是节省硬件资源,成本较低,但在控制系统运行过程中,要保证显示器正常显示,CPU 必须每隔一段时间执行一次显示子程序,这占用了CPU 的大量时间,降低了CPU 工作效率,同时显示亮度较静态显示器低。 综合以上考虑,由于温度显示为精确到小数点后两位,故只需4个数码管,又考虑到CPU 工作效率与电源效率,本毕业设计采用静态显示。为共阳极显示。 4.4.3 硬件编码 动74LS47是一款BCD 码转揣为7段输出的集成电路芯片,利用它可以直接驱动共阳 极的7段数码管。它的引脚分部和真值表分别下图。

单片机DS12C887时钟设计

目录 摘要 (2) 1 系统总体设计 (2) 1.1 系统设计的主要内容和具体要求 (2) 1.1.1主要内容: (2) 1.1.2 具体技术要求: (2) 1.2 方案论证 (2) 2 系统硬件电路设计 (3) 2.1单片机控制系统包括STC89C52单片机以及它的外围电路(晶振电路和复位电路)。 (3) 2.1.1晶振电路 (4) 2.1.2 复位电路 (4) 2.2 DS12C887时钟电路 (5) 2.2.1 器件介绍 (5) 2.2.2 DS12C887与单片机的连接 (6) 2.3 1602液晶显示屏 (6) 2.4 USB供电电路 (7) 2.5 键盘电路 (8) 2.6闹铃电路 (9) 3 系统软件程序设计 (9) 3.1 主程序运行说明及流程图 (9) 3.2 DS12C887使用说明及流程图 (11) 3.3 1602操作说明及流程图 (11) 3.4 键盘控制说明及流程图 (12) 4 系统调试 (13) 5 结论 (14) 6 谢辞 (14) 7 参考文献 (15) 8 附录A:实时日历电子钟设计电路原理图 (15) 9 附录B:实时日历电子钟设计程序代码 (15)

摘要 在日新月异的21世纪里,家用电子产品得到了迅速发展。许多家电设备都趋于人性化、智能化,这些电器设备大部分都含有CPU控制器或者是单片机。单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统、通讯设备、日常消费类产品和玩具等。 本文设计的电子万年历属于小型智能家用电子产品。利用单片机进行控制,实时时钟芯片DS12C887时钟芯片进行记时及掉电存储,外加键盘电路和显示电路,可实现时间的调整和显示。电子万年历既可广泛应用于家庭,也可应用于银行、邮电、宾馆、医院、学校、企业、商店等相关行业的大厅,以及单位会议室、门卫等场所。因而,此设计具有相当重要的现实意义和实用价值。关键词:单片机;DS12C887;智能 1 系统总体设计 1.1 系统设计的主要内容和具体要求 1.1.1主要内容: 本次设计的题目是基于ds12c887的高精度时钟的设计,可以正常的显示年、月、日、星期、时、分、秒。本系统利用单片机实现具有计时校时等功能的数字时钟,是以单片机STC89C52为核心元件,同时采用1602液晶显示“时”、“分”、“秒”的现代计时装置。与传统机械表相比它具有走时精确,显示直观等特点。另外具有校时功能,编程灵活,便于扩充等优点。 本次设计可分为两部分:硬件部分,软件部分。 硬件部分包括:STC89C52、DS12C887时钟芯片、1602LCD液晶显示器。主要由STC89C52单片机、实时时钟芯片电路、液晶显示输出电路、键盘输入电路等几大部分组成。 软件部分包括:主程序模块,DS12C887模块,LCD1602模块,键盘控制模块。 1.1.2 具体技术要求: (1)在1602液晶上显示年、月、日、星期、时、分、秒,并且按秒实时更新显示。 (2)具有闹铃设定及到时报警功能,报警响起时按任意键可取消报警。 (3)能够通过按键随时调节各个参数,按键可设计4个有效键,分别为功能选择键、数值增大键、数值减小键、和闹铃查看键。 (4)每次有键按下时,蜂鸣器都以短“滴”声报警。 (5)利用DS12C887自身掉电可继续走时的特性,设计实现断电时间不停,再次上电时间仍然准确显示在液晶上的功能。 1.2 方案论证 时钟电路有各种各样的,在不同的要求和条件下有着各自的优势,本设计的题目是高精度时钟的设计,根据设计要求时钟显示正常的年、月、日、星期、时、分、秒。要想实现上述功能,所以设计要从电路设计的性价比、显示时间的精确以及稳定性为前提。本设计是要将硬件系统和软件系统有机的结合在一起,方可实现我们设计任务中的各项要求。 在以单片机为核心构成的装置中,经常需要一个实时的时钟和日历,以便对一些实时发生事件记录时给予时标,实时时钟芯片便可起到这一作用。DS12C887是一个综合性能较好且价格便宜的并行接口实时时钟芯片。利用单片机进行控制,采用DS12C887作为实时时钟芯片,并与单片机进行同步通信,外加显示电路、键盘电路、闹铃电路,即构成一个基本的电子万年历系统。若还要添加其他功能,在这基础上外扩电路即可。

单片机万年历DS12C887实现程序

#include #include "1602.h" #include"ds12cr887.h" #define uchar unsigned char #define uint unsigned int sbit lcdrs=P3^7 ; sbit lcdrw=P3^6 ; sbit lcden=P3^5 ; sbit dscs=P1^4; sbit dsas=P1^5; sbit dsrw=P1^6; sbit dsds=P1^7; sbit dsirq=P3^3; /**************键盘引脚定义******************/ sbit key_1 = P1^0; //设置格式 sbit key_2 = P1^1; //+ sbit key_3 = P1^2; //- sbit key_4 = P1^3; //定时设置 sbit buzzer= P3^1; //蜂鸣器 sbit DQ = P3^0; //定义DS18B20 /******************小点闪烁********************/ bit at=0; /******************全局变量********************/ uchar t0=0,second=0, min=0, hour=0,day=0,month=0,year=0,weekday=0,flag=0,temp=0,flag1=0; /******************初始化时间******************/ uchar code table1[]=" 2009-05-12 MON "; uchar code table2[]="00:00:00 0000"; /*******************字符表*********************/ uchar code word[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x20,0x2d}; uchar code week[][3]={"SUN","MON","TUE","WED","THU","FRI","SAT"}; /************数据缓冲与键盘计数变量************/ uchar databuffer[14],TempBuffer[4],count,t_value; uint num=0; /******************函数声明********************/ void init(); void lcd_write_com(uchar command); //1602液晶写命令 void lcd_write_data(uchar date); //1602液晶写数据 void delay(uint a); void newbuf(); //数据转换 void keyboard(); //键盘子程序 void disp(); //显示程序 void write_ds(uchar add,uchar date); uchar read_ds(uchar add);

51单片机并行口驱动LED数码管显示电路及程序

51单片机并行口驱动LED数码管显示电路及程序 介绍利用51单片机的一个并行口实现多个LED数码管显示的方法,给出了利用此方法设计的多路LED显示系统的硬件电路结构原理图和软件程序流程,同时给出了采用51汇编语言编写程序。 1 硬件电路 多位LED显示时,常将所有位的段选线并联在一起,由一个8位I/O口控制,而共阴极点或共阳极点分别由另一个8位I/O口控制;也可采用并行扩展口构成显示电路,通常,需要扩展器件管脚的较多,价格较高。本文将介绍一种利用单片机的一个并行I/O口实现多个LED显示的简单方法,图1所示是该电路的硬件原理图。其中,74LS138是3线-8线译码器,74LS164是8位并行输出门控串行输入移位寄存器,LED采用L05F型共阴极数码管。 显示时,其显示数据以串行方式从89C52的P12口输出送往移位寄存器74LS164的A、B 端,然后将变成的并行数据从输出端Q0~Q7输出,以控制开关管WT1~WT8的集电极,然后再将输出的LED段选码同时送往数码管LED1~LED8。位选码由89C52的P14~P16口输出并经译码器74LS138送往开关管Y1~Y8的基极,以对数码管LED1~LED8进行位选控制,这样,8个数码管便以100ms的时间间隔轮流显示。由于人眼的残留效应,这8个数码管看上去几乎是同时显示。

<51单片机并行口驱动LED数码管显示电路> 2 软件编程 该系统的软件编程采用MCS-51系列单片机汇编语言完成,并把显示程序作为一个子程序,从而使主程序对其进行方便的调用。图2所示是其流程图。具体的程序代码如下:

<51单片机并行口驱动LED数码管显示程序>

数码管显示程序

数码管显示程序 一、程序X1 1、程序X1的功能:最右边的数码管显示“0” 2、程序: ORG 0 LJMP STR ORG 0100H STR: MOV P3, #0FEH ;送最低位有效的位码 MOV P0, #0C0H ;送“0”的段码“0C0H” SJMP STR END 二、程序X2: 用查表方式显示某个显示缓冲器中的数字 1、查表显示的预备知识 设从右到左各显示器对应的显示缓冲器为片内RAM79H~7EH

3、 实例: 例:已知(79H )= 0 7H , 查段码表在最右边的数码管显示79H 中的 “7”; 注:共阳极的段码表: TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH 若:(A )= 0XH 则数字“X ”对应的段码在段码表中的表地址 = TAB + X ORG 0 LJMP STR ORG 0100H ① 各显示器与显示缓冲器地址对应关系 显示缓冲器: 7EH 7DH 7CH 7BH 7AH 79H 对应显示 器: ② 显示缓冲器的值与显示数字的关系: 显示缓冲器中的值 对应段码表地址 显示的数字 0XH 表首址+OXH X

STR: MOV P3, #11111110B ;送最低位有效的位码 MOV 79H , #07H ;送要显示的数据到显示缓冲器 MOV A , 79H ;显示缓冲器的数作为查表变址送A MOV DPTR , #TAB ;表首址送DPTR MOVC A , @A+ DPTR ;查表将数字转换为对应段码MOV P0, A ; 段码送段码口(P0) SJMP STR TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH END 例2:. 查段码表在最右边的数码管循环显示“0”~“F” ORG 0 LJMP STR ORG 0100H STR: MOV P3, #11111110B ;送最低位有效的位码 LP0: MOV 79H , #0H ;送要显示的数据的初值到显示缓冲器MOV R3 , #6 ; 送要显示的数据的个数 LP: MOV A , 79H ;显示缓冲器的数作为查表变址送A MOV DPTR , #TAB ;表首址送DPTR MOVC A , @A+ DPTR ;查表将数字转换为对应段码MOV P0, A ; 段码送段码口(P0)

7段数码管控制引脚

《EDA技术综合设计》 课程设计报告 报告题目:计数器7段数码管控制接口技术作者所在系部: 作者所在专业: 作者所在班级: 作者姓名: 作者学号: 指导教师姓名: 完成时间:

内容摘要 掌握VHDL语言基本知识,并熟练运用VHDL语言来编写程序,来下载实践到硬件上,培养使用设计综合电路的能力,养成提供文档资料的习惯和规范编程的思想。利用VHDL语言设计一个七段数码管控制引脚,在时钟信号的控制下,使6位数码管动态刷新显示十进制计数器及其进位,十二进制计数器,四位二进制可逆计数器,六十进制计数器的计数结果,这期间需要seltime分频器来动态的给各个计数器分配数码管,并显示数字的变化。 关键词:VHDL语言编程七段数码管控制引脚芯片

目录 一概述 (1) 二方案设计与论证 (1) 三单元电路设计与参数计算 (1) 3.1数码管译码器 (1) 3.2 十进制计数器 (2) 3.3六十进制计数器 (3) 3.4四位二进制可逆计数器 (5) 3.5时间数据扫描分时选择模块 (6) 3.6顶层文件 (8) 四总的原理图 (9) 五器件编程与下载 (9) 六性能测试与分析(要围绕设计要求中的各项指标进行) (10) 七实验设备 (10) 八心得体会 (10) 九参考文献 (10)

课程设计任务书课题 名称7段数码管控制引脚 完成 时间 2011. 12.12 指导 教师胡辉职称副教授 学生 姓名 庄仲班级B09212 总体设计要求和技术要点 通过本课程的学习使学生掌握可编程器件、EDA开发系统软件、硬件描述语言和电子线路设计与技能训练等各方面知识;提高工程实践能力;学会应用EDA技术解决一些简单的电子设计问题。 具体要求: 1.设计一个共阴7段数码管控制接口,在硬件时钟电路的基础上,采用分频器,输出一个1S的时钟信号,同时显示2、3、4所要求的计数器。 2.设计一个带使能输入、进位输出及同步清0的增1十进制计数器。 3.设计一个带使能输入及同步清0的六十进制同步加法计数器; 4.设计一个四位二进制可逆计数器; 工作内容及时间进度安排 第16周: 周一、周二:设计项目的输入、编译、仿真 周三:器件编程下载与硬件验证 周四:成果验收与总结 周五:撰写课程设计总结报告 课程设计成果 把编写好的程序下载到试验箱,使数码管能够按照编写的程序显示出正确的结果,实验成功。

DS12c887中文资料

一种新型的时钟日历芯片DS12C887 1器件特性 DS12C887 实时时钟芯片功能丰富,可以用来直接代替IBM PC 上的时钟日历芯片DS12887,同时,它的管脚也和 MC146818B、DS12887 相兼容。 由于DS12C887 能够自动产生世纪、年、月、日、时、分、秒 等时间信息,其内部又增加了世纪寄存器,从而利用硬件电路解决子 “千年”问题;DS12C887 中自带有锂电池,外部掉电时,其内部时间 信息还能够保持10 年之久;对于一天内的时间记录,有 12 小时制和24 小时制两种模式。在12 小时制模式中,用AM 和PM 区分上午和下午;时间的表示方法也有两种,一种用二进制数 表示,一种是用BCD 码表示;DS12C887 中带有128 字节 RAM,其中有11 字节RAM 用来存储时间信息,4 字节RAM 用 来存储DS12C887 的控制信息,称为控制寄存器, 113 字节通用RAM 使用户使用;此外用户还可对DS12C887 进 行编程以实现多种方波输出,并可对其内部的三路中断通过软件进行 屏蔽。 2引脚功能 DS12C887 的引脚排列如图1 所示,各管脚的功能说明如下: GND、VCC:直流电源,其中VCC 接+5V 输入,GND 接地,当VCC 输入为+5V 时,用户可以访问 DS12C887 内RAM 中的数据,并可对其进行读、写操作;当VCC 的输入小于 +4.25V 时,禁止用户对内部RAM 进行读、写操作,此时用户不能正确获取芯片内的时间信息;当VCC 的输入小于+3V 时,DS12C887 会自动将电源发换到内部自带的锂电池上,以保证内部的电路能够正常工作。 (1)MOT:模式选择脚,DS12C887 有两种工作模式,即Motorola 模式和Intel 模式,当MOT 接VCC 时,选用的工作模式是Motorola 模式,当MOT 接GND 时,选用的是Intel 模式。本文主要讨论Intel 模式。 (23)SQW:方波输出脚,当供电电压VCC 大于 4.25V 时,SQW 脚可进行方波输出,此时用户可以通过对控 制寄存器编程来得到13 种方波信号的输出。 AD0~AD7:复用地址数据总线,该总线采用时分复用技术,在总线周期的前半部分,出现在AD0~AD7 上的是地址信息,可用以选通DS12C887 内的RAM,总线周期的后半部分出现在AD0~AD7 上的数据信息。 (14)AS:地址选通输入脚,在进行读写操作时,AS 的上升沿将AD0~AD7 上出现的地址信息锁存到 DS12C887 上,而下一个下降沿清除AD0~AD7 上的地址信息,不论是否有效,DS12C887 都将执行该操作。 (17)DS/RD:数据选择或读输入脚,该引脚有两种工作模式,当MOT 接VCC 时,选用Motorola 工作模式,在这种工作模式中,每个总线周期的后一部分的DS 为高电平,被称为数据选通。在读操作中,DS 的上升沿使DS12C887 将内部数据送往总线AD0~AD7 上,以供外部读取。在写操作中,DS 的下降沿将使总线AD0~AD7 上的数据锁存在 DS12C887 中;当MOT 接GND 时,选用Intel 工作模式,在该模式中,该引脚是读允许输入脚,即Read Enable。 (15)R/W:读/写输入端,该管脚也有 2 种工作模式,当MOT 接VCC 时,R/W 工作在Motorola 模式。此 时,该引脚的作用是区分进行的是读操作还是写操作,当R/W 为高电平时为读操作,R/W 为低电平时为写操作;当MOT 接GND 时,该脚工作在Intel 模式,此时该作为写允许输入,即Write Enable。 (13)C——S——:片选输入,低电平有效。 (19)I——R——Q——:中断请求输入,低电平有效,该脚有效对DS12C887 内的时钟、日历和RAM 中的内容没有任何 影响,仅对内部的控制寄存器有影响,在典型的应用中,RESET 可以直接接VCC,这样可以保证DS12C887 在掉电 时,其内部控制寄存器不受影响。 在DS12C887 内有11 字节RAM 用来存储时间信息,4 字节用来存储控制信息,其具体垢地址及取值如表 1 所列。

数码管显示

数码管显示 第3讲数码管显示 第3讲数码管显示 一、数码管显示原理 我们最常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,其他的基本相同。所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED 的另一端高电平,它便能点亮。而共阳极就是将八个LED的阳极连在一起。其原理图如下。 其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。 数码管的8段,对应一个字节的8位,a对应最低位,dp对应最高位。所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111,即0x3f;共阳数码管的字符编码为11000000,即0xc0。可以看出两个编码的各位正好相反。如下图。

二、点亮一个数码管 下面以七段共阴数码管为例讲述如何点亮一个数码管。 l 51系列单片机的P0口没有上拉电阻(其他端口有),所以如果直接接数码管的段选线,那么不能将其点亮。我们需要为其加上220欧姆的上拉电阻,注意,上拉电阻阻值不能过大。实验原理图如下。 其中,7SEG-COM-CAT-GRN为七段共阴数码管,显示为绿色。RES为电阻。查找电阻时,需要选中下面的Resistors,如下图。

七段数码管循环显示

(封面) 天津理工大学中环信息学院 电子技术课程设计 设计题目:七段数码管循环显示控制电路设计 姓名:诸钦峰学号:11160014 系别:电子信息工程系专业班级:物联网1班 开始日期: 2013年6月24日完成日期2013 年07月01日 指导教师:彭利标成绩评定等级

天津理工大学中环信息学院 课程设计任务书 系别:电子信息工程系班级:物联网1班姓名:诸钦峰学号:11160014 本表附在课程设计说明书的目录之后。

天津理工大学中环信息学院 课程设计成绩评定表 系别:电子信息工程系班级:物联网1班姓名:诸钦峰学号:11160014 本表附在课程设计任务书之后。

目录 一、设计意义 (4) 二、主要任务 (5) 2.设计方案比较 (5) 三、电路组成框图 (8) 1.数列循环电路的设计 (8) 2.序列显示电路的设计 (8) 2.1十进制自然数序列的显示电路 (8) 2.2奇数序列显示电路 (9) 2.3偶数序列显示电路 (9) 2.4音乐序列显示电路 (10) 3.脉冲产生电路的设计 (11) 4.二分频电路的设计 (11) 四、电路原理图 (12) 五、各电路的仿真测试 (14) 1.脉冲产生电路的仿真 (15) 2.二频分电路的仿真 (16) 六、元件清单 (16) 七、总结 (16)

一、设计意义 这次的课程设计主要是用计数器来实现的,这个七段数码管循环显示控制电路设计的实质就是要产生一系列有规律的数列, 然后通过一个七段数码管显示出来。这里使用的只要就是计数器, 计数器在时序电路中应用的很广泛,它不仅可以用于对脉冲进行计数,还可用于分频,定时,产生节拍脉冲以及其他时序信号。运用计数器的不同的功能和不同的接发就可以实现不同的序列输出了。 而这次的内容还包括分电路图的整合,使这个七段数码管能够按照要求那个依次输出自然序列,奇数序列,偶数序列还有音乐序列。为了实现这个循环输出的功能,在设计的时候还用到了一个以为寄存器,可以利用它的输出端来控制四个计数器的工作情况, 可以让四个计数器依次工作,就可以达到要求的依次循环输出数列。 最后还有一个部分就是脉冲的产生基于多谐振荡器可以产生方波,就可以利用它来产生脉冲信号了。而这个多谐振荡器采用的是 555 定时器来完成的。这个设计基本上就是由以上三个部分连接在一起组成的。 1、基本方案框图 计数器输出信号,将信号给译码器和脉冲信号再由脉冲信号和译码器分别编成自然序列,奇数序列,偶数序列和音乐序列,最后由数码管显示出来。 图1 七段数码管显示的基本方框图

相关文档