1. 单片机原理与实验
定时器的时钟频率为12MHz/12=1MHz,则定时器计数器计1个数为1us,所以2ms为2000,因为计数器是向上计数模式,所以65536-2000=63536=0xF830
void Timer0_Init(void)
{
TMOD|=0x01; //16位定时器模式
ET0=1; //定时器0中断允许
TH0=0xF8; //定时2ms 2000-2ms
TL0=0x30;
TR0=1; //开始计时
}
void Timer0_Interrupt(void) interrupt 0
{
TH0=0xF8; //重装载
TL0=0x30;
if(P1^0 == 1) P1^0 = 0;
else P1^0 = 1;
}
2. 单片机计数器实验
做计数器实验,不需要开中断,T1设为计数模式,脉冲由P3.5口进入。
TR1 = 1;是单片机自己在运行
3. 单片机流水灯实验原理
上一节我们介绍了什么是总线的方法,以及如何通过十六进制来控制IO口。并把我们的之前单点操作的流水灯进行了改进,成为了一个新的更加简洁的程序。这回,就再用总线方法,来实现流水灯的更加多样化的操作。
这次,我们要实现正向流水结束后再反过来流水,如此循环。然后再间隔闪烁。然后再累积流水,最后结束。
正向流水结束,再反过来。这个如何实现呢,我们需要使用到一些运算方法。
第一个是移位指令<<。
由于数字对比不强,看的不是很清晰,所以把数字给换成红色了。
<<这个标志符的意思是,向左移动一位,就像下边这样:
1111 1111》1111 111_
移动完成后,会发现,最低位空出来了,此时程序会自动去填补一个0。于是就成了:
1111 1111》1111 111_》1111 1110
第一次移位1111 1110,第二次在第一次基础上移位1111 1100,第三次在第二次基础上移位1111 1000,如此循环,就可以一直把所有位都变成0。
我们在看下一句"|",这个符号是或的意思,我们知道,逻辑中的或,是说只要有其一为一,结果就是一。所以,我们把1100|0001,结果就是头两个一和最后一个一留下来,第三位因为都是0,所以就是0.结果就是1101了。当再次移位后,数据就变成1010了,我们再次跟0001取或,最后一位就再次置1,结果就是1011,从结果上看,1110》1101》1011……就是0在不断的左移。
通过这个方法,可以让每一位都会单独置零。然后再给以一定时间的延时,就会看到流水灯了。
如果我们不赋初值0xfe会出现什么情况?
就会出现,移位产生一个0,在或运算时就会被重新置1,如此循环,就进入不到第二个LED,也就不会出现流水灯了。可以自己尝试下。
向右流水,效果是一样的,需要注意的是初值更改为左侧为0,就是0x7f,0111 1111,然后移位符号>>,还有取或的语句需要用0x80,1000 0000.
基本上是在左移位的基础上稍作修改即可。
接下来是闪烁的。
闪烁,我们用的是间隔LED的方法,就是隔一个亮一个,端口输出是1010 1010。翻译成十六进制就是0xaa。这次用到的是一个取反的运算,就是把每一位的0变成1,1变成0,然后延时一段时间,再次取反,循环几个周期,就看起来像是不断闪烁。取反的操作相对好理解一些,就是这一位,现在是1,那么取反后就是0,就是0和1的变换。
最后是一个累积点亮LED。
这个程序就是把第一个我们向左移位的函数,进行了更改,取消了赋初值,不用取或了,这样就可以对比着理解,各个语句的作用,如果不使用,会产生什么结果。如果我们的第一个函数不用取或这一步,那最终输出结果就和这个现象一样了。
所以,我们在写程序时,需要认真,仔细分析自己需要的结果,然后对照程序进行简单的演算。保证每一段都是可以输出想要的结果,不然累积到最终,几百行的代码,看起来就会头疼的,尤其是在没有标注释的情况下,有时就会忘记自己为什么要写这一句。
好的,这篇先说到这里,有问题或建议可以留言或私信给我。
想了解更多精彩内容,快来关注小亮谈电气
更多多内容,欢迎关注百家号:小亮谈电气。微信公众号:电气学苑。
4. 单片机秒表显示实验中,提高计时精度的方法有哪些
单片机秒表显示实验中,提高计时精度的方法只有一个(因晶振频率误差也影响计时精度,但是不能调,所以,这不能算一个方法),就是调整定时器的计数的初始值。
都认为,计数的初始值就是按定时的时间计算出来,应该是最精确的,这一点,的确对。但是,定时器中断后,影响中断,需要用时间的,到再计重写时间初始值就是多余的,就这一点点时间,就是影响计时精度的原因。
不过,这点计时误差,必须是计时的时间很长,比如,经过一天以上,或经过十天以上的积累才能测出来。
所以,先把计算出来的计数
初始值增加8,经过测量,然后在这个基础上再一点一点调整。或增或减小。
有一点,必须强调,就是定时器的中断程序的第一行就必须是重写时间常数,否则,误差会更大。
5. 单片机实验 编写程序
单片机实验,其实这就是典型的流水灯电路,P1口接8个流水灯,每个灯点亮1秒。用定时器T1定时50ms,中断20次就为1秒,可用_crol_()移位函数实现。仿真效果如下图所示。
6. 单片机实验数据排序
原发布者:瀚海湛蓝
实验一、数据排序实验一、实验目的熟悉8031指令系统,掌握程序设计方法。二、实验内容编写并调试一个排序子程序,其功能为用冒泡法将内部RAM中几个单元字节无符号的正整数,按从小到大的次序重新排列。三、实验程序框图NNN四、实验步骤1把8032片内RAM区50H—5AH中放入不等的数据(用寄存器读写方法)。2用连续运行方式从起始地址0100H开始运行程序(输入0100后按EXEC键)。3排序结束,显示“P.”。4用寄存器读写方法检查50—5AH中内容应从小到大排列。五、参考程序DORDE:MOVSP,#60H;设置栈指针MOVR3,#50HDORDE1:MOVA,R3MOVR0,A;数据指针传送到R0MOVR7,#0AH;长度送到R7CLR00H;清零标志位MOVA,@R0DORDE2:INCR0MOVR2,ACLRC;清零进位标志MOV22H,@R0CJNEA,22H,DORDE3;是否相等SETBCDORDE3:MOVA,R2JCDORDE4;小于或等于不交换SETB00HXCHA,@R0DECR0XCHA,@R0;大于交换位置INCR0DORDE4:MOVA,@R0DJNZR7,DORDE2JB00H,DORDE1;未完继续MOVR0,#7EH;完,关显示器前三位MOVA,#0FFHMOVR4,#06HDORDE5:MOV@RO,ADECR0DJNZR4,DORDE5MOV7EH,#0CH
7. 单片机汇编矩阵键盘实验(扫描法)
关于扫描按键的原理,可以看下面这篇文章。
本文以循序渐进的思路,引导大家思考如何用最少的IO驱动更多的按键,并依次给出5种方案原理图提供参考。在实际项目中我们经常会遇到有按键输入的需求,但有的时候为了节省资源成本,我们都会选择在不增加硬件的情况下使用最少的控制器IO驱动更多的按键,那么具体是怎么做的呢,下面我们就以用5个IO引脚为例,讲下怎么设计可以实现更多的按键?共有5种设计思路,下面依次介绍。
首先通常想到的可能是下面这样的设计:
这样我们可以先识别K01、K02、K03、K04、K05,若没有按键按下然后再和思路四的设计一样去识别其他按键。但这样存在一个问题,如果IO1配置为0,IO5读到0,那么怎么知道是K51按下还是K05按下呢,这里只需要在程序里做下判断,先判断下是不是K05按下,若不是就是K51,因为按键K01、K02、K03、K04、K05在5个IO口都为读取的情况下,就可以识别,不需要扫描识别处理,相当于这5个按键优先级高与其他按键。
总结
综合上述,5个IO口最多可以识别25个按键,思路五程序上处理比较麻烦,若实际中只按思路四设计,也可识别20个按键,那么如果有N个IO口可识别多少按键呢?这里给出如下公式:
假设有N个IO口按照思路三可以识别N*(N-1)/2个;
按照思路四可识别N*(N-1)个;
按照思路5可以识别N*(N-1)+N个。
最后再说下,如果实际设计时,还是按思路四设计好,软件也没那么麻烦。如果是你的话你会选择哪种方法呢?你还有没有其他的设计方法呢?
8. 单片机中断实验交通灯的实验原理
根据图3.2电路,用单片机的IO口控制4组红绿黄共12个发光二极管,使发光二极管按照一定规则与次序发光与闪亮以实现模拟交通灯的功能。假设初始状态为:(南北通行状态)南北绿灯、东西红灯(25s);后转为过度状态:南北黄灯、东西红灯(5s);再转为东西通行状态:东西绿灯、南北红灯25(s)。再转为过渡状态:东西黄灯、南北红灯(5s),然后循环往复。
要求采用定时器实现所需要的定时时间。
2、键控交通灯。
按一下K1键
,保持南北通行状态;按一下K2键
,保持东西通行状态;按一下K3键
,保持正常交通灯。
要求在中断中进行按键处理。
3、具有闪烁的交通灯。
在2的基础上增加,绿灯最后5s闪烁,即亮0.5S灭0.5S闪烁。
四、实验原理图
图3.2交通灯实验电路原理图
图3.2共有4个按键K1、K2、K3、K4,分别连接到单片机P2.0、P2.1、P2.2、P2.3引脚,按键后对应引脚为低电平,通过4个二极管D17、D18、D19、D20连接到P3.2(外部中断0),这是二极管构成的相与电路,即任意按一个键能在P3.2上产生一个低电平或下降,作为中断触发信号。
五、软件设计思想
1、定时思想。
采用定时器T0或T1的方式1定时500ms,每500ms中断进行计数,计数10次即0.5s,计数20次即1s,对秒计数实现所需要的定时时间。
2、亮灯控制思想。
单片机控制灯引脚与灯对应如下,0点亮。
一共有四种状态S0、S1、S2、S3,
a、南北通行S0状态:
南北绿灯、东西红灯,P0=11110111=0xf7,P1=10011110=0x9e;
南北通行S0
b、过渡状态S1:
南北黄灯、东西红灯,P0=11111011=0xfb,P1=10101110=0xae;
过渡状态S1
c、东西通行状态S2:
东西绿灯、南北红灯,P0=11111100=0xfc,P1=11110011=0xf3;
东西通行状态S2
d、过渡状态S3:
东西黄灯、南北红灯,P0=11111101=0xfd,P1=01110101=0x75;
过渡状态S3
设置一个秒计数单元SEC每秒+1,设置两个控制值变量a,b。