嵌入式系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)4_第1頁
嵌入式系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)4_第2頁
嵌入式系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)4_第3頁
嵌入式系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)4_第4頁
嵌入式系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)4_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、北京聯(lián)合大學(xué)嵌入式系統(tǒng)設(shè)計(jì)與應(yīng)用實(shí)驗(yàn)報(bào)告 學(xué) 院: 專 業(yè): 課 程:嵌入式系統(tǒng)設(shè)計(jì)與應(yīng)用 班 級(jí): 姓 名: 學(xué) 號(hào): 實(shí)驗(yàn)四 數(shù)碼管實(shí)驗(yàn)1、 實(shí)驗(yàn)?zāi)康募叭蝿?wù) 目的:掌握數(shù)碼管控制基本原理 任務(wù):編寫數(shù)碼管驅(qū)動(dòng)及測試程序2、 原理 數(shù)字顯示電路是數(shù)字設(shè)備中不可或缺的組成部分,也是嵌入式系統(tǒng)中數(shù)字顯示器常用的外圍設(shè)備之一。在這里我們使用的數(shù)字顯示器是共陰極八段數(shù)碼管,這樣可以免去布線和相互干擾的麻煩。1)led 的發(fā)光原理:led(light emitting diode),即發(fā)光二極管。是一種半導(dǎo)體固體發(fā)光器件。它是利用固體半導(dǎo)體置于一個(gè)有引線的架子上,然后四周用環(huán)氧樹脂密封,起到保護(hù)內(nèi)部芯

2、線的作用,所以led 的抗震性能好。發(fā)光二極管的核心部分是由p 型半導(dǎo)體和n 型半導(dǎo)體組成的晶片,如下圖,在p 型半導(dǎo)體和n 型半導(dǎo)體之間有一個(gè)過渡層,稱為p-n 結(jié)。在某些半導(dǎo)體材料的pn 結(jié)中,注入的少數(shù)載流子與多數(shù)載流子復(fù)合時(shí)會(huì)把多余的能量以光的形式釋放出來,從而把電能直接轉(zhuǎn)換為光能。pn 結(jié)加反向電壓,少數(shù)載流子難以注入,故不發(fā)光。這種利用注入式電致發(fā)光原理制作的二極管叫發(fā)光二極管,通稱led。 當(dāng)它處于正向工作狀態(tài)時(shí)(即兩端加上正向電壓),電流從led陽極流向陰極時(shí),半導(dǎo)體晶體就發(fā)出從紫外到紅外不同顏色的光線,光的強(qiáng)弱與電流有關(guān)。2)數(shù)碼管數(shù)碼管是一種半導(dǎo)體發(fā)光器件,其基本單元是發(fā)光

3、二極管。數(shù)碼管按段數(shù)分為七段數(shù)碼管和八段數(shù)碼管,八段數(shù)碼管比七段數(shù)碼管多一個(gè)發(fā)光二極管單元(多一個(gè)小數(shù)點(diǎn)顯示);按能顯示多 少個(gè)“8”可分為 1 位、2 位、4 位等等數(shù)碼管;按發(fā)光二極管單元連接方式分為共陽極數(shù)碼管和共陰極數(shù)碼管。共陽數(shù)碼管是指將所有發(fā)光二極管的陽極接到一起形成公共陽極(com)的數(shù)碼管。共陽數(shù)碼管在 應(yīng)用時(shí)應(yīng)將公共極 com 接到+5v,當(dāng)某一字段發(fā)光二極管的陰極為低電平時(shí),相應(yīng)字段就點(diǎn)亮。當(dāng)某一字段的陰極為高電平時(shí),相應(yīng)字段就不亮。共陰數(shù)碼管 是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(com)的數(shù)碼管。共陰數(shù)碼管在應(yīng)用時(shí)應(yīng)將公共極 com 接到地線 gnd 上,當(dāng)某

4、一字段發(fā)光二極管的陽極 為高電平時(shí),相應(yīng)字段就點(diǎn)亮。當(dāng)某一字段的陽極為低電平時(shí),相應(yīng)字段就不亮。數(shù)碼管(led segment displays)是由多個(gè)發(fā)光二極管封裝在一起組成“8”字型的器件,引線已在內(nèi)部連接完成,只需引出它們的各個(gè)筆劃,公共電極。led 數(shù)碼管常用段數(shù) 一般為7 段有的另加一個(gè)小數(shù)點(diǎn),還有一種是類似于 3 位“+1”型。位數(shù)有半位,1,2,3,4,5,6,8,10 位等等.,led 數(shù)碼管根據(jù) led 的接法不同分為共陰和共陽兩類,了解 led 的這些特性,對(duì)編程是很重要的,因?yàn)椴煌愋偷臄?shù)碼管,除了它們的硬件電路有差異外,編程方法也是不同的。3) 八段數(shù)碼管八段數(shù)碼管由

5、 8 個(gè)發(fā)光二極管構(gòu)成,通過不同的組合可用來顯示數(shù)字 09、字符 af、h、l、p、r、u、y、符號(hào)“”及小數(shù)點(diǎn)“.”。數(shù)碼管的外形結(jié)構(gòu)如圖所示。八段數(shù)碼管引腳圖八段數(shù)碼管顯示器由 8 個(gè)發(fā)光二極管組成,如下圖?;?7 個(gè)長條形的發(fā)光管排列成“日”字形,另一個(gè)賀點(diǎn)形的發(fā)光管在顯示器的右下角作為顯示小數(shù)點(diǎn)用,它能顯示各種數(shù)字及部份英文字母。數(shù)碼管有兩種不同的形式:共陰極和共陽極。共陰極數(shù)碼管的 8 個(gè)發(fā)光二極管的陰極(二極管負(fù)端)連接在一起。通常,公共陰極接低電平(一般接地),其它管腳接段驅(qū)動(dòng)電路輸出端。當(dāng)某段驅(qū)動(dòng)電路的輸出端為高電平時(shí),則該端所連接的字段導(dǎo)通并點(diǎn)亮,根據(jù)發(fā)光字段的不同組合可顯

6、示出各種數(shù)字或字符。此時(shí),要求段驅(qū)動(dòng)電路能提供額定的段導(dǎo)通電流,還需根據(jù)外接電源及額定段導(dǎo)通電流來確定相應(yīng)的限流電阻。共陰和共陽結(jié)構(gòu)的數(shù)碼管各筆劃段名和安排位置是相同的。當(dāng)二極管導(dǎo)通時(shí),相應(yīng)的筆劃段發(fā)亮,由發(fā)亮的筆劃段組合而顯示的各種字符。8 個(gè)筆劃段hgfedcba 對(duì)應(yīng)于一個(gè)字節(jié)(8位)的d7 d6 d5 d4 d3 d2 d1 d0,于是用8 位二進(jìn)制碼就可以表示欲顯示字符的字形代碼。例如,對(duì)于共陰數(shù)碼管,當(dāng)共陰極接地(為零電平),而陽極hgfedcba 各段為0111011時(shí),顯示器顯示"p"字符,即對(duì)于共陰極數(shù)碼管,“p”字符的字形碼是73h。如果是共陽數(shù)碼管,共

7、陽極接高電平,顯示“p”字符的字形代碼應(yīng)為10001100(8ch)。這里必須注意的是:很多產(chǎn)品為方便接線,常不按規(guī)則的方法去對(duì)應(yīng)字段與位的關(guān)系,這時(shí)字形碼就必須根據(jù)接線來自行設(shè)計(jì)了。4)驅(qū)動(dòng)方式數(shù)碼管要正常顯示,就要用驅(qū)動(dòng)電路來驅(qū)動(dòng)數(shù)碼管的各個(gè)段碼,從而顯示出 我們要的數(shù)字, 因此根據(jù)數(shù)碼管的驅(qū)動(dòng)方式的不同,可以分為靜態(tài)式和動(dòng)態(tài)式兩類。5)靜態(tài)顯示驅(qū)動(dòng)靜態(tài)驅(qū)動(dòng)也稱直流驅(qū)動(dòng)。靜態(tài)驅(qū)動(dòng)是指每個(gè)數(shù)碼管的每一個(gè)段 碼都由一個(gè)單片機(jī)的i/o 端口進(jìn)行驅(qū)動(dòng),或者使用如 bcd 碼二-十進(jìn)制譯碼器譯碼進(jìn)行驅(qū)動(dòng)。靜態(tài)驅(qū)動(dòng)的優(yōu)點(diǎn)是編程簡單,顯示亮度高,缺點(diǎn)是占用 i/o 端口多,如驅(qū)動(dòng) 5 個(gè)數(shù)碼 管靜態(tài)顯示

8、則需要 5×8=40根 i/o 端口來驅(qū)動(dòng)。6)動(dòng)態(tài)顯示驅(qū)動(dòng)數(shù)碼管動(dòng)態(tài)顯示接口是單片機(jī)中應(yīng)用最為廣泛的一種顯示方 式之一,動(dòng)態(tài)驅(qū)動(dòng)是將所有數(shù)碼管的 8 個(gè)顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個(gè)數(shù)碼管的公共極com 增加位選通控制電 路,位選通由各自獨(dú)立的 i/o 線控制,當(dāng)單片機(jī)輸出字形碼時(shí),所有數(shù)碼管都接收到相同的字形碼,但究竟是那個(gè)數(shù)碼管會(huì)顯示出字形,取決于單片機(jī)對(duì)位選通 com 端電路的控制,所以我們只要將需要顯示的數(shù)碼管的選通控制打開,該位就顯示出字形,沒有選通的數(shù)碼管就不會(huì)亮。通過分時(shí)輪流控制各個(gè)數(shù)碼管的的 com 端,

9、就使各個(gè)數(shù)碼管輪流受控顯示,這就是動(dòng)態(tài)驅(qū)動(dòng)。在輪流顯示過程中,每位數(shù)碼管的點(diǎn)亮?xí)r間為 12ms,由于人的視覺暫留現(xiàn)象及發(fā)光二極管的余輝效應(yīng),盡管實(shí)際上各位數(shù)碼管并非同時(shí)點(diǎn)亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù),不會(huì)有閃爍感,動(dòng)態(tài)顯示的效果和靜態(tài)顯示是一樣的, 能夠節(jié)省大量的 i/o 端口,而且功耗更低3、 代碼及截圖分析seg.c文件#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/device.h>

10、;#include <linux/fs.h>#include <linux/wait.h>#include <linux/cdev.h>#include <linux/mm.h>#include <asm/io.h>#include <asm/uaccess.h>#include <linux/irq.h>#include <linux/interrupt.h>#include <linux/delay.h>#include <linux/jiffies.h>#include

11、 <plat/gpio.h>#include <linux/moduleparam.h>#define device_name "seg"#define fpga_base 0x20000000#define sys_status (fpga_base+(0x20<<1)#define dip_sw_l (fpga_base+(0x12<<1)#define dip_sw_h (fpga_base+(0x13<<1)#define l0 (0x3f)#define l1 (0x06)#define l2 (0x5b

12、)#define l3 (0x4f)#define l4 (0x66)#define l5 (0x6d)#define l6 (0x7d)#define l7 (0x07)#define l8 (0x7f)#define l9 (0x6f)#define intcps_revision 0x48200000static volatile unsigned int *intcps_revision;static volatile unsigned short *sys_status;static volatile unsigned short *dip_l;static volatile uns

13、igned short *dip_h;int hello_major = 233;module_param(hello_major,int,s_irugo);int hello_minor = 0;int number_of_devices = 1;struct cdev cdev;dev_t devno = 0;struct class *key_class;void only_test (void)int i;for(i=0;i<=9;+i)printk("i:%#xn",i);switch(i)case 0 :_raw_writew(l0|l0<<8

14、,dip_l);_raw_writew(l0|l0<<8,dip_h);break;case 1 :_raw_writew(l1|l1<<8,dip_l);_raw_writew(l1|l1<<8,dip_h);break;case 2 :_raw_writew(l2|l2<<8,dip_l);_raw_writew(l2|l2<<8,dip_h);break;case 3 :_raw_writew(l3|l3<<8,dip_l);_raw_writew(l3|l3<<8,dip_h);break;case 4

15、 :_raw_writew(l4|l4<<8,dip_l);_raw_writew(l4|l4<<8,dip_h);break;case 5 :_raw_writew(l5|l5<<8,dip_l);_raw_writew(l5|l5<<8,dip_h);break;case 6 :_raw_writew(l6|l6<<8,dip_l);_raw_writew(l6|l6<<8,dip_h);break;case 7 :_raw_writew(l7|l7<<8,dip_l);_raw_writew(l7|l7&

16、lt;<8,dip_h);break;case 8 :_raw_writew(l8|l8<<8,dip_l);_raw_writew(l8|l8<<8,dip_h);break;case 9 :_raw_writew(l9|l9<<8,dip_l);_raw_writew(l9|l9<<8,dip_h);break;default:break;msleep(1000);static unsigned short translate (unsigned short num)unsigned short temp = 0;switch (num

17、/10)case 0:temp = l0;break;case 1:temp = l1;break;case 2:temp = l2;break;case 3:temp = l3;break;case 4:temp = l4;break;case 5:temp = l5;break;case 6:temp = l6;break;case 7:temp = l7;break;case 8:temp = l8;break;case 9:temp = l9;break;default:printk("errorn");break;switch (num%10)case 0: te

18、mp=(temp<<8|l0);break;case 1: printk("into 1:%xn",temp); temp=(temp<<8|l1);break;case 2: temp=(temp<<8|l2);break;case 3: temp=(temp<<8|l3);break;case 4: temp=(temp<<8|l4);break;case 5: printk("into 5:%xn",temp); temp=(temp<<8|l5);break;case 6:

19、temp=(temp<<8|l6);break;case 7: temp=(temp<<8|l7);break;case 8: temp=(temp<<8|l8);break;case 9: temp=(temp<<8|l9);break;default:printk("errorn");break;return temp;static unsigned short translate_v (unsigned short num)unsigned short temp = 0;switch (num/10)case 0:tem

20、p = l0;break;case 1:temp = l1;break;case 2:temp = l2;break;case 3:temp = l3;break;case 4:temp = l4;break;case 5:temp = l5;break;case 6:temp = l6;break;case 7:temp = l7;break;case 8:temp = l8;break;case 9:temp = l9;break;default:printk("errorn");break;switch (num%10)case 0:temp |= l0<<

21、;8;break;case 1:temp |= l1<<8;break;case 2:temp |= l2<<8;break;case 3:temp |= l3<<8;break;case 4:temp |= l4<<8;break;case 5:temp |= l5<<8; break;case 6:temp |= l6<<8;break;case 7:temp |= l7<<8; break;case 8:temp |= l8<<8;break;case 9:temp |= l9<<

22、8; break;default:printk("errorn");break; return temp;ssize_t seg_read (struct file *filp, char *buff, size_t count, loff_t *offp)unsigned short num,temp;if(copy_from_user(&num,buff,sizeof(num)return -efault; temp = translate(num%100);_raw_writew(temp,dip_l); temp = translate(num/100);_

23、raw_writew(temp,dip_h);return sizeof(temp);ssize_t seg_write (struct file *filp, const char *buff, size_t count, loff_t *f_pos)unsigned short num,temp;if(copy_from_user(&num,buff,sizeof(num)return -efault; temp = translate_v (num%100);_raw_writew(temp,dip_h); /_raw_writew(temp,dip_l);temp = tran

24、slate_v (num/100);_raw_writew(temp,dip_l); /_raw_writew(temp,dip_h);return sizeof(temp);static int seg_open (struct inode *inode, struct file *file)return 0;static int seg_release (struct inode *inode, struct file *file)_raw_writew(0x3f|0x3f<<8,dip_l);_raw_writew(0x3f|0x3f<<8,dip_h);retu

25、rn 0;struct file_operations seg_fops = .owner = this_module,.open = seg_open,.release = seg_release,.read = seg_read,.write = seg_write;static int _init seg_init (void)int status;devno = mkdev (hello_major, hello_minor);status = register_chrdev_region (devno, number_of_devices, device_name);if (stat

26、us<0) printk (kern_warning "can't register major number:%d,check /dev device_no.n", hello_major);goto out1;intcps_revision=ioremap(intcps_revision,0x4);sys_status=ioremap(sys_status,0x2);dip_l=ioremap(dip_sw_l,0x2);dip_h=ioremap(dip_sw_h,0x2);_raw_writew(_raw_readw(sys_status)|0x1,s

27、ys_status);_raw_writew(0x3f|0x3f<<8,dip_l);_raw_writew(0x3f|0x3f<<8,dip_h);cdev_init (&cdev, &seg_fops);cdev.owner = this_module;cdev.ops = &seg_fops;status = cdev_add (&cdev, devno , 1);if (status) printk (kern_notice "error %d adding char_reg_setup_cdev", stat

28、us);goto out2;key_class = class_create(this_module, device_name);device_create(key_class,null,devno,null,device_name);printk("drivers ok,welcome to test!n");return 0;out2:unregister_chrdev_region (devno, number_of_devices);out1:return status;static void _exit seg_exit (void)dev_t devno = mkdev (hello_major, hello_minor);_raw_writew(_raw_readw(sys_status)&(0xfffe),sys_status);cdev_del (&cdev);iounmap(sys_status);iounmap(dip_l);iounmap(dip_h);iounmap(intcps_revision);device_destroy(key_class,devno);class_destroy(key_class); unregis

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論