单片机听课笔记Word下载.docx
- 文档编号:3705773
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:17
- 大小:43.50KB
单片机听课笔记Word下载.docx
《单片机听课笔记Word下载.docx》由会员分享,可在线阅读,更多相关《单片机听课笔记Word下载.docx(17页珍藏版)》请在冰点文库上搜索。
中断17
6:
中断控制的跑表18
第一次课
keil绿色版本的安装
D:
\keil\uv4\uv4.exe
File-licensemanagement-CID复制
Keygen.exe粘帖,获取Key。
注册LicenseADDLIC
看到注册成功。
proteus7.5安装
\Proteus75\BIN\ISIS.EXE
双击LICENCE.EXE
Install,ok了
第一个工程
flashled画图
选择元器件-P-89c51在device框双击at89c51
同理,选取LED-yello
选择Termailmode–选择POWER,先单击放置好,双击修改+2.4v
保存画好的图。
Keil建立工程:
Project-Newuvsionproject-选择刚才新建的文件夹,取一个名字
对话框DeviceSelectfortarge1-=》选择atmelat89s51=》Yes
File-New保存flashled.c
双击soursegroup1选择flashled.c单击ADD然后单击CLOSE
Targe1右击,选择operationfortarge1,出现operationfortarge1对话框,选择output选项卡,勾选creathexfile确定
把程序代码写好。
F7
0Error0Warning
Proteus里面双击cpuprogramfile里面打开flashled.hex文件。
确定。
第二次课
工作电压:
at89s514.5-5.5v5v
变压器220---7.5v交流,整流,滤波,稳压芯片7805
Pic,stcLow系列3.3v功耗小,lm1117-3.3,
单片机的主频:
振荡频率?
?
从振荡电路来?
从非门来.频率?
晶振选频..传递电压的固定某个频率的音叉?
常用频率12M,24M,11.0592M。
复位电路:
Pin9RST,2us以上的高电平,就可以复位。
最小系统已经完成。
电源的正负极之间要接两个电容,100u以上的电解电容,0.1u的瓷片电容。
10M以上的干扰信号为主,则使用104(0.1u)的瓷片电容,100M以上的,用个103的瓷片电容。
晶振的稳定电容30p左右。
Pin31EA脚要接高电平,设置为从内部的rom启动。
检查错误:
电源,2:
振荡,Pin18,正弦波,2.5v左右。
Pin31,
3引脚相关
51单片机的引脚输出电流的能力很弱,输出电流的时候,内阻很大很大很大,30K。
如果要输出高电平,负载要100K以上,输出电流只能到15uA左右。
51单片机输入电流的能力比较强,可以达到10mA左右。
第三次课
1流水灯
画图流水灯:
元器件的选取同上次,排阻:
res10灯:
led-barg排阻要设置一下,阻值300,digital
程序里面:
while(!
=0)i--;
当。
。
只要为真,就执行后面的语句i是unsignedint,16位,最大65535;
Sbit:
注释见程序。
<
首先把要移位的数据转换成二进制,左移一次,最高位被移走,最低位(右边)补0。
3while
while(?
)当?
不为假,就是真的,?
===1,1.5,2:
真,?
===6>
3真。
就一定会执行后面的循环体{};
直到为假。
Times=8;
while(Times!
=0){…..Times--;
}
要点亮的灯,清零,熄灭的灯置位。
11111110表示P1.0亮。
现在点亮P1.1,把灯的缓冲数据左移一位,PTemp<
=1;
11111100
如果希望P1.0现在熄灭,PTemp|=0x0100000001B
反之,如果要反方向移动,01111111。
然后右移PTemp>
>
=1,变成了00111111
如果希望P1.7熄灭,PTemp|=0x80;
10000000
数组
无规律的数据,有序存取。
unsignedcharLedCode[元素个数]={元素0,元素1,,,};
怎样取出某个元素?
LedCode[4];
3:
非门驱动:
7404,7406,uln2003,
三极管驱动:
pnp:
9012,8550,A91(贴片),npn:
9013,8050,A41(贴片)
动态扫描的硬件原理
当P2口通过限流电阻接到两个数码管并联的共阴段码,单片机两个引脚P30,P31分别通过非门接到左右两个共阳极.如果P30=0,P31=1,左边数码管点亮,显示P2口所送的数据。
延时一段时间之后,P30=1,P31=0,右边点亮,显示p2口所送的数据。
当两边不停切换的时候,两个数码管可以轮流显示不同的数据,当切换的频率足够高的时候,由于人眼的视觉暂留,看上去两个数码管同时点亮。
两个数码管首先要全部熄灭。
P30=1;
P31=1;
送其中一个数码管的段码,P2=?
;
点亮这个数码管;
P30=0;
延时时间Delay();
熄灭这个数码管;
6:
重复2—5点亮另外一个数码管。
7:
注意:
Delay时间必须保证每个数码管在0.1s内必须被点亮一次。
每个数码管的点亮方式都是先保证所有数码管熄灭,再送数据,再点亮,延时,再熄灭,目的是确保数据显示清晰,不会互相干扰。
2延时程序怎么看时间
:
targe1右键单击,operations。
Targe选项卡,Xtal:
12M;
UseOnChipRom打勾;
F7编译后,Ctrl+F5仿真
在程序中,Delay被调用的地方,前面行号位置双击,加入红色的断点。
F5全速跑,程序的黄色光标会跑到断点,停下来
在左边的regester窗口可以看到Sec,记录当前时间。
按下F10,或者单击StepOver图标1次,就会跑完delay子程序。
8:
记录当前Sec时间,减去刚才的时间,就是Delay的时间。
3放置标签的方法
proteus单击LBL,再单击需要放置标签的导线,会弹出对话框,输入标签名字。
相同标签名的导线,相当于导通。
显示驱动的写法:
自己研究。
第五次课
按键弹起检测
While(PKey==0);
如果按键没有弹起,就空跑。
Cpu没有执行任何有效代码。
动态扫描就无法工作,结果为黑屏。
While(PKey==0)Display();
如果按键没有弹起,就会继续显示。
因为已经检测到了按键按下,所以显示会+1;
弹起的时候,没有反应。
按键消抖
如果发现按键按下,则延时20-50ms;
避过抖动期。
然后再判断是否有按键按下。
可以避免弹起的抖动。
因为动态扫描必须时刻执行,所以,程序中,不能有独立的延时程序,所有的延时程序全部用display()替换。
键盘扫描驱动程序
驱动一定要有输出,或者输入。
主函数调用驱动程序,只需要关心对方的输入输出,也叫接口。
键盘程序返回的KeyCode值,在使用了之后,要记得清零。
变量命名大写英文开头,引脚定义如果是整个端口,建议用#definePDisP1这种方法,如果是某个端口定义,建议用sbitPLed0=P1^0;
这种方法。
函数的参数
调用延时函数:
Delay();
调用了一个函数。
数学里面:
sin(x)=y;
y=sin(x);
sin(x);
sin(x):
表示计算了一次x的sin值,结果并没有给任何变量。
y=sin(x);
表示计算了一次x的sin值,结果给了y;
x叫参数,也叫自变量,不由sin决定。
同理,Delay(5);
5:
作为参数传递给对方,让对方做一定次数的延时操作。
如果需要函数有返回值,比如,y=sin(x);
或者KeyCode=KeyScan();
则,keyScan函数里面要有return来返回一个数据给KeyCode;
switch()case{};
switchcase语句,一定要default分支。
行列键盘:
行送1111列送0000==0xf0检查PKey==0xf0获得行值,
随后,行送0000列送1111,获得列的值;
恢复Pkey=0xf0;
第7次课
没有笔记
第8次课
数码管每一位显示需要10ms,完整显示一次4位需要40ms,重复10次完整显示需要0.4s.
10次完整显示之后,熄灭0.4s,再次显示0.4s,熄灭0.4s.
unsignedchari;
i=10;
while(i--){完整显示一次。
}i=10;
while(i--){延时40ms;
}
键盘检测与闪烁的关系
如果每次闪烁之后检测键盘,键盘迟钝!
原因是每一闪烁需要0.8s。
检查键盘的频率太低。
我们每40ms检测一次键盘,就可以实时检测到按键。
于是,在闪烁程序中的显示和熄灭40ms后面各检测一次按键。
i=10;
KeyCode=KeyScan();
}i=10;
KeyCode=KeyScan();
如果刚刚进入完整显示的时候,发现按键按下,获得keycode;
一直等待到结束才处理按键,不行。
原因有二:
程序随后还会继续做keyscan();
如果这个时候没有按键按下,keycode=0。
如果keycode能够立刻存储,但是,要等最多0.8s才能退出flashdisplay程序。
在显示方面,明显迟钝。
解决方法:
一旦发现keycode不为0,立刻return,退出flashdisplay程序,到主函数去做累加数据处理。
还可以不return,直接把主函数的数据处理放在flashdisplay中做好。
主函数就不需要做数据处理了。
会执行10次循环
中断
外部中断,EX0,P32口。
做了相应的配置后,如果P32有了下降沿,就会导致中断。
cpu就会暂停当前操作,转而执行一个中断子程序。
中断子程序执行结束后,返回去执行刚才未执行的操作。
打开这个功能。
EnableExternalInterrupt0EX0=1;
下降沿使能IT0=1;
总开关打开,EnableAll;
EA=1
中断子程序:
voidFunEX0(void)interrupt0{}
中断控制的跑表
中断按键的消抖为中断专门写一个延时程序,IDelay();
中断不具体去管理跑表的工作,只是修改一个标志位,IsRun;
主函数每过0.2s检测一次标志位,根据标志位决定是否跑。
Sum是否++;
于是,Sum能够每个0.2s做++的操作。
第9次课
4*4keys的中断
4行线初始值为高电平,4列线为低电平。
把行线接入4与门电路,当任何一个按键按下,会把相应的行线拉低,与门输出低电平,与门输出接P32中断。
则,低电平会导致中断。
只要有按键按下,就会导致中断。
所以,不需要键盘定时扫描。
中断程序中,先延时,消抖,然后获得行值,行列翻转,获得列值,然后再翻转恢复原值。
输出行列值。
主函数只执行显示程序,不停显示行列键盘值。
用中断解决动态扫描的显示问题
Timer/Counter:
定时计数器
要让定时器可以接受送来的脉冲,C/T=0;
TR0=1;
Gate0=0;
当TMOD=0x01;
就可以实现Timer0接受1MHz脉冲,并送给TH0TL0;
为16位的存储单元。
于是,当脉冲数量到达65536个的时候,TH0TL0溢出变成了0;
导致中断。
TMOD=0X01;
ET0=1;
EA=1;
设置好了中断0的工作模式为16位定时器。
逻辑分析仪的窗口:
Ctrl+F5,进入仿真状态,单击逻辑分析仪图标,单击setup按钮,单击右上角New新建按钮,输入引脚符号P1_0,如果还有其他引脚需要分析,再次单击新建按钮,输入引脚符号。
单击close
单击run,过几秒中,单击stop。
查看逻辑分析窗口。
如果需要获得某个频率的波形,则需要修改中断溢出的时间。
修改方法是,给TH0TL0预先赋初值,于是,只需要(65536-初值)的时间就会溢出,中断。
比如,需要50ms的溢出时间,65536-50000=15536,16进制,0x3cb0。
0x3c给TH0,0xb0给TL0。
每次溢出都必须重新赋初值。
第10次课:
定时器中断显示:
定时器每隔10ms中断一次,每次只熄灭一个数码管,并点亮一个数码管,因为数码管端口电平会锁存住,无需再管理,直到下一次中断熄灭它。
消耗时间20us内。
这样,大多数的时间都在跑主函数。
定时器程序里面的注意事项:
不要做大量的运算。
{PLed3=1;
PSEG=LedCode[Seg0];
//01111111//111110011
PLed0=0;
Timer0InterruptTimes++;
}
定时器做延时和键盘检测的方法
键盘的中断检测由外部中断Int0完成。
Ex0发现有按键按下,只发出一个通知告诉所有程序,有按键了,并且是第一次检测到按键。
“IsKeyPressed=1;
IsFirst=1”
定时器在自己的中断中,检测Iskeypressed;
发现有按键按下,并且是第一次发现,则把第一次改为非第一次,Isfirst=0;
然后不管了。
定时器在下一次中断中,也就是过了约20ms后,也会检测到IsKeyPressed=1;
并且发现不是第一次检测到,IsFirest=0,说明目前已经过了消抖期。
可以检测具体的按键了。
If(P32==0)sum++;
键盘检测结束后,iskeypressed=0;
第11次课
8*8点阵显示
测试点阵的方法:
从proteus的GeneratorMode中,选择Dclock信号源,输出一个方波,接点阵的任意脚,点阵另外一端接地,看运行结果,如果没有任何灯亮,说明接反了。
驱动方法:
逐行点亮,比如:
每行低电平点亮,则,从第一行到第7行逐行送低电平,每送一行低电平,相应的列要送数据码。
数据码来源:
字模3软件。
驱动功率:
如果行送低电平点亮,则每行的最大输出电流为8*10mA=80mA,行电流很大。
驱动的芯片必须是大功率的。
比如:
unl2003,tip127。
第12次课
屏幕上下滚动的方法:
显示一定的时间后,让第0行显示第1行的数据,第1行显示第2行的数据。
第6行显示第7行的数据。
相当于往上滚动了一行。
第7行要显示的是第0行的数据,才能循环滚动。
(当前行+滚动的行数)%8就可以实现了。
某屏显示n次后,滚动行+1,n越大,滚动的速度就越慢。
74138译码器实现的方法:
ABC三线接P10,11,12,只要P1口的这三根线从000到111循环变化,则,138的Y0到Y7就逐个输出低电平,输出的低电平接1k欧姆电阻送pnpTip127的B极,点阵的行低电平驱动脚接Tip127的E极,Tip127的C极接地即可。
更好的方法是:
138输出Y口接非门,接电阻,接Tip122的B极,Tip122的C极接点阵的行低电平驱动脚,Tip122的E极接地。
220v1000w48欧姆
PWM脉冲宽度调制。
定时器50ms中断一次,3cb0,总宽度循环变化=0~19,循环变化1次是50*20=1000ms,每当宽度为0的时候,我就输出1,10的时候,我就输出0电平,输出的脉冲占空比50%,如果,每当宽度为0的时候,我就输出1,5的时候,我就输出0电平,输出的脉冲占空比25%,
voidfuntimer()interrupt1
{
if(++Times>
=20)
Times=0
if(Times==0)
Pout=1;
if(Times==5)
Pout=0;
第13次课
步进电机:
1.步进电机的工作原理
该步进电机为一四相步进电机,采用单极性直流电源供电。
只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。
图1是该四相反应式步进电机工作原理示意图。
图1四相步进电机步进示意图
开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相
绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。
当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。
而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。
依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。
四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。
单四拍与双四拍的步距角相等,但单四拍的转动力矩小。
八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。
第14次课
步进电机的驱动过程:
送总的步数,totalsteps,送方向。
确定当前是否已经停下来了。
驱动的速度解决方法是:
每次送一个step的时间间隔。
一个很重要的参数:
currenstep:
当前的位置。
有了currenstep,就可以根据方向,确定下一次送的数据。
驱动过程:
每次进入定时器中断,检查Totalsteps是否为0,如果不为0,则先自减1,然后,检查方向,根据方向,确定当前的step:
currenstep++,或者currenstep--(循环加减),随后,送数据currenstep到驱动口,驱动电机。
如果发现totalsteps已经为0了,则,把定时器关了。
TR0=0;
第15次课
1602
1602的接口:
电源电压5v不能接反,3脚为对比度控制脚,可以通过可调电阻接电源正负脚,也可以直接用100欧姆电阻接地。
数据脚得第7脚为忙信号脚,要记得定义。
hardware.h硬件定义的头文件,头文件的前面一定要#ifndef#defin#endif,确保只被包含一次。
包含的方法是在需要使用hardware.h头文件中的配置信息的程序中,单个引脚的硬件配置sbitPClk=P1^0;
整个P口:
#definePDataP0
另外,必须包含reg51.h文件。
lcd1602.hlcd1602.c这个驱动的头文件。
.c文件中的函数的声明;
.h文件中,不建议定义变量。
更不能在.h文件里面定义函数。
对应.c文件需要用的的常量在这里定义。
4:
lcd1602.c所有和驱动1602相关的函数在这里定义。
驱动程序的嵌入方法:
建好工程,写好main.c文件,拷贝lcd1602.c.hhardware.h文件到工程文件夹中。
在sourcegroup上双击添加lcd1602.c文件。
main.c文件内要包含hardware.hlcd1602.h文件。
在main函数中,对lcd1602初始化,设置显示位置,送字符或字符串显示。
第16次课
ds18b20:
单总线,1-wire设备,每一个设备都有一个唯一的ID号,Rom值,可以用来区分多个挂在一条总线上的单总线设备。
复位时序:
单片机拉低480-960us,然后,单片机拉高,单片机等待15-60us后,ds18b20会送出一个60-240us宽度的低电平,叫存在脉冲。
单片机从拉高到下一次发送任何指令,时间至少480us。
ds18b20操作流程:
while(ResetPluse());
//复位并检测1820成功与否。
WriteCommandtoDS18b20(0xcc);
//跳过序列号
WriteCommandtoDS18b20(0x44);
//温度转换命令
//等待1s钟,让1820有时间转换温度
//再次复位
WriteCommandtoDS18b20(0xBE);
//读取温度指令Tempture=TemptureReadAndConvert();
//读取并转换温度
17课
热敏电阻测温:
热敏电阻串联一个固定电阻,1k欧姆,给串联在一起的两个电阻送一个电压5v,如果热敏电阻上的压降为1.7v,则热敏电阻为500欧姆。
所以,根据压降,可以获得阻值。
然后查表,获得温度。
温度表格:
0度—50度,每一度对应的阻值写出来,作为数组:
TemptureRes[0]--TemptureRes[50]的这51个元素。
ADC0809:
5/250V:
0.02v
18课
分辨率8位表示可以精确到1/256*Vref,大多数单片机自带的AD为10位.分辨率越高,价格越贵.同时,对参考电源的要求越高.
CLK:
可以从单片机来,当单片机的晶振为12M的时候,51单片机的ALE就输出500KHz的脉冲,ADC0809的输入脉冲为最高800Khz,实际情况下,一般单片机设置为6M,ALE输出250KHz信号给ADC0809的CLK脚。
如何驱动:
先设置好输入选择端,CBA三个脚设置,如果把0809的ALE设置为高电平,则,自动锁住。
启动AD转换,START脚送下降沿。
等待1ms,读数据脚。
19课
dac0832:
8位da转换,输出时间1us.电流输出型,需要外接运放转换为电压.
正弦波的输出:
生成表格数据.0—4-8……..生成列,然后转换为弧度,求sin值,+1偏移,*127,获得最大254,求整int.获得整数.复制后,在word中,表格转换为文本,Ctrl+H,,查找文本框中输入^p,替换为,产生数据表作为数组。
数组的名字前面补上code。
检查nop的个数和频率的关系。
正弦波,平滑滤波。
2021课:
串口:
串口的通信速率:
常用300bps,600,1200,2400,4800;
固定速率来源于定时器1工作在模式2,8位自动重装,溢出后,会自动把TH1TL1;
不需
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 听课 笔记