![]() |
數碼管動態顯示會受A/D芯片轉換時間的影響,出現閃爍,建議數碼管用定時器掃描方式。 |
你用AI8051U 兼容的 直接USB仿真,排產故障更簡單 |
不想用三極管,也可以吧r12-r15四個限流電阻改為上拉電阻 |
共陽數碼管的四個公共端,供電不足,AT89C52的拉電流有400微安,又加了限流電阻,根本驅動不了數碼管,com1-com4用三極管驅動試試吧 |
#include <reg51.h> sbit CLK= P3^1; sbit EOC = P3^0; sbit CS = P2^7; sbit WRR = P3^6; sbit RDD = P3^7; unsigned char code SegmentTable[] = { 0xC0, // 0 0xf9, // 1 0xa4, // 2 0xb0, // 3 0x99, // 4 0x92, // 5 0x82, // 6 0xf8, // 7 0x80, // 8 0x90 // 9 }; void delay(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 120; j++); // 調整 120 的值以改變延時長度 } } void Timer0_Init() { TMOD = 0x01; // 定時器0,模式1(16位定時模式) TH0 = 0xFC; // 設置初值高位 TL0 = 0x18; // 設置初值低位 ET0 = 1; // 允許定時器0中斷 EA = 1; // 開啟總中斷 TR0 = 1; // 啟動定時器0 } void Timer0_ISR() interrupt 1 { TH0 = 0xFC; // 重置初值高位 TL0 = 0x18; // 重置初值低位 P3 ^= 0x02; // 翻轉P3.1電平(高->低或低->高) } void ADC_START() { CS = 0; WRR = 0; delay(1); // 穩定信號 CS = 0; WRR = 1; //與非讓START為低電平,不觸發 delay(1); } unsigned char ADC_GET() { while (EOC == 0); // 等待 EOC = 1,表示轉換完成 delay(5); RDD = 0; CS = 0; delay(5); return P0; // 返回采樣結果 } void main() { unsigned int Result; unsigned char digits[3]; unsigned char i; unsigned char position[]={0x02,0x04,0x08}; Timer0_Init(); // 初始化定時器 CS = 1; WRR = 1; while (1) { ADC_START(); Result = ADC_GET(); RDD = 1; CS = 0; Result = Result*100/51; digits[0] = Result/100; //最高位 digits[1] = Result%100/10; digits[2] = Result%100%10; // 小數部分 for(i = 0;i<3;i++) { P2 = position[i]; P1 = SegmentTable[digits[i]]; if(i == 0) { P1 = P1 -0x80; } delay(1); P2 = 0x00; } } } 現在已經實現功能了,但是數碼管會閃爍 而且delay函數沒法往下調了,j到119甚至就顯示不出來了 |
您有可供驗證的測試代碼嗎? |
有問題請描述問題,預計表現,實際表現,提供代碼,報錯信息 |