单片机.docx
- 文档编号:26152244
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:25
- 大小:155.38KB
单片机.docx
《单片机.docx》由会员分享,可在线阅读,更多相关《单片机.docx(25页珍藏版)》请在冰豆网上搜索。
单片机
关于单片机我学到了什么?
1:
流水灯
1.189C51单片机内部资源:
2:
256字节的RAM(数据存储器);
3:
flash(4KB)用于存放程序、数据和表格;
4:
4个并口(每个八位);
5:
1个串口;
6:
2个16bit定时器.
1.28951单片机引脚及其功能:
1:
Vcc(40脚):
+5V,Vss(20脚):
接地端;
2:
输入/输出端口P0、P1、P2和P3
P0:
地址/数据总线;
P1:
准双向通用I/O口;
P2:
扩展外部存储器时,当作地址总线使用;
P3:
多用途端口.
1.3常用psw字符标志:
CY:
进位标志。
有进位/借位时置1
AC:
半进位标志。
D3->D4进位/借位时置1
OV:
溢出标志。
带符号数超出-128~127置1,乘法结果超过255,除数为0
P:
奇偶标志。
A中的1的个数为奇数
F0:
用户设置标志
RS1,RS0:
通用寄存器选择位,在存储器组织部分介绍
1.4ROM和RAM各指什么,有什么功能?
程序存储器
ROM型(只读):
程序,表格常数
当PC超过4KB,自动转1000H~FFFFH(片外)
数据存储器
RAM型(读,写):
数据暂存,运算结果,标志位,堆栈
各管脚及其功能
LED1~LED8:
P1.0~P1.7
SW1~SW6:
P0.0~P0.5
Key(6个按键的公共端):
P3.2
数码管a~dp:
P2.0~P2.7
数码管DS1~DS6共阳极:
P0.0~P0.5
蜂鸣器:
P0.6
AD:
CLK~P2.1(DO:
P3.7,DI:
P3.6,CS:
P3.5
SPEAKER/继电器(由P6控制):
P0.7
温度传感器DS18B20:
P3.5
2:
高级流水灯
2.1查表的含义:
查表就是在单片机的只读存储区(ROM)定义一个数组,然后通过程序的不断调用数组里的数实现查表的功能。
2.2code的功能:
code将一个变量或者数组定义到单片机的只读存储区,不占用RAM的空间。
2.3比较与实验1的相同与不同之处:
实验一所实现的只是简单的左移右移,而实验二则通过查表的方法实现更多花样的流水灯,实验一是用延时的方法来控制,实验二则用定时器的方法来控制。
2.4比较led2.c、led_timer.c的异同:
相同点:
都是运用查表的方法来控制流水灯的运行。
不同点:
led2.c是通过延时函数来控制,执行程序的时候延时函数需要不断的运行,而led_timer.c是通过定时器来控制,只有定时器计数到65535的时候才执行一次定时器中断函数,相较而言比较省资源。
2.5定时器的使用及相关概念;
如何利用74LS161来构建定时器?
答:
只要知道脉冲的频率就可知道定时器的定时周期,从而构建定时器。
8位定时器的定时范围?
16位呢?
答:
8位:
0~25516位:
0~65535
定时周期是什么?
答:
定时周期就是定时器执行一圈所花费的时间。
2.6中断的使用及相关概念;
如何开启中断?
答:
先开启全局中断,然后根据需要再开启定时器中断,外部中断或者串口中断。
中断函数与普通函数的区别与联系?
答:
普通函数在主函数内会不断执行,而中断函数则不会一直执行,只有定时器计数计满之后才会执行定时器中断函数,只有外部中断被触发后才会执行外部中断函数。
什么是中断屏蔽寄存器、中断标志寄存器?
答:
当不想执行中断时可以用中断屏蔽寄存器屏蔽中断,以不执行中断函数;中断标志寄存器用来记录中断。
什么是定时器?
答:
若知道震荡周期,知道定时器定时周期,定时器开始计数直道计满溢出,就达到定时的功能
用定时器有什么好处?
答:
定时器较普通延时函数来说,定时较准确,较节省资源。
什么是中断?
答:
举个例子,就好像你正在执行一个事件,但是有一个更高级别的事件要求你先执行,你必须中断正在做的事去做另一件事,这就是中断。
用中断有什么好处?
(节省资源)
2.7什么时候用定时器?
什么时候用延时指令?
答:
若要求延时比较精确的话或者延时比较长的话用定时器,若延时不要求精确或者延时较短的话用延时指令。
2.8.与使用延时指令相比,利用定时器有什么缺点?
答:
编程较麻烦。
2.9只有定时器才能产生中断吗?
答:
不是的。
中断除了定时器中断还有外部中断和串口中断,这两种中断都不需要定时器产生。
2.10可以用定时器但是不用中断吗?
答:
可以。
可以通过中断屏蔽寄存器将中断屏蔽掉。
2.11程序分析
#include"reg52.h"添加头文件
codeunsignedchartab[]={0x3c,0x81,0xc3,0xe7,0xff,0xe7,0xc3,0x81,0x00,//9
0x18,0x3c,0x7e,0xff,0x00,0xaa,0xaa,0xcc,//8
0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};定义只读数组
unsignedcharCount4ms;定义4ms计数器
unsignedcharShiftCount;数组计数
bitShiftFlag;程序执行标识符
voidT0_service(void)interrupt1//4ms中断函数
{
TH0=(65536-4000)>>8;记录起始数字高八位
TL0=(unsignedchar)(65536-4000);记录起始数字低八位
Count4ms=Count4ms+1;
if(Count4ms==100)计数4ms100次,定时为400ms
{
Count4ms=0;
ShiftFlag=1;程序标志位置一
}
voidmain()
{
//systeminitial
TMOD=0x01;//设置定时器0为工作模式1
TH0=(65536-4000)>>8;//定时周期为4000
TL0=(unsignedchar)(65536-4000);
TR0=1;//定时器使能
ET0=1;//定时器中断使能
EA=1;//开全局中断
//用户变量初始化
ShiftFlag=0;
ShiftCount=0;
while
(1)
{
if(ShiftFlag)
{
ShiftFlag=0;
P1=~tab[ShiftCount];轮流显示数组的内容
ShiftCount++;
if(ShiftCount>=33)//24+1=33
ShiftCount=0;
}
2.12定时器的四种模式
最常用的是模式1和模式2.
模式0:
13位计数器
模式1:
16位计数器
模式2:
自动在装入8位计数器
模式3:
定时器0:
分成两个8位计数器
定时器1:
停止计数
3:
倒计时
3.1程序设计思路:
生成自动每秒减一的变量sec
---利用定时器生成4ms周期中断;
---对4ms周期中断计数,得到1s脉冲(SecFlag)
---sec初值99,根据秒脉冲修改自动减一,为零后自动在回到99
数码管的显示
---把sec的十位、个位分别放入disp_buff[0/1]
---把disp_buff[0/1]的数字在DS1、DS2上显示出来
3.2功能演示&说明
数码管DS1、DS2显示2位十进制数
这个2位十进制数从99开始每秒减1
到0后又回到99,再开始递减
3.3程序分析:
3.3.1主循环
sec=99;
FillDispBuffer();
while
(1)
{
if(SecFlag)
ChangeTime();
}
3.3.2改变sec
voidChangeTime(void)
{
SecFlag=0;
sec=sec-1;
if(sec==255)
sec=99;
FillDispBuffer();
}
3.3.3中断服务子程序
voidT0_service(void)interrupt1
{
TH0=(65536-4000)>>8;
TL0=(unsignedchar)(65536-4000);
Count4ms=Count4ms+1;
if(Count4ms==250)
{
Count4ms=0;
SecFlag=1;
}
P0=Tab[disp_cnt];//disp
dat=disp_buff[disp_cnt];
P2=Tab1[dat];
disp_cnt=disp_cnt+1;
if(disp_cnt==2)
disp_cnt=0;
}
3.3.4数码管动态显示原理
工作原理:
DS1、DS2轮流点亮
P0.0为0时(P0输出FEH),Q1导通,电流通过Q1流入DS1的阳极;若要显示出0,则除了g、dp之外所有的段均点亮,故此时P2口应输出11000000=C0H(Tab1[0])
P0输出FEH时,DS1点亮,DS2熄灭
P0输出FDH时,DS1熄灭,DS2点亮
3.3.5数码管查找表的构建
0xC0,0xF9,0xA4,0xB0,0x99,//01234
0xc0:
11000000(仅g、dp熄灭,其他点亮)
0xf9:
11111001(仅b、c点亮)
0x92,0x82,0xF8,0x80,0x90,//56789
0x88,0x83,0xA7,0xA1,0x86,0x8E//AbcdEF
0x88:
10001000(d、dp熄灭):
显示A
0x83:
10000011(a、b、dp熄灭):
显示b
0xa7:
10100111(d、e、g点亮):
显示c
0xa1:
10100001(a、f、dp熄灭):
显示d
0x86:
10000110(b、c、dp熄灭):
显示E
0x8e:
10001110(b、c、d、dp熄灭):
显示F
3.3.6全局变量
#include"reg52.h"
bitSecFlag;
unsignedcharCount4ms;
unsignedchardisp_buff[2];
unsignedchardisp_cnt;//0..1
unsignedcharsec;
unsignedchardat;
codeunsignedcharTab[2]={0xfe,0xfd};
codeunsignedcharTab1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E};//;数码管显示字型表
3.3.7系统初始化
//initial
TMOD=0x01;
TH0=(65536-4000)>>8;
TL0=(unsignedchar)(65536-4000);
TR0=1;
ET0=1;
EA=1;
//
sec=99;
FillDispBuffer();
3.4改为999(或999999)秒的倒计时
程序如下:
#include"reg52.h"
bitSecFlag;
unsignedcharCount4ms;
unsignedchardisp_buff[6];
unsignedchardisp_cnt;//0..1
unsignedlongsec;
unsignedchardat;
codeunsignedcharTab[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
codeunsignedcharTab1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E};//;数码管显示字型表
voidT0_service(void)interrupt1
{
TH0=(65536-4000)>>8;
TL0=(unsignedchar)(65536-4000);
Count4ms=Count4ms+1;
if(Count4ms==250)
{
Count4ms=0;
SecFlag=1;
}
P0=Tab[disp_cnt];//disp
dat=disp_buff[disp_cnt];
P2=Tab1[dat];
disp_cnt=disp_cnt+1;
if(disp_cnt==6)
disp_cnt=0;
}
voidFillDispBuffer(void)
{
disp_buff[0]=sec/100000;
disp_buff[1]=(sec/10000)%10;
disp_buff[2]=(sec/1000)%10;
disp_buff[3]=(sec/100)%10;
disp_buff[4]=(sec/10)%10;
disp_buff[5]=sec%10;
}
voidChangeTime(void)
{
SecFlag=0;
sec=sec-1;
if(sec==4294967295)
sec=999999;
FillDispBuffer();
}
voidmain()
{
//initial
TMOD=0x01;
TH0=(65536-4000)>>8;
TL0=(unsignedchar)(65536-4000);
TR0=1;
ET0=1;
EA=1;
//
sec=999999;
FillDispBuffer();
while
(1)
{
if(SecFlag)
ChangeTime();
}
}
3.5999999秒倒计时流程图
4:
电子表
4.1设计思路
4.1.1生成时间:
hour/min/sec/年/月/日
利用定时器生成4ms周期中断;
对4ms周期中断计数,得到1s脉冲(SecFlag)
根据秒脉冲对sec、min、hour进行计数,切换按键,可对年月日进行计数。
4.1.2数码管的显示
把时分秒的十位、个位分别放入disp_buff[0~5]
把disp_buff[0~5]的内容在DS1~6显示
设置一个按键如0x20,取反,按下后切换到年月日计数。
4.1.3按键的扫描及处理
动态显示:
P0.0~P0.5轮流变低4ms(周期为24ms)
从P3.2读取按键状态,若没有按键按下,则P3.2=1
若有按键按下,则P3.2=0,若此时P0.0~P0.5那个为0,则是对应的按键(key1~key6)按下造成的,从而得到对应的按键
4.2功能说明
自动从00:
00:
00,开始计时
可以用按键Key1~6来调整时、分、秒的增加或减少
按键时,蜂鸣器响1s,闹钟响一分钟。
4.3程序分析
4.3.1中断服务子程序
A.生成秒脉冲标志SecFlag
按键去抖动+蜂鸣器自动关闭
KeyDownFlg为1说明有键按下
Beep_cnt加1,P0.6=0(蜂鸣器响)
若Beep_cnt加到100(400ms)则KeyDownFlg清0
KeyDownFlg=0,蜂鸣器不响
6个数码管的轮流显示(每个显示4ms)
B.流程图
1.中断子程序及闪烁和闹铃
图一
2.按键检测&处理DealKey
图二
3.改变时间ChangeTime
图三
C.程序
A.按键处理部分程序
voidDealKey(void)
{
KeyBuff=P0;
if(KeyDownFlg)
return;
if((KeyBuff&0x01)!
=0x01)//按下第一个按键,小时加1
hour=hour+1;
if((KeyBuff&0x02)!
=0x02)//…
hour=hour-1;
if((KeyBuff&0x04)!
=0x04)//…
min=min+1;
if((KeyBuff&0x08)!
=0x08)//…
min=min-1;
if((KeyBuff&0x10)!
=0x10)//00010000按下第五个键切换至年月日
{mid=hour;hour=year;year=mid;
mid=min;min=mon;mon=mid;
mid=sec;sec=day;day=mid;riqi=!
riqi;
min=CheckData(min,13);
sec=CheckData(sec,31);
}
if((KeyBuff&0x20)!
=0x20)//
{sec++;}
//checkdata校时
hour=CheckData(hour,24);
min=CheckData(min,60);
sec=CheckData(sec,60);
FillDispBuffer();
Beep_cnt=0;
KeyDownFlg=1;
}
B.主程序
voidmain()
{
//initial
disp_cnt=0;
Count4ms=0;
hour=6;
min=59;
sec=50;
//
TMOD=0x01;
TH0=(65536-4000)>>8;
TL0=(unsignedchar)(65536-4000);
TR0=1;
ET0=1;
EA=1;
4.3.2按键检测思路
按键与数码管显示的关系:
共用P0.0~5
动态显示,P0.0~5轮流变低,DS1~6轮流点亮;
没有按键按下,6个按键公共端P3.2(Key)为高(在主循环中检测);
有按键按下,Key变低
此时检测P0.0~5哪个为低,则对应的按键按下(在DealKey中处理)
4.3.3数码管显示&按键电路
图四
5:
串口
5.1功能
设置串口工作模式:
10位,9600bps
利用串口调试助手向单片机发送1字节的数据
单片机将该数据输出到P1口驱动LED,同时向PC机返回该数据
5.2:
程序分析
5.2.1:
串口中断服务函数
voidSerial_Service(void)interrupt4
{
if(RI)//接收中断
{
RI=0;
P1=SBUF;//MOVSBUF,P1
SBUF=P1;//MOVP1,SBUF
}
片内全双工UART
发TXD收RXDfullduplex
两个缓冲器(SerialBuffer)同一个地址99H
收发过程由UART管理,CPU操作的时间很少
5.2.2:
主函数
voidmain(void)
{
SCON=0x50;//01010000:
方式1(10位)、接收使能
TMOD=0x20;//模式2:
8位,溢出后自动加载
TH1=0xFD;//波特率9600bps11059200Hz/[12*(256-253)*32]=9600
TL1=0xFD;
TR1=1;//启动定时器1
ES=1;//串口中断使能
EA=1;//全局中断使能
while
(1)
{
}
}
5.2.3:
串口模式
10位:
1起始位(0)
8个数据位
1个停止位
波特率计算:
波特率=2SMOD定时器1溢出率/32
TH1=253,则定时器1溢出率=11059200/(12*6)=307200Hz
波特率=307200/32=9600
5.2.4:
串行口工作模式
模式0:
移位寄存器输入/输出
波特率固定:
fosc/12
模式1:
10位,波特率可变
波特率=2SMOD定时器1溢出率/32(被采用)
模式2:
11位,
波特率固定:
2SMOD×fosc/64
模式3:
11位,波特率可变
波特率=2SMOD定时器1溢出率/32
5.2.5:
串行口控制寄存器
SCON(SerialControlRegister)本实验为:
0x50
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0、SM1:
工作方式选择(modeselectbit)
SM2:
第九位方式控制
REN:
接收允许(ReceiveEnable)
TB8:
发送的第9位数据(TransmitBit8)
RB8:
接收的第9位数据(ReceiveBit8)
TI:
发送中断标志位(TransmitInterruptflag)
RI:
接收中断标志位(ReceiverInterruptflag)
(硬件置位)(软件清除)
5.2.6:
定时器工作模式2
模式2:
8位,溢出后自动加载
TH0->TL0
溢出率=fosc/[12*(256-TL0)]
TMOD=0x2001000000
5.3:
重要参数和指标
5.3.1:
波特率
每秒传送的二进制码的位数(比特数)位/秒
时钟频率比波特率高16倍或64倍
16倍:
16个检测脉冲
取7、8、9——采样脉冲三取二原则
收发方必须事先规定二件事
5.3.2:
同步
连续传送字符之间无间隙
同步字符数据…数据,循环冗余检验
时钟频率和波特率一致
发方:
除数据外,时钟信号同时传送
5.3.3:
异步
传送不连续,以字(字符)为单位
几部分:
起始位数据位奇偶校验位和停止位
数据位:
5、6、7、8位,最低位在前
奇偶位:
地址/数据
停止位:
1、1.5、2位均可,标志结束
5.4:
自己重新编写的发收程序:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机