谁有proteus LED点阵时钟仿真,最好proteus图形,单片机是c51的哦,程序是c语言的哦?急急急!!!

谁有proteus LED点阵时钟仿真,最好proteus图形,单片机是c51的哦,程序是c语言的哦?急急急!!!,第1张

#include<reg51.h>

unsigned char seven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90}

unsigned char flash,mode=0

char min=50,hour=12,hour_rom,min_rom,sec=25

unsigned char j,k

unsigned int i

unsigned char key_set_s,key_up_s,key_down_s,key_reset_s

sbit P0_7=P0^7

sbit key_set=P3^4

sbit key_up=P3^5

sbit key_down=P3^6

sbit key_reset=P3^7

sbit buzzer=P1^0

bit dop,bb    //声明

void delay(unsigned int x)     //延时

{

while(x--)

}

void timer0_isr(void) interrupt 1    //中断服务函数

{

TH0=0xf8     //为65535-2000=63535转化为16进制取高八位

TL0=0x2f    //取低八位

i++

bb=!bb

if(i>=250)     //半秒,五百一秒

{

i=0

k++

flash=~flash

dop=!dop

}

if(k>=2)     //大于二归零

{

k=0

sec++

}

if(sec>=60)      //秒

{

sec=0

min++

}

if(min>=60)     //分

{

min=0

hour++

}

if(hour>=24)   //小时

hour=0

P0=0xff  //P0初始化为全1 11111111

if(mode==0)   //正常显示

{

switch(j)   //控制语句

{

case 0:P0=seven_seg[sec%10]P2=0xfebreak  //秒个位

case 1:P0=seven_seg[sec/10]P2=0xfdbreak  //秒十位

case 2:P0=seven_seg[min%10]P0_7=dopP2=0xfbbreak

case 3:P0=seven_seg[min/10]P2=0xf7break

case 4:P0=seven_seg[hour%10]P0_7=dopP2=0xefbreak //dop为小数点

case 5:P0=seven_seg[hour/10]P2=0xdfbreak

}

}

////////////////////

if(mode==1)     //模式一 C1状态

{

switch(j)

{

case 0:P0=seven_seg[min%10]P2=0xfebreak

case 1:P0=seven_seg[min/10]P2=0xfdbreak

case 2:P0=seven_seg[hour%10]| flashP2=0xfbbreak    //flash为闪烁

case 3:P0=seven_seg[hour/10]| flashP2=0xf7break

case 4:P0=seven_seg[1]P2=0xefbreak    //1为C1状态

case 5:P0=0xc6P2=0xdfbreak     //0xc6为显示C

}

}

////////////////////

if(mode==2)      //模式二   C1状态

{

switch(j)

{

case 0:P0=seven_seg[min%10]| flashP2=0xfebreak

case 1:P0=seven_seg[min/10]| flashP2=0xfdbreak

case 2:P0=seven_seg[hour%10]P2=0xfbbreak

case 3:P0=seven_seg[hour/10]P2=0xf7break

case 4:P0=seven_seg[1]P2=0xefbreak

case 5:P0=0xc6P2=0xdfbreak

}

}

////////////////////

if(mode==3)    //模式三  C2状态

{

switch(j)

{

case 0:P0=seven_seg[min_rom%10]P2=0xfebreak

case 1:P0=seven_seg[min_rom/10]P2=0xfdbreak

case 2:P0=seven_seg[hour_rom%10]| flashP2=0xfbbreak

case 3:P0=seven_seg[hour_rom/10]| flashP2=0xf7break

case 4:P0=seven_seg[2]P2=0xefbreak

case 5:P0=0xc6P2=0xdfbreak

}

}

////////////////////

if(mode==4)      //模式四  C2状态

{

switch(j)

{

case 0:P0=seven_seg[min_rom%10]| flashP2=0xfebreak

case 1:P0=seven_seg[min_rom/10]| flashP2=0xfdbreak

case 2:P0=seven_seg[hour_rom%10]P2=0xfbbreak

case 3:P0=seven_seg[hour_rom/10]P2=0xf7break

case 4:P0=seven_seg[2]P2=0xefbreak

case 5:P0=0xc6P2=0xdfbreak

}

}

j++

if(j>=6)

j=0

}

void key(void)     //调用开关函数

{

////////////////

if(key_set==0)   //设置

{

delay(300)

if(key_set==0)

key_set_s=1

}

if(key_set==1&&key_set_s==1)

{

mode++

if(mode>=5)

mode=1

key_set_s=0

}

//////  ///

if(key_up==0)    //上调

{

delay(300)

if(key_up==0)

key_up_s=1

}

if(key_up==1&&key_up_s==1)

{

if(mode==1)hour++

if(mode==2)min++

if(mode==3)hour_rom++if(hour_rom>=24)hour_rom=0

if(mode==4)min_rom++if(min_rom>=60)min_rom=0

key_up_s=0

}

/////////////////

if(key_down==0)     //下调

{

delay(300)

if(key_down==0)

key_down_s=1

}

if(key_down==1&&key_down_s==1)

{

if(mode==1)hour--if(hour<0)hour=23

if(mode==2)min-- if(min<0)min=59

if(mode==3)hour_rom--if(hour_rom<0)hour_rom=23

if(mode==4)min_rom--if(min_rom<0)min_rom=59

key_down_s=0

}

/////////////////

if(key_reset==0)     //复位

{

delay(300)

if(key_reset==0)

key_reset_s=1

}

if(key_reset==1&&key_reset_s==1)

{

key_reset_s=0

mode=0

}

}

void timer0_init(void)   //timero初始化函数

{

TMOD=0x01    //方式1

TH0=0xf8

TL0=0x2f

EA=1 //中断开关

ET0=1  //中断小开关

TR0=1  //开始计数

}

void main(void)      //主函数

{

timer0_init()

while(1)

key()

{

if(hour==hour_rom&&min==min_rom)

buzzer=bb    //buzzer为蜂鸣器

}

}

这个程序可以循环显示0~9.#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code Table_of_Digits[]={0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //00x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, //10x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //20x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //30x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, //40x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, //50x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //60x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00, //70x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //80x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00, //90xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff}uchar code xdat[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}uchar code ydat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}uchar i=0,j=0,t=0,Num_Index,key,xi,yisbit we1=P1^1sbit we2=P1^3//主程序void main(){//P1=0x80Num_Index=0//从0 开始显示TMOD=0x01//T0 方式0TH0=(65536-2000)/256//2ms 定时TL0=(65536-2000)%256IE=0x82key=0xi=0yi=0EX0=1IT0=1TR0=1//启动T0while(1)}//T0 中断函数void ext_int0() interrupt 0{key++ key&=0x03}void LED_Screen_Display() interrupt 1{TH0=(65536-2000)/256//2ms 定时TL0=(65536-2000)%256switch(key){case 0: P0=0xffwe1=1P0=~Table_of_Digits[Num_Index*8+i]we1=0P0=0xff//输出位码和段码 we2=1P0=xdat[i]we2=0if(++i==8) i=0//每屏一个数字由8 个字节构成 if(++t==250) //每个数字刷新显示一段时间 { t=0if(++Num_Index==10) Num_Index=0//显示下一个数字 } breakcase 1: we1=1P0=~xdat[xi]we1=0we2=1P0=ydat[yi]we2=0if(++t==250) //每个数字刷新显示一段时间 { t=0yi++if(yi>7){yi=0xi++} if(xi>7)xi=0} breakcase 2: we1=1P0=0x00we1=0P0=0xff//输出位码和段码 we2=1P0=xdat[i]we2=0if(++t==250) //每个数字刷新显示一段时间 { if(++i==8) i=0//每屏一个数字由8 个字节构成 t=0} breakdefault:key=0 i=0 j=0 t=0 xi=0 yi=0 Num_Index=0 we1=1 P0=0xff we1=0 we2=1 P1=0x80 we2=0break}}

程序和具体电路结合起来才能看出问题,有一个办法可以不用具体研究代码和电路:把你调试用的汉字点阵全部改为0XFF,看是否该汉字所在位置是否全部显示,然后把第一个字节改为0X00或0XEF,看对应显示是否正确,也可以再改其他字节的点阵。用这种方法可以找出问题所在!

第7-15行是汉字的下半部分,据此查看一下程序和电路。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8129996.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存