学习单片机
目录
函数的使用和熟悉
实例3:用单片机控制第一个灯亮 (4)
实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (4)
实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (5)
实例6:使用P3口流水点亮8位LED (5)
实例7:通过对P3口地址的操作流水点亮8位LED (6)
实例8:用不同数据类型控制灯闪烁时间 (7)
实例9:用P0口、P1口分别显示加法和减法运算结果 (8)
实例10:用P0、P1口显示乘法运算结果 (9)
实例11:用P1、P0口显示除法运算结果 (9)
实例12:用自增运算控制P0口8位LED流水花样 (10)
实例13:用P0口显示逻辑"与"运算结果 (10)
实例14:用P0口显示条件运算结果 (11)
实例15:用P0口显示按位"异或"运算结果 (11)
实例16:用P0显示左移运算结果 (11)
实例17:"万能逻辑电路"实验 (11)
实例18:用右移运算流水点亮P1口8位LED (12)
实例19:用if语句控制P0口8位LED的流水方向 (13)
实例20:用swtich语句的控制P0口8位LED的点亮状态 (13)
实例21:用for语句控制蜂鸣器鸣笛次数 (14)
实例22:用while语句控制LED (16)
实例23:用do-while语句控制P0口8位LED流水点亮 (16)
实例24:用字符型数组控制P0口8位LED流水点亮 (17)
实例25:用P0口显示字符串常量 (18)
实例26:用P0口显示指针运算结果 (19)
实例27:用指针数组控制P0口8位LED流水点亮 (19)
实例28:用数组的指针控制P0口8位LED流水点亮 (20)
实例29:用P0、P1口显示整型函数返回值 (21)
实例30:用有参函数控制P0口8位LED流水速度 (22)
实例31:用数组作函数参数控制流水花样 (23)
实例32:用指针作函数参数控制P0口8位LED流水点亮 (23)
实例33:用函数型指针控制P1口灯花样 (25)
实例34:用指针数组作为函数的参数显示多个字符串 (26)
实例35:字符函数ctype.h应用举例 (27)
实例36:内部函数intrins.h应用举例 (27)
实例37:标准函数stdlib.h应用举例 (28)
实例38:字符串函数string.h应用举例 (29)
实例39:宏定义应用举例2 (29)
实例40:宏定义应用举例2 (30)
实例41:宏定义应用举例3 (30)
中断、定时器
实例42:用定时器T0查询方式P2口8位控制LED闪烁 (31)
实例43:用定时器T1查询方式控制单片机发出1KHz音频 (31)
实例44:将计数器T0计数的结果送P1口8位LED显示 (32)
实例45:用定时器T0的中断控制1位LED闪烁 (33)
实例46:用定时器T0的中断实现长时间定时 (34)
实例47:用定时器T1中断控制两个LED以不同周期闪烁 (34)
实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 (36)
实例49:用定时器T0的中断实现"渴望"主题曲的播放 (36)
实例50-1:输出50个矩形脉冲 (39)
实例50-2:计数器T0统计外部脉冲数 (40)
实例51-2:定时器T0的模式2测量正脉冲宽度 (40)
实例52:用定时器T0控制输出高低宽度不同的矩形波 (41)
实例53:用外中断0的中断方式进行数据采集 (42)
实例54-1:输出负脉宽为200微秒的方波 (43)
实例54-2:测量负脉冲宽度 (43)
实例55:方式0控制流水灯循环点亮 (44)
实例56-1:数据发送程序 (45)
实例56-2:数据接收程序 (47)
实例57-1:数据发送程序 (47)
实例57-2:数据接收程序 (49)
实例58:单片机向PC发送数据 (50)
实例59:单片机接收PC发出的数据 (51)
数码管显示
实例60:用LED数码显示数字5 (52)
实例61:用LED数码显示器循环显示数字0~9 (52)
实例62:用数码管慢速动态扫描显示数字"1234" (53)
实例63:用LED数码显示器伪静态显示数字1234 (54)
实例64:用数码管显示动态检测结果 (54)
实例65:数码秒表设计 (56)
实例66:数码时钟设计 (58)
实例67:用LED数码管显示计数器T0的计数值 (62)
实例68:静态显示数字“59” (63)
键盘控制
实例69:无软件消抖的独立式键盘输入实验 (64)
实例70:软件消抖的独立式键盘输入实验 (64)
实例71:CPU控制的独立式键盘扫描实验 (65)
实例72:定时器中断控制的独立式键盘扫描实验 (68)
实例73:独立式键盘控制的4级变速流水灯 (71)
实例74:独立式键盘的按键功能扩展:"以一当四" (73)
实例75:独立式键盘调时的数码时钟实验 (75)
实例76:独立式键盘控制步进电机实验 (79)
实例77:矩阵式键盘按键值的数码管显示实验 (82)
实例78:矩阵式键盘按键音 (85)
实例79:简易电子琴 (86)
实例80:矩阵式键盘实现的电子密码锁 (92)
液晶显示LCD
实例81:用LCD显示字符'A' (96)
实例82:用LCD循环右移显示"Welcome to China" (99)
实例83:用LCD显示适时检测结果 (102)
实例84:液晶时钟设计 (106)
一些芯片的使用24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 红外遥控
实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 (112)
实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 (117)
实例87:对I2C总线上挂接多个AT24C02的读写操作 (124)
实例88:基于AT24C02的多机通信读取程序 (129)
实例88:基于AT24C02的多机通信写入程序 (133)
实例90:DS18B20温度检测及其液晶显示 (144)
实例91:将数据"0xaa"写入X5045再读出送P1口显示 (153)
实例92:将流水灯控制码写入X5045并读出送P1口显示 (157)
实例93:对SPI总线上挂接多个X5045的读写操作 (161)
实例94:基于ADC0832的数字电压表 (165)
实例95:用DAC0832产生锯齿波电压 (171)
实例96:用P1口显示红外遥控器的按键值 (171)
实例97:用红外遥控器控制继电器 (174)
实例98:基于DS1302的日历时钟 (177)
实例99:单片机数据发送程序 (185)
实例100:电机转速表设计 (186)
模拟霍尔脉冲 (192)
//实例1:用单片机控制第一个灯亮
#include
void main(void)
{
P1=0xfe; //P1=1111 1110B,即P1.0输出低电平
}
//实例2:用单片机控制一个灯闪烁:认识单片机的工作频率#include
/
函数功能:延时一段时间
/
void delay(void) //两个void意思分别为无需返回值,没有参数传递{
unsigned int i; //定义无符号整数,最大取值范围65535
for(i=0;i<20000;i++) //做20000次空循环
; //什么也不做,等待一个机器周期
}
/
函数功能:主函数(C语言规定必须有也只能有1个主函数)
/
void main(void)
{
while(1) //无限循环
{
P1=0xfe; //P1=1111 1110B,P1.0输出低电平
delay(); //延时一段时间
P1=0xff; //P1=1111 1111B,P1.0输出高电平
delay(); //延时一段时间
}
}
//实例3:将P1口状态分别送入P0、P2、P3口:认识I/O口
的引脚功能
#include
/
函数功能:主函数(C语言规定必须有也只能有1个主函数)
/
void main(void)
{
while(1) //无限循环
{
P1=0xff; // P1=1111 1111B,熄灭LED
P0=P1; // 将P1口状态送入P0口
P2=P1; // 将P1口状态送入P2口
P3=P1; // 将P1口状态送入P3口
}
}
//实例4:使用P3口流水点亮8位LED #include
/
函数功能:延时一段时间
/
void delay(void)
{
unsigned char i,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++)
;
}
/
函数功能:主函数
/ void main(void)
{
while(1)
{
P3=0xfe; //第一个灯亮
delay(); //调用延时函数
P3=0xfd; //第二个灯亮
delay(); //调用延时函数
P3=0xfb; //第三个灯亮
delay(); //调用延时函数
P3=0xf7; //第四个灯亮
delay(); //调用延时函数
P3=0xef; //第五个灯亮
delay(); //调用延时函数
P3=0xdf; //第六个灯亮
delay(); //调用延时函数
P3=0xbf; //第七个灯亮
delay(); //调用延时函数
P3=0x7f; //第八个灯亮
delay(); //调用延时函数
}
}
//实例7:通过对P3口地址的操作流水点亮8位LED
#include
sfr x=0xb0; //P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机
//的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作
/
函数功能:延时一段时间
/
void delay(void)
{
unsigned char i,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++)
; //利用循环等待若干机器周期,从而延时一段时间
}
/
函数功能:主函数
/
void main(void)
{
while(1)
{
x=0xfe; //第一个灯亮
delay(); //调用延时函数
x=0xfd; //第二个灯亮
delay(); //调用延时函数
x=0xfb; //第三个灯亮
delay(); //调用延时函数
x=0xf7; //第四个灯亮
delay(); //调用延时函数
x=0xef; //第五个灯亮
delay(); //调用延时函数
x=0xdf; //第六个灯亮
delay(); //调用延时函数
x=0xbf; //第七个灯亮
delay(); //调用延时函数
x=0x7f; //第八个灯亮
delay(); //调用延时函数
}
}
//实例8:用不同数据类型控制灯闪烁时间
#include
/
函数功能:用整形数据延时一段时间
/
void int_delay(void) //延时一段较长的时间
{
unsigned int m; //定义无符号整形变量,双字节数据,值域为0~65535 for(m=0;m<36000;m++)
; //空操作
}
/
函数功能:用字符型数据延时一段时间
/
void char_delay(void) //延时一段较短的时间
{
unsigned char i,j; //定义无符号字符型变量,单字节数据,值域0~255 for(i=0;i<200;i++)
for(j=0;j<180;j++)
; //空操作
}
/
函数功能:主函数
/
void main(void)
{
unsigned char i;
while(1)
{
for(i=0;i<3;i++)
{
P1=0xfe; //P1.0口的灯点亮
int_delay(); //延时一段较长的时间
P1=0xff; //熄灭
int_delay(); //延时一段较长的时间
}
for(i=0;i<3;i++)
{
P1=0xef; //P1.4口的灯点亮
char_delay(); //延时一段较长的时间
P1=0xff; //熄灭
char_delay(); //延时一段较长的时间
}
}
}
//实例9:用P0口、P1 口分别显示加法和减法运算结果
#include
void main(void)
{
unsigned char m,n;
m=43; //即十进制数2x16+11=43
n=60; //即十进制数3x16+12=60
P1=m+n; //P1=103=0110 0111B,结果P1.3、P1.4、P1.7 口的灯被点亮
P0=n-m; //P0=17=0001 0001B,结果P0.0、P0.4的灯被熄灭
}
//实例10:用P0、P1口显示乘法运算结果
#include
void main(void)
{
unsigned char m,n;
unsigned int s;
m=64;
n=71;
s=m n; //s=64 71=4544,需要16位二进制数表示,高8位送P1口,低8位送P0口
//由于4544=17 256+192=H3 16 16 16+H2 16 16+H1 16+H0
//两边同除以256,可得17+192/256=H3 16+H2+(H1 16+H0)/256
//因此,高8位16进制数H3 16+H2必然等于17,即4544除以256的商
//低8位16进制数H1 16+H0必然等于192,即4544除以256的余数
P1=s/256; //高8位送P1口,P1=17=11H=0001 0001B, P1.0和P1.4口灭,其余亮
P0=s%256; //低8位送P0口, P3=192=c0H=1100 0000B,P3.1,P3.6,P3.7口灭,其余亮
}
//实例11:用P1、P0口显示除法运算结果
#include
void main(void)
{
P1=36/5; //求整数
P0=((36%5) 10)/5; //求小数
while(1)
; //无限循环防止程序“跑飞”
}
//实例12:用自增运算控制P0口8位LED流水花样
#include
/
函数功能:延时一段时间
/
void delay(void)
{
unsigned int i;
for(i=0;i<20000;i++)
;
}
/
函数功能
/
void main(void)
{
unsigned char i;
for(i=0;i<255;i++) //注意i的值不能超过255
{
P0=i; //将i的值送P0口
delay(); //调用延时函数
}
}
//实例13:用P0口显示逻辑"与"运算结果#include
void main(void)
{
P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口
while(1)
; //设置无限循环,防止程序“跑飞”
}
//实例14:用P0口显示条件运算结果
#include
void main(void)
{
P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=0000 1000B
while(1)
; //设置无限循环,防止程序“跑飞”
}
//实例15:用P0口显示按位"异或"运算结果#include
void main(void)
{
P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1)
; //设置无限循环,防止程序“跑飞”
}
//实例16:用P0显示左移运算结果
#include
void main(void)
{
P0=0x3b<<2;//将左移运算结果送P0口,P0=1110 1100B=0xec
while(1)
; //无限循环,防止程序“跑飞”
}
//实例17:"万能逻辑电路"实验
#include
sbit F=P1^4; //将F位定义为P1.4
sbit X=P1^5; //将X位定义为P1.5
sbit Y=P1^6; //将Y位定义为P1.6
sbit Z=P1^7; //将Z位定义为P1.7
void main(void)
{
while(1)
{
F=((~X)&Y)|Z; //将逻辑运算结果赋给F
;
}
}
//实例18:用右移运算流水点亮P1口8位LED #include
/
函数功能:延时一段时间
/
void delay(void)
{
unsigned int n;
for(n=0;n<30000;n++)
;
/
函数功能:主函数
/
void main(void)
{
unsigned char i;
while(1)
{
P1=0xff;
delay();
for(i=0;i<8;i++)//设置循环次数为8
{
P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0
delay(); //调用延时函数
}
}
}
//实例19:用if语句控制P0口8位LED的流水方向#include
sbit S1=P1^4; //将S1位定义为P1.4
sbit S2=P1^5; //将S2位定义为P1.5
/
函数功能:主函数
/
void main(void)
{
while(1)
{
if(S1==0) //如果按键S1按下
P0=0x0f; //P0口高四位LED点亮
if(S2==0) //如果按键S2按下
P0=0xf0; //P0口低四位LED点亮
}
}
//实例20:用swtich语句的控制P0口8位LED的点亮状态#include
sbit S1=P1^4; //将S1位定义为P1.4
/
函数功能:延时一段时间
/
void delay(void)
{
unsigned int n;
for(n=0;n<10000;n++)
;
}
/
函数功能:主函数
/
void main(void)
{
unsigned char i;
i=0; //将i初始化为0
while(1)
{
if(S1==0) //如果S1键按下
{
delay(); //延时一段时间
if(S1==0) //如果再次检测到S1键按下
i++; //i自增1
if(i==9) //如果i=9,重新将其置为1
i=1;
}
switch(i) //使用多分支选择语句
{
case 1: P0=0xfe; //第一个LED亮
break;
case 2: P0=0xfd; //第二个LED亮
break;
case 3:P0=0xfb; //第三个LED亮
break;
case 4:P0=0xf7; //第四个LED亮
break;
case 5:P0=0xef; //第五个LED亮
break;
case 6:P0=0xdf; //第六个LED亮
break;
case 7:P0=0xbf; //第七个LED亮
break;
case 8:P0=0x7f; //第八个LED亮
break;
default: //缺省值,关闭所有LED
P0=0xff;
}
}
}
//实例21:用for语句控制蜂鸣器鸣笛次数#include
sbit sound=P3^7; //将sound位定义为P3.7
/
函数功能:延时形成1600Hz音频
/
void delay1600(void)
{
unsigned char n;
for(n=0;n<100;n++)
;
}
/
函数功能:延时形成800Hz音频
/
void delay800(void)
{
unsigned char n;
for(n=0;n<200;n++)
;
}
/
函数功能:主函数
/
void main(void)
{
unsigned int i;
while(1)
{
for(i=0;i<830;i++)
{
sound=0; //P3.7输出低电平
delay1600();
sound=1; //P3.7输出高电平
delay1600();
}
for(i=0;i<200;i++)
{
sound=0; //P3.7输出低电平
delay800();
sound=1; //P3.7输出高电平
delay800();
}
}
}
//实例22:用while语句控制LED #include
/
函数功能:延时约60ms (3 100 200=60000μs)
/
void delay60ms(void)
{
unsigned char m,n;
for(m=0;m<100;m++)
for(n=0;n<200;n++)
;
}
/
函数功能:主函数
/
void main(void)
{
unsigned char i;
while(1) //无限循环
{
i=0; //将i初始化为0
while(i<0xff) //当i小于0xff(255)时执行循环体
{
P0=i; //将i送P0口显示
delay60ms(); //延时
i++; //i自增1
}
}
}
//实例23:用do-while语句控制P0口8位LED流水点亮#include
/
函数功能:延时约60ms (3 100 200=60000μs)
/
void delay60ms(void)
{
unsigned char m,n;
for(m=0;m<100;m++)
for(n=0;n<200;n++)
;
}
/
函数功能:主函数
/
void main(void)
{
do
{
P0=0xfe; //第一个LED亮
delay60ms();
P0=0xfd; //第二个LED亮
delay60ms();
P0=0xfb; //第三个LED亮
delay60ms();
P0=0xf7; //第四个LED亮
delay60ms();
P0=0xef; //第五个LED亮
delay60ms();
P0=0xdf; //第六个LED亮
delay60ms();
delay60ms();
P0=0xbf; //第七个LED亮
delay60ms();
P0=0x7f; //第八个LED亮
delay60ms();
}while(1); //无限循环,使8位LED循环流水点亮
}
//实例24:用字符型数组控制P0口8位LED流水点亮#include
/
函数功能:延时约60ms (3 100 200=60000μs)
/
void delay60ms(void)
{
unsigned char m,n;
for(m=0;m<100;m++)
for(n=0;n<200;n++)
;
}
/
函数功能:主函数
/
void main(void)
{
unsigned char i;
unsigned char code Tab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义无符号字符型数组
while(1)
{
for(i=0;i<8;i++)
{
P0=Tab[i];//依次引用数组元素,并将其送P0口显示
delay60ms();//调用延时函数
}
}
}
//实例25:用P0口显示字符串常量
#include
/
函数功能:延时约150ms (3 200 250=150 000μs=150ms
/
void delay150ms(void)
{
unsigned char m,n;
for(m=0;m<200;m++)
for(n=0;n<250;n++)
;
}
/
函数功能:主函数
/
void main(void)
{
unsigned char str[]={"Now,Temperature is :"}; //将字符串赋给字符型全部元素赋值
unsigned char i;
while(1)
{
i=0; //将i初始化为0,从第一个元素开始显示
while(str[i]!='\0') //只要没有显示到结束标志'\0'
{
P0=str[i]; //将第i个字符送到P0口显示
delay150ms(); //调用150ms延时函数
i++; //指向下一个待显字符
}
}
}
//实例26:用P0 口显示指针运算结果
#include
void main(void)
{
unsigned char p1, p2; //定义无符号字符型指针变量p1,p2
unsigned char i,j; //定义无符号字符型数据
i=25; //给i赋初值25
j=15;
p1=&i; //使指针变量指向i ,对指针初始化
p2=&j; //使指针变量指向j ,对指针初始化
P0= p1+ p2; // p1+ p2相当于i+j,所以P0=25+15=40=0x28
//则P0=0010 1000B,结果P0.3、P0.5引脚LED熄灭,其余点亮while(1)
; //无限循环,防止程序“跑飞”
}
//实例27:用指针数组控制P0口8位LED流水点亮#include
/
函数功能:延时约150ms (3 200 250=150 000μs=150ms
/
void delay150ms(void)
{
unsigned char m,n;
for(m=0;m<200;m++)
for(n=0;n<250;n++)
;
}
/
函数功能:主函数
/
void main(void)
{
unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char p[ ]={&Tab[0],&Tab[1],&Tab[2],&Tab[3],&Tab[4],&Tab[5],
&Tab[6],&Tab[7]};
unsigned char i; //定义无符号字符型数据
while(1)
{
for(i=0;i<8;i++)
{
P0= p[i];
delay150ms();
}
}
}
//实例28:用数组的指针控制P0 口8 位LED流水点亮#include
/
函数功能:延时约150ms (3 200 250=150 000μs=150ms
/
void delay150ms(void)
{
unsigned char m,n;
for(m=0;m<200;m++)
for(n=0;n<250;n++)
;
}
/
函数功能:主函数
/
void main(void)
{
unsigned char i;
unsigned char Tab[ ]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,
0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,
0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,
0xE7,0xDB,0xBD,0x7E,0x3C,0x18,0x00,0x81,
0xC3,0xE7,0x7E,0xBD,0xDB,0xE7,0xBD,0xDB};
//流水灯控制码
unsigned char p; //定义无符号字符型指针
p=Tab; //将数组首地址存入指针p
while(1)
{
for(i=0;i<32;i++) //共32个流水灯控制码
{
P0= (p+i); // (p+i)的值等于a[i]
delay150ms(); //调用150ms延时函数
}
}
}
//实例29:用P0 、P1口显示整型函数返回值
#include
/
函数功能:计算两个无符号整数的和
1.闪烁灯 1.实验任务 如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。 2.电路原理图 图4.1.1 3.系统板上硬件连线 把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。 4.程序设计内容 (1).延时程序的设计方法 作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要 求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在 执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程 序是如何设计呢?下面具体介绍其原理:
如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒 MOV R6,#20 2个 2 D1: MOV R7,#248 2个 2 2+2×248=498 20× DJNZ R7,$ 2个2×248 (498 DJNZ R6,D1 2个2×20=40 10002 因此,上面的延时程序时间为10.002ms。 由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时, 延时10ms,以此为基本的计时单位。如本实验要求0.2秒=200ms, 10ms×R5=200ms,则R5=20,延时子程序如下: DELAY: MOV R5,#20 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET (2).输出控制 如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管 的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平, 即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0 端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。 5.程序框图 如图4.1.2所示
目录 目录 (1) 函数的使用和熟悉 (4) 实例3:用单片机控制第一个灯亮 (4) 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (4) 实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (5) 实例6:使用P3口流水点亮8位LED (5) 实例7:通过对P3口地址的操作流水点亮8位LED (6) 实例8:用不同数据类型控制灯闪烁时间 (7) 实例9:用P0口、P1 口分别显示加法和减法运算结果 (8) 实例10:用P0、P1口显示乘法运算结果 (9) 实例11:用P1、P0口显示除法运算结果 (9) 实例12:用自增运算控制P0口8位LED流水花样 (10) 实例13:用P0口显示逻辑"与"运算结果 (10) 实例14:用P0口显示条件运算结果 (11) 实例15:用P0口显示按位"异或"运算结果 (11) 实例16:用P0显示左移运算结果 (11) 实例17:"万能逻辑电路"实验 (11) 实例18:用右移运算流水点亮P1口8位LED (12) 实例19:用if语句控制P0口8位LED的流水方向 (13) 实例20:用swtich语句的控制P0口8位LED的点亮状态 (13) 实例21:用for语句控制蜂鸣器鸣笛次数 (14) 实例22:用while语句控制LED (15) 实例23:用do-while语句控制P0口8位LED流水点亮 (16) 实例24:用字符型数组控制P0口8位LED流水点亮 (17) 实例25:用P0口显示字符串常量 (18) 实例26:用P0 口显示指针运算结果 (19) 实例27:用指针数组控制P0口8位LED流水点亮 (19) 实例28:用数组的指针控制P0 口8 位LED流水点亮 (20) 实例29:用P0 、P1口显示整型函数返回值 (21) 实例30:用有参函数控制P0口8位LED流水速度 (22) 实例31:用数组作函数参数控制流水花样 (22) 实例32:用指针作函数参数控制P0口8位LED流水点亮 (23) 实例33:用函数型指针控制P1口灯花样 (25) 实例34:用指针数组作为函数的参数显示多个字符串 (26) 实例35:字符函数ctype.h应用举例 (27) 实例36:内部函数intrins.h应用举例 (27) 实例37:标准函数stdlib.h应用举例 (28) 实例38:字符串函数string.h应用举例 (29) 实例39:宏定义应用举例2 (29) 实例40:宏定义应用举例2 (29) 实例41:宏定义应用举例3 (30)
51 单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET
五、定时器功能实例 5.1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0 入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50 个 0.2 秒,即50*0.2=1 秒 MOV TMOD,#00000001B;定时器0 工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 11 SETB EA ;开总中断 SETB ET0 ;开定时器0 中断允许 SETB TR0 ;开定时0 运行 SETB P1.0 LOOP: AJMP LOOP DIN0: ;是否到一秒//////////////////////////////////////// INCC: INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPL P1.0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 RETI END 5.2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期是1 微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 的频率为例: 200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电
项目七按钮控制灯课题 一、项目目的 1.进一步掌握单片机开发的基本过程。 2,掌握单片机I/O口的输入、输出基本编程方法。 二、项目设备 微机一台(WIN98/WIN2000系统、安装好Debugger8051等相关软件),编程器一台/下载线一条,单片机实验开发板一块。 三、项目内容 学习单片机I/O口输入、输出的编程方法,要求按下S1~S4中的任意一个键,则对应的发光二极管亮,松开键对应的发光二极管灭。 1.项目(课题)分析 思路分析: S1-S4可接到某一P口上,此时对应P口引脚作为输入端使用。改变开关的开合状态,可以改变对应I/O口的电平,然后将此电平状态去控制发光二极管的亮灭。2.硬件电路 如图4-7-1所示。 图4-7-1 3.软件设计 (1)编写源程序。 ;******************************** ;文件名:EX7_1.asm, ;功能:按下按扭S1-S4,控制相应发光二极管D3-D6亮 ;********************************
ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV P3,#0FFH LOOP: MOV A,P3 MOV P1,A LJMP LOOP END (2)对源程序进行编译,并使用Debugger8051软件对其功能进行仿真。 4.硬件系统安装 按照电路图安装好实验开发板的相关元件,注意按扭开关的方向。 5.程序烧录并观察实际运行结果 四、按要求编写程序并上机调试,观察实际运行结果 按下S1键D1~D4亮,按下S2键D2~D5亮,按下S3键D3~D6亮,按下S4键D4~D7亮。按上述过程,编写源程序,并运行观察结果,完成设计。(源文件名为EX7_2.asm) 项目八定时器控制流水灯课题 一、项目目的 1.进一步掌握单片机开发的基本过程。 2.掌握单片机内部资源定时器定时功能的使用(用查询方法实现定时)。 3.进一步掌握单片机I/O口的输入、输出基本编程方法。 二、项目设备 微机一台(WIN98/WIN2000系统、安装好Debugger8051等相关软件),编程器一台/下载线一条,单片机实验开发板一块。 三、项目内容 利用定时器控制发光二极管交替闪亮,每0.2秒钟交替闪亮一次。 1.硬件电路(同上) 2.编写项目程序 ;******************************** ;文件名:EX8_1.asm, ;功能:用定时器控制延时,实现流水灯效果 ;定时器使用查询方式 ;********************************
单片机资料教程下载,省去找资料的麻烦,只供学习参考用,下载24内删掉,祝大家学习进步 单片机点阵学习资料 https://www.wendangku.net/doc/3a9346686.html,/thread-1703-1-1.html 手把手教你学单片机--教程视频 https://www.wendangku.net/doc/3a9346686.html,/thread-1688-1-1.html 力天把手教你学单片机视频教程 https://www.wendangku.net/doc/3a9346686.html,/thread-1689-1-1.html 谱中单片机开发板例程 https://www.wendangku.net/doc/3a9346686.html,/thread-1683-1-2.html 初学单片机的30,硬件简单对初学者有帮助 https://www.wendangku.net/doc/3a9346686.html,/thread-1962-1-1.html 用单片机制作的MP3 https://www.wendangku.net/doc/3a9346686.html,/thread-1701-1-2.html 51单片机应用开发大全所含100个范例代码及电路图 https://www.wendangku.net/doc/3a9346686.html,/thread-1820-1-1.html 【含28个单片机实例流程图】 https://www.wendangku.net/doc/3a9346686.html,/thread-1959-1-2.html 谱中单片机程序烧录工具STC https://www.wendangku.net/doc/3a9346686.html,/thread-1682-1-2.html 《单片机技术》32讲
https://www.wendangku.net/doc/3a9346686.html,/thread-1693-1-1.html 51单片机c语言100例教程 https://www.wendangku.net/doc/3a9346686.html,/thread-1700-1-1.html 单片机超级精华包 https://www.wendangku.net/doc/3a9346686.html,/thread-1687-1-1.html 新手学的多功能电子钟 https://www.wendangku.net/doc/3a9346686.html,/thread-1679-1-1.html 十天学会单片机和c语言视频教程 https://www.wendangku.net/doc/3a9346686.html,/thread-1692-1-1.html C语言函数库速查手册 https://www.wendangku.net/doc/3a9346686.html,/thread-1696-1-1.html 历史上最全的KEIL中文学习资料 https://www.wendangku.net/doc/3a9346686.html,/thread-1729-1-2.html 单片机c语言程序设计实训100例--基于AVR+PROTUES https://www.wendangku.net/doc/3a9346686.html,/thread-1695-1-2.html (有电路图和程序) https://www.wendangku.net/doc/3a9346686.html,/thread-1965-1-1.html 关于单片机抗干扰的资料 https://www.wendangku.net/doc/3a9346686.html,/thread-1961-1-1.html 单片机矩阵扫描键盘程序 https://www.wendangku.net/doc/3a9346686.html,/thread-1723-1-1.html 共享通过串口在线调试51单片机的专业版培训资料
应用程序设计实例 浙江海洋学院楼然苗6.1 闪烁LED小灯的设计 6.2 六位数码管时钟电路的设计 6.3 LED广告显示电路的设计 6.4 8路输入模拟信号的数值显示电路 6.5 单键学习型遥控器的设计 6.6 十六路遥控电路的设计 6.7 遥控码的仿真应用设计 6.8 自行车里程\速度计的设计 6.9 自动往返行驶小汽车的设计 6.10 遥控小汽车的设计 6.11 汽车行驶信息的发送与接收
;************; ;亮灯控制程序; ;************; ; ;************; ;中断入口程序; ;************; ; ORG 0000H LJMP START ORG 0003H RETI ORG 000BH RETI ORG 0013H RETI ORG 001BH RETI ORG 0023H RETI ; ;************; ; 初始化程序 ; ;************; ; CLEAR: RET ; ;************; ; 主程序 ; ;************; ;
START:ACALL CLEAR STAR1:MOV P3,#0FFH JNB P3.0,FUN0 JNB P3.1,FUN1 JNB P3.2,FUN2 JNB P3.3,FUN3 ;关闭按纽 JNB F0,STAR1 ;曾经有键按下F0置1 RET ; FUN0:LCALL DL10MS ;消岸抖动 JB P3.0,STAR1 WAITL0:JNB P3.0,WAITL0 ;等待键释放 SETB F0 FUN01:LCALL FUN00 LCALL STAR1 LJMP FUN01 ; FUN1:LCALL DL10MS ;消岸抖动 JB P3.1,STAR1 WAITL1:JNB P3.1,WAITL1 ;等待键释放 SETB F0 FUN10:LCALL FUN11 LCALL STAR1 LJMP FUN10 ; FUN2:LCALL DL10MS ;消岸抖动 JB P3.2,STAR1 WAITL2:JNB P3.2,WAITL2 ;等待键释放 SETB F0 FUN20:LCALL FUN22 LCALL STAR1 LJMP FUN20 ; FUN3:LCALL DL10MS ;消岸抖动 JB P3.3,STAR1 WAITL3:JNB P3.3,WAITL3 ;等待键释放 CLR F0 MOV P1,#0FFH ;关显示 LJMP STAR1 ; FUN00:MOV A,#0FEH FUN000:MOV P1,A LCALL DL05S JNB ACC.7,OUT
单片机编程100例
单片机编程实例100例大全 单片机编程实例 *实例1:使用P3口流水点亮8位LED #include
delay(); //调用延时函数 P3=0xf7; //第四个灯亮 delay(); //调用延时函数 P3=0xef; //第五个灯亮 delay(); //调用延时函数 P3=0xdf; //第六个灯亮 delay(); //调用延时函数 P3=0xbf; //第七个灯亮 delay(); //调用延时函数 P3=0x7f; //第八个灯亮 delay(); //调用延时函数 } / / } *实例2:通过对P3口地址的操作流水点亮8位LED #include
void delay(void) { unsigned char i,j; for(i=0;i<250;i++) for(j=0;j<250;j++) ; //利用循环等待若干机器周期,从而延时一段时间} / 函数功能:主函数 / void main(void) { while(1) { x=0xfe; //第一个灯亮 delay(); //调用延时函数 x=0xfd; //第二个灯亮 delay(); //调用延时函数 x=0xfb; //第三个灯亮 delay(); //调用延时函数 x=0xf7; //第四个灯亮 delay(); //调用延时函数
51单片机50个例程代码程序里有中断,串口等驱动,直接复制即可使用1-IO输出-点亮1个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.wendangku.net/doc/3a9346686.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include
名称:IO口高低电平控制 论坛:https://www.wendangku.net/doc/3a9346686.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include
51单片机串口通信 1./*打开串口调试程序,将波特率设置为9600,无奇偶校验 晶振11.0592MHz,发送和接收使用的格式相同,如都使用 字符型格式,在发送框输入hello,I Love MCU ,在接 收框中同样可以看到相同字符,说明设置和通信正确*/ #include
例一:一个液晶显示的数字式电脑温度计 液晶显示器分很多种类,按显示方式可分为段式,行点阵式和全点阵式。 段式与数码管类似,行点阵式一般是英文字符,全点阵式可显示任何信息, 如汉字、图形、图表等。这里我们介绍一种八段式四位LCD显示器,该显 示器内置驱动器,串行数据传送,使用非常方便。原理图如下图: 下图是长沙太阳人科技开发有限公司生产的4位带串行接口的液晶显示模块SMS0403 的外部引线简图:
有关该模块的具体参数,请查看该公司网站。此例中使用的温度传感器为美国DALLAS公司生产的单总线式数字温度传感器。该传感器本站有其详细的资料可供下载。此例稍加改动,即可做成温控器。 下载驱动该模块的源程序LCD.PLM 例2: LED显示电脑电子钟 本例介绍一种用LED制作的电脑电子钟(电脑万年历)。 原理图如下图所示:
上图中,CPU选用的是AT89C2051,时钟芯片选用的是Dallas公司的DS1302, 温度传感器选用的是Dallas公司的数字温度传感器DS1820,显示驱动芯片 选用的是德州仪器公司的TPIC6B595,也可选用与其兼容的芯片NC595或 国产的AMT9595。整个电子钟用两个键来调节时间和日期。一个是位选 键,一个是数字调节键。按一下位选键,头两位数字开始闪动,进入设 定调节状态,此时按数字调节键,当前闪动位的数字就可改变。全部参 数调节完后,五秒钟内没有任何键按下,则数字停止闪动,退出设定调 节状态。源程序清单如下(无温度显示程序): start:do; $include(reg51.dcl) declare (sclk,io,rst) bit at (0b3h) register; /* p33,p34,p35 */ declare (command,data,n,temp1,num) byte; declare a(9) byte; declare ab(6) byte; declare aco(11) byte constant (0fdh,60h,0dah,0f2h,66h,0b6h,0beh, 0e0h,0feh,0f6h,00h); declare week(11) byte constant (0edh,028h,0dch,7ch,39h,75h,0f5h, 2ch,0fdh,7dh,00h); declare da literally 'p15',clk literally 'p16',ale literally 'p17', mk literally 'p11',sk literally 'p12'; clear:procedure; sclk=0;io=0;rst=0; end clear; send1302:procedure(comm);
51单片机仿真实例 l示例6—扫描与判断—(单端口)位扫描与字节(多端口)扫描 这是一个常用程序段—子程序—标准程序, 通过端口扫描而获得输入数据或控制输出数据,达到节 省位或字节的目的—节约硬件资源。 关于扫描,可以从位及其取反实现流水灯着手来理解。 可以通过移位实现流水灯—扫描。可以通过字节数据(01H,02H,04H,08H,10H,20H,40H,80H—阳极管)的端口发送实现流水灯—扫描。可以通过数据表(DB01H,02H,04H,08H,10H,20H,40H,80H—阴极管)实现流水灯—扫描。可以通过循环跳转实现流水灯—扫描。扫描注意入比出查—获得输入要比 较数据、发送输出要检查出口 扫描获取端口字节 扫描输出位移动产生动态效果(01、02、04、08、10、20、40、80),可以用字节表 扫描输出字符字节,通过延时可以变换字符以便造成数 字进位效果
ORG 0000H START: dbufequ30h;置存储区首址tempequ40h;置缓冲区首址org 00h mov 30h,#2 ;存入数据mov 31h,#0 mov 32h,#1 mov 33h,#0 mov 34h,#7 mov 35h,#1 mov r0,#dbuf mov r1,#temp
mov r2,#6;六位显示器 mov dptr,#segtab ;段码表首地址dp00:mov a,@r0 ;取要显示的数据 movc a,@a+dptr ;查表取段码mov @r1,a;段码暂存 inc r1 inc r0 djnz r2,dp00 disp0:mov r0,#temp;显示子程序mov r1,#6;扫描6次 mov r2,#01h;从第一位开始 dp01:mov a,@r0 mov p2,a;段码输出 mov a,r2 ;取位码 mov p1,a;位码输出 acall delay;调用延时 mov a,r2 rl a mov r2,a inc r0 djnz r1,dp01
《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例 第01 篇基础程序设计 01 闪烁的LED /* 名称:闪烁的LED 说明:LED按设定的时间间隔闪烁 */ #include
//延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { P0=0xfe; while(1) { P0=_crol_(P0,1); //P0的值向左循环移动 DelayMS(150); } } 03 8只LED左右来回点亮 /* 名称:8只LED左右来回点亮 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/ #include
单片机应用实例报告 零.序 这个学期一开始便接触了《单片微型计算机原理与接口技术》,听说是《微型计算机控制技术实用教程》的基础,对于工科的我来说学以致用无非是一切的一切,虽然还是个该领域的菜鸟,但是单片机之于自动化的意义不言而喻,对于这篇论文,以下开始展开,不足之处谅解。 一.概述 单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。 关于80C51:该系列单片机是采用高性能的静态80C51 设计由先进CMOS 工艺制造并带有非易失性Flash 程序存储器全部支持12 时钟和 6 时钟操作P89C51X2 和P89C52X2/54X2/58X2 分别包含128 字节和256 字节RAM 32 条I/O 口线 3 个16 位定时/计数器 6 输入4 优先级嵌套中断结构 1 个串行I/O 口可用于多机通信 I/O 扩展或全双工UART以及片内振荡器和时钟电路。此外,由于器件采用了静态设计,可提供很宽的操作频率范围,频率可降至0 。可实现两个由软件选择的节电模式,空闲模式和掉电模式,空闲模式冻结CPU但RAM 定时器,串口和中断系统仍然工作掉电模式保存RAM的内容但是冻结振荡器导致所有其它的片内功能停止工作。由于设计是静态的时钟可停止而不会丢失用户数据运行可从时钟停止处恢复的。 二.应用领域 目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。 单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴: 1.在智能仪器仪表上的应用 单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、
目录 实例3:用单片机控制第一个灯亮 (3) 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (3) 实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (4) 实例6:使用P3口流水点亮8位LED (4) 实例7:通过对P3口地址的操作流水点亮8位LED (5) 实例8:用不同数据类型控制灯闪烁时间 (6) 实例9:用P0口、P1 口分别显示加法和减法运算结果 (8) 实例10:用P0、P1口显示乘法运算结果 (8) 实例11:用P1、P0口显示除法运算结果 (9) 实例12:用自增运算控制P0口8位LED流水花样 (9) 实例13:用P0口显示逻辑"与"运算结果 (10) 实例14:用P0口显示条件运算结果 (10) 实例15:用P0口显示按位"异或"运算结果 (10) 实例16:用P0显示左移运算结果 (10) 实例17:"万能逻辑电路"实验 (11) 实例18:用右移运算流水点亮P1口8位LED (11) 实例19:用if语句控制P0口8位LED的流水方向 (12) 实例20:用swtich语句的控制P0口8位LED的点亮状态 (12) 实例21:用for语句控制蜂鸣器鸣笛次数 (14) 实例22:用while语句控制LED (15) 实例23:用do-while语句控制P0口8位LED流水点亮 (16) 实例24:用字符型数组控制P0口8位LED流水点亮 (16) 实例25:用P0口显示字符串常量 (17) 实例26:用P0 口显示指针运算结果 (18) 实例27:用指针数组控制P0口8位LED流水点亮 (18) 实例28:用数组的指针控制P0 口8 位LED流水点亮 (19) 实例29:用P0 、P1口显示整型函数返回值 (20) 实例30:用有参函数控制P0口8位LED流水速度 (21) 实例31:用数组作函数参数控制流水花样 (22) 实例32:用指针作函数参数控制P0口8位LED流水点亮 (23) 实例33:用函数型指针控制P1口灯花样 (24) 实例34:用指针数组作为函数的参数显示多个字符串 (25) 实例35:字符函数ctype.h应用举例 (26) 实例36:内部函数intrins.h应用举例 (27) 实例37:标准函数stdlib.h应用举例 (27) 实例38:字符串函数string.h应用举例 (28) 实例39:宏定义应用举例2 (28) 实例40:宏定义应用举例2 (29) 实例41:宏定义应用举例3 (29) 实例42:用定时器T0查询方式P2口8位控制LED闪烁 (30) 实例43:用定时器T1查询方式控制单片机发出1KHz音频 (31) 实例44:将计数器T0计数的结果送P1口8位LED显示 (31)
13.动态数码显示技术 1.实验任务 如图4.13.1所示,P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7接一个开关,当开关接高电平时,显示“12345”字样;当开关接低电平时,显示“HELLO”字样。 2.电路原理图 图4.13.1 3.系统板上硬件连线 (1.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7用8芯排线连接到“动态数码显示”区域中的a-h端口上;
(2.把“单片机系统”区域中的P2.0/A8-P2.7/A15用8芯排线连接到“动态数码显示”区域中的S1-S8端口上; (3.把“单片机系统”区域中的P1.7端口用导线连接到“独立式键盘”区域中的SP1端口上; 4.程序设计内容 (1.动态扫描方法 动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。 (2.在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。 (3.对于显示的字形码数据我们采用查表方法来完成。 5.程序框图 图4.13.2
6.汇编源程序 ORG 00H START: JB P1.7,DIR1 MOV DPTR,#TABLE1 SJMP DIR DIR1: MOV DPTR,#TABLE2 DIR: MOV R0,#00H MOV R1,#01H NEXT: MOV A,R0 MOVC A,@A+DPTR MOV P0,A MOV A,R1 MOV P2,A LCALL DAY INC R0 RL A MOV R1,A CJNE R1,#0DFH,NEXT SJMP START DAY: MOV R6,#4 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET TABLE1: DB 06H,5BH,4FH,66H,6DH TABLE2: DB 78H,79H,38H,38H,3FH END 7. C语言源程序 #include
51单片机中断系统程序实例(STC89C52RC) 51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。中断优先级是可以给要做的事情排序。 单片机的学习不难,只要掌握学习方法,学起来并不难。什么是好的学习方法呢,一定要掌握二个要点: 1. 要知道寄存器的英文全拼,比如IE = interrupt中断 不知道全拼,要去猜,去查。这样就可以理解为什么是这个名称,理解了以后就不用记忆了。 2. 每个知识点要有形像的出处 比如看到TF0,脑子里马上要形像地定位到TCON寄存器的某位 看到ET0, 马上要形像地定位到IE寄存器的第2位 https://www.wendangku.net/doc/3a9346686.html,/tuenhai/独家揭秘:形像是记忆的最大技巧。当人眼看到某个图时,是把视觉信号转化成电信号,再转化成人能理解的形像。当我们回忆形像时,就是在重新检索原先那个视觉信号,并放大。在学习过程中,不断练习检索、放大信号,我们的学习能力就会越来越强。 写程序代码时,也要把尽量把每行代码形像化。 51单片机内中断源 8051有五个中断源,有两个优先级。与中断系统有关的特殊功能寄存器有IE(中断允许寄存器)、IP(中断优先级控制寄存器)、中断源控制寄存器(如TCON、SCON的有关位)。51单片机的中断系统结构如下图(注意,IF0应为TF0):
8052有6个中断源,它比8051多一个定时器/计数器T2中断源。 8051五个中断源分别是: (1)51单片机外部中断源 8051有两个外部中断源,分别是INT0和INT1,分别从P3.2和P3.3两个引脚引入中断请求信号,两个中断源的中断触发允许由TCON的低4位控制,TCON的高4位控制运行和溢出标志。 INT0也就是Interrupt 0。在这里应该看一下你的51单片机开发板的电路原理图。离开形像的记忆是没有意义的。读到上面这句,你应该回忆起原理图上的连接。任何记忆都转化为形像,这是学习的根本原理,我们通过学习单片机要学会这种学习方法,会让你一辈子受益无穷。 TCON的结构如下图: (a)定时器T0的运行控制位TR0
目录 目录 1 函数的使用和熟悉 6 实例3:用单片机控制第一个灯亮7 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率7 实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能8
实例6:使用P3口流水点亮8位LED 9 实例7:通过对P3口地址的操作流水点亮8位LED 11 实例8:用不同数据类型控制灯闪烁时间13 实例9:用P0口、P1 口分别显示加法和减法运算结果15 实例10:用P0、P1口显示乘法运算结果15 实例11:用P1、P0口显示除法运算结果16 实例12:用自增运算控制P0口8位LED流水花样17 实例13:用P0口显示逻辑"与"运算结果18 实例14:用P0口显示条件运算结果18 实例15:用P0口显示按位"异或"运算结果 19 实例16:用P0显示左移运算结果19 实例17:"万能逻辑电路"实验20 实例18:用右移运算流水点亮P1口8位LED 20 实例19:用if语句控制P0口8位LED的流水方向 22 实例20:用swtich语句的控制P0口8位LED的点亮状态23 实例21:用for语句控制蜂鸣器鸣笛次数25 实例22:用while语句控制LED 27 实例23:用do-while语句控制P0口8位LED流水点亮29 实例24:用字符型数组控制P0口8位LED流水点亮30 实例25:用P0口显示字符串常量 32 实例26:用P0 口显示指针运算结果33 实例27:用指针数组控制P0口8位LED流水点亮34
实例28:用数组的指针控制P0 口8 位LED流水点亮35 实例29:用P0 、P1口显示整型函数返回值37 实例30:用有参函数控制P0口8位LED流水速度38 实例31:用数组作函数参数控制流水花样40 实例32:用指针作函数参数控制P0口8位LED流水点亮41 实例33:用函数型指针控制P1口灯花样44 实例34:用指针数组作为函数的参数显示多个字符串45 实例35:字符函数ctype.h应用举例48 实例36:内部函数intrins.h应用举例48 实例37:标准函数stdlib.h应用举例49 实例38:字符串函数string.h应用举例 51 实例39:宏定义应用举例2 52 实例40:宏定义应用举例2 52 实例41:宏定义应用举例3 53 中断、定时器54 实例42:用定时器T0查询方式P2口8位控制LED闪烁54 实例43:用定时器T1查询方式控制单片机发出1KHz音频55 实例44:将计数器T0计数的结果送P1口8位LED显示56 实例45:用定时器T0的中断控制1位LED闪烁57 实例46:用定时器T0的中断实现长时间定时59 实例47:用定时器T1中断控制两个LED以不同周期闪烁60 实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频62