|
51hei圖片20200610100625.png (77.78 KB, 下載次數: 43)
下載附件
2020-6-10 10:06 上傳
這個程序實現的是 流水燈先流水兩次,數碼管全亮全滅一次,顯示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
2020-6-10 10:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
22.76 KB, 下載次數: 17, 下載積分: 黑幣 -5
-
-
發送.zip
2020-6-10 10:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
48.46 KB, 下載次數: 16, 下載積分: 黑幣 -5
評分
-
查看全部評分
|