单片机应用系统设计实例
#include <INTRINS.H> uchar _crol_(uchar a,uchar n);
/*函数原型,左循环*/
/*函数原型,右循环*/
uchar _cror_(uchar a,uchar n);
#include <INTRINS.H> uchar _crol_(uchar a,uchar n); uchar _cror_(uchar a,uchar n); void main(void) { uint a = 0xfe; while(1) { P1=a; delay(5000); a=_crol_(a,1); } } /*函数原型*/ /*函数原型,右循环*/
公选课
——《单片机基础及应用》
设计实例
1、用1个LED发光二极管,设计一个循环闪烁的指示 灯。
2、用8个LED发光二极管,设计一个循环闪烁的流水 灯。 4、通过定时,精确控制P1.0闪烁500ms。
3、通过设置中断,改变灯的循环方向,控制灯的亮灭。
5、以秒为单位,用LED数码管显示当前计数值。
void int0(void) interrupt 0 { uchar a=0xfe,i=16; P1=0x0; delay(5000); P1=0x0ff; delay(5000); P1=0x0; delay(5000); P1=0x0ff; delay(5000); do { P1=a; delay(5000); a=_cror_(a,1); }while(i--); }
void delay(uint t);
//声明函数
void delay(uint t) //延时0.1*t毫秒 { uint i; do { for(i=0;i<10;i++) ; } while(t--); }
void main(void) { while(1) { P1_0=0; delay(5000); P1_0=1; delay(5000); } }
4)相关的特殊功能寄存器
TCON
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
IE0/IE1:外部中断申请标志位: =0:没有外部中断申请; =1:有外部中断申请。
IT0/IT1:外部中断请求的触发方式选择位: =0:在INT0/INT1端申请中断的信号低电平有效; =1:在INT0/INT1端申请中断的信号负跳变有效.
h g f e d c b a
a f e d g b c h
☞比如要显示“0” 须令a b c d e f 为“0” 电平,g h为“1”电平。
共阳极
累加器 A h g f e d c b a
1 1 0 0 0 0 0 0
0C0H = “0”
管脚识别小技巧: 用万用表测一下就可以了。数码管分为共阴极 和共阳极。以共阴极为例: 先用万用表的正极(对于数字万用表为红色表 笔)放在某一个管脚,另外一个负极依次去测 量其他管脚。若没有一个管脚亮,说明正极接 的是公共端(COM)。若亮,根据发光位置 就可以判断引脚了,正极接的是相应的段码端 (a,b,c,……,dp),负极为对应数码管 的公共端(C1,C2)。
灯的循环闪亮控制 中断初始化
3)延时功能 4)中断服务程序设计
3.2软件设计
中断初始化
触发方式设置 中断允许控制
中断服务程序设计
中断初始化 IT0=1; EA=1; EX0=1;
中断服务程序
函数名()interrupt n [using m ] { } Void int0(void) interrupt 0 /* 外部中断0的服务函数定义,使用第二组工 作寄存器组*/
4、通过定时,精确控制闪烁 500ms。 针对任务一进行操作。
使用定时器T0 1)设置定时器工作方式 2)计算初始值 3)编写初始化程序 4)编写中断服务程序
1)设置定时器工作方式
TMOD
GATE C/T M1 0 0 0 M0 GATE C/T M1 M0 0 0 0 0 1
2)计算初始值
晶振12Mhz 1 Tp=12 1个机器周期: 12 10
定时50ms,需要计数:
6
1 s
50 103 50000 1
定时器初始值:
65536 50000 15536 0 x3CB0
定时500ms,需要中断10次。
3)编写初始化程序
2、用8个LED发光二极管,设计一 个循环闪烁的流水灯。
2.1硬件设计
2.2软件设计
1)初始化
51头文件、宏定义 灯的循环闪亮控制 延时子程序设计
2)主程序,即main()程序
3)延时功能
如何进行灯的循环闪亮控制? intrins.h 内部函数库 (包含变量循环移位、位操作等函数) 需要将该函数包含进来,同时对函数 原型进行声明。
TMOD=0X01; TH0=0X3C; TL0=0XB0; EA=1; ET0=1; TR0=1;
4)编写中断服务程序
Void timer0(void) interrupt 1 { TH0=0x3c; TL0=0xb0; i++; if(i==9) { i=0; P1_0=~P1_0; } }
@ 共阳数码管每个段笔画是用低电平(“0”)点亮, 共阴数码管段笔画是用高电平(“1”)点亮
要显示某个字形,就应使此字形的相应 断码的二极管点亮,实际就是送一个用 不同电平组合代表的数据字(显示码) 来控制LED的显示,此数据称为字符的 段码或字形码。 共阴极和共阳极LED显示器段码不同。
共阳LED数码管: 公共端(字位) 接高电平, 笔划(字段) 置为低电平 就被点亮了
2)日常中断的例子
你正在专心看 书,突然电话铃响, 于是你记下正在看的 书的页数,去接电话, 接完电话后再回来接 着看书。
3)计算机中的中断概念
中断是指由于某种随机事件(甲方) 的发生,计算机(乙方)暂停现行程 序的运行,转去执行另一程序,以处 理发生的事件,处理完毕后又自动返 回原来的程序继续运行。 将能引起中断的事件称为中断源。 CPU现行运行的程序称为主程序。 处理随机事件的程序称为中断服务 子程序。
IE
EA —
ET2
ES
ET1 EX1 ET0 EX0
EX0/EX1位: 分别是INT0/INT1的中断允许控制位: =0 时禁止中断; =1 时允许中断。 EA:总的中断允许控制位(总开关): =0 时禁止全部中断;=1 时允许中断。
3.2软件设计
1)初始化
51头文件、宏定义
2)主程序,即main()程序
5.2软件设计
1)定时中断服务程序 定时50ms,中断20次为1秒 每中断20次,计数1次。 2)显示程序 将显示数值分为:个位、十位、 百位、千位,分别查表显示。
初始化:
uchar code a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x 7d,0x07,0x7f,0x6f}; //段码组合,共阴极 uchar m=0; //计数循环变量 uint n=0; //计数值
定时中断服务程序
void timer0(void) interrupt 1 { TH0=0x3C; TL0=0xB0; m++; if(m==19) {m=0; n++; P1_0=~P1_0; } }
显示程序
void display(void) { P2=0xf7,P0=a[n%10]; delay(20); P2=0xfb,P0=a[n%100/10]; delay(20); P2=0xfd,P0=a[n/100%10]; delay(20); P2=0xfe,P0=a[n/1000]; delay(20); }
1、用1个LED发光二极管,设计一 个循环闪烁的指示灯。
如何设计硬件和软件?
1.1硬件设计
注意:在接下来的仿真中,省略时钟及复位电路。
1.2软件设计
1)初始化
51头文件、宏定义 灯的亮灭控制 延时子程序设计
2)主程序,即main()程序
3)延时功能
#include <at89X52.h> #define uint unsigned int #define uchar unsigned char
4位一体共阴极LED数码管管脚分布如图所示:
5.1硬件设计
如果每个LED上要显示的数字不同, 那么它在同一时刻是不能同时显示 的。 用这种数码管都是动态显示的。 (可以到网上去看下动态显示)
比如4个LED上要显示"1234"(假 设是共阴极连接)
4个LED上显示"1234"(假设共阴极连接) 过程如下: 首先选种第一个LED(即上面 C1='0',C2='1',C3='1',C4='1') 送LED要显示的数据(abcdefg=“0110000”), 如果要显示小数点dp='1' 再延时一段时间(注意不能过长,不然看到的连续 显示的现象了,下面一样) 再选择第二个LED(即上面 C1='1',C2='0',C3='1',C4='1') 送LED要显示的数据(abcdefg="1101101")如 果要显示小数点dp='1' 再延时一段时间 接下来是第三、第四个LED也一样。