一、硬件电路设计
(1)复位电路
复位是使单片机处于某种确定的初始状态。
单片机工作从复位开始。
在单片机RST引脚引入高电平并保持2个机器周期,单片机就执行复位操作。
复位操作有两种基本方式:一种是上电复位,另一种是上电与按键均有效的复位。
如图1所示为复位电路:
图1复位电路
开机瞬间RST获得高电平,随着电解电容C3的充电,RST引脚的高电平将逐渐下降。
若该高电平能保持足够2个机器周期,就可以实现复位操作。
根据经典电路选择参数,选取C3=10µF,R1=10KΩ。
(2)晶振电路
单片机的时钟信号通常有两种产生方式:一是内部时钟方式,二是外部时钟方式。
内部时钟方式是利用单片机内部的振荡电路产生时钟信号。
外部时钟方式是把外部已有的时钟信号引入到单片机内。
本次设计中,采用的是12MHz晶振,配上30pF的电容,构成谐振,这样有助于输出稳定的波形。
图2所示为晶振电路:
图2晶振电路
在单片机的XTAL1和XTAL2引脚外接石英晶体(简称晶振),作为单片机内部振荡电路的负载,构成自激振荡器,可在单片机内部产生时钟脉冲信号。
C1和C2的作用是稳定振荡频率和快速起振。
根据经典电路选择参数,本电路选用晶振12 MHz,C1=C2=33PF。
其中晶振周期(或外部时钟信号周期)为最小的时序单位。
(3)串口调试电路
二、程序设计
程序思路说明:只需要4个按键。
关于频率和占空比的确定,对于12M晶振,输出频率为1KHZ,这样定时中断次数设定为 10,即10MS 中断一次,则TH0=FF,TL0=F6;由于设定中断时间为10ms,这样可以设 * *定占空比可从1-99%变化。
即10ms*100=1s
#include<regx51.h>
#define uchar unsigned char
#define uint unsigned int
uchar timer0_tick,ZKB=1;//timer0_tick计数,ZKB占空比
uchar i=0,n=0,temp=0;
code
seven_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //1,2,3, 4, 5, 6, 7, 8, 9
code scan[2]={0xfd,0xfe};
uchar counter[2]={0,0};
sbit AN1=P3^2;//调整个位
sbit AN2=P3^3;//调整十位
sbit AN3=P3^4;//启动按键
sbit AN4=P3^5;//确认按键
void delay(uint z)//软件延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
static void timer0_isr(void) interrupt 1 using 0 //中断函数 { TR0=0;
TL0=(65536-10000)%256;
TH0=(65536-10000)/256;
TR0=1;
if (ZKB>99) ZKB=1;
if (ZKB<1) ZKB=99;
counter[0]=ZKB%10;
counter[1]=ZKB/10;
n++;
if(n==100)
{
n=0;
i++;
if(i==2) i=0;
P0=seven_seg[counter[i]];
P2=scan[i];
}
timer0_tick++;
if(timer0_tick++==100)
{
timer0_tick=0;
}
if(AN2==0)
{
delay(100);
if(AN2==0)
{
temp=1;
counter[0]++;
if(counter[0]==10) {
counter[0]=0; }
}
}
if(AN1==0)
{
delay(100);
if(AN1==0)
{
temp=1;
counter[1]++;
if(counter[1]==10) {
counter[1]=0; }
}
}
ZKB=counter[0]+counter[1]*10;
if(AN4==0)
{
delay(5);
if(AN4==0)
temp=0;
}
if(temp==1)
P3_7=0;// P3_7为脉冲输出引脚
else
{
if (timer0_tick<=ZKB) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
{
P3_7=1;
}
else
{
P3_7=0;
}
}
}
static void timer0_initialize(void)//中断初始化
{
EA=0;
timer0_tick=0;
TR0=0;
TMOD=0x01;
TL0=(65536-10000)%256;
TH0=(65536-10000)/256;
PT0=0;
ET0=1;
TR0=1;
EA=1;
}
void main(void)
{
STAR: delay(100);
if(AN3!=0) goto STAR;//按键3启动脉冲
timer0_initialize();
while(1);
}
//按按键3启动脉冲器,初始设置占空比为1%,按键1调整十位,
//按键2调整个位,一旦调整,输出为0,必须按确认键确认,
//输出正确脉冲.可以占空比1-99%任意调节。
三、学习单片机的体会
通过在单片机原理课程的学习我简单总结了几点心得和体会:第一:万事开头难,要勇敢的迈出第一步,不要总找借口说没有学习过就总推脱。
凡事都有第一步可以先可简单的来,然后可以逐步的向深层次学习。
可以从建项目开始,然后可以找一个简单的小程序先把它敲进单片机内然他运行起来,感觉一下单片机的运行,让自己了解单片机整个运行。
第二:对于知识点,学过的要掌握牢固,对于没有学的和暂时用不到的先不用学习。
比如:小灯得点亮就没有用到中断可以先不用看。
这样可以避免知识过多记不住的麻烦。
对于程序这里的知识点不能只停留在理论层次上,一定要结合着程序进行学习这样才能掌握的很牢靠,当用到哪里的知识点不记得了可以去看书,对于用不到的可以不去看。
第三:程序不要只是看别人得,一定要自己写过才是自己的。
开始不懂可以参考别人的,看看每一句代表着什么意思,能够实现什么现象。
明白之后自己再重新写一遍,你会发现看别人的能懂到自己写的时候很困难。
当你自己能写出来的时候说明你真懂了。
第四:一定要学会程序调试的方法。
有时候把程序写完了然后运行时不能实现理想的现象。
这时有人就晕了不知该怎么办,然后就去问别人。
当别人找出问题出在哪里时就会恍然大悟。
其实当遇到问题一定要自己尝试着解决,不
能遇到问题就去问别人。
自己一定要掌握解决问的方法和思路。
第五:在学习初期看别人的代码,学习别人的思路这个很有用。
通过看别人的代码特别是有多年编程经验的人的程序,可以迅速提高自己的编程水平。
也可以结合着别人的手法,与自己的想法结合在一起写出更好的程序。
但是切记将学习变成抄袭,不能认为抄袭别人的你就学会了,这样只能使你退步。
第六:面对一个新项目时,自己一定要多想想,不要急着去看别人是怎么写的。
有的人看到新项目时就去找别人的然后抄一小段,自己在写几句,放在一起完成任务,虽然省时间但不利你的学习。
当你遇到一新项目时你应该先想一下程序的构架,想想如何来完成。
然后自己动手去写,当你遇到实在是没办法解决的问题时再去请教别人,看他是怎么处理的,学习他的方法。
这样起码你自己想过了,有自己的思路不会受到别人的影响,这样更容易提高自己。
在单片机的学习开始时感觉很吃力,在不断的学习过程中慢慢的对单片机产生了些好感,而且在编写程序过程中吃力的感觉慢慢的淡了。
在这其中基础知识掌握牢固是非常重要的,然后在学习过程中要学会提问题和自己解决问题,慢慢的对于学习单片机你也会产兴趣。
虽然在开始学习单片机时感觉很青涩,但只要坚定自己的学习信心,在付出持之以恒的努力,我相信自己能进一步加深对单片机的了解,在单片机的学习道路上走得更远!。