hmgqljz111 发表于 2019-11-16 10:31 玩单片机就是玩逻辑和时间,原则上定时器中断中不要执行过么多语句,以免影响主程序执行任务,但只要把时序安排好,完全可以只在定时器中断中完成任务,基本没有主函数什么事。串口发送程序也可以在T0中断中运行,串口发送程序在主函数中运行时如果受到T0中断干扰可以在发送时短暂关闭T0中断,如果不能关,也可以在T0中断中设个标志,串口发送程序查询这个标志决定发送,可以有效避免互相干扰。 |
wulin 发表于 2019-11-14 21:38 真厉害 |
wulin 发表于 2019-11-14 21:38 师傅在定时器里可以执行这么多语句,为何我在定时器0里执行一个,用定时器1产生波特率的串口发送程序就不行呢。 |
谢谢大家,我这就仔细学习一下 |
很简单的 github 有源码 直接找 |
一般用定时计数器可以实现,其思路是用一个整型变量进行加,所加的值分配按千百十个位存入数组定义的显示缓冲区,程序扫描显示缓冲区的数据即可 如定义1秒钟加1次的实现方法: 定时中断的程序 void time0() interrupt 1 { n++; //2ms定时加到500即为1秒 if (n==500) { n=0; sec++; //秒钟加1 } P2=0; //共阴数码管消影 P2=disp[dispbuf[i]]; //dispbuf数组存千百十个位数据 disp数组存0-9的段码 P3=wei[i]; //数组wei存放显示的位码依次为0x0e,0x0d,0x0b,0x07 i++; //i用于计数数码管的显示位 if (j==4) j=0; TH0=(65536-2000)/256; //重装2ms初值 TL0=(65536-2000)%256; } 主程序应包括如下内容: dispbuf[0]=sec/1000; //千位数字 dispbuf[1]=(sec/100)%10; //百位数字 dispbuf[2]=(sec/10)%10; //十位数字 dispbuf[3]=sec%10; //个位数字 |
给你写了一个按键短按加减,长按连加减 4位数码管显示0~9999程序,端口根据实际电路自行修改。![]()
|