原先是个写死的广告风扇,经过抄板换芯片可以显示任何汉字字母图形。
制作出来的实物图如下:
电路原理图如下:
单片机源程序如下:
- /************旋转LED指尖陀螺程序**************/
- //----------|D1 |D2 | D3|D4 | D5| D6| D7|D8 |D9 |D10|D11||P32 | P55 | P54 |
- //----------| | | | | | | | | | | || | | |
- //----------|P10|P11|P12|P13|P14|P15|P30|P31|P33|P36|P37||按键|红外接收| 红外发射|
- //----------字模为12x12点阵,黑体,低位先,从左至右,0为亮灯
- //----------下载选择IRC频率 6.000 MHZ
- //----------分频/4
- #include <STC8.H>
- #include"zjtl.h"
- //#include"intrins.h"
- #define uchar unsigned char //宏定义
- #define uint unsigned int //宏定义
- uchar i,s,d,zz;
- #define b 20
- sbit led1 = P1 ^ 0;
- sbit led2 = P1 ^ 1;
- sbit led3 = P1 ^ 2;
- sbit led4 = P1 ^ 3;
- sbit led5 = P1 ^ 4;
- sbit led6 = P1 ^ 5;
- sbit led7 = P3 ^ 0;
- sbit led8 = P3 ^ 1;
- sbit led9 = P3 ^ 3;
- sbit led10 = P3 ^ 6;
- sbit led11 = P3 ^ 7;
- uchar JS,ss,zz,xuanze;
- uint ZS; //累计转数
- sbit k1=P3^2;
- sbit k2=P5^5;
- //sbit LED0=P3^0;
- sbit LED=P3^7;
- sbit LED_H=P5^4; //红外发射LED
- //sbit D7=P3^0;
- //sbit D8=P3^1;
- //sbit D9=P3^3;
- //sbit D10=P3^6;
- //sbit D11=P3^7;
- /**************************/
- uchar code huamian0[]={
-
- 0xFF,0xFF,0xFF,0xFB,0x7F,0xFC,
- .......见附件.......
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",7*/
- /* (6 X 12 , 宋体 ) */
- };
- /*****************************************/
- /**********************************/
- /*****n延时子程序*****/
- /************************************************/
- void delay(uint a) //延时
- {
- uchar x;
- while(a--)
- {
- for(x=0;x<150;x++);
- }
- }
- //////////////////////////////
- void delayus(uint f)
- {
- while(f--);
- }
- /**************************/
- void Timer0Init(void) //1毫秒@6.000MHz
- {
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0x0C; //设置定时初值
- TH0 = 0xFE; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //定时器T0中断允许
- }
- /**********************************************/
- /*开机显示*/
- void kaijiss() //开机最外面LED闪烁三次
- {
- uchar i;
- // for(i=0;i<6;i++)
- // {
- // P10=~P10;
- // delay(100);
- // }
- // P10=1;
-
- }
- /**********************************************/
- /**** LED显示函数 ****/
- /**********************************************/
- void tuan(uchar *p)
- {
- uchar i;
-
- delayus(ss*100+3300); //延时一个时间后
- for(i=83;i>0;i--)
- {
- P1=p[i*2];
- P2=p[i*2+1];
- P30=P16;
- P31=P17;
- P33=P20;
- P36=P21;
- P37=P22;
-
- delayus(ss+35); //显示延时
-
- }
-
- P1=P2=P3=0xff; //清除LED显示
- }
- /***********************************/
- /* 比较器中断 */
- void cmp_isr()interrupt 21 //
- {
- CMPCR1&=~CMPIF; //清除完成标志
- JS=!!(CMPCR1&CMPRES);
-
- if(JS==0)
- {
-
-
- /**/
- switch(xuanze)
- {
- case(0):tuan(huamian0);break;
- case(1):tuan(huamian1);break;
- case(2):tuan(huamian2);break;
- case(3):tuan(huamian3);break;
- }
- delay(15);
- ZS++; //转数累加
-
- }
- }
- /**************************************/
- /**************************************/
- /*定时器T0中断服务*/
- void Timer0(void) interrupt 1
- {
- uchar c;
- d++;
- if(d==40/4) //一直检测每10ms内当前转数
- { d=0;
- c++;
- if(c==20)
- {
- P11=~P11;
- }
-
-
- ss=ZS+1;
-
-
- ZS=0; //清零
-
-
- }
- TL0 = 0x0C; //设置定时初值
- TH0 = 0xFE; //设置定时初值
- }
- /**************************************/
- /*外中断0服务程序*/
- void zhongduan(void) interrupt 0
- {
- if(k1==0)
- {
- delay(15);
- if(k1==0)
- {
- xuanze++;
- if(xuanze>=4)xuanze=0; //
- LED=0;
- }
- while(!k1);
- LED=1;
- }
-
- }
- ////////////////////////////////////////////////
- ///////////////--主--函--数--///////////////////
- ////////////////////////////////////////////////
- void main()
- {
- EA=1; //开总中断
- EX0=1; //允许使用外中断
- IT0=1; //负跳变触发方式(下降沿)
-
- Timer0Init(); //1毫秒@6.000MHz
- msgl(); //单片机工作模式
- fenpin(); //单片机主频设置
- bjq(); //比较器设置
-
- ioshezhi(); //io口设置
-
- kaijiss(); //开机最外面LED闪烁三次
-
- ////////////////////////////////////////////
- // while(1)
- // {
- // LED_H=0; //红外发射LED
- //
- // }
- }
- ////////////////////////////////////////////
- ////////////////////////////////////////////
复制代码
Keil代码下载(附件内只含代码,不含其他任何文件):
Keil代码.7z
(29.46 KB, 下载次数: 35)
|