带注解简单c51程序.docx
《带注解简单c51程序.docx》由会员分享,可在线阅读,更多相关《带注解简单c51程序.docx(11页珍藏版)》请在冰豆网上搜索。
带注解简单c51程序
日志
[转]带注解简单c51程序-学习专用2010-9-915:
47阅读(5)
下一篇:
单片机C语言编程... |返回日志列表
∙赞赞赞赞
∙转载
∙分享
∙评论
∙复制地址
∙更多
名称:
IO口高低电平控制
#include//包含头文件,一般情况不需要改动,头文件
包含特殊功能寄存器的定义
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
P1=0xFF; //P1口全部为高电平,对应的LED灯全灭掉,ff
换算成二进制是11111111
P1=0xfe; //P1口的最低位点亮,可以更改数值是其他的
灯点亮
//0xfe是16进制,0x开头表示16进制数,fe换
算成二进制是11111110
while
(1) //主循环
{
//主循环中添加其他需要一直工作的程序
}
}
-----------------------我是分割线-------------------------
名称:
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口的灯亮
//程序可以通过独立按键测试,在开发板上需
要切换成独立按键模式
}
}
-----------------------我是分割线-------------------------
名称:
流水灯
#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;//重新赋值
}
}
}
-----------------------我是分割线-------------------------
名称:
独立按键
#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
}
}
-----------------------我是分割线-------------------------
名称:
独立按键去抖动
#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"
}
}
}
}
-----------------------我是分割线-------------------------
名称:
定时器
#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; //指示灯反相,可以看到闪烁
}
-----------------------我是分割线-------------------------
名称:
外部中断0电平触发
#include//包含头文件,一般情况不需要改动,头文件
包含特殊功能寄存器的定义
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
P1=0x55; //P1口初始值
EA=1; //全局中断开
EX0=1; //外部中断0开
IT0=0; //电平触发
while
(1)
{
//在此添加其他程序
}
}
/*------------------------------------------------
外部中断程序
------------------------------------------------*/
voidISR_Key(void)interrupt0using1
{
P1=~P1;
}
-----------------------我是分割线-------------------------
名称:
外部中断0边沿触发
#include//包含头文件,一般情况不需要改动,头文件
包含特殊功能寄存器的定义
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
P1=0x55; //P1口初始值
EA=1; //全局中断开
EX0=1; //外部中断0开
IT0=1; //边沿触发
while
(1)
{
//在此添加其他程序
}
}
/*------------------------------------------------
外部中断程序
------------------------------------------------*/
voidISR_Key(void)interrupt0using1
{
P1=~P1; //s3按下触发一次,P1取反一次,这里需要切换
跳帽到独立按键模式
}
-----------------------我是分割线-------------------------
名称:
外部中断1
#include//包含头文件,一般情况不需要改动,头文件
包含特殊功能寄存器的定义
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
P1=0x55; //P1口初始值
EA=1; //全局中断开
EX1=1; //外部中断0开
IT1=1; //边沿触发,IT1=0表示电平触发
while
(1)
{
//在此添加其他程序
}
}
/*------------------------------------------------
外部中断程序
------------------------------------------------*/
voidISR_Key(void)interrupt2using1
{
//在此处可以添加去抖动程序,防止按键抖动造成错误
P1=~P1;
}
-----------------------我是分割线-------------------------
名称:
矩阵键盘
#include//包含头文件,一般情况不需要改动,头文件
包含特殊功能寄存器的定义
#defineucharunsignedchar
#defineuint unsignedint
unsignedcharconstdofly[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
/*------------------------------------------------
函数声明
------------------------------------------------*/
ucharkeyscan(void);//键盘扫描
voiddelay(uinti);//演示程序
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain()
{
ucharkey;
P2=0x00; //1数码管亮按相应的按键,会显示按键上的字
符
while
(1)
{
key=keyscan(); //调用键盘扫描,
switch(key)
{
case0x7e:
P0=dofly[0];break;//0按下相应的键显示相对应的
码值
case0x7d:
P0=dofly[1];break;//1
case0x7b:
P0=dofly[2];break;//2
case0x77:
P0=dofly[3];break;//3
case0xbe:
P0=dofly[4];break;//4
case0xbd:
P0=dofly[5];break;//5
case0xbb:
P0=dofly[6];break;//6
case0xb7:
P0=dofly[7];break;//7
case0xde:
P0=dofly[8];break;//8
case0xdd:
P0=dofly[9];break;//9
case0xdb:
P0=dofly[10];break;//a
case0xd7:
P0=dofly[11];break;//b
case0xee:
P0=dofly[12];break;//c
case0xed:
P0=dofly[13];break;//d
case0xeb:
P0=dofly[14];break;//e
case0xe7:
P0=dofly[15];break;//f
}
}
}
/*------------------------------------------------
键盘扫描程序
------------------------------------------------*/
ucharkeyscan(void) //键盘扫描函数,使用行列反转扫描法
{
ucharcord_h,cord_l;//行列值中间变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!
=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!
=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff); //返回该值
}
/*------------------------------------------------
延时程序
------------------------------------------------*/
voiddelay(uinti) //延时函数
{
while(i--);
}
-----------------------我是分割线-------------------------
名称:
PWM调光
#include //包含头文件,一般情况不需要改动,头
文件包含特殊功能寄存器的定义
sbitLED=P1^2; //定义LED灯,通过LED显示调光效果
unsignedcharCYCLE; //定义周期该数字X基准定时时间如果是
10则周期是10x0.1ms
unsignedcharPWM_ON;//定义高电平时间
/**********************************************************
********/
/* 延时函数
*/
/**********************************************************
********/
voiddelay(unsignedintcnt)
{
while(--cnt);
}
/**********************************************************
********/
/* 主函数
*/
/**********************************************************
********/
main()
{
bitFlag;
TMOD|=0x01; //定时器设置0.1msin12Mcrystal
TH0=(65536-100)/256;
TL0=(65536-100)%256; //定时0.1mS
IE=0x82; //打开中断
TR0=1;
CYCLE=10; //时间可以调整这个是10调整8位
PWM就是256步
while(!
Flag)
{
delay(20000); //延时时间,从一个亮度到下一个亮
度的间隔时间,速度快就能看到连续效果
PWM_ON++; //这个使用较长延时,以便能看清楚
变化过程
if(PWM_ON==CYCLE)
{ //这个里可以添加其他程序