|
这个程序实现的是 流水灯先流水两次,数码管全亮全灭一次,显示hello,然后显示时钟(我设置初值为23-58-40)开始走,当时间为零点零分,闹钟灯会亮,打开串口发送助手,会发送实时时,串口zip是protues图,发送zip是keil文件
单片机源程序如下:
- #include <reg51.h>
- #include<intrins.h>
- //声明全局函数//
- void UsartConfiguration();
- unsigned char p;
- #define uint unsigned int
- #define uchar unsigned char
- uchar code duan[]={0x76,0x79,0x38,0x38,0x3f}; //显示hello段选
- uchar wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- unsigned char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字0-9
- int num,second,minute,hour,a;
- int i,j,k,m,n,s,t;
- unsigned char PuZh[16];/数组比较大,一个汉字占两个字节
- unsigned char src[16] = {0,1,2,3,4,5,6,7,8,9};
- sbit stop=P3^5;
- sbit clear=P3^6;
- sbit start=P3^7;
- sbit hourjia=P2^0;
- sbit hourjian=P2^1;
- sbit minutejia=P2^2;
- sbit minutejian=P2^3;
- sbit clock=P2^4; //设置闹钟
- sbit ledground=P2^5;
- void mDelay(unsigned int mDelay) //延迟函数
- { unsigned int i;
- for(;mDelay>0;mDelay--)
- { for(i=0;i<124;i++)
- {;}
- }
- }
- void liushuideng() //流水灯
- {
- int k=2; //流水灯流水两次
- while(k--)
- { int i;
- ledground=0; //设置低电平
- P0=0x01;//第一个灯亮
- mDelay(500);
- for(i=0;i<7;i++)
- {
- P0=P0<<1;
- mDelay(100);
- }
- ledground=1;//设置高电平,关掉流水灯
- }
- }
- void shumaguan_init() //数码管初始化
- {
- P0=0xff;//段选码 全亮
- P1=0x00;//位选码
- mDelay(900);
- P0=~0xff;// 取反,全灭
- P1=0x00;
- mDelay(900);
- }
- void shumaguan() //数码管初始化
- {
- uchar n;
- int z=50;
- while(z--)
- {
- for(n=0;n<5;n++)
- {
- P1=wei[n];
- P0=duan[n];
- mDelay(1);
- }
- }
- }
- void UsartConfiguration()
- {
- SCON=0X50; //设置为工作方式1
- TMOD=0X21; //设置计数器1为方式2 ,定时器0为方式1
- PCON=0X80; //波特率加倍 SMOD=1
- TH1=0XF3; //定时器初始值设置 TH1=256-2^SMOD*f0sc/(波特率*32*12)
- TL1=0XF3;
- TR1=1; //打开定时器
- }
- void Interrupt_0() interrupt 1
- { TH0=-50000/256;
- TL0=-50000%256;
- num++;
-
- if(num%5==0)
- { if(minutejia==0)
- {minute++;mDelay(2);if(minute>59) minute=0;}
- if(minutejian==0)
- { minute--;mDelay(2);if(minute<0) minute=59;}
- if(hourjia==0)
- {hour++;mDelay(2);if(hour>23) hour=0;}
- if(hourjian==0)
- {hour--;mDelay(2);if(hour<0) hour=23;}
- }
- if(num==20)
- { num=0;
- second=second+1;
- if(second>59)
- {second=0;minute=minute+1;}
- if(minute>59)
- {minute=0;hour=hour+1;}
- if(hour>23)
- hour=0;
- }
-
-
- }
- void main()
- {
- clock=0;
- liushuideng();
- shumaguan_init();
- shumaguan();
- a=-50000; //a=(-t*f)/12 设置=50ms a=[(-50*10^-3)*12*10^6]/12=-50000
- TH0=-50000/256; //高八位
- TL0=-50000%256; //低八位
- EA=1; //总开关
- ET0=1; //打开定时器0中断
- TR0=1; //打开定时器0
- hour=23; //设置时钟初值
- minute=58;
- second=40;
- UsartConfiguration();
- while(1)
- {
-
-
- for(p=0; p<16; p++)
- {
- SBUF = PuZh[p]; //将要发送的数据放入到发送寄存器
- while(!TI); //等待发送数据完成 查询法
- TI=0; //清除发送标志位
- }
- mDelay(3); //延时一下再发
- if(stop==0) { TR0=0;} //暂停
- if(clear==0) //清零
- {
-
- hour=0;
- second=0;
- minute=0;
- TR0=0;
- }
- if(start==0) //启动
- {TR0=1;}
-
- j=second%10;
- k=second/10;
- m=minute%10;
- n=minute/10;
- s=hour%10;
- t=hour/10;
- PuZh[0] = src[hour/10]+0x30;
- PuZh[1] = src[hour% 10]+0x30;
- PuZh[2] = 0x2D;
- PuZh[3] = src[minute/ 10]+0x30;
- PuZh[4] = src[minute% 10]+0x30;
-
- if(hour==0&&minute==0) //定闹钟,当时间为零点零分,闹钟灯亮起
- clock=1;
- else
- clock=0;
-
- P1=0x7f; //0111 1111
- P0=tab[j];
- mDelay(1);
- P1=0xbf; //1011 1111
- P0=tab[k];
- mDelay(1);
-
- P1=0xdb; //1101 1111
- P0=0x40;
- mDelay(1);
-
-
- P1=0xef; //1110 1111
- P0=tab[m];
- mDelay(1);
- P1=0xf7; //1111 0111
- P0=tab[n];
- mDelay(1);
-
-
-
- P1=0xfd; //1111 1101
- P0=tab[s];
- mDelay(1);
- P1=0xfe; //1111 1110
- P0=tab[t];
- mDelay(1);
- }
- }
复制代码 |
-
-
串口.zip
22.76 KB, 下载次数: 17, 下载积分: 黑币 -5
-
-
发送.zip
48.46 KB, 下载次数: 16, 下载积分: 黑币 -5
评分
-
查看全部评分
|