单片机程序Word文档下载推荐.docx
《单片机程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机程序Word文档下载推荐.docx(24页珍藏版)》请在冰豆网上搜索。
voidmain(void)
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
while
(1)
{
if(P0_0==0)
for(i=5;
i>
0;
i--)
for(j=248;
j>
j--);
second++;
if(second==60)
second=0;
}
dispbuf[0]=second;
dispbuf[1]=second/10;
while(P0_0==0);
if(P0_1==0)
minite++;
if(minite==60)
minite=0;
dispbuf[3]=minite;
dispbuf[4]=minite/10;
while(P0_1==0);
if(P0_2==0)
hour++;
if(hour==24)
hour=0;
dispbuf[6]=hour;
dispbuf[7]=hour/10;
while(P0_2==0);
}
voidt0(void)interrupt1using0
mstcnt++;
if(mstcnt==8)
mstcnt=0;
P1=dispcode[dispbuf[dispbitcnt]];
P3=dispbitcode[dispbitcnt];
dispbitcnt++;
if(dispbitcnt==8)
dispbitcnt=0;
tcnt++;
if(tcnt==4000)
tcnt=0;
}
标题:
多位数码管动态显示定时器中断实现(C51)
·
*
作者:
wentao
日期:
2007.2.22
软件:
Keil
C51
V8.02
芯片:
AT89X51
说明:
实验板实测通过,数码管为8位共阳
声明:
自用存档!
另仅供需要的朋友参考,请勿用做不道德转载及商业用途!
**************************************************************************/
#include
#define
uchar
unsigned
char
uchar
code
dis_code[16]
=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
//段码表
//
0
1
2
3
4
5
6
7
//对应内容
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
8
9
a
b
c
d
e
f
data
i
0x00;
循环控制变量兼偏移量,初值为0
j
0xfe;
位码(选通各位数码管),初值为11111110
void
main()
{
P2
0xff;
关所有数码管
TMOD
0x01;
定时/计数器0工作于方式1
TH0
0xfc;
装载定时常数64536(fc18)
TL0
0x18;
EA
1;
开总中断
ET0
定时/计数器0允许中断
TR0
启动定时/计数器0
while
(1);
执行主程序,等待中断
}
time0(void)
interrupt
T/C0中断服务程序(延时1ms)
{
j;
位码送入P2口显示
P0
dis_code[i];
段码表中取值送P0口
_crol_(j,1);
位码循环左移1位选通下一数码管
i++;
偏移量加1取下一段码(循环控制加1)
&
0x07;
偏量增到8时自动归0(控制在0~7之间循环)
重新装载定时常数
旋转LED——飘在空中的文一.效果:
二.整体结构:
三.制作方法:
1.电机的改装
电路的供电和LED的定位是本制作的一个难点。
装在电机上的电路始终在高速旋转,我们就无法使用通常的方法来给电路供电。
但我们可以通过对电机的改造来解决。
我们都知道,一般的直流电机是线圈作为转子,而永磁体作为定子的。
他是通过电刷来实现给线圈供电的,而且直流电机的旋转需要交变的电流,这是由固定在转子轴上的换向器来巧妙的实现直流变为交流的。
我们的电路是固定在电机的转子上的,它和转子是保持相对静止的。
因此,我们可以从电机的转子中取得电源。
方法很简单,也就是从电机的换向器上用漆包线把电引到电路板上,经整流,滤波后给单片机电路供电。
换向器上的每个电极什么时候变化,是和电机转子的位子有关的,我们正好可以使用其中的一路信号来给LED显示的起始位置定位。
具体改装过程如下:
1)拆开电机(我使用的是录音机上的12V直流电机),注意拆的时候别弄坏了电机的电刷!
2)小心地从电机换向器上的三个电极引出三条漆包线
(由于我改装到这步时忘了拍照了,此图略)
3)取下电机外壳的含油轴承
4)我用原来装在电机上的皮带轮试了一下,正好可以放进拆掉含油轴承的地方,而且可以和外壳之间灵活旋转(运气不错!
大家也可以试试别的)。
于是我在这个上面钻了几个小孔,把那三条漆包线从小孔里穿出来。
从而可以用来保护漆包线在转子和定子结合出的安全。
(注意:
替代上去的部分是和转子保持固定,和外壳之间是可以旋转的)。
5)组装回整个电机,电机改装至此结束
2.电路
电路结构的安排见上面整体结构图,需要注意的是要安排好电机轴两边的电路重量尽量相近。
3.程序
程序很简单,我这里给出一个C51的示例程序,大家可以按自己的需要来改,做成旋转时钟等什么的。
/*******************************************************************
名称:
旋转LED
作者:
章健
日期:
2006.1.5
*******************************************************************/
#include
#defineucharunsignedchar
voiddelay();
ucharzimo[16]={0xff,0x7d,0x00,0x7d,0xff,//字母“I”
0xc7,0x83,0xc1,0x83,0xc7,//心形图案
0xff,//用来搁开心形图案和字母U
0x03,0xfd,0xfd,0xfd,0x03};
//字母“U”
//0xc9,0xb6,0xb6,0xb6,0xc9};
voidmain()
{TCON|=0x01;
//外部中断0下降沿触发
IE=0x81;
//开中断
voiddelay()//延时子程序,延时长短请根据的你的电机转速进行调整
{ucharj;
for(j=0;
j<
255;
j++)
{;
voiddisplay()interrupt0//中断处理
{uchari;
for(i=0;
i<
16;
i++)
{P1=zimo[i];
delay();
P1=0xff;
纯手工打造摇摆LED时钟
看到市场上正在流行的时尚商品——摇摆LED时钟,感觉非常新颖独特,正在玩单片机的我,激起了自己也想DIY一个的冲动。
不就是一个流水灯吗?
有什么难的?
!
于是,一个单片机项目就这样开始了。
然而动手以后才知道问题并非想象那样简单,因没有任何现成的资料,机械的、电子的和编程的问题一大堆,一个一个需要自己来解决。
经历二十多天的苦战和无数次的修改与调试,作品终于完成,基本达到预先要求。
现将制作资料整理出来,与广大DIY爱好者分享。
一.整体方案
本制作是根据视觉暂留原理,让一排8只LED作往复运动,在空中呈现八个字符的显示屏,可显示数字或英文字符。
开机后先显示“Welcome!
”欢迎字符(见图1),再进入时钟显示状态。
显示屏同时显示“时”、“分”、“秒”信息,用“:
”分隔(见图2)。
图1开机画面
图2运行状态
显示分“正常运行”、“调分”和“调时”三种状态。
当处于调整状态时,调整的项会闪现,以便识别。
为此,设置三个调整按键,一个为“状态键”,一个为“加法键”,一个为“减法键”。
(见图3)
图3按键的设置
图4音圈电机组件
摇棒的动力部分采用从废旧硬盘拆下的音圈电机(见图4),驱动采用直流电机驱动方式。
结构方面,将音圈电机直接安装在万用板上,将万用板的四周用四根螺柱与一透明有机板结合成一体,构成支撑摇棒底座。
(见图5,图6)。
图5万用板与有机板构成底座
图6底座侧面
二.实作要点
1.主板的结构布局见图7。
图7主板布局
图8摇棒上的LED
2.LED的焊接,将LED两脚跨接在电路板两端的方式进行焊接。
使LED紧密排列在一起。
3.摇棒上的LED与主板上的信号用柔性排线连接,音圈电机供电占2位,LED信号传输占9位,所以至少要11位的排线。
(见图9)
图9排线与拉簧
图10拉簧
4.为保持摇棒的平衡,在摇棒接近旋转轴的两端加装两只拉簧,这两只拉簧的规格尽量保持一致,弹性强弱要适中,最好可多找几种规格的试试。
(图9,图10)
5.采用驱动直流电机正反转的方式,驱动音圈电机来回摆动。
让电机正、反转的方法很多,最典型的是H桥电路驱动,H桥电路原理见图11,常见的是用三级管代替图中的开关。
图11H桥驱动原理
为了简化电路,最好采用H桥功能的集成电路。
这种IC很多,比如象TA7257,TA8429H,L6203等,这里用的是三菱公司的M54544AL(见图12)。
IC各脚定义见图13。
图12电机驱动IC
图13M56544AL各脚定义
6.电原理图见图14。
图14电原理图
7.完成图见图15。
图15完成图
三.软件设计
1.摇棒的启动
为了使摇棒从静止状态过度到正常运行状态,在正式显示前加一启动程序。
其实质就是逐渐加快驱动的频率,一直到摇棒正常摆动为止。
通过下面的代码实现
do{
mm++;
Delay(120+mm);
put1=~put1;
put2=~put2;
}while(mm<
60);
Delay(20);
//根据实际情况确定延时值
2.秒闪现的实现:
数字或字符的闪现是通过变量Ms和数组w[]实现的,如需要八位字符中的间的第4位闪现,则w[3]=1。
这是通过全局变量Ms在voidtimer0(void)函数中每隔一秒改变一次状态(0或1),打开或关闭显示。
if(Ms*w[ii-3]==1)P2=0xff;
elseP2=~ASCIIDOC[v[ii]*6+jj];
//正向显示
if(Ms*w[10-ii]==1)P2=0xff;
elseP2=~ASCIIDOC[v[13-ii]*6+5-jj];
//反向显示
3.调试中发现,显示屏上的字符并不是一样宽的(见图16),仔细分析是由于摇棒在运动中,一直受力,而且所受的力是随时变化的。
为方便精确调整显示,特别作了一个显示中断表Tr[],改变显示LED的时间段,协调显示效果。
图16调整前的显示
4.按键去抖程序
按键的去抖采用软件编程实现,其方法是当检测到按键的接口出现低电平后,隔一段时间再检测,如还是低电平,则确认为有效,否则无效。
具体的程序是通过函数unsignedcharChKey(bitKey)完成的。
5.显示同步
因没有位置传感器,显示同步完全靠时钟中断来确定。
这样就有一个问题,音圈电机的驱动信号在什么时刻改变,显示才能保持在中间,并能保证正反显示能很好地重合。
经实际观察,音圈电机的驱动信号在显示中部,要根据具体情况细调。
由程序中的变量Ta调试确定。
6.完整C51程序代码
/*
POV摇摆显示LED钟C51程序
周正华编
2008.3.19
*/
/*硬件端口定义*/
sbitset0=P0^1;
sbitset1=P0^0;
sbitset2=P0^2;
sbitput1=P3^6;
sbitput2=P3^7;
/*时钟用数组*/
unsignedcharBUFFER[]={0,0,0,0};
unsignedcharmaxnum[]={59,23};
/*显示数组*/
unsignedintv[14];
unsignedintw[8];
/*显示中断表*/
intcodeTr[]={
2000,2000,2000,2000,2000,2000,
2550,2500,2450,2400,2350,2300,
2250,2200,2150,2100,2050,2000,
1950,1900,1850,1800,1750,1700,
1650,1600,1550,1500,1450,1400,
1400,1450,1500,1550,1600,1650,
1700,1750,1800,1850,1900,1950,
2000,2050,2100,2150,2200,2250,
2300,2350,2400,2450,2500,2550,
};
/*字符字模*/
unsignedcharcodeASCIIDOC[]=//ASCII
{
0x7C,0x8A,0x92,0xA2,0x7C,0x00,//-0-00
0x00,0x42,0xFE,0x02,0x00,0x00,//-1-01
0x46,0x8A,0x92,0x92,0x62,0x00,//-2-02
0x84,0x82,0x92,0xB2,0xCC,0x00,//-3-03
0x18,0x28,0x48,0xFE,0x08,0x00,//-4-04
0xE4,0xA2,0xA2,0xA2,0x9C,0x00,//-5-05
0x3C,0x52,0x92,0x92,0x8C,0x00,//-6-06
0x80,0x8E,0x90,0xA0,0xC0,0x00,//-7-07
0x6C,0x92,0x92,0x92,0x6C,0x00,//-8-08
0x62,0x92,0x92,0x94,