单片机例程Word下载.docx

上传人:b****4 文档编号:16352013 上传时间:2022-11-23 格式:DOCX 页数:14 大小:18.50KB
下载 相关 举报
单片机例程Word下载.docx_第1页
第1页 / 共14页
单片机例程Word下载.docx_第2页
第2页 / 共14页
单片机例程Word下载.docx_第3页
第3页 / 共14页
单片机例程Word下载.docx_第4页
第4页 / 共14页
单片机例程Word下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

单片机例程Word下载.docx

《单片机例程Word下载.docx》由会员分享,可在线阅读,更多相关《单片机例程Word下载.docx(14页珍藏版)》请在冰豆网上搜索。

单片机例程Word下载.docx

=20)//控制数字变化速度

{DelayCNT=0;

//20个扫描周期清零一次

++LedNumVal;

//每隔20个扫描周期加一次}

LedOut[0]=Disp_Tab[LedNumVal%10000/1000];

LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;

LedOut[2]=Disp_Tab[LedNumVal%100/10];

LedOut[3]=Disp_Tab[LedNumVal%10];

LedOut[4]=Disp_Tab[LedNumVal%10000/1000];

//千位

LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80;

//百位带小数点

LedOut[6]=Disp_Tab[LedNumVal%100/10];

//十位

LedOut[7]=Disp_Tab[LedNumVal%10];

//个位

for(i=0;

i<

9;

i++)

{P0=LedOut[i];

P1=dispbit[i];

//使用查表法进行位选

/*switch(i)//使用switch语句控制位选

case0:

P1=0x7F;

break;

case1:

P1=0xbF;

case2:

P1=0xdF;

case3:

P1=0xeF;

case4:

P1=0xf7;

case5:

P1=0xfb;

case6:

P1=0xfd;

case7:

P1=0xfe;

}*/

delay(150);

//扫描间隔时间太长会数码管会有闪烁感

}

}

voiddelay(unsignedinti)

{charj;

for(i;

i>

0;

i--)

for(j=200;

j>

j--);

}

(译码器位选共阴极)*

*连接方法:

P0与J12用8PIN排线连接

*请学员认真消化本例程,用573锁存器和译码器控制和数码管#include<

sbitLS138A=P2^2;

//定义138译码器的输入A脚由P2.2控制

sbitLS138B=P2^3;

//定义138译码器的输入脚B由P2.3控制

sbitLS138C=P2^4;

//定义138译码器的输入脚C由P2.4控制

//此表为LED的字模,共阴数码管0-9-

while

(1)//进入循环状态

=50)

{

DelayCNT=0;

//延时计数每扫描一次加一次

//每隔50个扫描周期加一次

}

LedOut[0]=Disp_Tab[LedNumVal%10000/1000];

for(i=0;

i++)//实现8位动态扫描循环

P0=LedOut[i];

//将字模送到P0口显示

switch(i)//使用switch语句控制位选也可以是用查表的方式学员可以试着自己修改

LS138A=0;

LS138B=0;

LS138C=0;

LS138A=1;

LS138B=1;

LS138C=1;

}

delay(150);

*voiddelay(unsignedinti)

{

charj;

1位数码管上显示外部中断计数

P0与JP3P3与JP5用8PIN排线连接P3.2外部中断输入*

*请学员认真消化本例程,用单片机脚直接控制数码管和外部中断使用

reg51.h>

unsignedintLedNumVal;

unsignedcharcodeDisp_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0xbf,0xc7,0x8c,0xc1,0xff,0xf7};

/********************************************************

*主程序*

********************************************************/

voidmain(void)

//IT0=0;

//低电平触发

IT0=1;

//下降沿触发

EA=1;

EX0=1;

while

(1)

P0=Disp_Tab[LedNumVal%10];

*INT0中断函数*

voidcounter(void)interrupt0

EX0=0;

LedNumVal++;

//中断计数

试验4位数码管上显示外部中断计数

P0与J12P3与JP5用8PIN排线连接P3.2外部中断输入JP15和JP16用8个短路冒连上

*请学员认真消化本例程,用单片机通过译码器控制数码管和外部中断使用*

sbitLS138A=P2^2;

sbitLS138B=P2^3;

sbitLS138C=P2^4;

unsignedintLedNumVal=0,LedOut[8];

unsignedcharcodeDisp_Tab[]={~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x90,~0x88,~0x83,~0xC6,~0xA1,~0x86,~0xbf,~0xc7,~0x8c,~0xc1,~0xff,~0xf7};

display()

{unsignedchari;

LedOut[1]=Disp_Tab[LedNumVal%1000/100]&

0x7f;

8;

switch(i)

{case0:

delay(150);

}}

{P0=0xff;

P1=0xff;

P2=0xff;

display();

//unsignedcharx;

试验数码管显示时钟

*通过本例程了解DS1302时钟芯片的基本原理和使用,理解并掌握DS1302时钟芯片驱动程序的编写以及实现数字字符在数码管中的显示。

注意:

JP1302跳线冒要短接。

请学员认真消化本例程,懂DS1302在C语言中的操作

#include<

reg52.h>

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

sbitSCK=P3^6;

//时钟

sbitSDA=P3^4;

//数据

sbitRST=P3^5;

//DS1302复位

bitReadRTC_Flag;

//定义读DS1302标志

unsignedcharl_tmpdate[7]={0,0,12,15,5,3,8};

//秒分时日月周年08-05-1512:

00:

00

unsignedcharl_tmpdisplay[8];

codeunsignedcharwrite_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};

//秒分时日月周年最低位读写位

codeunsignedcharread_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

codeunsignedchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

//共阴数码管0-9'

-'

'

熄灭‘表

/******************************************************************/

/*函数声明*/

/******************************************************************/voidWrite_Ds1302_byte(unsignedchartemp);

voidWrite_Ds1302(unsignedcharaddress,unsignedchardat);

unsignedcharRead_Ds1302(unsignedcharaddress);

voidRead_RTC(void);

//readRTC

voidSet_RTC(void);

//setRTC

voidInitTIMER0(void);

//initaltimer0

/*主函数*/

voidmain(void)

{InitTIMER0();

//初始化定时器0

Set_RTC();

//写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽

{if(ReadRTC_Flag)

{ReadRTC_Flag=0;

Read_RTC();

l_tmpdisplay[0]=l_tmpdate[2]/16;

//数据的转换,因我们采用数码管0~9的显示,将数据分开

l_tmpdisplay[1]=l_tmpdate[2]&

0x0f;

l_tmpdisplay[2]=10;

//加入"

-"

l_tmpdisplay[3]=l_tmpdate[1]/16;

l_tmpdisplay[4]=l_tmpdate[1]&

l_tmpdisplay[5]=10;

l_tmpdisplay[6]=l_tmpdate[0]/16;

l_tmpdisplay[7]=l_tmpdate[0]&

}}}

/*定时器0初始化*/

voidInitTIMER0(void)

{TMOD|=0x01;

//定时器设置16位

TH0=0xef;

//初始化值

TL0=0xf0;

ET0=1;

TR0=1;

/*写一个字节*/

voidWrite_Ds1302_Byte(unsignedchartemp)

unsignedchari;

for(i=0;

i<

i++)//循环8次写入数据

SCK=0;

SDA=temp&

0x01;

//每次传输低字节

temp>

>

=1;

//右移一位

SCK=1;

}}

/*写入DS1302*/

voidWrite_Ds1302(unsignedcharaddress,unsignedchardat)

RST=0;

_nop_();

SCK=0;

RST=1;

_nop_();

//启动

Write_Ds1302_Byte(address);

//发送地址

Write_Ds1302_Byte(dat);

//发送数据

//恢复

/*读出DS1302数据*/

unsignedcharRead_Ds1302(unsignedcharaddress)

{unsignedchari,temp=0x00;

for(i=0;

i++)//循环8次读取数据

{if(SDA)

temp|=0x80;

//每次传输低字节

temp>

SCK=1;

//以下为DS1302复位的稳定时间

RST=0;

SDA=0;

SDA=1;

return(temp);

//返回

/*读时钟数据*/

voidRead_RTC(void)//读取日历

unsignedchari,*p;

p=read_rtc_address;

//地址传递

for(i=0;

7;

i++)//分7次读取秒分时日月周年

l_tmpdate[i]=Read_Ds1302(*p);

p++;

/*设定时钟数据*/

voidSet_RTC(void)//设定日历

unsignedchari,*p,tmp;

i++){//BCD处理

tmp=l_tmpdate[i]/10;

l_tmpdate[i]=l_tmpdate[i]%10;

l_tmpdate[i]=l_tmpdate[i]+tmp*16;

Write_Ds1302(0x8E,0X00);

p=write

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

当前位置:首页 > 高中教育 > 语文

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

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