基于AT89C52的单片机,要求显示时间每两秒显示加一,0~9999
答案:3 悬赏:20 手机版
解决时间 2021-02-04 09:13
- 提问者网友:刺鸟
- 2021-02-03 17:10
基于AT89C52的单片机,要求显示时间每两秒显示加一,0~9999
最佳答案
- 五星知识达人网友:雾月
- 2021-02-03 18:21
用动态扫描,数码管的1234脚接错了。应该用4个脚来控制,假设P1.0-P1.3;
code uchar Tab[] = {0x3b, ...}; //0-f段码
uchar disbuf[4] = {0}; //数码管要显示的内容缓存
void display() //动态数码管扫描,1ms执行一次就行了,尽量不要和其它功能复用这个模块的引脚
{
static uchar ComNum = 0; //选中点亮的数码管号数
P1 = 0; //清掉1234
P2 = Tab[disbuf[ComNum]]; //写段码
P1 = (1 << ComNum); //写位码,到这里就点亮了一位数码管
ComNum = (ComNum + 1) % 4; //0-3循环
}
//阴阳的问题没考虑,
void Counter() //1ms执行一次,
{
statiic uint num = 0;
static uchar Time = 0;
if(num++ > 2000){ //2秒一次
num = 0;
Time++;
disbuf[3] = (Time /1000)% 10;
disbuf[2] = (Time /100) % 10;
disbuf[1] = (Time /10) % 10;
disbuf[0] = Time % 10;
}
}
//计时,用定时器,追问可不可以写个详细点的程序,新手学,但是编程神马一窍不通,还有1234要接在单片机上,P0还要有上拉电阻是么,无比感谢之~~追答硬件不在行,通常在读数据(即输入)时要用到上拉电阻,但是这里跟P0没关系。再有,你这个仿真软件,可以不管它。
#include
#define uchar unsigned char
#define uint unsigned int
code uchar Tab[] = {0x3b, ....}; //段码,自己补充一下。0-F的
uchar disbuf[4] = {0}; //数码管要显示的内容缓存
uchar ScanFlag = 0;
void InitTimer0(){
TCON = 0x02;
TH0 = 0xfd;
TL0 = 0xfd; //定时器初值,自己算,这里乱写的,写成1ms的
EA = 1;
ET0 = 1; //定时器开中断
TR0 = 1;
}
void Timer0() interrupt 1 //定时器0中断程序
{
TH0 = 0xfd;
TL0 = 0xfd;
ScanFlag = 1;
}
void display() { //
...
}
void Counter(){...} //
void main()
{
InitTimer0();
while(1){
if(ScanFlag){ //由中断程序1ms置1一次
ScanFlag = 0;
display() ;
Counter();
}
}
}追问问一下关于那两个你省略的函数,display是关于数码管动态扫描的么,counter是不是只要做个计数的功能就好了追答是呀,那两个函数,就是先前写的那两个呀。
code uchar Tab[] = {0x3b, ...}; //0-f段码
uchar disbuf[4] = {0}; //数码管要显示的内容缓存
void display() //动态数码管扫描,1ms执行一次就行了,尽量不要和其它功能复用这个模块的引脚
{
static uchar ComNum = 0; //选中点亮的数码管号数
P1 = 0; //清掉1234
P2 = Tab[disbuf[ComNum]]; //写段码
P1 = (1 << ComNum); //写位码,到这里就点亮了一位数码管
ComNum = (ComNum + 1) % 4; //0-3循环
}
//阴阳的问题没考虑,
void Counter() //1ms执行一次,
{
statiic uint num = 0;
static uchar Time = 0;
if(num++ > 2000){ //2秒一次
num = 0;
Time++;
disbuf[3] = (Time /1000)% 10;
disbuf[2] = (Time /100) % 10;
disbuf[1] = (Time /10) % 10;
disbuf[0] = Time % 10;
}
}
//计时,用定时器,追问可不可以写个详细点的程序,新手学,但是编程神马一窍不通,还有1234要接在单片机上,P0还要有上拉电阻是么,无比感谢之~~追答硬件不在行,通常在读数据(即输入)时要用到上拉电阻,但是这里跟P0没关系。再有,你这个仿真软件,可以不管它。
#include
#define uchar unsigned char
#define uint unsigned int
code uchar Tab[] = {0x3b, ....}; //段码,自己补充一下。0-F的
uchar disbuf[4] = {0}; //数码管要显示的内容缓存
uchar ScanFlag = 0;
void InitTimer0(){
TCON = 0x02;
TH0 = 0xfd;
TL0 = 0xfd; //定时器初值,自己算,这里乱写的,写成1ms的
EA = 1;
ET0 = 1; //定时器开中断
TR0 = 1;
}
void Timer0() interrupt 1 //定时器0中断程序
{
TH0 = 0xfd;
TL0 = 0xfd;
ScanFlag = 1;
}
void display() { //
...
}
void Counter(){...} //
void main()
{
InitTimer0();
while(1){
if(ScanFlag){ //由中断程序1ms置1一次
ScanFlag = 0;
display() ;
Counter();
}
}
}追问问一下关于那两个你省略的函数,display是关于数码管动态扫描的么,counter是不是只要做个计数的功能就好了追答是呀,那两个函数,就是先前写的那两个呀。
全部回答
- 1楼网友:长青诗
- 2021-02-03 19:13
不解释 哎 你这个是什么软件做的啊?
- 2楼网友:一把行者刀
- 2021-02-03 18:40
要实现这个你的电路是错误的,根本不会实现。你要把数码管上的位选分开接。我问一下这个是你自己画的电路吗?追问选位的话是不是就是那四个阳极的接上单片机?这个软件 图标就是个蓝底的ISIS
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯