单片机配套程序讲解.docx

上传人:b****5 文档编号:5386024 上传时间:2022-12-15 格式:DOCX 页数:112 大小:44.01KB
下载 相关 举报
单片机配套程序讲解.docx_第1页
第1页 / 共112页
单片机配套程序讲解.docx_第2页
第2页 / 共112页
单片机配套程序讲解.docx_第3页
第3页 / 共112页
单片机配套程序讲解.docx_第4页
第4页 / 共112页
单片机配套程序讲解.docx_第5页
第5页 / 共112页
点击查看更多>>
下载资源
资源描述

单片机配套程序讲解.docx

《单片机配套程序讲解.docx》由会员分享,可在线阅读,更多相关《单片机配套程序讲解.docx(112页珍藏版)》请在冰豆网上搜索。

单片机配套程序讲解.docx

单片机配套程序讲解

单片机配套程序讲解

/*-----------------------------------------------

名称:

IO口高低电平控制

日期:

2009.5

修改:

内容:

点亮P1口的一个LED灯

该程序是单片机学习中最简单最基础的,

通过程序了解如何控制端口的高低电平

------------------------------------------------*/

#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

/*------------------------------------------------

主函数

------------------------------------------------*/

voidmain(void)

{

P1=0xFF;//P1口全部为高电平,对应的LED灯全灭掉,ff换算成二进制是11111111

P1=0xfe;//P1口的最低位点亮,可以更改数值是其他的灯点亮

//0xfe是16进制,0x开头表示16进制数,fe换算成二进制是11111110

while

(1)//主循环

{

//主循环中添加其他需要一直工作的程序

}

}

/*-----------------------------------------------

名称:

IO口信号输入

日期:

2009.5

修改:

内容:

通过读入P3端口的电平控制P1口,用LED显示

该程序是学习如何读入IO电平信息

------------------------------------------------*/

#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

/*------------------------------------------------

主函数

------------------------------------------------*/

voidmain(void)

{

P1=0xFF;//P1口全部为高电平,对应的LED灯全灭掉,ff换算成二进制是11111111

while

(1)//主循环

{

P1=P3;//读入P3的值然后赋值给P1,如果P3.0=0,其他为1,则执行过该语句后P1.0=0,其他值为1,对应P1.0口的灯亮

//程序可以通过独立按键测试,在开发板上需要切换成独立按键模式

}

}

/*-----------------------------------------------

名称:

流水灯

日期:

2009.5

修改:

内容:

循环点亮P1口对应的8个LED灯,造成循环流水点亮的效果

------------------------------------------------*/

#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

/*------------------------------------------------

延时子程序

------------------------------------------------*/

voiddelay(unsignedintcnt)

{

while(--cnt);

}

/*------------------------------------------------

主函数

------------------------------------------------*/

main()

{

P1=0xfe;//给初始化值换算成二进制是11111110

while

(1)

{

delay(30000);//延时程序

P1<<=1;//左移一位该语句等效于P1=P1<<1

P1|=0x01;//最后一位补1,该语句等效于P1=P1|0x01符号"|"表示"或"

if(P1==0x7f)//检测是否移到最左端?

"=="表示检测符号2端的值是否相等

{

delay(30000);

P1=0xfe;//重新赋值

}

}

}

/*-----------------------------------------------

名称:

数码管动态扫描

日期:

2009.5

修改:

内容:

数码管使用动态扫描显示,所以可以同时看到数码管同时显示数字或者字符,扫描原理可以参考说明书

或者视频教程。

------------------------------------------------*/

#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

 

unsignedcharconstdofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值01234567

unsignedcharcodeseg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码

/*------------------------------------------------

延时子程序

------------------------------------------------*/

voiddelay(unsignedintcnt)

{

while(--cnt);

}

/*------------------------------------------------

主函数

------------------------------------------------*/

main()

{

unsignedchari;

while

(1)

{

P0=dofly[i];//取显示数据,段码

P2=seg[i];//取位码

delay(200);//扫描间隙延时,时间太长会闪烁,太短会造成重影

i++;

if(8==i)//检测8位扫描完全?

i=0;

}

}

/*-----------------------------------------------

名称:

独立按键

日期:

2009.5

修改:

内容:

切换到独立按键模式,通过按键在数码管显示对应的数字

------------------------------------------------*/

#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbitkey1=P3^0;//定义按键位置

sbitkey2=P3^1;

sbitkey3=P3^2;

sbitkey4=P3^3;

/*------------------------------------------------

延时子程序

------------------------------------------------*/

voiddelay(unsignedintcnt)

{

while(--cnt);

}

/*------------------------------------------------

主函数

------------------------------------------------*/

main()

{

P2=0x00;

while

(1)

{

if(!

key1)//按下相应的按键,数码管显示相应的码值

P0=0x06;//数码管显示"1"

if(!

key2)

P0=0x5B;//2

if(!

key3)

P0=0x4F;//3

if(!

key4)

P0=0x66;//4

}

}

//如果有干扰请加去抖程序

//红外接收头部分用黑色物质遮光,防止干扰按键,因为红外接收和按键使用同一个端口

 

/*-----------------------------------------------

名称:

独立按键

日期:

2009.5

修改:

内容:

切换到独立按键模式,通过按键在数码管显示对应的数字

------------------------------------------------*/

#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbitkey1=P3^0;//定义按键位置

sbitkey2=P3^1;

sbitkey3=P3^2;

sbitkey4=P3^3;

/*------------------------------------------------

延时子程序

------------------------------------------------*/

voiddelay(unsignedintcnt)

{

while(--cnt);

}

/*------------------------------------------------

主函数

------------------------------------------------*/

main()

{

P2=0x00;

while

(1)

{

if(!

key1)

{//按下相应的按键,数码管显示相应的码值

delay(1000);

if(!

key1)

{

P0=0x06;//数码管显示"1"

}

}

if(!

key2)

{//按下相应的按键,数码管显示相应的码值

delay(1000);//去抖动

if(!

key2)//检测按键确实按下,进行按键处理

{

P0=0x5B;//数码管显示"2"

//这里可以添加按键按下所需要的操作,如数据加减乘除,蜂鸣器等设备开关

}

}

if(!

key3)

{//按下相应的按键,数码管显示相应的码值

delay(1000);

if(!

key3)

{

P0=0x4F;//数码管显示"3"

}

}

if(!

key4)

{//按下相应的按键,数码管显示相应的码值

delay(1000);

if(!

key4)

{

P0=0x66;//数码管显示"4"

}

}

}

}

/*-----------------------------------------------

名称:

定时器0

日期:

2009.5

修改:

内容:

通过定时让LED灯闪烁

------------------------------------------------*/

#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbitLED=P1^2;//定义LED端口

/*------------------------------------------------

定时器初始化子程序

------------------------------------------------*/

voidInit_Timer0(void)

{

TMOD|=0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响

TH0=0x00;//给定初值,这里使用定时器最大值从0开始计数一直到65535溢出

TL0=0x00;

EA=1;//总中断打开

ET0=1;//定时器中断打开

TR0=1;//定时器开关打开

}

/*------------------------------------------------

主程序

------------------------------------------------*/

main()

{

Init_Timer0();

while

(1);

}

/*------------------------------------------------

定时器中断子程序

------------------------------------------------*/

voidTimer0_isr(void)interrupt1using1

{

TH0=0x00;//重新赋值

TL0=0x00;

LED=~LED;//指示灯反相,可以看到闪烁

}

/*-----------------------------------------------

名称:

定时器1

日期:

2009.5

修改:

内容:

通过定时让LED灯闪烁

------------------------------------------------*/

#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbitLED=P1^2;//定义LED端口

/*------------------------------------------------

定时器初始化子程序

------------------------------------------------*/

voidInit_Timer1(void)

{

TMOD|=0x10;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响

TH1=0x00;//给定初值,这里使用定时器最大值从0开始计数一直到65535溢出

TL1=0x00;

EA=1;//总中断打开

ET1=1;//定时器中断打开

TR1=1;//定时器开关打开

}

/*------------------------------------------------

主程序

------------------------------------------------*/

main()

{

Init_Timer1();

while

(1);

}

/*------------------------------------------------

定时器中断子程序

------------------------------------------------*/

voidTimer1_isr(void)interrupt3using1

{

TH1=0x00;//重新赋值

TL1=0x00;

LED=~LED;//LED闪烁

}

/*-----------------------------------------------

名称:

定时器1

日期:

2009.5

修改:

内容:

通过定时让LED灯闪烁

------------------------------------------------*/

#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbitLED=P1^2;//定义LED端口

 

/*------------------------------------------------

定时器初始化子程序

------------------------------------------------*/

voidTIM2Inital(void)

{

RCAP2H=(65536-60000)/256;//晶振12M10ms16bit自动重载

RCAP2L=(65536-60000)%256;

ET2=1;//打开定时器中断

EA=1;//打开总中断

TR2=1;//打开定时器开关

}

/*------------------------------------------------

主程序

------------------------------------------------*/

main()

{

TIM2Inital();

while

(1);

}

/*------------------------------------------------

定时器中断子程序

------------------------------------------------*/

voidTIM2(void)interrupt5using1//定时器2中断

{

TF2=0;

LED=~LED;//指示灯反相

}

/*-----------------------------------------------

名称:

外部中断0电平触发

日期:

2009.5

修改:

内容:

通过中断接口P3.2连接的独立按键测试,按一次P1口的LED灯反向,

这里使用电平触发,所以一直按键不松开和一次按键效果不相同,按下会看到灯全部亮

说明中断一直在作用

------------------------------------------------*/

#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

/*------------------------------------------------

延时子程序

------------------------------------------------*/

voiddelay(unsignedintcnt)

{

while(--cnt);

}

/*------------------------------------------------

主程序

------------------------------------------------*/

main()

{

P1=0x55;//P1口初始值

EA=1;//全局中断开

EX0=1;//外部中断0开

IT0=0;//电平触发

while

(1)

{

//在此添加其他程序

}

}

/*------------------------------------------------

外部中断程序

------------------------------------------------*/

voidISR_Key(void)interrupt0using1

{

P1=~P1;

//delay(20000);

}

/*-----------------------------------------------

名称:

外部中断0边沿触发

日期:

2009.5

修改:

内容:

通过中断接口P3.2连接的独立按键测试,按一次P1口的LED灯反向,

这里使用边沿触发,所以一直按键不松开和一次按键效果相同,区

别于电平触发

------------------------------------------------*/

#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

/*------------------------------------------------

主程序

------------------------------------------------*/

main()

{

P1=0x55;//P1口初始值

EA=1;//全局中断开

EX0=1;//外部中断0开

IT0=1;//边沿触发

while

(1)

{

//在此添加其他程序

}

}

/*------------------------------------------------

外部中断程序

------------------------------------------------*/

voidISR_Key(void)interrupt0using1

{

P1=~P1;//s3按下触发一次,P1取反一次,这里需要切换跳帽到独立按键模式

}

/*-----------------------------------------------

名称:

外部中断1

日期:

2009.5

修改:

内容:

通过中断接口P3.3连接的独立按键测试,按一次P1口的LED灯反向,

作用效果和中断0相同

------------------------------------------------*/

#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

/*------------------------------------------------

主程序

------------------------------------------------*/

main()

{

P1=0x55;//P1口初始值

EA=1;//全局中断开

EX1=1;//外部中断0开

IT1=1;//边沿触发,IT1=0表示电平触发

while

(1)

{

//在此添加其他程序

}

}

/*------------------------------------------------

外部中断程序

------------------------------------------------*/

voidISR_Key(void)interrupt2using1

{

//在此处可以添加去抖动程序,防止按键抖动造成错误

P1=~P1;

}

/*-----------------------------------------------

名称:

矩阵键盘

日期:

2009.5

修改:

内容:

通过反转法循环扫描矩阵键盘,并通过数码管显示数据

------------------------------------------------*/

#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#defineucharunsignedchar

#defineuintunsignedint

unsignedcharconstdofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F

/*--------------------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1