完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
题目具体要求:
用单片机定时计数器产生高电平为50ms,低电平为100ms的方波信号。实现方式: 使用定时计数器0产生中断,单片机的晶振频率为12MHZ,方波信号在P2.0口输出。C语言程序代码: #include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; ***it LSA=P2^2; ***it LSB=P2^3; ***it LSC=P2^4;//设置38译码器的输入端 u16 flag=9999,num=0;//设置数码管初值以及中断次数变量 void DelayMS(u8 i); u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值 void Timer0Init(void) //中断初始化 { TMOD =0x01; //设置定时器模式 TL0 = 0x18; //设置定时初值 TH0 = 0xFC; //设置定时初值 1ms TF0 = 0; //清除TF0标志 ET0 = 1; //定时/计数器T0中断允许开启 EA = 1; //开启总中断 TR0 = 1; //定时器0开始计时 } void DIGdisplay() { u8 i; for (i=0;i<4;i++){ switch(i){ case(0): LSA = 0 ;LSB = 0 ; LSC = 0 ;P0 = smgduan[flag%10] ;DelayMS(1); break; //第一位数码管 case(1): LSA = 1 ;LSB = 0 ; LSC = 0 ;P0 = smgduan[flag/10%10] ;DelayMS(1);break; //第二位数码管 case(2): LSA = 0 ;LSB = 1 ; LSC = 0 ;P0 = smgduan[flag/100%10] ; DelayMS(1);break; //第三位数码管 case(3): LSA = 1 ;LSB = 1 ; LSC = 0 ;P0 = smgduan[flag/1000] ; DelayMS(1);break; // 第四位数码管 这里延时是为了提高数码管亮度 } P0 =0X00;//消隐 } } void time() interrupt 1//中断函数 { TL0 = 0x18; //设置定时初值 TH0 = 0xFC; //设置定时初值 1ms num++; if(num==20) /20ms则跳数字 { num=0; flag--; } } void main() { Timer0Init(); P0 = 0x00; while(1) { DIGdisplay(); } } void DelayMS(u8 i) { //大约 1ms u8 j=100; while(i--) { while(j--); } } 仿真实验结果: |
|
|
|
只有小组成员才能发言,加入小组>>
2561 浏览 0 评论
1158浏览 2评论
761浏览 1评论
514浏览 0评论
271浏览 0评论
447浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 13:03 , Processed in 1.133253 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号