单片机配套程序讲解.docx
《单片机配套程序讲解.docx》由会员分享,可在线阅读,更多相关《单片机配套程序讲解.docx(112页珍藏版)》请在冰豆网上搜索。
单片机配套程序讲解
单片机配套程序讲解
/*-----------------------------------------------
名称:
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
/*--------------------------------