系统开始运行,内部进行初始化后,等待外部中断。当摇动到指定位置时,由滚珠开关出触发外部中断,再经过一段时间延时后开始显示。显示完成返回主程序,等待下一个摇动周期的到来。
#define uchar unsigned char
#define uint unsigned int
/*********外部接口定义**********/
#define out P1 //数据输出端口
sbit led1=P3^2; //第1组LED
sbit led2=P3^4; //第2组LED
sbit led3=P3^5; //第3组LED
sbit led4=P3^7; //第4组LED
/*********字符点阵数据表**********/
uchar code disp_tab[]=
{0xFF,0xFF, 0x0F,0xFF,
0xFF,0x9F, 0xFF,0xFF,
0xFF,0xCF, 0x00,0x80,
0xFF,0xE7, 0x00,0x80,
0xFF,0xF3, 0xEF,0xFF,
0xFF,0xF8, 0xDF,0xFF,
0x00,0xFC, 0x8F,0x9F,
0x00,0xFE, 0x81,0x9C,
0x7F,0xFC, 0xE1,0x9C,
0xFF,0xF9, 0xE7,0x9C,
0xFF,0xF3, 0x00,0x80,
0xFF,0xE7, 0x00,0x80,
0xFF,0xCF, 0xE7,0x9C,
0xFF,0x9F, 0xE7,0x9C,
0xFF,0xDF, 0xE7,0x9F,
0xFF,0xFF,0xFF,0xFF,/*"人"*/ /*"性"*/
0xFF,0xDF, 0xFF,0xF7,
0xCF,0xCF, 0xE7,0xE7,
0xCF,0xE7, 0xE7,0xF3,
0xCF,0xF7, 0xE7,0xF9,
0xCF,0xE3, 0x67,0xF0,
0xCF,0xC9, 0x27,0xF2,
0xCE,0xDC, 0x07,0xF3,
0x48,0x9E, 0x00,0x80,
0x09,0x9F, 0x00,0x80,
0x8F,0x9F, 0x27,0xF3,
0x8F,0x9F, 0x67,0xF2,
0xCF,0x9F, 0xE7,0xF0,
0xCF,0x9F, 0xE7,0xF9,
0xCF,0x9F, 0xE7,0xF3,
0xFF,0x9F, 0xE7,0xF7,
0xFF,0xFF,0xFF,0xFF,/*"之"*/ /*"本"*/
0xFF,0xFD, 0xFF,0xFF,
0xE7,0xFC, 0xFF,0xFD,
0x64,0xFE, 0xBB,0x85,
0x20,0x80, 0x2A,0x85,
0x01,0x80, 0x28,0xD4,
0x47,0xFC, 0xA9,0xD4,
0x3F,0x99, 0xAB,0xD5,
0xB3,0xCF, 0x03,0xD4,
0xF3,0xE3, 0x03,0xD4,
0x03,0xF0, 0xA9,0xD5,
0x03,0x9C, 0xA8,0xD4,
0xF3,0x9F, 0x2A,0x84,
0xF3,0x8F, 0x2B,0x85,
0x03,0xC0, 0xBB,0xFD,
0x03,0xE0, 0xFF,0xFD,
0xFF,0xFF,0xFF,0xFF};/*"初"*/ /*"善"*/
/*********子程序声明**********/
void delay(n); //延时子程序
void display(); //显示子程序
/********* 主 程 序 **********/
void main()
{
EX1=1; //开放外部中断1
IT1=0; //中断1为边沿触发方式
EA=1;
while(1);
}
/*********显示子程序**********/
void display()
{ uchar i,n;
n=0; //初始化数据表计数
for(i=0;i<48;i++) //共显示16*3=48列
{
out=0xff; //清显示
led4=1; //关闭第4组LED
led1=0; //开启第1组LED
out=disp_tab[n++]; //输出数据到LED
delay(20); //延时
out=0xff; //清显示
led1=1; //关闭第1组LED
led2=0; //开启第2组LED
out=disp_tab[n++]; //输出数据到LED
delay(20); //延时
out=0xff; //清显示
led2=1; //关闭第2组LED
led3=0; //开启第3组LED
out=disp_tab[n++]; //输出数据到LED
delay(20); //延时
out=0xff; //清显示
led3=1; //关闭第3组LED
led4=0; //开启第4组LED
out=disp_tab[n++]; //输出数据到LED
delay(20); //延时
}
}
/*********延时子程序**********/
void delay(n)
{
uchar i;
for(;n>0;n--)
{
for(i=0;i<7;i++);
}
}
/*********中断子程序**********/
void int1() interrupt 2 //使用外部中断1
{
uint i=5000; //延时一段时间开始显示
out=0xff;
while(i--);
display(); //显示
}
三、“pctolcd2002”软件使用方法
程序中“字符点阵数据表”中的数据是由“pctolcd2002”软件生成的,下面介绍使用pctolcd2002生成3个×2行的汉字点阵数据的方法:
1、启动pctolcd2002软件,“模式”设为“字符模式”。字宽和字高设为16*16。“选项”中的“自定义格式”选择“C51”格式。其它默认即可。
2、输入第一行的三个(或四个)汉字,生成字模。
例如:
{0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11}
{0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22}
{0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33}
3、将字模保存好,输入第二行的三个(或四个)汉字,生成字模。
例如:
{0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44}
{0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55}
{0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66}
4、由于摇摇棒是逐列扫描,需要将同一列上下两行16位的数据组成一列32位数据。
按上面的数据,组合后为:
{0x11,0x11,0x44,0x44,
0x11,0x11,0x44,0x44,
0x11,0x11,0x44,0x44,
0x11,0x11,0x44,0x44,
0x22,0x22,0x55,0x55,
0x22,0x22,0x55,0x55,
0x22,0x22,0x55,0x55,
0x22,0x22,0x55,0x55,
0x33,0x33,0x66,0x66,
0x33,0x33,0x66,0x66,
0x33,0x33,0x66,0x66,
0x33,0x33,0x66,0x66};
5、将数据替换,如每行显示4个汉字则修改程序 for(i=0;i<48;i++)为 for(i=0;i<64;i++)
四、结论
本文以传感器和单片机的实际应用为背景,介绍了以单片机和传感器为核心系统摇动传感器和显示设计的基本结构和基本原理。
本文将使用单片机对摇动显示进行实例化,设计一个LED摇动显示器来显示文字、图像等信息。掌握利用8051型单片机对发光二极管阵列进行摇动控制的方法。输出信号频率的控制通过单片机来实现,用摇动传感器检测当前摇动状态,用32个发光二极管进行不同频率的亮灭刷新,通过手动摇动可显示输出文字及图案等信息。当进行摇动时,由于人的视觉暂留原理,会在发光二极管摇动区域产生一个视觉平面,在视觉平面内的二极管通过不同频率的刷新,会在摇动区域内产生图像,从而达到在该视觉平面上传达信息的作用。
设计具有市场前景,可满足各种大型演出、集会、游行等宣传需要,为人们的生活提供便利。