找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1682|回复: 2
打印 上一主题 下一主题
收起左侧

STC15W408AS单片机显字风扇制作 附程序

[复制链接]
跳转到指定楼层
楼主
原先是个写死的广告风扇,经过抄板换芯片可以显示任何汉字字母图形。

制作出来的实物图如下:


电路原理图如下:





单片机源程序如下:
  1. /************旋转LED指尖陀螺程序**************/

  2. //----------|D1        |D2        | D3|D4        | D5| D6| D7|D8        |D9 |D10|D11||P32 |  P55   |   P54         |        
  3. //----------|         |        |        |        |        |        |        |        |        |        |        ||          |                   |                 |
  4. //----------|P10|P11|P12|P13|P14|P15|P30|P31|P33|P36|P37||按键|红外接收| 红外发射|        

  5. //----------字模为12x12点阵,黑体,低位先,从左至右,0为亮灯
  6. //----------下载选择IRC频率 6.000 MHZ
  7. //----------分频/4


  8. #include <STC8.H>
  9. #include"zjtl.h"
  10. //#include"intrins.h"
  11. #define uchar unsigned char        //宏定义
  12. #define uint unsigned int        //宏定义

  13. uchar i,s,d,zz;
  14. #define b 20
  15. sbit led1 = P1 ^ 0;
  16. sbit led2 = P1 ^ 1;
  17. sbit led3 = P1 ^ 2;
  18. sbit led4 = P1 ^ 3;
  19. sbit led5 = P1 ^ 4;
  20. sbit led6 = P1 ^ 5;
  21. sbit led7 = P3 ^ 0;
  22. sbit led8 = P3 ^ 1;
  23. sbit led9 = P3 ^ 3;
  24. sbit led10 = P3 ^ 6;
  25. sbit led11 = P3 ^ 7;

  26. uchar JS,ss,zz,xuanze;               
  27. uint ZS;                //累计转数

  28. sbit k1=P3^2;
  29. sbit k2=P5^5;
  30. //sbit LED0=P3^0;
  31. sbit LED=P3^7;
  32. sbit LED_H=P5^4;        //红外发射LED
  33. //sbit D7=P3^0;
  34. //sbit D8=P3^1;
  35. //sbit D9=P3^3;
  36. //sbit D10=P3^6;
  37. //sbit D11=P3^7;
  38. /**************************/

  39. uchar code huamian0[]={
  40.    
  41. 0xFF,0xFF,0xFF,0xFB,0x7F,0xFC,
  42. .......见附件.......
  43. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",7*/
  44. /* (6 X 12 , 宋体 ) */
  45. };
  46. /*****************************************/

  47. /**********************************/
  48. /*****n延时子程序*****/
  49. /************************************************/
  50. void delay(uint a)        //延时
  51. {
  52.         uchar x;
  53.         while(a--)
  54.         {
  55.           for(x=0;x<150;x++);
  56.         }        
  57. }
  58. //////////////////////////////
  59. void delayus(uint f)
  60. {
  61.         while(f--);
  62. }
  63. /**************************/
  64. void Timer0Init(void)                //1毫秒@6.000MHz
  65. {
  66.         AUXR &= 0x7F;                //定时器时钟12T模式
  67.         TMOD &= 0xF0;                //设置定时器模式
  68.         TMOD |= 0x01;                //设置定时器模式
  69.         TL0 = 0x0C;                //设置定时初值
  70.         TH0 = 0xFE;                //设置定时初值
  71.         TF0 = 0;                //清除TF0标志
  72.         TR0 = 1;                //定时器0开始计时
  73.         ET0 = 1;                //定时器T0中断允许
  74. }
  75. /**********************************************/
  76. /*开机显示*/
  77. void kaijiss()        //开机最外面LED闪烁三次        
  78. {        
  79.         uchar i;
  80. //        for(i=0;i<6;i++)
  81. //        {        
  82. //                P10=~P10;
  83. //                delay(100);
  84. //         }
  85. //         P10=1;
  86.         
  87. }
  88. /**********************************************/
  89. /****          LED显示函数             ****/
  90. /**********************************************/
  91. void tuan(uchar *p)
  92. {        
  93.         uchar i;
  94.         
  95.         delayus(ss*100+3300);         //延时一个时间后
  96.         for(i=83;i>0;i--)
  97.         {
  98.                 P1=p[i*2];
  99.                 P2=p[i*2+1];
  100.                 P30=P16;
  101.                 P31=P17;
  102.                 P33=P20;
  103.                 P36=P21;
  104.                 P37=P22;
  105.         
  106.                 delayus(ss+35);                //显示延时
  107.                
  108.         }
  109.         
  110.         P1=P2=P3=0xff;                //清除LED显示
  111. }

  112. /***********************************/

  113. /*        比较器中断 */
  114. void cmp_isr()interrupt 21           //
  115. {

  116.           CMPCR1&=~CMPIF;        //清除完成标志
  117.           JS=!!(CMPCR1&CMPRES);
  118.          
  119.           if(JS==0)
  120.           {
  121.          
  122.                   
  123.         /**/        
  124.                 switch(xuanze)
  125.                 {
  126.                         case(0):tuan(huamian0);break;
  127.                         case(1):tuan(huamian1);break;
  128.                         case(2):tuan(huamian2);break;
  129.                         case(3):tuan(huamian3);break;
  130.                 }
  131.         delay(15);
  132.                 ZS++;        //转数累加
  133.                
  134.           }
  135. }
  136. /**************************************/
  137. /**************************************/
  138. /*定时器T0中断服务*/
  139. void Timer0(void) interrupt 1
  140. {         
  141.            uchar c;
  142.                  d++;
  143.          if(d==40/4)           //一直检测每10ms内当前转数
  144.          {        d=0;
  145.                  c++;
  146.                  if(c==20)
  147.                 {
  148.                         P11=~P11;
  149.                 }
  150.                     
  151.         
  152.                 ss=ZS+1;
  153.                
  154.                
  155.                 ZS=0;                           //清零
  156.                
  157.            
  158.          }
  159.         TL0 = 0x0C;                //设置定时初值
  160.         TH0 = 0xFE;                //设置定时初值
  161. }
  162. /**************************************/                  
  163. /*外中断0服务程序*/        
  164. void zhongduan(void) interrupt 0
  165. {
  166.          if(k1==0)
  167.          {
  168.                  delay(15);
  169.                 if(k1==0)
  170.                 {
  171.                         xuanze++;
  172.                         if(xuanze>=4)xuanze=0;         //
  173.                         LED=0;
  174.                 }
  175.                 while(!k1);
  176.                 LED=1;
  177.          }
  178.          
  179. }

  180. ////////////////////////////////////////////////
  181. ///////////////--主--函--数--///////////////////
  182. ////////////////////////////////////////////////
  183. void main()
  184. {

  185.         EA=1;        //开总中断

  186.         EX0=1;        //允许使用外中断
  187.         IT0=1;        //负跳变触发方式(下降沿)

  188.    

  189.         Timer0Init();        //1毫秒@6.000MHz
  190.         msgl();                        //单片机工作模式
  191.         fenpin();                //单片机主频设置
  192.         bjq();                        //比较器设置                 

  193.         
  194.         ioshezhi();                //io口设置
  195.         
  196.         kaijiss();                //开机最外面LED闪烁三次
  197.         


  198. ////////////////////////////////////////////

  199. //        while(1)
  200. //        {
  201. //                 LED_H=0;                //红外发射LED
  202. //        
  203. //        }
  204. }
  205. ////////////////////////////////////////////
  206. ////////////////////////////////////////////
复制代码

Keil代码下载(附件内只含代码,不含其他任何文件):
Keil代码.7z (29.46 KB, 下载次数: 30)

评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:904752 发表于 2022-9-27 16:49 | 只看该作者
从图片上看好像不能转吧
回复

使用道具 举报

板凳
ID:281065 发表于 2022-9-27 17:02 | 只看该作者
tutu12138 发表于 2022-9-27 16:49
从图片上看好像不能转吧

板子固定在马达轴上,灯排是固定在扇叶上,正负极通过弹簧和PCB上的大焊盘接触,机械部分用的都是原装,我只换了板子。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表