整套系统以STC12C2051单片机为核心控制系统,使用16只LED灯作为显示屏,其中16只直接与单片机IO口相连。当惯性开关触发中断T1时,单片机向16只LED传送数据,依据人体的视觉暂留原理,随着显示棒的摆动前进,输出数据的列也不会立刻消失而是随着摆动逐渐显示在了形成的扇形区域。 系统的元器件明细表:
1、单片机STC12C2051 1片; 2、发光二极管 16只; 3、12M晶振 1个 4、电阻、电容 若干 5、USB接口 1个 6、按钮及开关 若干
四.系统软件设计
1.软件设计思路
在摇动LED棒的时候单片机必须单程传送数据否则显示的图形会产生重影,影响视觉效果。因此当系统开始工作后通过惯性开关的
位置来使单片机实现单程传送数据给LED。如果惯性开关位于右边,则进入外部中断1并将一变量置1,。在变量为1期间让单片机以一定的频率将数据传送给LED。如果惯性开关位于左边,则进入外部中断0并将变量置0,。在这期间单片机不会传送数据给LED。在送数据时,数据送完后应延时一段时间来使摇动时显示的每个字不会太拥挤。之后再立刻熄灭LED并开始重新判断惯性开关的位置。 2.主程序流程图
通过软件设计思路分析,得到该系统的主程序流程图如下:
系统开始运行,内部进行初始化后,等待外部中断。当摇动到指定
位置时,由滚珠开关出触发外部中断,再经过一段时间延时后开始显示。显示完成返回主程序,等待下一个摇动周期的到来。 经过文字取模后,系统的源程序编制如下: #include
for(x=0; x<=N;x++); }
*****中断服务程序*****
void intersvr0(void) interrupt 0 using 1 {
KY=~KY; 每个摇动来回水银开关会在摆幅两端分别产生下降沿中断,只提取其中一次(从左向右摇才显示) if(KY==0) {
num++; 计算中断次数 switch(pic) 选择画面 {
case 0:{display1();}break; case 1:{display2();}break; case 2:{display3();}break; case 3:{display4();}break; default:{display1();} }
} }
*****显示子程序1(汉字)***** void display1(void) {
uchar i;
if(num>10){disp++;num=0;} 12个汉字分为3次显示完(每次显示4个),每中断10次切换 if(disp>2)disp=0;
DelayUs(5200); 此处延时时间依各硬件差别而各不相同,试着调整使得显示内容居中即可 for(i=0;i<64;i++) {
P0=~(void) { IT0=1; EX0=1;
EA=1; 开中断,下降沿中断 KY=0;
while(1) 主程序中只检测按键 {
if(KEY==0) 画面切换键按下 {
DelayUs(10000); 按键去抖 if(KEY==0);
pic++;}
if(pic>3)pic=0; } }
*****END***** 3. 软件实现功能的完善
本次设计的一个难点是去除重影,我们的解决方法是使用外部中断让数据单程传输。
第二个难点是当显示较长字符时不能完整的显示在一次摇摆的扇形区域内。通过反复试验,我们改变了送数据方式:由一个字符接一个字符传送改为一组字符一起传送,传送结束后再延时,通过不断调试实现了完整显示的功能,同时也解决了画面连续出现没有间断的问题。
综上,只要控制好数据传输方式以及每次传输数据间的延时就可以实现多种数据的显示方法。
五.系统的硬件调试及软件调试
单片机应用系统的硬件调试和软件调试是分不可的,许多硬件故障是在调试软件时才发现的。但通常是先排除系统中明显的硬件故障后才和软件结合起来调试的。其一般的调试过程如下: 1.常见的硬件故障 (1)逻辑错误
样机硬件的逻辑错误是由于设计错误和加工过程中的工艺性错误所造成的。这类错误包括:错线,开路,短路等几种,其中短路时最常见的故障。在印刷电路板布线密度高的情况下,极易因工艺原因