1、单片机例程试验数码管上显示数字( 单片机直接实现位选 共阴极) *连接方法:P0与J12 用8PIN排线连接 P1与JP16 用排线连接 请学员认真消化本例程,用573锁存器控制和单片机脚直接位选控制(非译码器控制)数码管 #include #include void delay(unsigned int i); /函数声名char DelayCNT;/定义变量 /此表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; /段码控制
2、/此表为8个数码管位选控制, 共阴数码管 1-8个 - unsigned char code dispbit8=0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F; /位选控制 查表的方法控制/*主函数*/ main() unsigned int i,LedNumVal=1 ; /变量定义 unsigned int LedOut10; /变量定义 DelayCNT=0;while(1) if(+DelayCNT=20) /控制数字变化速度 DelayCNT=0; /20个扫描周期清零一次 +LedNumVal; /每隔20个扫描周期加一次LedOut0=Disp_T
3、abLedNumVal%10000/1000; LedOut1=Disp_TabLedNumVal%1000/100|0x80; LedOut2=Disp_TabLedNumVal%100/10; LedOut3=Disp_TabLedNumVal%10; LedOut4=Disp_TabLedNumVal%10000/1000; /千位 LedOut5=Disp_TabLedNumVal%1000/100|0x80; /百位带小数点 LedOut6=Disp_TabLedNumVal%100/10; /十位 LedOut7=Disp_TabLedNumVal%10; /个位 for( i=0
4、; i 0; i-) for(j = 200; j 0; j-);试验数码管上显示数字(译码器位选 共阴极) * 连接方法:P0与J12 用8PIN排线连接 * 请学员认真消化本例程,用573锁存器和译码器控制和数码管 #include #include sbit LS138A = P22; /定义138译码器的输入A脚由P2.2控制 sbit LS138B = P23; /定义138译码器的输入脚B由P2.3控制sbit LS138C = P24; /定义138译码器的输入脚C由P2.4控制void delay(unsigned int i); /函数声名char DelayCNT; /此表
5、为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; /*主函数*/ main() unsigned int i,LedNumVal=1 ; unsigned int LedOut10; DelayCNT=0; while(1) /进入循环状态 if(+DelayCNT=50) DelayCNT=0; /延时计数 每扫描一次加一次 +LedNumVal; /每隔50个扫描周期加一次 LedOut0=Disp_TabLedNumVal
6、%10000/1000; LedOut1=Disp_TabLedNumVal%1000/100|0x80; LedOut2=Disp_TabLedNumVal%100/10; LedOut3=Disp_TabLedNumVal%10; LedOut4=Disp_TabLedNumVal%10000/1000; /千位 LedOut5=Disp_TabLedNumVal%1000/100|0x80; /百位带小数点 LedOut6=Disp_TabLedNumVal%100/10; /十位 LedOut7=Disp_TabLedNumVal%10; /个位 for( i=0; i 0; i-)
7、for(j = 200; j 0; j-);1位数码管上显示外部中断计数* 连接方法:P0与JP3 P3与JP5 用8PIN排线连接 P3.2外部中断输入* 请学员认真消化本例程,用单片机脚直接控制数码管和外部中断使用 #include #include unsigned int LedNumVal;unsigned char code Disp_Tab = 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0xbf,0xc7,0x8c,0xc1, 0xff, 0xf7 ; /* 主程序 */v
8、oid main(void) / IT0=0; /低电平触发 IT0=1; /下降沿触发 EA=1; EX0=1; while(1) P0=Disp_TabLedNumVal%10; /* INT0中断函数 */void counter(void) interrupt 0 EX0=0; LedNumVal+; /中断计数 EX0=1; 试验4位数码管上显示外部中断计数* 连接方法:P0与J12 P3与JP5 用8PIN排线连接 P3.2外部中断输入 JP15和JP16用8个短路冒连上 * 请学员认真消化本例程,用单片机通过译码器控制数码管和外部中断使用 *#include #include s
9、bit LS138A=P22; sbit LS138B=P23;sbit LS138C=P24; unsigned int LedNumVal = 0 ,LedOut8;unsigned char code Disp_Tab = 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0xbf,0xc7,0x8c,0xc1, 0xff, 0xf7 ; void delay(unsigned int i)char j; for(i; i 0; i-) for(j = 200; j 0; j-);disp
10、lay() unsigned char i;LedOut0=Disp_TabLedNumVal%10000/1000; LedOut1=Disp_TabLedNumVal%1000/100&0x7f; LedOut2=Disp_TabLedNumVal%100/10; LedOut3=Disp_TabLedNumVal%10; for( i=0; i8; i+) P0 = LedOuti; switch(i) case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case
11、2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0; LS138C=1; break; case 5:LS138A=1; LS138B=0; LS138C=1; break; case 6:LS138A=0; LS138B=1; LS138C=1; break; case 7:LS138A=1; LS138B=1; LS138C=1; break; delay(150); /* 主程序 */void main(void) P0=0
12、xff; P1=0xff; P2=0xff; / IT0=0; /低电平触发 IT0=1; /下降沿触发 EA=1; EX0=1;while(1) display(); /* INT0中断函数 */void counter(void) interrupt 0 / unsigned char x; EX0=0; LedNumVal+; /中断计数 EX0=1;试验数码管显示时钟* 通过本例程了解 DS1302时钟芯片的基本原理和使用 ,理解并掌握DS1302时钟芯片 驱动程序的编写以及实现数字字符在数码管中的显示。 注意:JP1302跳线冒要短接。 请学员认真消化本例程,懂DS1302在C语言中
13、的操作 #include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include sbit SCK=P36; /时钟 sbit SDA=P34; /数据 sbit RST = P35;/ DS1302复位sbit LS138A=P22; sbit LS138B=P23;sbit LS138C=P24; bit ReadRTC_Flag;/定义读DS1302标志unsigned char l_tmpdate7=0,0,12,15,5,3,8;/秒分时日月周年08-05-15 12:00:00unsigned char l_tmpdisplay8;code unsigne
14、d char write_rtc_address7=0x80,0x82,0x84,0x86,0x88,0x8a,0x8c; /秒分时日月周年 最低位读写位code unsigned char read_rtc_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d; code unsigned char table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; /共阴数码管 0-9 - 熄灭表/*/* 函数声明 */*/ void Write_Ds1302_byte(unsigned char t
15、emp); void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);/read RTC void Set_RTC(void); /set RTC void InitTIMER0(void);/inital timer0/*/* 主函数 */*/void main(void) InitTIMER0(); /初始化定时器0 Set_RTC(); /写入时钟值,如果使用备用电池时候,不需要没每
16、次上电写入,此程序应该屏蔽 while(1) if(ReadRTC_Flag) ReadRTC_Flag=0; Read_RTC(); l_tmpdisplay0=l_tmpdate2/16; /数据的转换,因我们采用数码管09的显示,将数据分开 l_tmpdisplay1=l_tmpdate2&0x0f; l_tmpdisplay2=10; /加入- l_tmpdisplay3=l_tmpdate1/16; l_tmpdisplay4=l_tmpdate1&0x0f; l_tmpdisplay5=10; l_tmpdisplay6=l_tmpdate0/16; l_tmpdisplay7=l
17、_tmpdate0&0x0f; /*/* 定时器0初始化 */*/void InitTIMER0(void)TMOD|=0x01;/定时器设置 16位 TH0=0xef;/初始化值 TL0=0xf0; ET0=1; TR0=1; EA=1;/*/* 写一个字节 */*/void Write_Ds1302_Byte(unsigned char temp) unsigned char i; for (i=0;i=1; /右移一位 SCK=1; /*/* 写入DS1302 */*/void Write_Ds1302( unsigned char address,unsigned char dat )
18、 RST=0; _nop_(); SCK=0; _nop_(); RST=1; _nop_(); /启动 Write_Ds1302_Byte(address); /发送地址 Write_Ds1302_Byte(dat); /发送数据 RST=0; /恢复/*/* 读出DS1302数据 */*/unsigned char Read_Ds1302 ( unsigned char address ) unsigned char i,temp=0x00; RST=0; _nop_(); _nop_(); SCK=0; _nop_(); _nop_(); RST=1; _nop_(); _nop_();
19、 Write_Ds1302_Byte(address); for (i=0;i=1; /右移一位 _nop_(); _nop_(); _nop_(); SCK=1; RST=0; _nop_(); /以下为DS1302复位的稳定时间 _nop_(); RST=0; SCK=0; _nop_(); _nop_(); _nop_(); _nop_(); SCK=1; _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); SDA=1; _nop_(); _nop_(); return (temp); /返回/*/* 读时钟数据 */*/void Read_RTC(vo
20、id) /读取 日历 unsigned char i,*p; p=read_rtc_address; /地址传递 for(i=0;i7;i+) /分7次读取 秒分时日月周年 l_tmpdatei=Read_Ds1302(*p); p+; /*/* 设定时钟数据 */*/void Set_RTC(void) /设定 日历 unsigned char i,*p,tmp; for(i=0;i7;i+) /BCD处理 tmp=l_tmpdatei/10; l_tmpdatei=l_tmpdatei%10; l_tmpdatei=l_tmpdatei+tmp*16; Write_Ds1302(0x8E,0X00); p=write
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1