|
附件內有上位機VB源碼和上位機安裝程序,圖片左上角的小界面是上位機程序,可獲取電腦的時間和日期發送到16*64LED上顯示(需要安裝虛擬串口)。
單片機16*64LED條屏仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
220817e7exuwgbu0x1kbba.png (51.67 KB, 下載次數: 106)
下載附件
2018-10-10 20:44 上傳
0.png (13.89 KB, 下載次數: 116)
下載附件
2018-10-11 00:55 上傳
單片機源程序如下:
- #include "reg51.h" //包含51單片機的端口和內部寄存器定義的頭文件
- typedef unsigned char uint8; //定義字符型
- typedef unsigned int uint16; //定義整型
- typedef unsigned long uint32; //定義長整型
- uint32 dx,dxx; //字符顯示偏移量
- uint8 brk,flag;
- uint8 BUFFER[22];
- sbit RTC_RST = P3^5;
- sbit RTC_SCLK = P3^6;
- sbit RTC_IO = P3^7;
- uint8 bdata AA; //brk延時用
- uint8 const code dat_bit_up[]={0xF7,0xFB,0xFD,0xFE,0x7F,0xBF,0xDF,0xEF}; //列高位掃描數據
- uint8 const code dat_bit_down[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //列低位掃描數據
- sbit AA7 = AA^7;
- #define READ_SECOND 0x81
- #define WRITE_SECOND 0x80
- #define READ_MINE 0x83
- #define WRITE_MINE 0x82
- #define READ_HOUR 0x85
- #define WRITE_HOUR 0x84
- #define READ_DAY 0x87
- #define WRITE_DAY 0x86
- #define READ_MONTH 0x89
- #define WRITE_MONTH 0x88
- #define READ_WEEK 0x8b
- #define WRITE_WEEK 0x8a
- #define READ_YEAR 0x8d
- #define WRITE_YEAR 0x8c
- uint8 const code NUM[][16]=
- {
- {0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,0x00},/*"0",0*/
- …………
- …………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
- {0x00,0x00,0x10,0x81,0x28,0xC2,0x21,0x44,0x21,0x24,0x22,0x00,0x3E,0xFF,0x22,0x44,0x22,0x44,0x22,0x7C,0x3E,0x44,0x22,0x7C,0x22,0x44,0x22,0xFE,0x3E,0x44,0x00,0x44},/*"期",4*/
- {0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00},/*":",0*/
- };
- /*****************************************************************************************************************************
- / 端口定義
- ******************************************************************************************************************************/
- #define LED_PORTH P0 //列高位
- #define LED_PORTL P2 //列低位
- sbit SER_CP=P3^4; //串行時鐘線
- sbit SER_SDA=P3^3; //串行數據線
- sbit SER_EN=P3^2; //74595數據有效線
- /*****************************************************************************************************************************
- / 函數名稱:Delay
- / 作用: 延時子程序主要用于LED的消隱
- ******************************************************************************************************************************/
- void Delay() //延時子程序
- {
- uint16 i,j;
- for(i=0;i<0x14;i++)
- for(j=0;j<0x05;j++);
- }
- /*****************************************************************************************************************************
- / 函數名稱:LED_Ser
- / 作用: 發送串行數據到74LS595
- / 入口參數:dat 為要發送的數據8位
- ******************************************************************************************************************************/
- void LED_Ser(uint16 dat)
- {
- uint8 i;
- for(i=0;i<16;i++) //共8BYTE
- {
- SER_SDA=dat&0x01; //把數據的最后一位放在數據線上
- dat>>=1; //向右移位共8下這樣可以發送8位數據
- SER_CP=0; //
- SER_CP=1; //產生上升沿發送數據1BYTE
- }
- }
- void LED_Ser_8(uint8 dat)
- {
- uint8 i;
- for(i=0;i<8;i++) //共8BYTE
- {
- SER_SDA=dat&0x01; //把數據的最后一位放在數據線上
- dat>>=1; //向右移位共8下這樣可以發送8位數據
- SER_CP=0; //
- SER_CP=1; //產生上升沿發送數據1BYTE
- }
- }
- /*****************************************************************************************************************************
- / 函數名稱:LED_Ser_EN
- / 作用: 用于在SER_EN口線上產生上長沿使74595發送的數據有效
- ******************************************************************************************************************************/
- void LED_Ser_EN()
- {
- SER_EN=0; //
- SER_EN=1; //產生上升沿脈沖用于使74595發的數據有效
- }
- /*****************************************************************************************************************************
- / 函數名稱:LED_Disp
- / 作用: 在LED上顯示字符或BMP
- / 入口參數:*dat 為要顯示的字符或BMP的數據的首地址指針
- ******************************************************************************************************************************/
- void LED_Disp(uint16 *dat)
- {
- uint16 tmp;
- uint8 a,j,i;
- for(j=0;j<16;)
- {
- for(i=0;i<16;i++)
- {
- for(a=0;a<4;a++) //共四個字
- {
- if(dx>15){dxx+=16;dx=0;} //dx,dxx為顯示偏移量
- tmp=((dat[i+dxx+a*16]>>dx)|(dat[i+dxx+(a+1)*16]<<(16-dx)));//移動一位最大可移動八位左
- if(dat[i+(a+1)*16+dxx]==0x55aa){dxx=0;tmp=0;flag=1;}
- LED_Ser(~tmp); //發送右
- }
- LED_Ser_EN(); //使發送的數據顯示
- if(j<8){LED_PORTH=dat_bit_up[j];LED_PORTL=0XFF;} //上半列掃描
- else{LED_PORTL=dat_bit_down[j-8];LED_PORTH=0XFF;} //下半列掃描
- Delay(); //延時
- LED_PORTL=0XFF; //消隱
- LED_PORTH=0XFF; //消隱
- j++;
- }
- }
- }
- void RTC_Write(uint8 dat)
- {
- uint8 i;
- for(i=0;i<8;i++)
- {
- RTC_IO=(bit)(dat&0x01);
- RTC_SCLK=1;
- RTC_SCLK=0;
- dat>>=1;
- }
- }
- uint8 RTC_Read()
- {
- uint8 i;
- for(i=0; i<8; i++)
- {
- AA >>=1; //相當于匯編中的 RRC
- AA7 = RTC_IO;
- RTC_SCLK = 1;
- RTC_SCLK = 0;
- }
- return AA;
- }
- void RTC_Write_Byte(uint8 addr,uint8 dat)
- {
- RTC_RST=0;
- RTC_SCLK=0;
- RTC_RST=1;
- RTC_Write(addr);
- RTC_Write(dat);
- RTC_SCLK=1;
- RTC_RST=0;
- }
- uint8 RTC_Read_Byte(uint8 addr)
- {
- uint8 dat;
- RTC_RST=0;
- RTC_SCLK=0;
- RTC_RST=1;
- RTC_Write(addr|0x01);
- dat=RTC_Read();
- RTC_SCLK=1;
- RTC_RST=0;
- return dat;
- }
- typedef struct __SYSTEMTIME__
- {
- uint8 Second;
- uint8 Mine;
- uint8 Hour;
- uint8 Day;
- uint8 Month;
- uint8 Week;
- uint8 Year;
- }SYSTEMTIME;
- SYSTEMTIME TIMETYPE;
- void CurrentTime(SYSTEMTIME *dat)
- {
- uint8 TimeValue;
- TimeValue=RTC_Read_Byte(READ_SECOND);
- dat->Second=(((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
- TimeValue=RTC_Read_Byte(READ_MINE);
- dat->Mine= (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
- TimeValue=RTC_Read_Byte(READ_HOUR);
- dat->Hour= (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
- TimeValue=RTC_Read_Byte(READ_DAY);
- dat->Day= (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
- TimeValue=RTC_Read_Byte(READ_MONTH);
- dat->Month= (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
- TimeValue=RTC_Read_Byte(READ_WEEK);
- dat->Week= (TimeValue&0x0f);
- TimeValue=RTC_Read_Byte(READ_YEAR);
- dat->Year= (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
- }
- void LED_Disp_Time_Year(SYSTEMTIME *dat)
- {
- uint8 j,i;
- for(j=0;j<16;)
- {
- for(i=0;i<16;i++)
- {
- LED_Ser_8(~HZ[0][i]); //發送右
- LED_Ser_8(~NUM[2][i]); //發送右
- LED_Ser_8(~NUM[0][i]); //發送右
- LED_Ser_8(~NUM[(dat->Year)/10][i]); //發送右
- LED_Ser_8(~NUM[(dat->Year)%10][i]); //發送右
- LED_Ser_8(~Date[0][i*2+1]);
- LED_Ser_8(~Date[0][i*2]);
- LED_Ser_8(~HZ[0][i]); //發送右
-
- LED_Ser_EN(); //使發送的數據顯示
- if(j<8){LED_PORTH=dat_bit_up[j];LED_PORTL=0XFF;} //上半列掃描
- else{LED_PORTL=dat_bit_down[j-8];LED_PORTH=0XFF;} //下半列掃描
- Delay(); //延時
- LED_PORTL=0XFF; //消隱
- LED_PORTH=0XFF; //消隱
- j++;
- }
- }
- }
- void LED_Disp_Time_Month(SYSTEMTIME *dat)
- {
- uint8 j,i;
- for(j=0;j<16;)
- {
- for(i=0;i<16;i++)
- {
- LED_Ser_8(~NUM[dat->Month/10][i]); //發送右
- LED_Ser_8(~NUM[dat->Month%10][i]); //發送右
- LED_Ser_8(~Date[1][i*2+1]); //發送右
- LED_Ser_8(~Date[1][i*2]); //發送右
- LED_Ser_8(~NUM[dat->Day/10][i]); //發送右
- LED_Ser_8(~NUM[dat->Day%10][i]);
- LED_Ser_8(~Date[2][i*2+1]);
- LED_Ser_8(~Date[2][i*2]); //發送右
-
- LED_Ser_EN(); //使發送的數據顯示
- if(j<8){LED_PORTH=dat_bit_up[j];LED_PORTL=0XFF;} //上半列掃描
- else{LED_PORTL=dat_bit_down[j-8];LED_PORTH=0XFF;} //下半列掃描
- Delay(); //延時
- LED_PORTL=0XFF; //消隱
- LED_PORTH=0XFF; //消隱
- j++;
- }
- }
- }
- void LED_Disp_Time_Week(SYSTEMTIME *dat)
- {
- uint8 j,i;
- for(j=0;j<16;)
- {
- for(i=0;i<16;i++)
- {
- LED_Ser_8(~HZ[0][i]); //發送右
- LED_Ser_8(~Date[3][i*2+1]); //發送右
- LED_Ser_8(~Date[3][i*2]); //發送右
- LED_Ser_8(~Date[4][i*2+1]); //發送右
- LED_Ser_8(~Date[4][i*2]); //發送右
- LED_Ser_8(~WEEK[dat->Week-1][i*2+1]);
- LED_Ser_8(~WEEK[dat->Week-1][i*2]);
- LED_Ser_8(~HZ[0][i]); //發送右
-
- LED_Ser_EN(); //使發送的數據顯示
- if(j<8){LED_PORTH=dat_bit_up[j];LED_PORTL=0XFF;} //上半列掃描
- else{LED_PORTL=dat_bit_down[j-8];LED_PORTH=0XFF;} //下半列掃描
- Delay(); //延時
- LED_PORTL=0XFF; //消隱
- LED_PORTH=0XFF; //消隱
- j++;
- }
- }
- }
- void LED_Disp_Time_Time(SYSTEMTIME *dat)
- {
- uint8 j,i;
- for(j=0;j<16;)
- {
- for(i=0;i<16;i++)
- {
- LED_Ser_8(~NUM[dat->Hour/10][i]); //發送右
- LED_Ser_8(~NUM[dat->Hour%10][i]); //發送右
- LED_Ser_8(~Date[5][i]); //發送右
- LED_Ser_8(~NUM[dat->Mine/10][i]); //發送右
- LED_Ser_8(~NUM[dat->Mine%10][i]); //發送右
- LED_Ser_8(~Date[5][i]);
- LED_Ser_8(~NUM[dat->Second/10][i]);
- LED_Ser_8(~NUM[dat->Second%10][i]); //發送右
-
- LED_Ser_EN(); //使發送的數據顯示
- if(j<8){LED_PORTH=dat_bit_up[j];LED_PORTL=0XFF;} //上半列掃描
- else{LED_PORTL=dat_bit_down[j-8];LED_PORTH=0XFF;} //下半列掃描
- Delay(); //延時
- LED_PORTL=0XFF; //消隱
- LED_PORTH=0XFF; //消隱
- j++;
- }
- }
- }
- /*****************************************************************************************************************************
- / 函數名稱:ET0_INT
- / 作用: 定時器T0的中斷服務程序用于延自加字符顯示偏移量以產生字符滾動顯示的效果
- ******************************************************************************************************************************/
- void ET0_INT() interrupt 1 using 0 //中斷服務程序
- {
- TH0=0x03;
- TL0=0x04;
- brk++;
- if(brk==10)
- {
- brk=0; //brk延時用
- dx++; //字符顯示偏移量
- }
- }
- void Char_to_time(uint8 *dat)
- {
- uint8 year,month,day,week,hour,mine;
- year=((dat[0]-'0')*16+(dat[1]-'0'));
- month=((dat[3]-'0')*16+(dat[4]-'0'));
- day=((dat[6]-'0')*16+(dat[7]-'0'));
- hour=((dat[9]-'0')*16+(dat[10]-'0'));
- mine=((dat[12]-'0')*16+(dat[13]-'0'));
- week=(dat[15]-'0');
- RTC_Write_Byte(0x8e,0x00); //寫入允許
- RTC_Write_Byte(0x80,WRITE_SECOND|0x80);
- RTC_Write_Byte(0x8e,0x80); //禁止寫入
- RTC_Write_Byte(0x8e,0x00); //寫入允許
- RTC_Write_Byte(WRITE_YEAR,year); //寫入新的秒數
- RTC_Write_Byte(WRITE_MONTH,month); //寫入新的秒數
- RTC_Write_Byte(WRITE_DAY,day); //寫入新的秒數
- RTC_Write_Byte(WRITE_HOUR,hour); //寫入新的秒數
- RTC_Write_Byte(WRITE_MINE,mine&0x7f); //寫入新的秒數
- RTC_Write_Byte(WRITE_WEEK,week); //寫入新的秒數
- RTC_Write_Byte(0x8e,0x00); //寫入允許
- RTC_Write_Byte(0x80,WRITE_SECOND&0x7f);
- RTC_Write_Byte(0x8E,0x80);
- }
-
- void Serial_int() interrupt 4 using 0
- {
- uint8 i;
- for(i=0;i<17;i++)
- {
- // RI=0;
- while(RI==0);
- RI=0;
- BUFFER[i]=SBUF;
- }
- Char_to_time(BUFFER);
- }
- /*****************************************************************************************************************************
- / 函數名稱:main
- / 作用: 主程序
- ******************************************************************************************************************************/
- void main()
- {
- // TMOD=0x01; //定時器方式1
- TH0=0x03;
- TL0=0x04;
-
- TMOD=0x20;
- TH1=0xfd;
- TL1=0xfd;
- SCON=0x50;
- PCON&=0xef;
- EA=1; //開總中斷
- ET0=1; //開定時器中斷
- TR0=1; //開始定時
- ES=1;
- TR1=1;
- RI=0;
- while(1)
- {
-
- while(!flag)
- {
- LED_Disp(HZ);
- }
- while(dx!=0x14)
- {
- CurrentTime(&TIMETYPE);
- LED_Disp_Time_Year(&TIMETYPE); //顯示主程序
- }
- dx=0;
- while(dx!=0x14)
- {
- CurrentTime(&TIMETYPE);
- LED_Disp_Time_Month(&TIMETYPE);
- }
- dx=0;
- while(dx!=0x14)
- {
- CurrentTime(&TIMETYPE);
- LED_Disp_Time_Week(&TIMETYPE);
- }
- dx=0;
- while(dx!=0x6f)
- {
- CurrentTime(&TIMETYPE);
- LED_Disp_Time_Time(&TIMETYPE);
- }
- dx=0;
- flag=0;
- while(!flag)
- {
- LED_Disp(HZ1);
- }
- flag=0;
- }
-
- }
復制代碼
0.png (52.53 KB, 下載次數: 114)
下載附件
2018-10-11 00:54 上傳
所有資料51hei提供下載:
HBLED.rar
(3.53 MB, 下載次數: 47)
2018-10-10 20:45 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|