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