主要原因是你消隱沒有處理好,在傳輸段碼過程中要關閉數碼管。否則在仿真時會閃爍,在實際電路中可能會有鬼影。給你把程序修改了一下就正常了。
無標題.jpg (323.43 KB, 下載次數: 30)
下載附件
2019-3-1 11:07 上傳
- #include<reg51.h>
- #include<intrins.h>
- #define u8 unsigned char
- #define u16 unsigned int
- u8 code seg[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff, 0xaa};
- const u16 m[] = {10000, 1000, 100, 10};//數位分解所用權值表
- u16 val = 42950; //所演示的起始值 //分解以后的存放緩沖
- u8 Buf[5];
- sbit DAT = P3^4; //串行數據線
- sbit CLK = P3^7; //串行時鐘線
- sbit Hide= P3^5; //消隱
- void delayms(u16 ms)
- {
- u8 i;
- while(ms--)
- for(i = 0; i < 120; i++);
- }
- void Decompose(u16 x, u8 d[]) //分解顯示數據val
- { //分解整數x
- u8 i;
- for(i=0;i<4;i++)
- {
- d[i]= 0;
- while(x>=m[i])
- {
- x -= m[i];
- d[i]++;
- }
- }
- d[4] = x;
- }
- void serial_Output(u8 d)//模擬時序向74HC164串行輸出1字節數據
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- d <<= 1;
- DAT = CY; //移出一位,高位優先
- CLK = 0;
- CLK = 1; //上升沿移入數據
- }
- }
- void main()
- {
- u8 i;
- while(1)
- {
- Decompose(val, Buf); //分解顯示數據val
- Hide=0;//消隱,關閉數碼管電源
- for(i = 4; i != 0xff; i--) //串行發送各數字段碼
- {
- serial_Output(seg[Buf[i]]);
- //delayms(2);
- }
- Hide=1;//打開數碼管電源
- delayms(500);//延時u8最大255,改為u16
- val++;
- }
- }
復制代碼
|