久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3605|回復: 1
打印 上一主題 下一主題
收起左側

[原創]開源采用vb上位機串口對時的單片機16*64LED條屏仿真程序

[復制鏈接]
跳轉到指定樓層
樓主
附件內有上位機VB源碼和上位機安裝程序,圖片左上角的小界面是上位機程序,可獲取電腦的時間和日期發送到16*64LED上顯示(需要安裝虛擬串口)。

單片機16*64LED條屏仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)




單片機源程序如下:
  1. #include "reg51.h"                                                         //包含51單片機的端口和內部寄存器定義的頭文件
  2. typedef unsigned char uint8;                                                               //定義字符型
  3. typedef unsigned int  uint16;                                                              //定義整型
  4. typedef unsigned long uint32;                                                              //定義長整型
  5. uint32  dx,dxx;                                                                                      //字符顯示偏移量
  6. uint8  brk,flag;
  7. uint8 BUFFER[22];
  8. sbit RTC_RST     =                P3^5;
  9. sbit RTC_SCLK         =                 P3^6;
  10. sbit RTC_IO                 =                P3^7;
  11. uint8 bdata AA;                                                                                               //brk延時用
  12. uint8 const code dat_bit_up[]={0xF7,0xFB,0xFD,0xFE,0x7F,0xBF,0xDF,0xEF};   //列高位掃描數據
  13. uint8 const code dat_bit_down[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //列低位掃描數據
  14. sbit AA7 = AA^7;
  15. #define READ_SECOND     0x81
  16. #define WRITE_SECOND    0x80
  17. #define READ_MINE       0x83
  18. #define WRITE_MINE      0x82
  19. #define READ_HOUR       0x85
  20. #define WRITE_HOUR                 0x84
  21. #define READ_DAY                0x87
  22. #define WRITE_DAY                0x86
  23. #define READ_MONTH                0x89
  24. #define WRITE_MONTH                0x88
  25. #define READ_WEEK                0x8b
  26. #define WRITE_WEEK                0x8a
  27. #define READ_YEAR       0x8d
  28. #define WRITE_YEAR                0x8c
  29. uint8 const code NUM[][16]=
  30. {

  31. {0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,0x00},/*"0",0*/
  32. …………
  33. …………
  34. …………限于本文篇幅 余下代碼請從51黑下載附件…………

  35. {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*/

  36. {0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00},/*":",0*/



  37. };
  38. /*****************************************************************************************************************************
  39. /     端口定義
  40. ******************************************************************************************************************************/


  41. #define LED_PORTH P0          //列高位
  42. #define LED_PORTL P2          //列低位
  43. sbit SER_CP=P3^4;             //串行時鐘線
  44. sbit SER_SDA=P3^3;            //串行數據線
  45. sbit SER_EN=P3^2;             //74595數據有效線
  46. /*****************************************************************************************************************************
  47. /   函數名稱:Delay
  48. /   作用: 延時子程序主要用于LED的消隱
  49. ******************************************************************************************************************************/

  50. void Delay()                  //延時子程序
  51. {
  52.     uint16  i,j;
  53.     for(i=0;i<0x14;i++)
  54.     for(j=0;j<0x05;j++);
  55. }
  56. /*****************************************************************************************************************************
  57. /   函數名稱:LED_Ser
  58. /   作用: 發送串行數據到74LS595
  59. /   入口參數:dat 為要發送的數據8位
  60. ******************************************************************************************************************************/

  61. void LED_Ser(uint16 dat)
  62. {
  63.     uint8 i;
  64.     for(i=0;i<16;i++)          //共8BYTE
  65.     {
  66.         SER_SDA=dat&0x01;     //把數據的最后一位放在數據線上
  67.         dat>>=1;              //向右移位共8下這樣可以發送8位數據
  68.         SER_CP=0;                     //
  69.         SER_CP=1;             //產生上升沿發送數據1BYTE
  70.     }
  71. }
  72. void LED_Ser_8(uint8 dat)
  73. {
  74.     uint8 i;
  75.     for(i=0;i<8;i++)          //共8BYTE
  76.     {
  77.         SER_SDA=dat&0x01;     //把數據的最后一位放在數據線上
  78.         dat>>=1;              //向右移位共8下這樣可以發送8位數據
  79.         SER_CP=0;                     //
  80.         SER_CP=1;             //產生上升沿發送數據1BYTE
  81.     }
  82. }

  83. /*****************************************************************************************************************************
  84. /   函數名稱:LED_Ser_EN
  85. /   作用: 用于在SER_EN口線上產生上長沿使74595發送的數據有效
  86. ******************************************************************************************************************************/

  87. void LED_Ser_EN()
  88. {
  89.     SER_EN=0;                         //
  90.     SER_EN=1;                 //產生上升沿脈沖用于使74595發的數據有效
  91. }
  92. /*****************************************************************************************************************************
  93. /   函數名稱:LED_Disp
  94. /   作用: 在LED上顯示字符或BMP
  95. /   入口參數:*dat 為要顯示的字符或BMP的數據的首地址指針
  96. ******************************************************************************************************************************/

  97. void  LED_Disp(uint16 *dat)
  98. {
  99.     uint16  tmp;
  100.         uint8  a,j,i;
  101.     for(j=0;j<16;)
  102.     {
  103.         for(i=0;i<16;i++)
  104.             {
  105.             for(a=0;a<4;a++)   //共四個字
  106.                 {        
  107.                 if(dx>15){dxx+=16;dx=0;}  //dx,dxx為顯示偏移量
  108.                 tmp=((dat[i+dxx+a*16]>>dx)|(dat[i+dxx+(a+1)*16]<<(16-dx)));//移動一位最大可移動八位左
  109.                                 if(dat[i+(a+1)*16+dxx]==0x55aa){dxx=0;tmp=0;flag=1;}
  110.                 LED_Ser(~tmp);        //發送右
  111.                 }        
  112.             LED_Ser_EN();      //使發送的數據顯示
  113.             if(j<8){LED_PORTH=dat_bit_up[j];LED_PORTL=0XFF;}   //上半列掃描
  114.             else{LED_PORTL=dat_bit_down[j-8];LED_PORTH=0XFF;}  //下半列掃描
  115.             Delay();                                                                        //延時
  116.             LED_PORTL=0XFF;                                                                //消隱
  117.             LED_PORTH=0XFF;                                                                //消隱        
  118.                         j++;
  119.             }
  120.     }
  121. }
  122. void RTC_Write(uint8 dat)
  123. {
  124.         uint8 i;         
  125.         for(i=0;i<8;i++)
  126.         {
  127.                 RTC_IO=(bit)(dat&0x01);
  128.                 RTC_SCLK=1;
  129.                 RTC_SCLK=0;
  130.                 dat>>=1;
  131.         }
  132. }

  133. uint8 RTC_Read()                                                
  134. {
  135.     uint8 i;
  136.     for(i=0; i<8; i++)
  137.     {
  138.         AA >>=1;                                 //相當于匯編中的 RRC
  139.         AA7 = RTC_IO;
  140.         RTC_SCLK = 1;
  141.         RTC_SCLK = 0;
  142.     }
  143.     return AA;
  144. }

  145. void RTC_Write_Byte(uint8 addr,uint8 dat)
  146. {
  147.         RTC_RST=0;
  148.         RTC_SCLK=0;
  149.         RTC_RST=1;
  150.         RTC_Write(addr);
  151.         RTC_Write(dat);
  152.         RTC_SCLK=1;
  153.         RTC_RST=0;
  154. }

  155. uint8 RTC_Read_Byte(uint8 addr)
  156. {
  157.         uint8 dat;
  158.         RTC_RST=0;
  159.         RTC_SCLK=0;
  160.         RTC_RST=1;
  161.         RTC_Write(addr|0x01);
  162.         dat=RTC_Read();
  163.         RTC_SCLK=1;
  164.         RTC_RST=0;
  165.         return dat;
  166. }


  167. typedef struct __SYSTEMTIME__
  168. {
  169.         uint8  Second;
  170.         uint8  Mine;
  171.         uint8  Hour;
  172.         uint8  Day;
  173.         uint8  Month;
  174.         uint8  Week;
  175.         uint8  Year;
  176. }SYSTEMTIME;


  177. SYSTEMTIME TIMETYPE;
  178. void CurrentTime(SYSTEMTIME *dat)
  179. {
  180.         uint8 TimeValue;
  181.         TimeValue=RTC_Read_Byte(READ_SECOND);
  182.         dat->Second=(((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
  183.         TimeValue=RTC_Read_Byte(READ_MINE);
  184.         dat->Mine=  (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
  185.         TimeValue=RTC_Read_Byte(READ_HOUR);
  186.         dat->Hour=  (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
  187.         TimeValue=RTC_Read_Byte(READ_DAY);
  188.         dat->Day=        (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
  189.         TimeValue=RTC_Read_Byte(READ_MONTH);
  190.         dat->Month= (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
  191.         TimeValue=RTC_Read_Byte(READ_WEEK);
  192.         dat->Week=        (TimeValue&0x0f);
  193.         TimeValue=RTC_Read_Byte(READ_YEAR);
  194.         dat->Year=        (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
  195. }
  196. void  LED_Disp_Time_Year(SYSTEMTIME *dat)
  197. {
  198.         uint8  j,i;
  199.     for(j=0;j<16;)
  200.     {
  201.         for(i=0;i<16;i++)
  202.             {
  203.                                 LED_Ser_8(~HZ[0][i]);        //發送右
  204.                                 LED_Ser_8(~NUM[2][i]);        //發送右
  205.                                 LED_Ser_8(~NUM[0][i]);        //發送右
  206.                                 LED_Ser_8(~NUM[(dat->Year)/10][i]);        //發送右
  207.                                 LED_Ser_8(~NUM[(dat->Year)%10][i]);        //發送右
  208.                                 LED_Ser_8(~Date[0][i*2+1]);
  209.                                 LED_Ser_8(~Date[0][i*2]);
  210.                                 LED_Ser_8(~HZ[0][i]);        //發送右
  211.                                 


  212.             LED_Ser_EN();      //使發送的數據顯示
  213.             if(j<8){LED_PORTH=dat_bit_up[j];LED_PORTL=0XFF;}   //上半列掃描
  214.             else{LED_PORTL=dat_bit_down[j-8];LED_PORTH=0XFF;}  //下半列掃描
  215.             Delay();                                                                        //延時
  216.             LED_PORTL=0XFF;                                                                //消隱
  217.             LED_PORTH=0XFF;                                                                //消隱        
  218.                         j++;
  219.             }
  220.     }
  221. }
  222. void  LED_Disp_Time_Month(SYSTEMTIME *dat)
  223. {
  224.         uint8  j,i;
  225.     for(j=0;j<16;)
  226.     {
  227.         for(i=0;i<16;i++)
  228.             {
  229.                                 LED_Ser_8(~NUM[dat->Month/10][i]);        //發送右
  230.                                 LED_Ser_8(~NUM[dat->Month%10][i]);        //發送右
  231.                                 LED_Ser_8(~Date[1][i*2+1]);        //發送右
  232.                                 LED_Ser_8(~Date[1][i*2]);        //發送右
  233.                                 LED_Ser_8(~NUM[dat->Day/10][i]);        //發送右
  234.                                 LED_Ser_8(~NUM[dat->Day%10][i]);
  235.                                 LED_Ser_8(~Date[2][i*2+1]);
  236.                                 LED_Ser_8(~Date[2][i*2]);        //發送右
  237.                                 


  238.             LED_Ser_EN();      //使發送的數據顯示
  239.             if(j<8){LED_PORTH=dat_bit_up[j];LED_PORTL=0XFF;}   //上半列掃描
  240.             else{LED_PORTL=dat_bit_down[j-8];LED_PORTH=0XFF;}  //下半列掃描
  241.             Delay();                                                                        //延時
  242.             LED_PORTL=0XFF;                                                                //消隱
  243.             LED_PORTH=0XFF;                                                                //消隱        
  244.                         j++;
  245.             }
  246.     }
  247. }
  248. void  LED_Disp_Time_Week(SYSTEMTIME *dat)
  249. {
  250.         uint8  j,i;
  251.     for(j=0;j<16;)
  252.     {
  253.         for(i=0;i<16;i++)
  254.             {
  255.                                 LED_Ser_8(~HZ[0][i]);        //發送右
  256.                                 LED_Ser_8(~Date[3][i*2+1]);        //發送右
  257.                                 LED_Ser_8(~Date[3][i*2]);        //發送右
  258.                                 LED_Ser_8(~Date[4][i*2+1]);        //發送右
  259.                                 LED_Ser_8(~Date[4][i*2]);        //發送右
  260.                                 LED_Ser_8(~WEEK[dat->Week-1][i*2+1]);
  261.                                 LED_Ser_8(~WEEK[dat->Week-1][i*2]);
  262.                                 LED_Ser_8(~HZ[0][i]);        //發送右
  263.                                 


  264.             LED_Ser_EN();      //使發送的數據顯示
  265.             if(j<8){LED_PORTH=dat_bit_up[j];LED_PORTL=0XFF;}   //上半列掃描
  266.             else{LED_PORTL=dat_bit_down[j-8];LED_PORTH=0XFF;}  //下半列掃描
  267.             Delay();                                                                        //延時
  268.             LED_PORTL=0XFF;                                                                //消隱
  269.             LED_PORTH=0XFF;                                                                //消隱        
  270.                         j++;
  271.             }
  272.     }
  273. }
  274. void  LED_Disp_Time_Time(SYSTEMTIME *dat)
  275. {
  276.         uint8  j,i;
  277.     for(j=0;j<16;)
  278.     {
  279.         for(i=0;i<16;i++)
  280.             {
  281.                                 LED_Ser_8(~NUM[dat->Hour/10][i]);        //發送右
  282.                                 LED_Ser_8(~NUM[dat->Hour%10][i]);        //發送右
  283.                                 LED_Ser_8(~Date[5][i]);        //發送右
  284.                                 LED_Ser_8(~NUM[dat->Mine/10][i]);        //發送右
  285.                                 LED_Ser_8(~NUM[dat->Mine%10][i]);        //發送右
  286.                                 LED_Ser_8(~Date[5][i]);
  287.                                 LED_Ser_8(~NUM[dat->Second/10][i]);
  288.                                 LED_Ser_8(~NUM[dat->Second%10][i]);        //發送右
  289.                                 


  290.             LED_Ser_EN();      //使發送的數據顯示
  291.             if(j<8){LED_PORTH=dat_bit_up[j];LED_PORTL=0XFF;}   //上半列掃描
  292.             else{LED_PORTL=dat_bit_down[j-8];LED_PORTH=0XFF;}  //下半列掃描
  293.             Delay();                                                                        //延時
  294.             LED_PORTL=0XFF;                                                                //消隱
  295.             LED_PORTH=0XFF;                                                                //消隱        
  296.                         j++;
  297.             }
  298.     }
  299. }               
  300. /*****************************************************************************************************************************
  301. /   函數名稱:ET0_INT
  302. /   作用: 定時器T0的中斷服務程序用于延自加字符顯示偏移量以產生字符滾動顯示的效果
  303. ******************************************************************************************************************************/
  304. void ET0_INT() interrupt 1 using 0    //中斷服務程序
  305. {
  306.     TH0=0x03;
  307.     TL0=0x04;
  308.     brk++;
  309.     if(brk==10)
  310.     {
  311.         brk=0;       //brk延時用
  312.         dx++;       //字符顯示偏移量
  313.     }
  314. }
  315. void Char_to_time(uint8 *dat)
  316. {
  317.         uint8 year,month,day,week,hour,mine;
  318.     year=((dat[0]-'0')*16+(dat[1]-'0'));
  319.         month=((dat[3]-'0')*16+(dat[4]-'0'));
  320.         day=((dat[6]-'0')*16+(dat[7]-'0'));
  321.         hour=((dat[9]-'0')*16+(dat[10]-'0'));
  322.         mine=((dat[12]-'0')*16+(dat[13]-'0'));
  323.         week=(dat[15]-'0');
  324.         RTC_Write_Byte(0x8e,0x00); //寫入允許
  325.     RTC_Write_Byte(0x80,WRITE_SECOND|0x80);
  326.         RTC_Write_Byte(0x8e,0x80); //禁止寫入
  327.         RTC_Write_Byte(0x8e,0x00); //寫入允許
  328.         RTC_Write_Byte(WRITE_YEAR,year); //寫入新的秒數
  329.         RTC_Write_Byte(WRITE_MONTH,month); //寫入新的秒數
  330.         RTC_Write_Byte(WRITE_DAY,day); //寫入新的秒數
  331.         RTC_Write_Byte(WRITE_HOUR,hour); //寫入新的秒數
  332.         RTC_Write_Byte(WRITE_MINE,mine&0x7f); //寫入新的秒數
  333.         RTC_Write_Byte(WRITE_WEEK,week); //寫入新的秒數
  334.         RTC_Write_Byte(0x8e,0x00); //寫入允許
  335.         RTC_Write_Byte(0x80,WRITE_SECOND&0x7f);
  336.         RTC_Write_Byte(0x8E,0x80);
  337. }
  338.         
  339. void Serial_int() interrupt 4 using 0
  340. {
  341.         uint8 i;
  342.         for(i=0;i<17;i++)
  343.         {
  344.         //        RI=0;
  345.                 while(RI==0);
  346.                 RI=0;
  347.                 BUFFER[i]=SBUF;
  348.         }
  349.         Char_to_time(BUFFER);

  350. }
  351. /*****************************************************************************************************************************
  352. /   函數名稱:main
  353. /   作用: 主程序
  354. ******************************************************************************************************************************/
  355. void main()
  356. {
  357. //   TMOD=0x01;      //定時器方式1
  358.     TH0=0x03;
  359.     TL0=0x04;
  360.                
  361.         TMOD=0x20;
  362.         TH1=0xfd;
  363.         TL1=0xfd;
  364.         SCON=0x50;
  365.         PCON&=0xef;
  366.         EA=1;           //開總中斷
  367.     ET0=1;          //開定時器中斷
  368.     TR0=1;          //開始定時
  369.         ES=1;
  370.         TR1=1;
  371.         RI=0;

  372.         while(1)
  373.         {
  374.                
  375.             while(!flag)
  376.                 {
  377.                         LED_Disp(HZ);
  378.                 }
  379.                 while(dx!=0x14)
  380.                 {
  381.                         CurrentTime(&TIMETYPE);
  382.                         LED_Disp_Time_Year(&TIMETYPE); //顯示主程序

  383.                 }
  384.                 dx=0;
  385.                 while(dx!=0x14)
  386.                 {
  387.                         CurrentTime(&TIMETYPE);
  388.                         LED_Disp_Time_Month(&TIMETYPE);
  389.                 }
  390.                 dx=0;
  391.                 while(dx!=0x14)
  392.                 {
  393.                         CurrentTime(&TIMETYPE);
  394.                         LED_Disp_Time_Week(&TIMETYPE);
  395.                 }
  396.                 dx=0;
  397.                 while(dx!=0x6f)
  398.                 {
  399.                         CurrentTime(&TIMETYPE);
  400.                         LED_Disp_Time_Time(&TIMETYPE);
  401.                 }
  402.                 dx=0;
  403.                 flag=0;
  404.                 while(!flag)
  405.                 {
  406.                         LED_Disp(HZ1);
  407.                 }
  408.                 flag=0;
  409.         }
  410.    
  411. }   
復制代碼


所有資料51hei提供下載:
HBLED.rar (3.53 MB, 下載次數: 47)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:61840 發表于 2018-11-12 14:29 | 只看該作者
謝謝分享!收藏了!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品夜夜春夜夜爽久久电影 | 在线国产99 | 国产剧情一区二区三区 | 日韩精品视频在线 | 国产成人综合在线 | 日韩一级精品视频在线观看 | 精品日韩在线观看 | 国产日韩欧美一区二区在线播放 | 岛国av免费在线观看 | 日韩av一区二区在线 | 精品一区二区三区不卡 | 337p日韩 | 亚洲精品视频三区 | 黑人精品欧美一区二区蜜桃 | 男女激情网站免费 | 中文字幕在线观看第一页 | 中文字幕亚洲在线 | 精品久久香蕉国产线看观看亚洲 | 欧美日韩精品中文字幕 | 免费av直接看 | 视频在线一区二区 | 玖玖操 | 日韩电影在线 | 中文字幕亚洲在线 | 国产精品乱码一区二区三区 | 色播99| 一区二区在线免费观看 | 久久久性色精品国产免费观看 | 91大神在线资源观看无广告 | 欧美极品在线播放 | 国产欧美一区二区三区在线看 | 91视频免费黄| 欧美色视频免费 | 成人免费视频在线观看 | 粉嫩国产精品一区二区在线观看 | 99精品久久久 | 日韩一区在线播放 | 精品免费视频一区二区 | 色悠悠久 | 干干干操操操 | 99久久精品国产一区二区三区 |