单片机程序大全.docx
- 文档编号:8819571
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:20
- 大小:18.85KB
单片机程序大全.docx
《单片机程序大全.docx》由会员分享,可在线阅读,更多相关《单片机程序大全.docx(20页珍藏版)》请在冰豆网上搜索。
单片机程序大全
独立按键
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitP27=P2^7;
sbitK5=P1^4;
sbitfmq=P3^6;
ucharnum;
unsignedcharcodes8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
voiddelay1ms(uinti)
{ucharj;
while(i--)
{for(j=0;j<115;j++)//1ms基准延时程序
{;}
}
}
voidbeep()//产生1KHZ频率声音的函数
{
fmq=0;
delay500us();
fmq=1;
delay500us();
}
voiddelay500us()
{
unsignedcharj;
for(j=0;j<57;j++)//500us基准延时程序
{;}
}
voidmain()
{uchart;
P27=0;
while
(1){
if(K5==0){
delay1ms(15);
if(K5==0){
for(t=0;t<100;t++)
{beep();}
num=num+1;
if(num==16){
num=0;
}
while(!
K5);//等待按键释放
}
}
P0=s8[num];
}
}
#include
#defineucharunsignedchar//数据类型的宏定义
#defineuintunsignedint//数据类型的宏定义
sbitP27=P2^7;
unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF};
//共阳数码管显示字型码数组10111111"-"
voiddelay1ms(uinti)
{
ucharj;
while(i--)
{
for(j=0;j<115;j++);//1ms基准延时程序
}
}
voiddisplay(unsignedchari)
{
P27=0;//选通最有端的数码管显示
P0=table[i];//显示i参数传来的字型码
}
voidmain(void)
{
unsignedchartemp;
display(16);//初始显示"-"
while
(1)
{
P1=0xff;//先向P1口写1;端口读状态
P1=0xf0;
temp=P1;
if(temp!
=0xf0)
{
delay1ms(15);
if(temp!
=0xf0)
{
P1=0xfe;
temp=P1;
switch(temp)
{
case(0xee):
display(0);break;
case(0xde):
display
(1);break;
case(0xbe):
display
(2);break;
case(0x7e):
display(3);break;
}
P1=0xfd;
temp=P1;
switch(temp)
{
case(0xed):
display(4);break;
case(0xdd):
display(5);break;
case(0xbd):
display(6);break;
case(0x7d):
display(7);break;
}
P1=0xfb;
temp=P1;
switch(temp)
{
case(0xeb):
display(8);break;
case(0xdb):
display(9);break;
case(0xbb):
display(10);break;
case(0x7b):
display(11);break;
}
P1=0xf7;
temp=P1;
switch(temp)
{
case(0xe7):
display(12);break;
case(0xd7):
display(13);break;
case(0xb7):
display(14);break;
case(0x77):
display(15);break;
}
}
}
}
}
/*行线接P1.0-P1.3,列线接P1.4-P1.7。
根据线反转法扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管显示。
开机时,数码管显示“-”。
*/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitP27=P2^7;
sbitfmq=P3^6;
ucharkey;
unsignedcharcodedisp_code[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
unsignedcharcodekey_code[]={
0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
voiddelay1ms(uinti)
{
ucharj;
while(i--)
{
for(j=0;j<115;j++)//1ms基准延时程序
{;}
}
}
voiddelay500us()
{
unsignedcharj;
for(j=0;j<57;j++)//500us基准延时程序
{;}
}
voidbeep()//产生1KHZ频率声音的函数
{
fmq=0;
delay500us();
fmq=1;
delay500us();
}
/**********************************************************
键盘扫描子函数
**********************************************************/
ucharkeyscan()
{
ucharscan1,scan2,keycode,j;
P1=0xf0;
scan1=P1;
if((scan1&0xf0)!
=0xf0)//判键是否按下
{
delay1ms(20);//延时20ms
scan1=P1;
if((scan1&0xf0)!
=0xf0)//二次判键是否按下
{
P1=0x0f;//线反转法的核心
scan2=P1;
keycode=scan1|scan2;//组合成键编码
for(j=0;j<=15;j++)
{
if(keycode==key_code[j])//查表得键值
{
key=j;
return(key);
}
}
}
}
else
P1=0xff;//P1口写1输入状态
return(16);//"-"
}
main()
{
uchartt;
P0=0xbf;
P27=0;//数码管显示"-"
P1=0xff;
while
(1)
{
P1=0xf0;
if((P1&0xf0)!
=0xf0){
keyscan();
P0=disp_code[key];
for(tt=0;tt<200;tt++)
{beep();}
fmq=1;
delay1ms(200);
}
}
}
中断
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitdula=P2^6;
sbitwela=P2^7;
sbitd1=P1^0;
ucharnum;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
voiddelay(uintz);
voidmain()
{
EA=1;//开总中断
EX0=1;//开外部中断0
//IT0=1;
//TCON=0x01;
wela=1;//11101010
P0=0xea;
wela=0;
while
(1)
{
for(num=0;num<16;num++)
{
d1=1;
dula=1;
P0=table[num];
dula=0;
delay(1000);
}
}
}
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidexter0()interrupt0
{
d1=0;
}
定时器
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharaa,num;
sbitdula=P2^6;
sbitwela=P2^7;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
voidmain()
{
num=0;
aa=0;
//TMOD=0X00;//设定定时器0为工作方式0
TMOD=0X01;//设定定时器0为工作方式1
//TH0=(8192-5000)/32;
//TL0=(8192-5000)%32;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
wela=1;
P0=0x24;
wela=0;
dula=1;
P0=0x3f;
dula=0;
while
(1)
{
if(aa==20)
{
aa=0;
num++;
if(num==10)
num=0;
dula=1;
P0=table[num];
dula=0;
}
}
}
voidtimer0()interrupt1
{
//TH0=(8192-5000)/32;
//TL0=(8192-5000)%32;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
中断控制LED
//用定时器T0的中断控制1位LED闪烁
#include
sbitD0=P0^0;//将D0位定义为P0.0引脚
unsignedinti;
/**************************************************************
函数功能:
主函数
**************************************************************/
voidmain(void)
{
i=0;
EA=1;//开总中断
ET0=1;//定时器T0中断允许
TMOD=0x01;//使用定时器T0的模式1
TH0=(65536-50000)/256;//定时器T0的高8位赋初值
TL0=(65536-50000)%256;//定时器T0的高8位赋初值
TR0=1;//启动定时器T0
while
(1);//无限循环等待中断
}
/**************************************************************
函数功能:
定时器T0的中断服务程序
**************************************************************/
voidTime0(void)interrupt1using0//“interrupt”声明函数为中断服务函数
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{
i=i+1;
if(i==40){
D0=~D0;//按位取反操作,将P0.0引脚输出电平取反
i=0;
}
TH0=(65536-50000)/256;//定时器T0的高8位重新赋初值
TL0=(65536-50000)%256;//定时器T0的高8位重新赋初值
}
中断控制LED2
#include
/*******************************************
函数功能:
主函数
******************************************/
voidmain(void)
{
EA=1;//开放总中断
EX0=1;//允许使用外中断
IT0=1;//选择负跳变来触发外中断
P0=0xff;//关闭所有P0口的LED灯
while
(1);//无限循环,
}
/**************************************************************
函数功能:
外中断T0的中断服务程序
**************************************************************/
voidit0(void)interrupt0using0//外中断0的中断编号为0
{P0=~P0;//每产生一次中断请求,P0取反一次。
}
串口查询
#include
#include
unsignedchartmp;
voidsend_char(unsignedchartxd);
main()
{
TMOD=0x20;//定时器1工作于8位自动重载模式,用于产生波特率
TH1=TL1=0xFD;//波特率9600
SCON=0x50;//设定串行口工作方式1允许接收,相当于下面三句
//SM0=0;
//SM1=1;
//REN=1;
PCON=0x00;//波特率不倍增
TR1=1;//启动定时器1
while
(1)
{
if(RI==1)//是否有数据到来
{
RI=0;
tmp=SBUF;//暂存接收到的数据
P0=tmp;//数据传送到P0口
send_char(tmp);//回传接收到的数据
}
}
}
voidsend_char(unsignedchartxd)
//传送一个字符
{
SBUF=txd;
while(!
TI);//等特数据传送
TI=0;//清除数据传送标志
}
串口通讯
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharidatatrdata[]={'R','I','C','H','M','C','U','R','Z','-','5','1','V','2','.','0',0x0d,0x0a,0x00};
sbitK1=P3^2;//对应开发板K1按键
/*-------------------------------------------------------------*/
//串口初始化
voidUART_Init(void)
{
SCON=0x50;//串口工作方式为1,串行允许接收
//SM0=0;
//SM1=1;
//REN=1;
TMOD=0x20;//定时器1工作在方式2
//PCON=0x80;//SMOD=1;波特率加倍
TH1=0xfd;//波特率9600bpsfosc="11".0592MHz
TL1=0xfd;
ES=1;//开串口中断
TR1=1;//允许定时器1工作
EA=1;//开总中断
}
voiddelay1ms(uinti)
{
ucharj;
while(i--)
{
for(j=0;j<115;j++)//1ms基准延时程序
{
;
}
}
}
/*-------------------------------------------------------------*/
//串口发送一个字节
voidUart_SendChar(unsignedchardat)
{
SBUF=dat;//待发送的数据写入缓冲区
while(!
TI);//等待发送完成
TI=0;//清零发送标志位
}
/*-------------------------------------------------------------*/
//串口发送一个字符串
voidUart_SendString()
{uchar
i=0;
while(trdata[i]!
=0x00)
{
SBUF=trdata[i];
while(!
TI);
TI=0;
i++;
}
}
/*-------------------------------------------------------------*/
//主函数
voidmain(void)
{
UART_Init();//初始化串口
while
(1)
{
if(K1==0)
{
delay1ms(20);
if(K1==0)
{
Uart_SendString();//发送数据
while(!
K1);//等待按键释放
}
}
}
}
/*-------------------------------------------------------------*/
//串口接收中断函数
voidINT_UartRcv(void)interrupt4
{
unsignedcharRcv=0;
if(RI)//查询接收标志位(有数据发送过来时置为1)
{
RI=0;//接收标志位清零
Rcv=SBUF;//存储缓冲区的数据
P0=SBUF;
Uart_SendChar(Rcv);//让从计算机上传到单片机的数据,传回的计算机显示
}
}
//用LED数码管显示计数器对T0的计数值
#include
unsignedcharTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码表
unsignedcharx;
sbitP34=P3^4;
voiddelay1ms(unsignedinti)
{
unsignedcharj;
while(i--)
{
for(j=0;j<115;j++)//1ms基准延时程序
{;}
}
}
voidDisplay(unsignedcharx)
{
P2=0xdf;//P2.6引脚输出低电平,DS6点亮
P0=Tab[x/100];//显示十位
delay1ms(5);
P2=0xbf;//P2.6引脚输出低电平,DS6点亮
P0=Tab[x%100/10];//显示十位
delay1ms(5);
P2=0x7f;//P2.7引脚输出低电平,DS7点亮
P0=Tab[x%10];//显示个位
delay1ms(5);
P2=0xff;
}
/*******************************************
函数功能:
主函数
******************************************/
voidmain(void)
{
TMOD=0x06;//TMOD=00000110B,使用计数器T0的模式2
EA=1;//开总中断
ET0=1;//允许定时器T0的中断
EX0=1;//允许外中断INT0
IT0=1;//INT0为下负脉冲触发方式
TR0=1;//启动T0
TH0=TL0=256-1;//计数器T0高8位赋初值255
while
(1)//无限循环,不停地将TL0计数结果送P1口
{
//x=TL0;
Display(x);
}
}
//INT0终端函数
voidclear0()interrupt0
{x=0;}
//T0计数器中断
voidKey_counter()interrupt1
{
if(P34==0){
delay1ms(20);
if(P34==0){
x=(x+1)%1000;//因为是3位数码管显示所以要把计的数控制在1000以内(000~999)
}
}
}
外中断字符查询
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetrdata[]={'R','I','C','H','M','C','U',0x0d,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 程序 大全