|
額,不好意思,復(fù)制錯(cuò)代碼了,我貼一下中斷的代碼,這段代碼說(shuō)是解決了之前第一段代碼的抖動(dòng)問(wèn)題,但是我覺(jué)得利用中斷也就是下面這段代碼會(huì)有我上面說(shuō)的疑問(wèn):當(dāng)cnt=1000時(shí)也就是到了1s時(shí),執(zhí)行循環(huán)中的if語(yǔ)句,當(dāng)中斷觸發(fā)時(shí)進(jìn)入中斷也就是1s+1ms時(shí),執(zhí)行switch動(dòng)態(tài)刷新數(shù)碼管程序,但是跳出去時(shí),LedBuff[5]這個(gè)數(shù)組沒(méi)有計(jì)算完,我調(diào)試了代碼發(fā)現(xiàn)這段32位整型數(shù)的除法運(yùn)算程序運(yùn)行時(shí)長(zhǎng)長(zhǎng)達(dá)6.8ms,也就是當(dāng)?shù)?s時(shí)sec++,然后開始計(jì)算那6行32位運(yùn)算,需要6.8ms,但是6.8ms還沒(méi)到還沒(méi)算完時(shí)在1s+1ms時(shí)觸發(fā)中斷,進(jìn)入switch給P0賦值,那么進(jìn)入中斷時(shí)P0的值沒(méi)有更新到那6行32位運(yùn)算完的值豈不是會(huì)有數(shù)碼管秒數(shù)顯示錯(cuò)誤?但是,我把代碼下載到單片機(jī)里面,卻沒(méi)有顯示錯(cuò)誤,顯示是正確的,只不過(guò)我發(fā)現(xiàn)單片機(jī)的1s要更快,大概單片機(jī)上過(guò)了60s時(shí),電腦上過(guò)了61s.所以疑問(wèn):按理來(lái)說(shuō)第二段代碼解決了抖動(dòng)但應(yīng)該會(huì)有數(shù)碼管顯示錯(cuò)誤,但是下載到單片機(jī)上顯示沒(méi)有任何問(wèn)題,只是時(shí)間上有點(diǎn)不準(zhǔn),不知道為什么顯示會(huì)沒(méi)有問(wèn)題,應(yīng)該是第7個(gè)ms那6行運(yùn)算全部計(jì)算完之后P0的賦值才應(yīng)該是sec++后的正確秒數(shù)啊?難道原因是7個(gè)ms也就是刷新完一輪數(shù)碼管的時(shí)間太短暫了,把錯(cuò)誤的秒數(shù)顯示出來(lái)肉眼看不到嗎,麻煩各位大佬再幫我看一下,小弟初學(xué)乍道,勞煩各位了
- #include <reg52.h>
- //數(shù)碼管顯示字符轉(zhuǎn)換表
- unsigned char code LedChar[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; //0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71
- unsigned char LedBuff[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //數(shù)碼管顯示緩沖區(qū),初值 0xFF 確保啟動(dòng)時(shí)都不亮
- unsigned char code wei[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //數(shù)碼管各位的碼表
- unsigned char i = 0; //動(dòng)態(tài)掃描的索引
- unsigned int cnt = 0; //記錄 T0 中斷次數(shù)
- //sbit dula=P2^6; //段選信號(hào)的鎖存器控制
- sbit wela=P2^7; //位選信號(hào)的鎖存器控制
- void main()
- {
- unsigned long sec = 0; //記錄經(jīng)過(guò)的秒數(shù)
- EA = 1; //使能總中斷
- ET0 = 1; //使能 T0 中斷
- TMOD = 0x01; //設(shè)置 T0 為模式 1
- TH0 = 0xFC; //為 T0 賦初值 0xFC67,定時(shí) 1ms
- TL0 = 0x67;
- TR0 = 1; //啟動(dòng) T0
- while (1)
- {
- if (cnt == 1000) //判斷 T0 溢出是否達(dá)到 1000 次
- {
- sec++; //秒計(jì)數(shù)自加 1
- //以下代碼將 sec 按十進(jìn)制位從低到高依次提取并轉(zhuǎn)為數(shù)碼管顯示字符
- LedBuff[0] = LedChar[sec%10];
- LedBuff[1] = LedChar[sec/10%10];
- LedBuff[2] = LedChar[sec/100%10];
- LedBuff[3] = LedChar[sec/1000%10];
- LedBuff[4] = LedChar[sec/10000%10];
- LedBuff[5] = LedChar[sec/100000%10];
- cnt = 0; //達(dá)到 1000 次后計(jì)數(shù)值清零
- } //以下代碼完成數(shù)碼管動(dòng)態(tài)掃描刷新
- }
- }
- /* 定時(shí)器 0 中斷服務(wù)函數(shù) */
- void InterruptTimer0() interrupt 1
- {
- TH0 = 0xFC; //重新加載初值
- TL0 = 0x67;
- cnt++; //中斷次數(shù)計(jì)數(shù)值加 1
- //以下代碼完成數(shù)碼管動(dòng)態(tài)掃描刷新
- P0 = 0x00; //顯示消隱
- switch (i)
- {
- case 0: wela=0;P0=wei[5];wela=1;wela=0;i++;P0=LedBuff[0]; break;
- case 1: wela=0;P0=wei[4];wela=1;wela=0;i++;P0=LedBuff[1]; break;
- case 2: wela=0;P0=wei[3];wela=1;wela=0;i++;P0=LedBuff[2]; break;
- case 3: wela=0;P0=wei[2];wela=1;wela=0;i++;P0=LedBuff[3]; break;
- case 4: wela=0;P0=wei[1];wela=1;wela=0;i++;P0=LedBuff[4]; break;
- case 5: wela=0;P0=wei[0];wela=1;wela=0;i=0;P0=LedBuff[5]; break;
- default: break;
- }
- }
復(fù)制代碼 |
|