完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
以下是源程序。。。。
//实例64:用数码管显示动态检测结果 #include #include unsigned char i; //记录中断次数 unsigned int x; //随机检测的数据 unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管显示0~9的段码表 /*********************************************************************** 函数功能:快速动态扫描延时,延时约0.9毫秒 ************************************************************************/ void delay(void) { unsigned int i; for(i=0;i<300;i++) ; } /*********************************************************************** 函数功能:4位数的数码显示器显示 入口参数:k 出口参数:无 ************************************************************************/ void display(unsigned int k) { P2=0xfe; //即P2=1111 1110B,P2.0引脚输出低电平,数码显示器DS0接通电源 P0=Tab[k/1000]; //显示千位 delay(); P2=0xfd ; //即P2=1111 1101B,P2.1引脚输出低电平,数码显示器DS1接通电源 P0=Tab[(k%1000)/100]; //显示百位 delay(); P2=0xfb; //即P2=1111 1011B,P2.2引脚输出低电平,数码显示器DS2接通电源 P0=Tab[(k%100)/10]; //显示十位 delay(); P2=0xf7; //即P2=1111 0111B ,P2.3引脚输出低电平,数码显示器DS3接通电源 P0=Tab[k%10];//显示个位 delay(); P2=0xff; //关闭所有显示器 } void main(void) //主函数 { TMOD=0x01; //使用定时器T0 TH0=(65536-46083)/256; //将定时器计时时间设定为46083×1.085微秒=50000微秒=50毫秒 TL0=(65536-46083)%256; EA=1; //开启总中断 ET0=1; //定时器T0中断允许 TR0=1; //启动定时器T0开始运行 while(1) { display(x); //调用检测结果的显示程序 } } /******************************************************** 函数功能:定时器T0的中断服务程序 *******************************************************/ void time0(void) interrupt 1 using 1 { TR0=0; //关闭定时器T0 i++; //每来一次中断,i自加1 if(i==20) //够20次中断,即1秒钟进行一次检测结果采样 { x=rand()/10; //随机产生一个从0到32767的整数,再将其除以10,获得一个随机4位数,模拟检测结果 i=0; //将i清0,重新统计中断次数 } TH0=(65536-46083)/256; //重新给计数器T0赋初值 TL0=(65536-46083)%256; TR0=1; //启动定时器T0 } |
|
相关推荐
17个回答
|
|
|
用中断法。。。。在中断函数里需要人为的设置溢出位清0么??????有明白的师傅。。。过来讲两句。。。不胜感激。。。。
|
|
|
|
|
|
可以清,也可以不清。硬件上会自动清零。好好看看书。 GTX的东西,入门可以;但别当经典。 |
|
|
2 条评论
|
|
|
个位大师。。。来看看。。。。。需要答案。。。。谢谢。。。
|
|
|
|
|
|
那个 tr0=0. 和tr0=1可以去掉。。。因为tf0可以硬件清0。。。也就是调用中断函数 tf就自动请0 |
|
|
|
|
|
void Time0(void) interrupt 1 using 1
{ TF0=0; // 硬件清0 或者软件清0都可以 所以这句可以不写 TH0=(65536-46083)/256; //重新给计数器T0赋初值 TL0=(65536-46083)%256; i++; //每来一次中断,i自加1 if(i==20) //够20次中断,即1秒钟进行一次检测结果采样 { x=rand()/10; //随机产生一个从0到32767的整数,再将其除以10,获得一个随机4位数,模拟检测结果 i=0; //将i清0,重新统计中断次数 } } PCB打样找华强 http://www.hqpcb.com 样板2天出货 |
|
|
|
|
|
void Time0(void) interrupt 1 using 1
{ TF0=0; // 硬件清0 或者软件清0都可以 所以这句可以不写 TH0=(65536-46083)/256; //重新给计数器T0赋初值 TL0=(65536-46083)%256; i++; //每来一次中断,i自加1 if(i==20) //够20次中断,即1秒钟进行一次检测结果采样 { x=rand()/10; //随机产生一个从0到32767的整数,再将其除以10,获得一个随机4位数,模拟检测结果 i=0; //将i清0,重新统计中断次数 } } PCB打样找华强 http://www.hqpcb.com 样板2天出货 |
|
|
|
|
|
为了使中断完成之后能够回到主函数的断点处继续执行主函数
|
|
|
|
|
|
做个新手真是不容易。。。。想学点东西打发时间。。。。。。可是困难一大把。。。
|
|
|
|
|
|
我晚上看了《从单片机初学者迈向单片机工程师》的帖子。。。。里面的语句描述
if(0 == g_u8LedState) TMOD &= 0xf0 ; TMOD |= 0x01 这种写法是不是。。。。很少了???? |
|
|
|
|
|
感觉。。。论坛的学习氛围。。。。好差。。。。建议初学者建立一个QQ群。。。。大家讨论怎么把单片机学好。。。。。互相交流。。。那样的话进步就很快。。。。有同样想法的可以够来顶下啊。。。。。
|
|
|
|
|
|
在定时器中断里,开始时TR0=0,在中断最后的地方TR0=1这是为什么 回答: 这个是关定时器T0,定时器中断结束后,重新赋值开启定时器,也可以不关,但是如果定时器中断里的程序太长,到下一个溢出时,还在中断中,就有可能造成一些问题,当然如果有补偿算法,也可以,或者中断程序很短,直接重新赋值或自动赋值,不关中断,也可以。 |
|
|
|
|
|
这个问题我也问过,有人解答说是因为自己会将自己中断,虽然同级之间不能中断,但是自己会把自己中断,为了避免这样的发生,所以先把自己封闭,最后运行完再打开
|
|
|
|
|
|
这个在操作系统里面算是保护起来吧,这段代码及其重要,不能被其他中断打断,所以先把中断关掉,保护起来,执行完核心代码,在开起来
|
|
|
|
|
|
学习。。。。。。
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
有人有STM8H1K08T连接TM1650的源码吗,可以直接使用的那种,我的代码在烧录之后数码管一直处于熄灭状态
271 浏览 0 评论
【瑞萨RA6E2】瑞萨E2S软件安装过程,等待过程玩下97_e2 studio_ZGZZ
493 浏览 0 评论
589 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
891 浏览 0 评论
1436 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16926 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-4 10:18 , Processed in 2.063080 second(s), Total 151, Slave 115 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
570