熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
|
發(fā)布時(shí)間: 2025-1-15 22:43
正文摘要:/**本程序用于測(cè)試分散I/O口驅(qū)動(dòng)4位數(shù)碼管顯示**/ #include <STC12C5A60S2.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char //----I/O口位功能定義---------------- ... |
| 你確定首發(fā)的圖正確?CPU處是P0口輸出數(shù)據(jù),數(shù)碼管處是用了p0;p1???? |
hjx5548 發(fā)表于 2025-1-24 05:11 //====主函數(shù)============================================== void main() { P1M0 = 0x00; P1M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; while(1) { display_out(34); Delay5ms(); } } |
hjx5548 發(fā)表于 2025-1-24 05:11
|
hjx5548 發(fā)表于 2025-1-24 05:11 為何要做定時(shí)器中斷里面調(diào)用display_out(34);? |
hjx5548 發(fā)表于 2025-1-24 05:11 發(fā)原理圖全圖 |
hjx5548 發(fā)表于 2025-1-24 07:55 上傳代碼要用代碼功能,就是上邊的那個(gè)中括弧 |
| segment_out(duan_ma[date[i]]);//上傳怎么沒(méi)有了 |
WL0123 發(fā)表于 2025-1-23 14:55 #include "STC8G.h" #include <intrins.h> #define uint unsigned int #define uchar unsigned char //----I/O口段定義----------------------------------- sbit da=P3^7; sbit db=P3^2; sbit dc=P3^3; sbit dd=P3^5; sbit de=P3^4; sbit df=P3^6; sbit dg=P1^1; sbit dp=P1^0; //不含小數(shù)點(diǎn)8段LED字形碼0-9+黑屏碼、共陽(yáng)極驅(qū)動(dòng)0亮1熄 uchar duan_ma[11]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; uchar date[4];//顯示數(shù)據(jù)暫存 bit flag; void Delay1ms(void) //@11.0592MHz { unsigned char data i, j; i = 15; j = 90; do { while (--j); } while (--i); } void Timer0_Init(void) //1毫秒@12.000MHz { AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式 TMOD &= 0xF0; //設(shè)置定時(shí)器模式 TL0 = 0x20; //設(shè)置定時(shí)初始值 TH0 = 0xD1; //設(shè)置定時(shí)初始值 TF0 = 0; //清除TF0標(biāo)志 TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí) ET0=1; EA=1; } //======================================================= //將LED字形的8個(gè)筆段控制I/O引腳映射到變量的8個(gè)位上 void segment_out(uchar dat) { da=(bit)(dat&0x01); db=(bit)(dat&0x02); dc=(bit)(dat&0x04); dd=(bit)(dat&0x08); de=(bit)(dat&0x10); df=(bit)(dat&0x20); dg=(bit)(dat&0x40); dp=(bit)(dat&0x80); } //====數(shù)據(jù)拆分函數(shù)======================================= //提取出數(shù)據(jù)的千、百、十、個(gè)位的數(shù)值存入數(shù)組中 void digits_obtain(uint dat) { date[0]=dat/10; date[1]=dat%10; } //====顯示輸出函數(shù)======================================= void display_out(uint dat) { static uchar i; digits_obtain(dat);//拆分?jǐn)?shù)據(jù) segment_out(0xff);//段碼清除(消隱) if(i==0) {P55=0;P12=1;}//十位 else {P55=1;P12=0;}//個(gè)位 segment_out(duan_ma[date]);//發(fā)送段顯示碼 // i=++i%2; if (++i>=2) i=0; } //====主函數(shù)============================================== void main() { P1M0 = 0x00; P1M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; Timer0_Init(); Delay1ms(); while(1) { if(flag)//5ms { flag=0; // display_out(34); } } } void Timer0Interrupt(void) interrupt 1 { display_out(34); flag=1; } 還是顯示9 |
WL0123 發(fā)表于 2025-1-23 14:55 端口模式已經(jīng)設(shè)置void main() { P1M0 = 0x00; P1M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; |
|
//====顯示輸出函數(shù)======================================= void display_out(uint dat) { static uchar i; digits_obtain(dat);//拆分?jǐn)?shù)據(jù) segment_out(0xff);//段碼清除(消隱) if(i==0) {P55=0;P12=1;}//十位 else {P55=1;P12=0;}//個(gè)位 segment_out(duan_ma[date]);//發(fā)送段顯示碼 i=++i%2; } 還是一樣 |
hjx5548 發(fā)表于 2025-1-23 07:04 如果MCU采用的還是STC12C5A60S2不需要設(shè)置端口模式,默認(rèn)是準(zhǔn)雙向。沒(méi)有P55,就在P50~53選一個(gè)空閑腳或其它空閑腳。你那十位顯示9其實(shí)是3和4的疊加。換芯片STC8G1K08,需要設(shè)置端口模式,因?yàn)槟J(rèn)是高阻。定時(shí)器用自動(dòng)重裝模式為好。上述兩款單片機(jī)可以直接驅(qū)動(dòng)數(shù)碼管,不需要加晶體管放大。數(shù)碼管段驅(qū)動(dòng)要加8個(gè)限流電阻。 |
|
WL0123 發(fā)表于 2025-1-22 11:30 修改一下,十位顯示9,個(gè)位無(wú)顯示。 /*hjx5548 發(fā)表于 2025-1-21 22:13 如果這樣怎么修改 如果MCU采用的還是STC12C5A60S2那就沒(méi)有P55,只有P50~53。示例程序:*/ //#include <STC12C5A60S2.h> #include "STC8G.h" #include <intrins.h> #define uint unsigned int #define uchar unsigned char //----I/O口段定義----------------------------------- sbit da=P3^7; sbit db=P3^2; sbit dc=P3^3; sbit dd=P3^5; sbit de=P3^4; sbit df=P3^6; sbit dg=P1^1; sbit dp=P1^0; //不含小數(shù)點(diǎn)8段LED字形碼0-9+黑屏碼、共陽(yáng)極驅(qū)動(dòng)0亮1熄 uchar duan_ma[11]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; uchar date[4];//顯示數(shù)據(jù)暫存 bit flag; void Timer0_Init(void) //5毫秒@11.0592MHz { AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式 TMOD &= 0xF0; //設(shè)置定時(shí)器模式 TL0 = 0x00; //設(shè)置定時(shí)初始值 TH0 = 0x28; //設(shè)置定時(shí)初始值 TF0 = 0; //清除TF0標(biāo)志 TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí) ET0=1; EA=1; } //======================================================= //將LED字形的8個(gè)筆段控制I/O引腳映射到變量的8個(gè)位上 void segment_out(uchar dat) { da=(bit)(dat&0x01); db=(bit)(dat&0x02); dc=(bit)(dat&0x04); dd=(bit)(dat&0x08); de=(bit)(dat&0x10); df=(bit)(dat&0x20); dg=(bit)(dat&0x40); dp=(bit)(dat&0x80); } //====數(shù)據(jù)拆分函數(shù)======================================= //提取出數(shù)據(jù)的千、百、十、個(gè)位的數(shù)值存入數(shù)組中 void digits_obtain(uint dat) { date[0]=dat/10; date[1]=dat%10; } //====顯示輸出函數(shù)======================================= void display_out(uint dat) { static uchar i; digits_obtain(dat);//拆分?jǐn)?shù)據(jù) segment_out(0xff);//段碼清除(消隱) if(i==0) {P55=0;P12=1;}//十位 else {P55=1;P12=0;}//個(gè)位 segment_out(duan_ma[date]);//發(fā)送段顯示碼 i=++i%2; } //====主函數(shù)============================================== void main() { P1M0 = 0x00; P1M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; Timer0_Init(); while(1) { if(flag)//5ms { flag=0; display_out(34); } } } void Timer0Interrupt(void) interrupt 1 { TL0 = 0x00; //設(shè)置定時(shí)初始值 TH0 = 0x28; //設(shè)置定時(shí)初始值 flag=1; } |
WL0123 發(fā)表于 2025-1-22 11:30 芯片是STC8G1K08 |
hjx5548 發(fā)表于 2025-1-21 22:13 如果MCU采用的還是STC12C5A60S2那就沒(méi)有P55,只有P50~53。示例程序:
|
xiaobendan001 發(fā)表于 2025-1-16 12:46 這個(gè)我試了,你是對(duì)的,沒(méi)有錯(cuò) |
數(shù)碼管顯示異常是樓主的數(shù)碼管位驅(qū)動(dòng)碼錯(cuò)誤所致。修改如下:
|
jjy1039 發(fā)表于 2025-1-16 08:59 有沒(méi)有試過(guò)?軟件模擬也能看到的 |
|
da=(bit)(duan_ma[dat]&0x01); ....... |
單片機(jī)研究協(xié)會(huì) 發(fā)表于 2025-1-16 01:10 位域怎么寫,請(qǐng)大俠指點(diǎn)一二 |
| 1、先排除掉硬件問(wèn)題,接線問(wèn)題。2、直接用高低電平試試每一段是不是都能點(diǎn)亮。然后用程序控制。邏輯上不要有沖突。 |
|
新愛(ài)的壇友,你確定你的代碼沒(méi)有問(wèn)題嗎!你確定你已經(jīng)編譯通過(guò)了嗎! LINE 96 segment_out(duan_ma[date]); //發(fā)送段顯示碼 LINE 97 position_out(wei_ma); //發(fā)送位顯示碼 這兩行代碼重點(diǎn)檢查一下...... |
|
segment_out(duan_ma[date]); //發(fā)送段顯示碼 [date] 默認(rèn)是地址 0 ,所以只顯示0 修改:date[i] |
| 96行, segment_out(duan_ma[date]); 其中date是數(shù)組類型,改為segment_out(duan_ma[i ]) |
|
DATE是個(gè)數(shù)組,你把它當(dāng)做下標(biāo)是幾個(gè)意思。你是不是應(yīng)該這樣duan_ma[date[i]]; 還有wei_ma也有問(wèn)題。是不是也應(yīng)該寫成wei_ma[i];, |
|
有兩點(diǎn)可以優(yōu)化 1:改用共陰數(shù)碼管,可以省三極管 2:改用位域操作 |
Powered by 單片機(jī)教程網(wǎng)