第一篇:Excel之VBA編程常用語句300句之二
ThisWorkbook.ActiveSheet.Rows(1).RowHeight = 10 ‘改變工作表的行1的高度值設置為10(121)ThisWorkbook.Worksheets(1).Activate ‘當前工作簿中的第一個工作表被激活
(122)ThisWorkbook.Worksheets(“Sheet1”).Rows(1).Font.Bold = True ‘設置工作表Sheet1中的行1數(shù)據(jù)為粗體
(123)ThisWorkbook.Worksheets(“Sheet1”).Rows(1).Hidden = True ‘將工作表Sheet1中的行1隱藏
ActiveCell.EntireRow.Hidden = True ‘將當前工作表中活動單元格所在的行隱藏
注:同樣可用于列。
(124)ActiveSheet.Range(“A:A”).EntireColumn.AutoFit ‘自動調(diào)整當前工作表A列列寬
(125)ActiveSheet.Cells.SpecialCells(xlCellTypeConstants,xlTextValues)‘選中當前工作表中常量和文本單元格
ActiveSheet.Cells.SpecialCells(xlCellTypeConstants,xlErrors+xlTextValues)‘選中當前工作表中常量和文本及錯誤值單元格
*******************************************************
公式與函數(shù)
(126)Application.MacroOptions Macro:=”SumPro”,Category:=4 ‘將自定義的SumPro函數(shù)指定給Excel中的“統(tǒng)計函數(shù)”類別
(127)Application.MacroOptions Macro:=”SumPro”, _
Description:=”First Sum,then Product” ‘為自定義函數(shù)SumPro進行了功能說明
(128)Application.WorksheetFunction.CountA(Range(“A:A”))+1 ‘獲取A列的下一個空單元格(129)WorksheetFunction.CountA(Cell.EntireColumn)‘返回該單元格所在列非空單元格的數(shù)量 WorksheetFunction.CountA(Cell.EntireRow)‘返回該單元格所在行非空單元格的數(shù)量(130)WorksheetFunction.CountA(Cells)‘返回工作表中非空單元格數(shù)量
(131)ActiveSheet.Range(“A20:D20”).Formula=“=Sum(R*-19]C:R[-1+C”’對A列至D列前19個數(shù)值求和
*******************************************************
圖表
(132)ActiveWindow.Visible=False
或 ActiveChart.Deselect ‘使圖表處于非活動狀態(tài)
(133)TypeName(Selection)=”Chart” ‘若選中的為圖表,則該語句為真,否則為假
(134)ActiveSheet.ChartObjects.Delete ‘刪除工作表上所有的ChartObject對象
ActiveWorkbook.Charts.Delete ‘刪除當前工作簿中所有的圖表工作表
*******************************************************
窗體和控件
(135)UserForms.Add(MyForm).Show ‘添加用戶窗體MyForm并顯示
(136)TextName.SetFocus ‘設置文本框獲取輸入焦點
(137)SpinButton1.Value=0 ‘將數(shù)值調(diào)節(jié)鈕控件的值改為0
(138)TextBox1.Text=SpinButton1.Value ‘將數(shù)值調(diào)節(jié)鈕控件的值賦值給文本框控件
SpinButton1.value=“/Val(TextBox1.Text)” ‘將文本框控件值賦給數(shù)值調(diào)節(jié)鈕控件
CStr(SpinButton1.Value)=TextBox1.Text ‘數(shù)值調(diào)節(jié)鈕控件和文本框控件相比較
(139)UserForm1.Controls.Count ‘顯示窗體UserForm1上的控件數(shù)目
(140)ListBox1.AddItem “Command1” ‘在列表框中添加Command1
(141)ListBox1.ListIndex ‘返回列表框中條目的值,若為-1,則表明未選中任何列表框中的條目(142)RefEdit1.Text ‘返回代表單元格區(qū)域地址的文本字符串
RefEdit1.Text=ActiveWindow.RangeSelection.Address ‘初始化RefEdit控件顯示當前所選單元格區(qū)域
Set FirstCell=Range(RefEdit1.Text).Range(“A1”)‘設置某單元格區(qū)域左上角單元格
(143)Application.OnTime Now + TimeValue(“00:00:15”), “myProcedure” ‘等待15秒后運行myProcedure過程
(144)ActiveWindow.ScrollColumn=ScrollBarColumns.Value ‘將滾動條控件的值賦值給ActiveWindow對象的ScrollColumn屬性
ActiveWindow.ScrollRow=ScrollBarRows.Value ‘將滾動條控件的值賦值給ActiveWindow對象的ScrollRow屬性
(145)UserForm1.ListBox1.AddItem Sheets(“Sheet1”).Cells(1,1)‘將單元格A1中的數(shù)據(jù)添加到列表框中
ListBox1.List=Product ‘將一個名為Product數(shù)組的值添加到ListBox1中
ListBox1.RowSource=”Sheet2!SumP” ‘使用工作表Sheet2中的SumP區(qū)域的值填充列表框(146)ListBox1.Selected(0)‘選中列表框中的第一個條目(注:當列表框允許一次選中多個條目時,必須使用Selected屬性)
(147)ListBox1.RemoveItem ListBox1.ListIndex ‘移除列表框中選中的條目
*******************************************************
對象
Application對象
(148)Application.UserName ‘返回應用程序的用戶名
(149)Application.Caller ‘返回代表調(diào)用函數(shù)的單元格
(150)Application.Caller.Parent.Parent ‘返回調(diào)用函數(shù)的工作簿名稱
(151)Application.StatusBar=”請等待……” ‘將文本寫到狀態(tài)欄
Application.StatusBar=”請等待……” & Percent & “% Completed” ‘更新狀態(tài)欄文本,以變量Percent代表完成的百分比
Application.StatusBar=False ‘將狀態(tài)欄重新設置成正常狀態(tài)
(152)Application.Goto Reference:=Range(“A1:D4”)‘指定單元格區(qū)域A1至D4,等同于選擇“編輯——定位”,指定單元格區(qū)域為A1至D4,不會出現(xiàn)“定位”對話框
(153)Application.Dialogs(xlDialogFormulaGoto).Show ‘顯示“定位”對話框,但定位條件按鈕無效
(154)Application.Dialogs(xlDialogSelectSpecial).Show ‘顯示“定位條件”對話框
(155)Application.Dialogs(xlDialogFormatNumber).show ‘顯示“單元格格式”中的“數(shù)字”選項卡 Application.Dialogs(xlDialogAlignment).show ‘顯示“單元格格式”中的“對齊”選項卡
Application.Dialogs(xlDialogFontProperties).show ‘顯示“單元格格式”中的“字體”選項卡 Application.Dialogs(xlDialogBorder).show ‘顯示“單元格格式”中的“邊框”選項卡
Application.Dialogs(xlDialogPatterns).show ‘顯示“單元格格式”中的“圖案”選項卡
Application.Dialogs(xlDialogCellProtection).show ‘顯示“單元格格式”中的“保護”選項卡 注:無法一次顯示帶選項卡的“單元格格式”對話框,只能一次顯示一個選項卡。
(156)Application.Dialogs(xlDialogFormulaGoto).show Range(“b2”), True ‘顯示“引用位置”的默認單元格區(qū)域并顯示引用使其出現(xiàn)在窗口左上角(注:內(nèi)置對話框參數(shù)的使用)
(157)Application.CommandBars(1).Controls(2).Controls(16).Execute ‘執(zhí)行“定位”話框,相當于選擇菜單“編輯——定位”命令
(158)Application.Transpose(Array(“Sun”,”Mon”,”Tur”,”Wed”,”Thu”,”Fri”,”Sat”))‘返回一個垂直的數(shù)組
(159)Application.Version ‘返回使用的Excel版本號
(160)Application.Cursor = xlNorthwestArrow ‘設置光標形狀為北西向箭頭
Application.Cursor = xlIBeam ‘設置光標形狀為Ⅰ字形
Application.Cursor = xlWait ‘設置光標形狀為沙漏(等待)形
Application.Cursor = xlDefault ‘恢復光標的默認設置
(161)Application.WindowState ‘返回窗口當前的狀態(tài)
Application.WindowState = xlMinimized ‘窗口最小化
Application.WindowState = xlMaximized ‘窗口最大化
Application.WindowState = xlNormal ‘窗口正常狀態(tài)
(162)Application.UsableHeight ‘獲取當前窗口的高度
Application.UsableWidth ‘獲取當前窗口的寬度
(163)Application.ActiveCell.Address ‘返回活動單元格的地址(注:返回的是絕對地址)(164)Application.ActivePrinter ‘返回當前打印機的名稱
(165)Application.ActiveSheet.Name ‘返回活動工作表的名稱
(166)Application.ActiveWindow.Caption ‘返回活動窗口的標題
(167)Application.ActiveWorkbook.Name ‘返回活動工作簿的名稱
(168)Application.Selection.Address ‘返回所選區(qū)域的地址
(169)Application.ThisWorkbook.Name ‘返回當前工作簿的名稱
(170)Application.CalculationVersion ‘返回Excel計算引擎版本(右邊四位數(shù)字)及Excel版本(左邊兩位數(shù)字)
(171)Application.MemoryFree ‘以字節(jié)為單位返回Excel允許使用的內(nèi)存數(shù)(不包括已經(jīng)使用的內(nèi)存)
(172)Application.MemoryUsed ‘以字節(jié)為單位返回Excel當前使用的內(nèi)存數(shù)
(173)Application.MemoryTotal ‘以字節(jié)為單位返回Excel可以使用的內(nèi)存數(shù)(包括已使用的內(nèi)存,是MemoryFree和MemoryUsed的總和)
(174)Application.OperatingSystem ‘返回所使用的操作系統(tǒng)的名稱和版本
(175)Application.OrganizationName ‘返回Excel產(chǎn)品登記使用的組織機構的名稱
(176)Application.FindFormat ‘查找的格式種類
Application.ReplaceFormat ‘替換查找到的內(nèi)容的格式種類
ActiveSheet.Cells.Replace What:=” “, _
Replacement:=” “,SearchFormat:=True,ReplaceFormat:=True ‘替換查找到的格式
(177)Application.Interactive=False ‘忽略鍵盤或鼠標的輸入
(178)Application.Evaluate(“Rate”)‘若在工作表中定義了常量0.06的名稱為”Rate”,則本語句將返回值0.06
(179)Application.OnUndo “Undo Option”,“Undo Procedure” ‘選擇UndoOption后,將執(zhí)行Undo Procedure過程
*******************************************************
Range對象
(180)Range(A1:A10).value=“/Application.WorksheetFunction.Transpose(MyArray)” ‘將一個含有10個元素的數(shù)組轉(zhuǎn)置成垂直方向的工作表單元格區(qū)域(A1至A10)
注:因為當把一維數(shù)組的內(nèi)容傳遞給某個單元格區(qū)域時,該單元格區(qū)域中的單元格必須是水平方向的,即含有多列的一行。若必須使用垂直方向的單元格區(qū)域,則必須先將數(shù)組進行轉(zhuǎn)置,成為垂直的。
(181)Range(“A65536”).End(xlUp).Row+1 ‘返回A列最后一行的下一行
(182)rng.Range(“A1”)‘返回區(qū)域左上角的單元格
(183)cell.Parent.Parent.Worksheets ‘訪問當前單元格所在的工作簿
(184)Selection.Font.Bold=Not Selection.Font.Bold ‘切換所選單元格是否加粗
(185)ActiveSheet.Range(“A:B”).Sort Key1:=Columns(“B”), Key2:=Columns(“A”), _
Header:=xlYes ‘兩個關鍵字排序,相鄰兩列,B列為主關鍵字,A列為次關鍵字,升序排列(186)cell.Range(“A1”).NumberFormat ‘顯示單元格或單元格區(qū)域中的第一個單元格的數(shù)字格式
(187)cell.Range(“A1”).HasFormula ‘檢查單元格或單元格區(qū)域中的第一個單元格是否含有公式 或cell.HasFormula ‘工作表中單元格是否含有公式
(188)Cell.EntireColumn ‘單元格所在的整列
Cell.EntireRow ‘單元格所在的整行
(189)rng.Name.Name ‘顯示rng區(qū)域的名稱
(190)rng.Address ‘返回rng區(qū)域的地址
(191)cell.Range(“A1”).Formula ‘返回包含在rng區(qū)域中左上角單元格中的公式。
注:若在一個由多個單元格組成的范圍內(nèi)使用Formula屬性,會得到錯誤;若單元格中沒有公式,會得到一個字符串,在公式欄中顯示該單元格的值。
(192)Range(“D5:D10”).Cells(1,1)‘返回單元格區(qū)域D5:D10中左上角單元格
(193)ActiveCell.Row ‘活動單元格所在的行數(shù)
ActiveCell.Column ‘活動單元格所在的列數(shù)
(194)Range(“A1:B1”).HorizontalAlignment = xlLeft ‘當前工作表中的單元格區(qū)域數(shù)據(jù)設置為左對齊
(195)ActiveSheet.Range(“A2:A10”).NumberFormat=”#,##0” ‘設置單元格區(qū)域A2至A10中數(shù)值格式
(196)rng.Replace “ “,”0” ‘用0替換單元格區(qū)域中的空單元格
*******************************************************
Collection與object
(197)Dim colMySheets As New Collection
Public colMySheets As New Collection ‘聲明新的集合變量
(198)Set MyRange=Range(“A1:A5”)‘創(chuàng)建一個名為MyRange的對象變量
(199)
第二篇:實用的EXCEL VBA編程總結
實用的EXCEL VBA編程小結:
最近單位內(nèi)部的項目里要用到些報表EXCEL的生成,雖說JAVA 的POI可以有這能力,但覺得還是可能比較麻煩,因此還是轉(zhuǎn)用.net來搞,用Visual Studio2003配合office 2003,用到了一些VBA,因此小結并歸納之,選了些資料歸納在這里,以備今后查考
首先創(chuàng)建 Excel 對象,使用ComObj:
Dim ExcelID as Excel.Application
Set ExcelID as new Excel.Application
1)顯示當前窗口:
ExcelID.Visible := True;
2)更改 Excel 標題欄:
ExcelID.Caption := '應用程序調(diào)用 Microsoft Excel';
3)添加新工作簿:
ExcelID.WorkBooks.Add;
4)打開已存在的工作簿:
ExcelID.WorkBooks.Open('C:¥Excel¥Demo.xls');
5)設置第2個工作表為活動工作表:
ExcelID.WorkSheets[2].Activate;
或 ExcelID.WorkSheets[ 'Sheet2' ].Activate;
6)給單元格賦值:
ExcelID.Cells[1,4].Value := '第一行第四列';
7)設置指定列的寬度(單位:字符個數(shù)),以第一列為例:
ExcelID.ActiveSheet.Columns[1].ColumnsWidth := 5;
8)設置指定行的高度(單位:磅)(1磅=0.035厘米),以第二行為例:
ExcelID.ActiveSheet.Rows[2].RowHeight := 1/0.035;// 1厘米
9)在第8行之前插入分頁符:
ExcelID.WorkSheets[1].Rows[8].PageBreak := 1;
10)在第8列之前刪除分頁符:
ExcelID.ActiveSheet.Columns[4].PageBreak := 0;
11)指定邊框線寬度:
ExcelID.ActiveSheet.Range[ 'B3:D4' ].Borders[2].Weight := 3;
1-左 2-右 3-頂 4-底 5-斜(¥)6-斜(/)
12)清除第一行第四列單元格公式:
ExcelID.ActiveSheet.Cells[1,4].ClearContents;
13)設置第一行字體屬性:
ExcelID.ActiveSheet.Rows[1].Font.Name := '隸書';
ExcelID.ActiveSheet.Rows[1].Font.Color := clBlue;
ExcelID.ActiveSheet.Rows[1].Font.Bold := True;
ExcelID.ActiveSheet.Rows[1].Font.UnderLine := True;
14)進行頁面設置:
a.頁眉:
ExcelID.ActiveSheet.PageSetup.CenterHeader := '報表演示';b.頁腳:
ExcelID.ActiveSheet.PageSetup.CenterFooter := '第&P頁';
c.頁眉到頂端邊距2cm:
ExcelID.ActiveSheet.PageSetup.HeaderMargin := 2/0.035;
d.頁腳到底端邊距3cm:
ExcelID.ActiveSheet.PageSetup.HeaderMargin := 3/0.035;
e.頂邊距2cm:
ExcelID.ActiveSheet.PageSetup.TopMargin := 2/0.035;
f.底邊距2cm:
ExcelID.ActiveSheet.PageSetup.BottomMargin := 2/0.035;
g.左邊距2cm:
ExcelID.ActiveSheet.PageSetup.LeftMargin := 2/0.035;
h.右邊距2cm:
ExcelID.ActiveSheet.PageSetup.RightMargin := 2/0.035;
i.頁面水平居中:
ExcelID.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035;
j.頁面垂直居中:
ExcelID.ActiveSheet.PageSetup.CenterVertically := 2/0.035;
k.打印單元格網(wǎng)線:
ExcelID.ActiveSheet.PageSetup.PrintGridLines := True;
15)拷貝操作:
a.拷貝整個工作表:
ExcelID.ActiveSheet.Used.Range.Copy;
b.拷貝指定區(qū)域:
ExcelID.ActiveSheet.Range[ 'A1:E2' ].Copy;
c.從A1位置開始粘貼:
ExcelID.ActiveSheet.Range.[ 'A1' ].PasteSpecial;
d.從文件尾部開始粘貼:
ExcelID.ActiveSheet.Range.PasteSpecial;
16)插入一行或一列:
a.ExcelID.ActiveSheet.Rows[2].Insert;
b.ExcelID.ActiveSheet.Columns[1].Insert;
17)刪除一行或一列:
a.ExcelID.ActiveSheet.Rows[2].Delete;
b.ExcelID.ActiveSheet.Columns[1].Delete;
18)打印預覽工作表:
ExcelID.ActiveSheet.PrintPreview;
19)打印輸出工作表:
ExcelID.ActiveSheet.PrintOut;
20)工作表保存:
If not ExcelID.ActiveWorkBook.Saved then
ExcelID.ActiveSheet.PrintPreview End if
21)工作表另存為:
ExcelID.SaveAs('C:¥Excel¥Demo1.xls');
22)放棄存盤:
ExcelID.ActiveWorkBook.Saved := True;
23)關閉工作簿:
ExcelID.WorkBooks.Close;
24)退出 Excel:
ExcelID.Quit;
25)設置工作表密碼:
ExcelID.ActiveSheet.Protect “123”, DrawingObjects:=True, Contents:=True, Scenarios:=True
26)EXCEL的顯示方式為最大化
ExcelID.Application.WindowState = xlMaximized
27)工作薄顯示方式為最大化
ExcelID.ActiveWindow.WindowState = xlMaximized
28)設置打開默認工作薄數(shù)量
ExcelID.SheetsInNewWorkbook = 3
29)'關閉時是否提示保存(true 保存;false 不保存)
ExcelID.DisplayAlerts = False
30)設置拆分窗口,及固定行位置
ExcelID.ActiveWindow.SplitRow = 1
ExcelID.ActiveWindow.FreezePanes = True
31)設置打印時固定打印內(nèi)容
ExcelID.ActiveSheet.PageSetup.PrintTitleRows = “$1:$1”
32)設置打印標題
ExcelID.ActiveSheet.PageSetup.PrintTitleColumns = “"
33)設置顯示方式(分頁方式顯示)
ExcelID.ActiveWindow.View = xlPageBreakPreview
34)設置顯示比例
ExcelID.ActiveWindow.Zoom = 100
35)讓Excel 響應 DDE 請求
Ex.Application.IgnoreRemoteRequests = False
用VB操作EXCEL
Private Sub Command3_Click()
On Error GoTo err1
Dim i As Long
Dim j As Long
Dim objExl As Excel.Application '聲明對象變量
Me.MousePointer = 11 '改變鼠標樣式
Set objExl = New Excel.Application '初始化對象變量
objExl.SheetsInNewWorkbook = 1 '將新建的工作薄數(shù)量設為1
objExl.Workbooks.Add '增加一個工作薄
objExl.Sheets(objExl.Sheets.Count).Name = ”book1“ '修改工作薄名稱
objExl.Sheets.Add , objExl.Sheets(”book1“)‘增加第二個工作薄在第一個之后
objExl.Sheets(objExl.Sheets.Count).Name = ”book2“
objExl.Sheets.Add , objExl.Sheets(”book2“)‘增加第三個工作薄在第二個之后
objExl.Sheets(objExl.Sheets.Count).Name = ”book3“
objExl.Sheets(”book1“).Select '選中工作薄
For i = 1 To 50 '循環(huán)寫入數(shù)據(jù)
For j = 1 To 5
If i = 1 Then
objExl.Selection.NumberFormatLocal = ”@“ '設置格式為文本
objExl.Cells(i, j)= ” E “ & i & j Else
objExl.Cells(i, j)= i & j End If Next Next
objExl.Rows(”1:1“).Select '選中第一行
objExl.Selection.Font.Bold = True '設為粗體
objExl.Selection.Font.Size = 24 '設置字體大小
objExl.Cells.EntireColumn.AutoFit '自動調(diào)整列寬
objExl.ActiveWindow.SplitRow = 1 '拆分第一行
objExl.ActiveWindow.SplitColumn = 0 '拆分列
objExl.ActiveWindow.FreezePanes = True '固定拆分 objExl.ActiveSheet.PageSetup.PrintTitleRows = ”$1:$1“ '設置打印固定行
objExl.ActiveSheet.PageSetup.PrintTitleColumns
=
”“
'objExl.ActiveSheet.PageSetup.RightFooter = ”打印時間: “ & _
Format(Now, ”yyyy年mm月dd日 hh:MM:ss“)
objExl.ActiveWindow.View = xlPageBreakPreview '設置顯示方式
objExl.ActiveWindow.Zoom = 100 '設置顯示大小
'給工作表加密碼
objExl.ActiveSheet.Protect ”123", DrawingObjects:=True, _
Contents:=True, Scenarios:=True
objExl.Application.IgnoreRemoteRequests = False
objExl.Visible = True '使EXCEL可見
objExl.Application.WindowState = xlMaximized 'EXCEL的顯示方式為最大化
objExl.ActiveWindow.WindowState = xlMaximized '工作薄顯示方式為最大化
objExl.SheetsInNewWorkbook = 3 '將默認新工作薄數(shù)量改回3個
Set objExl = Nothing '清除對象
Me.MousePointer = 0 '修改鼠標
打
印
標
題 Exit Sub err1:
objExl.SheetsInNewWorkbook = 3
objExl.DisplayAlerts = False '關閉時不提示保存
objExl.Quit '關閉EXCEL
objExl.DisplayAlerts = True '關閉時提示保存
Set objExl = Nothing
Me.MousePointer = 0 End Sub
第三篇:智慧之語
智慧之語
清平樂 /李煜 別來春半,觸目柔腸斷。砌下落梅如雪亂,拂了一身還滿。雁來音信無憑,路遙歸夢難成。離恨恰如春草,更行更遠還生。
]1.一個人最大的缺點不是自私、多情、野蠻、任性,而是偏執(zhí)地愛一個不愛自己的人。2.一個承諾在最重要的時候沒有兌現(xiàn),那就是出賣。3.記憶像是倒在掌心的水不論你攤開還是緊握終究還是會從指縫中一滴一滴流淌干凈。4.什么叫快樂?就是掩飾自己的悲傷對每個人微笑。
愛人是路,朋友是樹。人生只有一條路,一條路上卻有多棵樹。有錢的時候別迷路,沒錢的時候靠靠樹。幸福的時候莫忘路,休息的時候澆澆樹。
玉樓春 /歐陽修 別后不知君遠近,觸目凄涼多少悶。漸行漸遠漸無書,水闊魚沉何處問。夜深風竹敲秋韻,萬葉千聲皆是恨。故欹單枕夢中尋,夢又不成燈又燼。
不斷的努力,才會提升自己。
完美女朋友標準:1.懂事2.融入你的生活圈3.她永遠會把你與其他男生區(qū)別對待4.她也許會有很多異性朋友5.她不抽煙不酗酒6.天天嚷著喜歡帥哥7.路癡8.你發(fā)給她的短消息,她一條也舍不得刪.9.她需要你的肩膀10.她不會總要求你先讓步11.她發(fā)給你的短信幾乎不會有錯別字12.她很想陪著你。
有些人會一直刻在記憶里的——即使忘記了他(她)的聲音,忘記了他(她)的笑容,忘記了他(她)的臉,但是每當想起他(她)時的那種感受,是永遠都不會改變的…我們微笑著說:我們停留在時光的原處,其實,那早已被時間洪流無聲地卷走。
安忍不動如大地,深思靜慮似密藏。今日復誦少時的座銘,別是一番滋味。人生的修行,困頓時寸進也難,開悟的機緣成熟時,遍地蓮花、剎那笙歌中齊齊開放。
猗蘭聲歇。抱孤琴思遠,幾番彈徹。洗耳無人,寂寂行歌古時月。一笑東風又急。黯消凝、恨聽啼鴂。想少陵、還嘆飄零,遣興在吟篋。# 愁絕更離別。待款語遲留,賦歸心切。故園夢接?;ㄓ伴e門掩春蝶。重訪山中舊隱,有羈懷、未須輕說。莫相忘,堤上柳、此時共折。梧桐樹,三更雨,不道離情正苦。一葉葉,一聲聲,空階滴到明。
人生就象一口大鍋,當你走到了鍋底時,無論再朝哪個方向走,都是向上的。最困難的時刻也許就是拐點的開始,改變一下思維方式可能就迎來轉(zhuǎn)機。樂觀豁達的人,能把平凡的生活變得富有情趣,能把苦難的日子變得甜美珍貴,能把繁瑣的事情變得簡單可行。以平常心去看世界,花開花謝都是風景。
如果有一天,讓你心動的再也感動不了你,讓你憤怒的再也激怒不了你,讓你悲傷的再也不能讓你流淚,你便知道這時光,這生活給了你什么,你為了成長,付出了什么。
當下中國,某類散文只擦拭觀點,而無視身旁人群,自己所居住的場,喧囂變革的時代,作品凌空蹈虛,遭讀者蔑視譏諷全然不覺。應該有一種和時代水乳交融、血肉相連的散文出現(xiàn),應該將散文不排斥主體,將主體擺進去,并同時保持主體的獨立性和自由性的特點,充分發(fā)揮出來,讓散文中的“我”變得更大起來。愛一個人,要問自己:對于他那些最惡劣的行為和性情,是否能夠容忍?如果你不能夠,你就離開。
第四篇:單片機編程經(jīng)驗之總結
單片機編程經(jīng)驗之總結!【轉(zhuǎn)】
貼子發(fā)表于:2008/11/3 21:38:05 經(jīng)驗之一:用“軟件陷阱+程序口令”對付PC指針的彈飛
當CPU受到外界干擾,有時PC指針會飛到另一段程序中,或跳到空白段去。其實,如果PC指針飛到空白段去,倒也好處理。只要在空白段設立軟件陷阱(攔截指令),將程序攔截到初始化段或程序錯誤處理段。但是,如果PC指針飛到另一段程序中去了,系統(tǒng)如何辦?小匠在這里推薦一種方法——程序口令。思路如下:
1、首先,程序必須模塊化。每個模塊(子程序)執(zhí)行一個功能。每個模塊只有一個出口(RET)。
2、設立一個模塊(子程序)ID寄存器。
3、為每個子程序配置一個唯一的ID號碼。
4、每當子程序執(zhí)行完畢,要返回(RET)之前,先將本子程序的ID號送入 ID寄存器。
5、返回到上級程序后,先判斷ID寄存器中的ID號。
如果正確,則繼續(xù)執(zhí)行;如果不正確,則表示PC指針有可能已經(jīng)跳錯了,子程序沒有按預計的出口返回,這時將程序攔截到初始化段或程序錯誤處理段。
這種方法,如同在程序中設立了若干個崗哨,每次調(diào)用子程序返回后,都要對口令(ID號),驗明正身后再放行。再配合軟件陷阱,基本上可以將大多數(shù)PC指針彈飛的現(xiàn)象檢測到。到了程序錯誤處理段,要殺要剮(冷啟動還是熱啟動)就由您了。
僅以一條代碼來揭示程序飛跑的本質(zhì)!750102H ;MOV 01H,#02H,如當前PC不是指向75H,而是指向01H或02H,那么51內(nèi)的指令譯碼器將把她們忠實地翻譯成AJMP X01H 或 LJMP XXXXH 而XX01H XXXXH又是什么呢?天知道!這樣惡性飛跑下去那還不死定!改革一下:
CLR A ;0C4H INC A ;04H MOV R1,A ;0F9H INC A ;04H MOV @R1,A ;86H
每一字節(jié)代碼都不能在生成跳轉(zhuǎn)和循環(huán),且都是單字節(jié)指令!往那跑去?跑出去了都要自己回來!“在家”千日好!“跳出”事事難嘛!這樣只要平時習慣了用累加器和寄存器把數(shù)倒一倒,把那些危險代碼都給倒掉,這樣雖說給PC的“足”上多加了兩字節(jié)的“包”可它不好“跑”??!“足包”====跑!有朋友會問:要是PC抓做02H--LJMP 又有抓做了老鼻子遠的XXH,再抓做隔壁的YYH不就沒用了嗎?提這樣的問題只有ZENYIN這種鉆牛角得才會提!PC那一位最活躍啊?PC0??!要“扯拐”顯然發(fā)生在她身上,至于那PC15同志啊,睡得更死豬一樣,雷爆(強干擾)來了都打不醒?此外如果干擾都強到了PC高位都出錯的地步!關電!關電!不干了!“不是我們不行而是敵人太強大”!反過來要是敵人在你的專政下,只是偶爾出來搗搗亂,但一出來就沖到屁西(PC)高層,就要問問是不是你的王國根基(硬件)有問題了?而非出在意識形態(tài)(軟件)上!硬件為本!軟件為標!標本兼治鑄就堅強體魄,方能百毒不侵!
經(jīng)驗之
二、不要輕信軟件狗
關于軟件狗的討論,論壇上多矣。匠人也曾經(jīng)查閱過許多關于軟件狗的文章。有些大師確實提出了一些比較有技巧性的方法。但是,匠人的忠告是:不要輕信軟件狗!其實,軟件狗相當于軟件的一種自律行為。一般的思路都是通過設立一個計數(shù)器,在計時中斷中對其+1,在主程序的適當?shù)胤綄ζ淝辶恪H绻绦蚴Э亓?,清零指令未被?zhí)行,但中斷造常發(fā)生,則計數(shù)器溢出(狗狗叫了)。但是這里有個問題:萬一干擾導致中斷被屏蔽了,那軟件狗就永遠不會叫了!——針對這種可能,有人提出在主程序中反復刷新中斷使能標志,保證不讓中斷被屏蔽。——但萬一程序飛到某個死循環(huán)中去了,不再執(zhí)行“刷新中斷使能標志”這一功能了,還是有可能把狗狗活活餓死。。
所以,匠人的觀點是:看門狗必須擁有獨立的計數(shù)器。(即硬件看門狗)好在現(xiàn)在好多芯片都提供了內(nèi)部WDT。這種狗都是自帶計數(shù)器的。即使干擾導致程序失控,WDT還是會造常計數(shù)直到溢出。當然,匠人也沒有要將軟件狗一棍子全部打死的意思。畢竟不管是軟狗還是硬狗,逮到耗子就是好狗嘛(狗拿耗子——多管閑事?)。如果哪位訓狗專家確實養(yǎng)過一條能看門的好軟件狗,請牽出來讓大伙瞧瞧。
經(jīng)驗之
三、話說RAM冗余技術
所謂的RAM冗余,就是:
1、將重要的數(shù)據(jù)信息備份2份(或以上)并存放在RAM中不同的區(qū)域(指地址不相連)。
2、當平時對這些數(shù)據(jù)進行修改時,同時也更新備份。
3、當干擾發(fā)生并被攔截到“程序錯誤處理段”中時,將數(shù)據(jù)與備份做比較,采用表決方式(少數(shù)服從多數(shù))選出正確(或可能正確?)的那個。
4、備份越多,效果越好。(當然,你得有足夠的存儲空間)。
5、只備份最最原始的數(shù)據(jù)。中間變量(指那些可以從原始數(shù)據(jù)重新推導出來的數(shù)據(jù))不必備份,注:
1、這種思路的理論依據(jù),據(jù)說是源于一種“概率論”,即一個人被老婆打腫臉的概率是很大的,但如果他捂著臉去上班卻發(fā)現(xiàn)全公司每個已婚男人的臉都青了,這種概率是很小的。同理,一個RAM寄存器數(shù)據(jù)被沖毀的概率是很大的,但地址不相連的多個RAM同時被沖毀的概率是很小的。
2、前兩年,小匠學徒時,用過一次這種方法,但效果不太理想。當時感覺可能是概率論在我這失效了?現(xiàn)在回想起來,可能是備份的時機選的不好。結果將已經(jīng)沖毀的數(shù)據(jù)又備份進去了。這樣以來,恢復出來的數(shù)據(jù)自然也就不對了。
經(jīng)驗之
四、話說指令冗余技術
前面有個朋友問到指令冗余,按匠人的理解,指令冗余,就是動作冗余。舉個例子,你要在某個輸出口上輸出一個高電平去驅(qū)動一個外部器件,你如果只送一次“1”,那么,當干擾來臨時,這個“1”就有可能變成“0”了。正確的處理方式是,你定期刷新這個“1”。那么,即使偶然受了干擾,它也能恢復回來。除了I/O口動作的冗余,匠人強烈建議大家在下面各方面也采用這種方法:
1、LCD的顯示。有時,也許你會用一些LCD的專用驅(qū)動芯片(如HT1621),這種芯片有個好處,即你只要將顯示數(shù)據(jù)傳送給它,它就會不斷的自動掃描LCD。但是,你千萬不要以為這樣就沒你啥事了。正確的處理方式是,要記得定期刷新送顯數(shù)據(jù)(即使顯示內(nèi)容沒有改變)。對于CPU中自帶LCD DRIVER 的,也要定期刷新LCD RAM。
2、中斷使能標志的設置。不要以為你在程序初始化段將中斷設置好就OK了。應該在主程序中適當?shù)牡胤蕉ㄆ谒⑿乱幌?,以免你的中斷被掛起來?/p>
3、其它一些標志字和參數(shù)寄存器(包括你自己定義的),也要記得常常刷新。
4、其它一些你認為有必要反復刷新的地方。
經(jīng)驗之
五、10種軟件濾波方法
下面奉獻——匠人嘔心瀝血搜腸刮肚冥思苦想東拼西湊整理出來的10種軟件濾波方法:
1、限幅濾波法(又稱程序判斷濾波法)
A、方法:根據(jù)經(jīng)驗判斷,確定兩次采樣允許的最大偏差值(設為A),每次檢測到新值時判斷:如果本次值與上次值之差<=A,則本次值有效。如果本次值與上次值之差>A,則本次值無效,放棄本次值,用上次值代替本次值
B、優(yōu)點:能有效克服因偶然因素引起的脈沖干擾。
C、缺點:無法抑制那種周期性的干擾,平滑度差。
2、中位值濾波法
A、方法:連續(xù)采樣N次(N取奇數(shù)),把N次采樣值按大小排列,取中間值為本次有效值。
B、優(yōu)點:能有效克服因偶然因素引起的波動干擾,對溫度、液位的變化緩慢的被測參數(shù)有良好的濾波效果。
C、缺點:對流量、速度等快速變化的參數(shù)不宜。
3、算術平均濾波法
A、方法:連續(xù)取N個采樣值進行算術平均運算。N值較大時:信號平滑度較高,但靈敏度較低;N值較小時:信號平滑度較低,但靈敏度較高。N值的選取:一般流量,N=12;壓力:N=4
B、優(yōu)點:適用于對一般具有隨機干擾的信號進行濾波,這樣信號的特點是有一個平均值,信號在某一數(shù)值范圍附近上下波動。
C、缺點:對于測量速度較慢或要求數(shù)據(jù)計算速度較快的實時控制不適用,比較浪費RAM。
4、遞推平均濾波法(又稱滑動平均濾波法)
A、方法:把連續(xù)取N個采樣值看成一個隊列,隊列的長度固定為N,每次采樣到一個新數(shù)據(jù)放入隊尾,并扔掉原來隊首的一次數(shù)據(jù).(先進先出原則),把隊列中的N個數(shù)據(jù)進行算術平均運算,就可獲得新的濾波結果。N值的選取:流量,N=12;壓力:N=4;液面,N=4~12;溫度,N=1~4
B、優(yōu)點:對周期性干擾有良好的抑制作用,平滑度高,適用于高頻振蕩的系統(tǒng)。
C、缺點:靈敏度低,對偶然出現(xiàn)的脈沖性干擾的抑制作用較差,不易消除由于脈沖干擾所引起的采樣值偏差,不適用于脈沖干擾比較嚴重的場合,比較浪費RAM
5、中位值平均濾波法(又稱防脈沖干擾平均濾波法)
A、方法:相當于“中位值濾波法”+“算術平均濾波法”。連續(xù)采樣N個數(shù)據(jù),去掉一個最大值和一個最小值,然后計算N-2個數(shù)據(jù)的算術平均值。N值的選取:3~14
B、優(yōu)點:融合了兩種濾波法的優(yōu)點,對于偶然出現(xiàn)的脈沖性干擾,可消除由于脈沖干擾所引起的采樣值偏差。
C、缺點:測量速度較慢,和算術平均濾波法一樣,比較浪費RAM。
6、限幅平均濾波法
A、方法:相當于“限幅濾波法”+“遞推平均濾波法”,每次采樣到的新數(shù)據(jù)先進行限幅處理,再送入隊列進行遞推平均濾波處理。
B、優(yōu)點:融合了兩種濾波法的優(yōu)點,對于偶然出現(xiàn)的脈沖性干擾,可消除由于脈沖干擾所引起的采樣值偏差。
C、缺點:比較浪費RAM。
7、一階滯后濾波法
A、方法:取a=0~1,本次濾波結果=(1-a)*本次采樣值+a*上次濾波結果。
B、優(yōu)點:對周期性干擾具有良好的抑制作用,適用于波動頻率較高的場合。
C、缺點: 相位滯后,靈敏度低,滯后程度取決于a值大小,不能消除濾波頻率高于采樣頻率的1/2的干擾信號。
8、加權遞推平均濾波法
A、方法:是對遞推平均濾波法的改進,即不同時刻的數(shù)據(jù)加以不同的權。通常是,越接近現(xiàn)時刻的數(shù)據(jù),權取得越大。給予新采樣值的權系數(shù)越大,則靈敏度越高,但信號平滑度越低。
B、優(yōu)點:適用于有較大純滯后時間常數(shù)的對象和采樣周期較短的系統(tǒng)。
C、缺點:對于純滯后時間常數(shù)較小,采樣周期較長,變化緩慢的信號不能迅速反應系統(tǒng)當前所受干擾的嚴重程度,濾波效果差。
9、消抖濾波法
A、方法:設置一個濾波計數(shù)器將每次采樣值與當前有效值比較:如果采樣值=當前有效值,則計數(shù)器清零如果采樣值<>當前有效值,則計數(shù)器+1,并判斷計數(shù)器是否>=上限N(溢出),如果計數(shù)器溢出,則將本次值替換當前有效值,并清計數(shù)器。
B、優(yōu)點:對于變化緩慢的被測參數(shù)有較好的濾波效果,可避免在臨界值附近控制器的反復開/關跳動或顯示器上數(shù)值抖動。
C、缺點:對于快速變化的參數(shù)不宜,如果在計數(shù)器溢出的那一次采樣到的值恰好是干擾值,則會將干擾值當作有效值導入系統(tǒng)。
10、限幅消抖濾波法
A、方法:相當于“限幅濾波法”+“消抖濾波法” 先限幅,后消抖。
B、優(yōu)點: 繼承了“限幅”和“消抖”的優(yōu)點改進了“消抖濾波法”中的某些缺陷,避免將干擾值導入系統(tǒng)。
C、缺點:對于快速變化的參數(shù)不宜。
IIR 數(shù)字濾波器
A.方法:確定信號帶寬,濾之。Y(n)= a1*Y(n-1)+ a2*Y(n-2)+.+ ak*Y(n-k)+ b0*X(n)+ b1*X(n-1)+ b2*X(n-2)+.+ bk*X(n-k)。
B.優(yōu)點:高通,低通,帶通,帶阻任意。設計簡單(用matlab)
C.缺點:運算量大。
第五篇:C語言對單片機編程的學習心得
很多朋友都在學習單片機或是想學單片機,但在看了一些資料后,要么感到不知道學的什么,要么找不到下一步的學習方法,這都很正常,因為單片機的學習是一項綜全性知識的結果。那么怎樣學習單片機,怎么樣學好單片機是我們關心的,通過我本人的學習過程,我總結了幾條,是單片機學習都要具備的幾個條件:
1.首先要明確一點,你是愛好單片機編程的,通過寫出各種各樣的程序,你可以從中得到快樂和成就感,這一點非常重要,如果你是因為學好單片機可以走上更好的工作崗位得到更好的報酬,那也可以,必競有個動力所以可以驅(qū)使你好好的學。
2.要具備能吃苦的精神,學習單片機初期是十分枯燥無味的(在你能寫出自已的程序前這一段時間),你會被狀態(tài)控制字、中斷地址、中斷優(yōu)先級等等問題所困惑,可能有些問題要好多天,查了很多資料,想的頭疼后你才能徹底想明白。沒有吃苦的精神是不行的。所以這一點也很重要。
3.要具備一些數(shù)字電路和模擬電路知識,這些雖然看起來和單片機關系不大,實際上哪個單片機沒有外圍電路,沒有這些知識你學會單片機編程后,能力也會被大大的限制。
4.雖然現(xiàn)在工作中用單片機編程都用的C語言編程,因為C語言有代碼編寫程序速度快,邏輯比較清晰,可維護性強。但是匯編語言對初學者來說也十分重要,這有助于你了解單片機內(nèi)部運行機制,對單片機的執(zhí)行過程更加了解。聽朋友這么說過,當一個工程師做單片機程序從匯編轉(zhuǎn)到C時,他的水平就提高了,但當他從C又轉(zhuǎn)回匯編時那么他就成精了。
5.要邊學邊練習,光看書還是不行的,要把你在學習過程中的編程思路在單片機上跑起來,你才會更能找到編寫單片機程序的感覺。如果不把自已的編程思路在單片機上運行起來,那么后面你就不知道自已的想法是對是錯,感覺無法繼續(xù)下去。如果經(jīng)濟條件允許一塊開發(fā)板還是必須的,理論和動手相經(jīng)結合,你的單片機水平會提高的很快。
6.多想多練,做一些實際的項目,你可以根據(jù)你現(xiàn)有的開發(fā)板硬件條件,做出一些你感覺比較有意思的項目,實際動手做過項目和看過別人的項目還是有差別的。自已做過項目以后在工作或求職中就沒有那么被動,也會有信心一點。
祝個位學習單片機的朋友早日提高!以上是個人見解有不同意見請?zhí)岢鰜砉V大單片機愛好參考。
創(chuàng)易電子搜集,全部資料來源于互聯(lián)網(wǎng)開源資料,如有侵權,請及時與樓主聯(lián)系立刻糾正。