單片機源程序如下:
#include #define uchar unsigned char #define uint unsigned int #define DAdata P0 //DA數據端口 sbit DA_S1= P2^0; // 控制DAC0832的8位輸入寄存器,僅當都為0時,可以輸出數據(處于直通狀態),否則,輸出將被鎖存 sbit DA_S2= P2^1; // 控制DAC0832的8位DAC寄存器,僅當都為0時,可以輸出數據(處于直通狀態),否則,輸出將被鎖存 sbit key= P3^2; uchar wavecount; //'抽點'計數 uchar THtemp,TLtemp;//傳遞頻率的中間變量 uchar judge=1; //在方波輸出函數中用于簡單判別作用 uchar waveform; //當其為0、1、2時,分別代表三種波 uchar code freq_unit[3]={10,50,200}; //三種波的頻率單位 uchar idata wavefreq[3]={1,1,1}; //給每種波定義一個數組單元,用于存放單位頻率的個數 uchar code lcd_hang1[]={"Sine Wave " "Triangle Wave " "Square Wave " "Select Wave: " "press No.1 key! "}; uchar idata lcd_hang2[16]={"f= Hz "}; uchar code waveTH[]={ 0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xec,0xf6,0xf9,0xfb,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe}; uchar code waveTL[]={ 0x06,0x8a,0x10,0x4e,0x78,0x93,0xa8,0xb3,0xbe,0xc6, //正弦波頻率調整中間值 0xac,0xde,0x48,0x7a,0x99,0xaf,0xbb,0xc8,0xd0,0xde, //三角波頻率調整中間值 0x88,0x50,0x90,0x32,0x34,0xbe,0x4a,0xa3,0xe5,0x2c}; /*************************************************************************************************/ uchar code triangle_tab[]={ //每隔數字8,采取一次 0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78, 0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0xe0,0xe8,0xf0,0xf8,0xff, 0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x98,0x90,0x88,0x80, 0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00}; uchar code sine_tab[256]={ //輸出電壓從0到最大值(正弦波1/4部分) 0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc, 0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec, 0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff, //輸出電壓從最大值到0(正弦波1/4部分) 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef, 0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2, 0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80, //輸出電壓從0到最小值(正弦波1/4部分) 0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43, 0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13, 0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00, //輸出電壓從最小值到0(正弦波1/4部分) 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10, 0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d, 0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80}; void delay(uchar z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void triangle_out() //三角波輸出 { DAdata=triangle_tab[wavecount++]; if(wavecount>64) wavecount=0; DA_S1=0; //打開8位輸入寄存器 DA_S1=1; //關閉8位輸入寄存器 } void sine_out() //正弦波輸出 { DAdata=sine_tab[wavecount++]; DA_S1=0; //打開8位輸入寄存器 DA_S1=1; //關閉8位輸入寄存器 } void square_out() //方波輸出 { judge=~judge; if(judge==1) DAdata=0xff; else DAdata=0x00; DA_S1=0; //打開8位輸入寄存器 DA_S1=1; //關閉8位輸入寄存器 } /************1602液晶的相關函數*************/ #define lcd_ports P1 sbit rs=P2^2; sbit rw=P2^3; sbit lcden=P2^4; void write_com(uchar com) { rs=0; //置零,表示寫指令 lcden=0; lcd_ports=com; delay(5); lcden=1; delay(5); lcden=0; } void write_date(uchar date) { rs=1; //置1,表示寫數據(在指令所指的地方寫數據) lcden=0; lcd_ports=date; delay(5); lcden=1; delay(5); lcden=0; } void disp_lcd(uchar addr,uchar *temp1) { uchar num; write_com(addr); delay(1); //延時一會兒??? for(num=0;num<16;num++) { write_date(temp1[num]);//或者這樣寫write_date(*(temp1+num)); delay(1); } } void init_lcd() { //uchar num; lcden=0; //可有可無??? rw=0; //初始化一定要設置為零,表示寫數據 write_com(0x38); //使液晶顯示點陣,為下面做準備 write_com(0x0c); //初始設置 write_com(0x06); //初始設置 write_com(0x01); //清零 write_com(0x80); //使指針指向第一行第一格 disp_lcd(0x80,&lcd_hang1[3*16]); //在第一行顯示 disp_lcd(0xc0,&lcd_hang1[4*16]); //在第二行顯示 } /********************1602液晶函數聲明結束*********************/ void main() { uchar i=0; DA_S2=0; //使DAC寄存器處于直通狀態 DAdata=0; DA_S1=1; //關閉8位輸入寄存器 init_lcd(); waveform=0; TMOD=0x01; //設置定時器0為16位工作方式 IT0=1; //設置外部中斷0為下降沿觸發 ET0=1; //開定時器中斷 EX0=1; EA=1; while(1) { //DAout(0xff); //可輸出TTL波形 //DAout(0x80); //T_temp=32; } } void timer0() interrupt 1 { TH0=THtemp; TL0=TLtemp; if(waveform==0) sine_out(); else if(waveform==1) triangle_out(); else if(waveform==2) square_out(); } void key_int0() interrupt 0 { uchar keytemp; uint total_freq; //總頻率 EA=0; TR0=0; //關總中斷與定時器 delay(5); //延時夠嗎??? if(key==0) //確實有按鍵按下而引發中斷 { keytemp=P3&0xf0; //獲取P3口高四位的值 switch(keytemp) { case 0xe0: //選擇波形 waveform++; if(waveform>2) waveform=0; break; case 0xd0: //頻率按規定單位依次增加 wavefreq[waveform]++; if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*這邊要用“>10”,因為它比“=11”可靠 break; // 性更高,使加數有個上限,不會一直加下去*/ ……………………
上一篇:51單片機水溫控制LCD顯示加VB上位機溫度曲線繪制
下一篇:自制單片機STC12C5A60S2+1602電壓表
推薦閱讀
史海拾趣
在電子行業中,產品質量是企業生存和發展的關鍵。EHC公司深知這一點,因此一直將品質管理作為企業發展的重要戰略。公司建立了完善的質量管理體系,從原材料采購到生產制造再到產品出廠,每一個環節都經過嚴格的把控。這種對品質的堅持和追求讓EHC公司的產品在市場上贏得了廣泛的信任和認可。
BULGIN公司的歷史可以追溯到1923年,當時A.F.Bulgin先生和他的同伴在英國創立了A.F.Bulgin有限公司。公司專注于無線電電子零件的制造與生產,憑借產品的優質口碑,BULGIN的品牌逐漸廣為人知。隨著訂單的不斷增加,公司迅速成長,并在二戰前已經擁有了當時最先進的現代化大規模生產線。
在2016年,BULGIN公司宣布與姊妹公司Arcolectric進行戰略性合并。這一合并使得兩個具有互補性的產品組合合為一體,BULGIN因此成為更加全面和覆蓋范圍更加廣的工程解決方案提供商。合并后的BULGIN不僅擴大了專長范圍,特別是在機電開關領域,還進一步提升了在全球市場的競爭力。
隨著產品線的不斷豐富和技術實力的不斷提升,Austek Microsystems開始積極拓展市場。公司不僅在國內市場取得了良好的銷售業績,還積極開拓海外市場,與多個國家和地區的客戶建立了穩定的合作關系。同時,Austek Microsystems還注重品牌建設,通過參加行業展會、舉辦技術研討會等方式,提升品牌知名度和影響力。
隨著技術實力的不斷增強,CALMIRCO公司開始積極拓展國內外市場。公司通過參加國際電子展會、建立海外銷售渠道等方式,逐漸將產品推向全球。同時,CALMIRCO公司還注重品牌建設,通過廣告宣傳、媒體報道等多種渠道提升品牌知名度和美譽度。這些舉措使得CALMIRCO公司的產品在市場上獲得了廣泛認可,公司也因此成為電子行業的佼佼者。
Auctor Corp公司的創始人,一群富有遠見和冒險精神的工程師,懷揣著對電子技術的熱情和對市場的敏銳洞察,決定共同創辦這家公司。在創業初期,公司面臨著資金緊張、技術儲備不足等多重困難。然而,團隊成員們憑借著堅韌不拔的精神和對技術的執著追求,通過自主研發和不斷改進,逐漸在市場上站穩了腳跟。
EEWorld積分種類如下: “芯積分”積分規則:越活躍,分越高,可兌換實物禮品! >>芯積分兌換商城 “E金幣”積分規則:一個可以當錢花的積分! & ...… 查看全部問答∨ |
不知道哪位好心的人可以幫幫我 我真的做不出來 以下是用AVR做的 包含LCD module (LCD 可顯示兩行) 這個部分已經做出來了 一定正確 題目 按A開始計算時間從00:00.0開始 到99:59.9 再按一次A時間會停止 如時間跑到35:11.9時 按A會停在35:11.9再 ...… 查看全部問答∨ |
這幾個概念采樣序列,多通道輸入我理解不到位。 看了下幾種adc的轉換原理,都是一個模擬信號,這個多通道意思是芯片可以同時采樣多個模擬信號嗎?還有采樣序列發生器起什么作用?… 查看全部問答∨ |
|
使用CPLD設計的三相交流電流電壓信號源,有原理圖。已經實現了全部功能。本項目是使用在三相電測標準源上的。 但是信號頻率不穩定。目前達到的是:49.99XX,要求達到49.9999±1個字。希望高手來幫忙解決。 注意本工程只響應有電測行業設計經驗的工 ...… 查看全部問答∨ |
ZLG的深入淺出ARM7中采用LPC2131。本人看了 SPI 后又去看了下ADC。 單獨的 SPI 沒有問題。然后我想用ADC后把顯示的數據通過SPI,然后在LED顯示。發現只要在 AD的有關引腳有電壓輸入就會使現實亂碼。想請教一下是不是 ADC會影響 SPI 。 其中 ...… 查看全部問答∨ |
[local]1[/local]之前用過MDK4.22版的 反正覺得有點問題,編譯的時候 似乎沒有錯會報錯 于是就換成了4.21版本的 附件是一個被壓縮的工程包,此工程包過對PWM、定時器、串口、OLED(基于GR_LIB)、按鍵、LED等模 塊的使用。建工程就不說了 ...… 查看全部問答∨ |
磁致伸縮位移傳感器的工作原理 磁致伸縮位移傳感器又叫磁尺,是利用磁致伸縮效應研制的傳感器。磁致伸縮位移傳感器能夠適應各種惡劣的工業環境,并對位移、速度做出精確的測量,因此磁致伸縮位移傳感器在冶金、化工等領域得到廣泛的應用 ...… 查看全部問答∨ |
ucgui3.90 vc6.0上仿真的入口函數是MainTask() 但是ucgui3.90a的入口函數不一樣 我把MainTask()函數注釋掉了 編譯運行還是一樣 都是那個車速指示盤 右下角還有個導航地圖 請各位幫幫忙??? 還有我單步運行時 ...… 查看全部問答∨ |
本帖最后由 dontium 于 2015-1-23 13:11 編輯 設計電路,在模電書上看到信號放大的電路,是三個運放,有沒有兩個運放的還有就是單電源運放放大的 … 查看全部問答∨ |