本文目錄一覽:
- 1、低代碼究竟是什麼?
- 2、《單片機C語言程序設計實訓100例——基於8051+Proteus仿真》 第03篇源代碼
- 3、c語言圖書館圖書基本信息管理軟件設計。求修改下代碼要求如下
- 4、linux下如何用c語言讀取條碼掃描槍數據
- 5、求大神做一個c語言打氣球程序,所有積分都在這了
- 6、怎麼才能編出用於處理外界信息的程序呢?就比如說超市收銀系統,刷的條形碼的信息能到計算機中。
低代碼究竟是什麼?
簡介: 什麼是低代碼?我們為什麼需要低代碼?低代碼會讓程序員失業嗎?本文總結了低代碼領域的基本概念、核心價值與行業現狀,帶你全面了解低代碼。
什麼是低代碼
“Low-Code”是什麼?如果你是第一次聽說,沒準也會跟我當年從老闆口中聽到這個詞後的內心戲一樣:啥?“Low-Code”?“Code”是指代碼我知道,但這個“Low”字是啥意思?不會是老闆發現我最近趕工寫的代碼很醜很“Low”吧… 想多了,老闆怎麼可能親自review代碼呢。那難道是指,“Low-level programming”里的“Low”?老闆終於發現讓我等編程奇才整天堆Java業務代碼太浪費,要派我去閉關寫一個高性能C語言網絡庫… 顯然也不是,老闆哪能有這技術情懷呢。那到底是什麼意思?作為一名搜商比情商還高的程序員,能問Google的絕不會問老闆。於是我一頓操作後,不假思索地點開了第一條搜索結果:Low-code development platform。
Wikipedia定義
從Wiki的這段定義中,我們可以提煉出幾個關鍵信息:
• 低代碼開發平台(LCDP)本身也是一種軟件,它為開發者提供了一個創建應用軟件的開發環境。看到“開發環境”幾個字是不是很親切?對於程序員而言,低代碼開發平台的性質與IDEA、VS等代碼IDE(集成開發環境)幾乎一樣,都是服務於開發者的生產力工具。
• 與傳統代碼IDE不同的是,低代碼開發平台提供的是更高維和易用的可視化IDE。大多數情況下,開發者並不需要使用傳統的手寫代碼方式進行編程,而是可以通過圖形化拖拽、參數配置等更高效的方式完成開發工作。
Forrester定義
順着Wiki的描述還能發現,原來“Low-Code”一詞早在2014年就由Forrester提出了,它對低代碼開發平台的始祖級定義是這樣的:
請點擊輸入圖片描述
相比Wiki的版本,這個定義更偏向於闡明低代碼所帶來的核心價值:
• 低代碼開發平台能夠實現業務應用的快速交付。也就是說,不只是像傳統開發平台一樣“能”開發應用而已,低代碼開發平台的重點是開發應用更“快”。更重要的是,這個快的程度是顛覆性的:根據Forrester在2016年的調研,大部分公司反饋低代碼平台幫助他們把開發效率提升了5-10倍。而且我們有理由相信,隨着低代碼技術、產品和行業的不斷成熟,這個提升倍數還能繼續上漲。
• 低代碼開發平台能夠降低業務應用的開發成本。一方面,低代碼開發在軟件全生命周期流程上的投入都要更低(代碼編寫更少、環境設置和部署成本也更簡單);另一方面,低代碼開發還顯著降低了開發人員的使用門檻,非專業開發者經過簡單的IT基礎培訓就能快速上崗,既能充分調動和利用企業現有的各方面人力資源,也能大幅降低對昂貴專業開發者資源的依賴。
低代碼核心能力
基於上述的定義和分析,不難總結出如下這3條低代碼開發平台的核心能力:
請點擊輸入圖片描述
• 全棧可視化編程:可視化包含兩層含義,一個是編輯時支持的點選、拖拽和配置操作,另一個是編輯完成後所及即所得(WYSIWYG)的預覽效果。傳統代碼IDE也支持部分可視化能力(如早年Visual Studio的MFC/WPF),但低代碼更強調的是全棧、端到端的可視化編程,覆蓋一個完整應用開發所涉及的各個技術層面(界面/數據/邏輯)。
• 全生命周期管理:作為一站式的應用開發平台,低代碼支持應用的完整生命周期管理,即從設計階段開始(有些平台還支持更前置的項目與需求管理),歷經開發、構建、測試和部署,一直到上線後的各種運維(e.g. 監控報警、應用上下線)和運營(e.g. 數據報表、用戶反饋)。
• 低代碼擴展能力:使用低代碼開發時,大部分情況下仍離不開代碼,因此平台必須能支持在必要時通過少量的代碼對應用各層次進行靈活擴展,比如添加自定義組件、修改主題CSS樣式、定製邏輯流動作等。一些可能的需求場景包括:UI樣式定製、遺留代碼復用、專用的加密算法、非標系統集成。
不只是少寫代碼
回到最初那個直擊心靈的小白問題:Low-Code中的“Low”,到底是啥意思?答案已經顯而易見:既不是指抽象程度很低(相反,低代碼開發方式的抽象程度要比傳統編程語言高一個level),也不是指代碼很low(也相反,低代碼所生成的代碼一般都經過精心維護和反覆測試,整體質量強於大部分手寫代碼),而是單純的“少寫代碼” —— 只在少數需要的情況下才手寫代碼,其他大部分時候都能用可視化等非代碼方式解決。
再往深一點兒看,低代碼不只是少寫代碼而已:代碼寫得少,bug也就越少(正所謂“少做少錯”),因此開發環節的兩大支柱性工作“趕需求”和“修bug”就都少了;要測的代碼少了,那麼測試用例也可以少寫不少;除了開發階段以外,平台還覆蓋了後續的應用構建、部署和管理,因此運維操作也更少了(Low-Code → Low-Ops)。
然而,少並不是最終目的:如果單純只是想達到少的效果,砍需求減人力、降低質量要求也是一樣的。低代碼背後的哲學,是少即是多(Less is More),或者更準確說是多快好省(Do More with Less) —— 能力更多、上線更快、質量更好,成本還更省,深刻踐行了阿里“既要,又要,還要”的價值觀精髓。
請點擊輸入圖片描述
平台的職責與挑戰
上面說的是低代碼給開發者提供的能力與吸引力,那麼作為服務的提供方與應用的承載者,低代碼開發平台自身應該承擔怎樣的職責,其中又會遇到多大的挑戰?是否就一定要如阿里雲所主張的那樣,“把複雜留給自己,把簡單留給別人”?雖然這句話聽起來很深明大義,但不知道大家有沒有想過,為什麼我們一定要抱着複雜不放,平白無故給自己找事?就不能直接幹掉複雜,也給咱阿里雲自己的員工留點簡單嗎?是工作太容易就體現不出來KPI價值了,還是家裡的飯菜不如公司的夜宵香?
冥思苦想許久後,我從熱力學第一定律中找到了答案:開發一個應用的總複雜度是恆定的,只能轉移而不可能憑空消失。要想讓開發者做的更少,安心享受簡單的快樂,那麼平台方就得做的更多,默默承擔儘可能多的複雜度。就像一個滿身腱子肉的雜技男演員,四平八穩地托舉着在高處旋轉與跳躍的女搭檔;上面的人顯得越輕盈越毫不費力,下面的人就得越穩重越用盡全力。當然,不是說上面的女演員就很輕鬆沒壓力,只是他們各自的分工不同,所承擔的複雜度也不一樣。
根據《人月神話》作者Fred Brooks的劃分,軟件開發的複雜度可以劃分為本質複雜度(Essential complexity )和偶然複雜度(Accidental complexity)。前者是解決問題時固有的最小複雜度,跟你用什麼樣的工具、經驗是否豐富、架構好不好等都無關,而後者就是除此之外在實際開發過程中引入的複雜度。通常來說,本質複雜度與業務要解決的特定問題域強相關,因此這裡我把它稱為更好理解的“業務複雜度”;這部分複雜度不是任何開發方法或工具能解決的,包括低代碼。而偶然複雜度一般與開發階段的技術細節強相關,因此我也相應把它稱為“技術複雜度”;而這一部分複雜度,恰好就是低代碼所擅長且適合解決的。
為開發者儘可能屏蔽底層技術細節、減少不必要的技術複雜度,並支撐其更好地應對業務複雜度(滿足靈活通用的業務場景需求),這是身為一個低代碼開發平台所應該盡到的核心職責。
請點擊輸入圖片描述
在盡到上述職責的同時,低代碼開發平台作為一個面向開發者的產品,還需要致力於為開發者提供簡單直觀的極致開發體驗。這背後除了巨大的工作量,還得能在“強大”和“易用”這兩個很難兩全其美的矛盾點之間,努力找到一個符合自己產品定位與目標客戶需求的平衡點 —— 這也許是設計一個通用低代碼開發平台所面臨的最大挑戰。
三、低代碼相關概念對比
純代碼(Pro-Code / Custom-Code)
“純代碼”可能算是我杜撰的一個詞,更常見的說法是專業代碼(Pro-Code)或定製代碼(Custom-Code);但意思都一樣,就是指傳統的以代碼為中心(Code-Centric)的開發模式。之所以我選擇用“純代碼”,是因為如果用“專業代碼”會顯得似乎低代碼就不專業了一樣,而用“定製代碼”又容易讓人誤解成低代碼無法支持定製的自定義代碼。
當然,更準確的稱謂我認為是“高代碼”(與低代碼恰好對應,只是名字太難聽,被我嫌棄了…),因為即便是使用傳統的代碼IDE,有些開發工作也支持(甚至更適合)以非代碼方式完成,比如:iOS端開發時使用的SwiftUI界面設計器、服務端開發數據庫應用時使用的PowerDesigner建模工具。不過這部分可視化工作在傳統開發模式下只是起輔助作用,最後通常也是生成開發者可直接修改的代碼;開發者仍然是以代碼為中心來開展主要工作。
低代碼與純代碼之間的關係,其實跟視頻和文章之間很像:
低代碼就像是現代的“視頻”,大部分內容都由直觀易理解、表達能力強的圖片組成,因此更容易被大眾所接受。但與此同時,視頻也不是死板得只能有圖片,完全可以添加少量文字(如字幕、標註)來彌補圖片表達不夠精確的問題。BTW,關於“圖”和“文字”之間的辯證關係,可以進一步參考《架構製圖:工具與方法論》[1]這篇文章中的相關描述。
純代碼則更像是傳統的“文章”,雖然很久以來都一直是信息傳播的唯一媒介,但自從視頻技術誕生以及相應軟硬件基礎設施的普及以來,便逐漸開始被搶走了風頭。如今,視頻已成為大部分人獲取信息的主要渠道(從電視電影到B站抖音),而經常讀書讀文章的人卻越來越少。但不可否認的是,文章依然有它存在的意義和受眾(不然我也不會費這勁敲這麼多字了),即使“市場份額”一直在被擠壓,但永遠會有它立足的空間。
請點擊輸入圖片描述
如果按上面這種類比關係推導,低代碼未來也會遵循與視頻類似的發展軌跡,超越純代碼成為主流開發模式。Gartner的預測也表達了相同的觀點:到2024年,所有應用程序開發活動當中的65%將通過低代碼的方式完成,同時75%的大型企業將使用至少四種低代碼開發工具進行應用開發。
但同樣地,就像是視頻永遠無法取代文章一樣,低代碼也永遠無法徹底取代純代碼開發方式。未來低代碼和純代碼方式將以互補的形態長期共存,各自在其所適合的業務場景中發光發熱。在後面的“低代碼業務場景”章節,會詳細列出哪些場景在現階段更適合用低代碼模式開發。
零代碼(Zero-Code / No-Code)
從分類的完備性角度來看,有“純代碼”自然也應該有完全相反的“零代碼”(也稱為“無代碼”)。零代碼就是完全不需要寫代碼的應用開發平台,但這並不代表零代碼就比低代碼更高級和先進,它只是做了一個更極端的選擇而已:徹底擁抱簡單的圖形可視化,完全消滅複雜的文本代碼。選擇背後的原因是,零代碼開發平台期望能儘可能降低應用開發門檻,讓人人都能成為開發者(注意:開發 ≠ 寫代碼),包括完全不懂代碼的業務分析師、用戶運營,甚至是產品經理(不懂裝懂可不算懂)。
即便是專業開發者,在技術分工越來越精細的趨勢下(前端/後端/算法/SRE/數據分析..),也很難招到一個能獨立開發和維護整套複雜應用的全棧工程師。但零代碼可以改變這一切:無論是Java和JavaScript傻傻分不清楚的技術小白,還是精通深度學習但沒時間學習Web開發的算法大牛,都可以通過零代碼實現自己的技術夢或全棧夢。“改變世界的idea已有,就差一個程序員了”,這句玩笑話或許真的可以成真;哦不,甚至都用不着程序員,有idea的人自己就能上。
請點擊輸入圖片描述
當然,所有選擇都要付出代價,零代碼也不例外。完全拋棄代碼的代價,就是平台能力與靈活性受限:
• 一方面,可視化編輯器的表達能力遠不及圖靈完備的通用編程語言,不引入代碼根本沒法實現靈活的定製與擴展(當然,理論上也可以做成Scrach/Blockly那樣的圖形編程語言,但那樣不過是換一種形式在手寫代碼而已)。
• 另一方面,由於目標受眾是非專業開發人員,平台能支持的操作會更趨於“傻瓜化”(e.g. 頁面只支持大塊業務組件的簡單堆疊,不支持細粒度原子組件和靈活的CSS布局定義),同時也只會透出相對“親民化”的模型和概念(e.g. 使用“表格”表示數據,而不是用“數據庫”),無法支撐強大專業的底層開發原語和編程理念。
請點擊輸入圖片描述
雖然零代碼與狹義上的低代碼有着上述明顯差異,但從廣義上來說,零代碼可以當作低代碼的一個子集。Gartner在其相關調研報告中,就是將“No Code”劃在了範圍更廣的低代碼應用平台“LCAP”(Low-Code Application Platform)中。而當前市面上很多通用的低代碼開發平台,也都兼具一定程度的零代碼能力;比如低代碼領域領頭羊Mendix,既提供了簡單易用的零代碼Web IDE – Mendix Studio,也包括一個功能更強大的低代碼桌面IDE – Mendix Studio Pro。
HpaPaaS(高生產力應用PaaS)
上文提到,“Low-Code”一詞是拜Forrester所賜。作為同樣是國際知名調研機構(a.k.a 造詞小能手)的Gartner,顯然不會輕易在這場可能決定低代碼領域江湖地位的新概念作詞大賽中認輸,於是也於2017年發明了“HpaPaaS”(High-productivity application Platform as a Service)這個聽上去更高大上的縮寫詞。
按照Gartner的定義,HpaPaaS是一種支持聲明式、模型驅動設計和一鍵部署的平台,提供了雲上的快速應用開發(RAD)、部署和運行特性;這顯然與低代碼的定義如出一轍。但事實證明,名字起得太專業並不見得是好事,“HpaPaas”最終還是敗給了起源更早、更接地氣也更順口的“Low-Code”:從2019年開始,Gartner在其相關調研報告中也開始全面採用“Low-Code”一詞(如LCAP),親手為“HpaPaaS”打上了 @deprecated 印記。
請點擊輸入圖片描述
圖源:What’s the difference between SaaS / IaaS / PaaS / aPaaS / HpaPaaS?
值得補充的是,“HpaPaaS“這個詞也並非橫空出世,而是傳承自更早之前Gartner提出的“aPaaS”,它倆之間的關係是:HpaPaaS只是aPaaS的一個子類;除了HpaPaaS這種通過低代碼實現的高生產力應用開發平台以外,aPaaS還包括面向純代碼的傳統應用開發平台(High-control aPaaS,即可控度更高的純代碼開發方式)。
不值得但就想八卦一下的是,“aPaaS”這個詞也非憑空捏造,而是與雲計算的興起淵源頗深。相信各位雲道中人都已猜到,aPaaS與IaaS/PaaS/SaaS這些雲計算遠古概念是一脈相承的:aPaaS介於PaaS和SaaS之間,相比PaaS提供的服務更偏應用,但又不像SaaS一樣提供現成的軟件服務(更詳細的說明可參考配圖來源文章)。
四、為什麼需要低代碼
低代碼是什麼可能並沒那麼重要,畢竟在這個信息爆炸的世界,永遠不缺少新奇而又短命的事物。大部分所謂的新技術都只是曇花一現:出現了,被看到了;大部分人“哦”了一聲,已閱但表示不感興趣;小部分人驚嘆於它的奇思妙想,激動地點了個贊後,回過頭來該用什麼還是什麼。真正決定新技術是否能轉化為新生產力的,永遠不是技術本身有多麼優秀和華麗,而是它是否真的被需要,即:為什麼需要低代碼?如果用不同的主語填充上面這個問句(冷知識:這叫做“延遲主語初始化”),可以更全面地看待這個問題:
為什麼「市場」需要低代碼?
在這個大爺大媽都滿嘴“互聯網+”和“數字化轉型”的時代,企業越來越需要通過應用(App)來改善企業內部的信息流轉、強化與客戶之間的觸點連接。然而,誕生還不太久的IT信息時代,也正面臨著與我國社會主義初級階段類似的供需關係矛盾:落後的軟件開發生產力跟不上人民日益增長的業務需求。
請點擊輸入圖片描述
Gartner預測,到2021年應用開發需求的市場增長將至少超過企業IT交付能力的5倍。面對如此巨大的IT缺口,如果沒有一種革命性的“新生產力”體系,很難想象僅憑現有傳統技術體系的發展延續就能徹底解決問題。而低代碼技術正是帶着這樣的使命而降臨,期望通過以下幾個方面徹底革新應用開發生產力,拯救差一點就要邁入水深火熱的IT世界:
提效降本 質量保障
雖然軟件行業一直在高速發展,新的語言、框架和工具層出不窮,但作為從業者我們不得不承認:軟件開發仍處於手工作坊階段,效率低、人力成本高、質量不可控。項目延期交付已成為行業常態,而瓶頸幾乎總是開發人員(對機器能解決的問題都不是問題);優秀的開發人才永遠是稀缺資源,還賊貴;軟件質量缺陷始終無法收斂,線上故障頻發資損不斷。
相比而言,傳統製造業經過幾百年工業革命的發展,大部分早已擺脫了對“人”的強依賴:從原料輸入到製品輸出,中間是各種精密儀器和自動化流水線的穩定支撐,真正實現生產的標準化和規模化。雖然信息化號稱是人類的第三次工業革命,但以軟件行業目前的狀況,遠遠還沒到達成熟的“工業化”階段。
所以,親愛的程序員朋友,當你與前端聯調了一上午接口,又與產品撕逼了一下午需求,再與自己的bug抗爭了一整晚,好不容易遁入夢鄉又被一連串報警短信吵醒時,是否有抬頭對着星空憧憬過:“I have a dream… that one day,軟件開發也能像工業製品一樣,批量流水化生產,穩定高效沒煩惱。” 事到如今,不管你有沒有意識到,這個憧憬正在慢慢變成現實。
請點擊輸入圖片描述
是的,低代碼正在將應用軟件開發過程工業化:每個低代碼開發平台都是一個技術密集型的應用工廠,所有項目相關人員都在同一條產線內緊密協作。開發主力不再是熟知for循環一百種寫法的技術Geek,而是一群心懷想法業務sense十足的應用Maker。藉助應用工廠中各種成熟的基礎設施、現成的標準零件、自動化的裝配流水線,開發者只需要專註於最核心的業務價值即可。即便是碰到非標需求,也可以隨時自己動手,用最靈活的手工定製(代碼)方式來解決各種邊角問題。
擴大應用開發勞動力
通過讓大部分開發工作可以僅通過簡單的拖拽與配置完成,低代碼(包括零代碼)顯著降低了使用者門檻,讓企業能夠充分利用前面所提到的平民開發者資源。部分純零代碼需求場景下,低代碼還能讓業務人員實現自助式(self-service)應用交付,既解決了傳統IT交付模式下的任務堆積(backlog)問題,避免稀缺的專業開發資源被大量簡單、重複性的應用開發需求所侵佔,也能讓業務人員真正按自己的想法去實現應用,擺脫交由他人開發時不可避免的桎梏。
請點擊輸入圖片描述
至此,應用開發能力不再是少數專業開發者的專利和特權,且今後所需要的技能門檻與擁有成本也會越來越低,真正實現所謂的“技術民主化”(democratization of technology)。
加強開發過程的溝通協作
多方調查結果顯示,軟件項目失敗的最主要原因之一就是缺乏溝通(poor communication)。傳統開發模式下,業務、產品、設計、開發、測試與運維人員各司其職,且各有一套領域內的工具和語言,長久以來很容易形成一個個“豎井”(silos),讓跨職能的溝通變得困難而低效。這也是為什麼當前熱門的敏捷開發和DevOps都在強調溝通(前者是協同Biz與Dev,而後者是協同Dev和Ops),而經典的DDD領域驅動設計也主張通過“統一語言”來減少業務與技術人員之間的溝通不一致。
請點擊輸入圖片描述
有了低代碼後,這一狀況將得到根本改善:上述各角色都可以在同一個低代碼開發平台上緊密協作(甚至可以是同一個人),這種全新的協作模式不僅打破了職能豎井,還能通過統一的可視化語言和單一的應用表示(頁面/數據/邏輯),輕鬆對齊項目各方對應用形態和項目進度的理解,實現更終極的敏捷開發模式,以及在傳統DevOps基礎之上更進一步的BizDevOps[2]。
統一開發平台下的聚合效應
低代碼嘗試將所有與應用開發相關活動都收斂到同一個平台(one platform)上後,將會產生更多方面的聚合效應與規模收益:
• 人員聚合:除了上一點所提到的各職能角色緊密協作以外,人員聚合到統一的低代碼開發平台進行作業後,還能促進整個項目流程的標準化、規範化和統一化。
• 應用聚合:一方面,新應用的架構設計、資產復用、相互調用變得更容易;另一方面,各應用的數據都天然互通,同時平台外數據也能通過集成能力進行打通,徹底消除企業的數據孤島問題。
• 生態聚合:當低代碼開發平台聚合了足夠多的開發者和應用後,將形成一個巨大的、連接一切、有無限想象力的生態體系,徹底放飛低代碼的價值。
《單片機C語言程序設計實訓100例——基於8051+Proteus仿真》 第03篇源代碼
單片機c語言編程100個實例目錄1
函數的使用和熟悉
實例3:用單片機控制第一個燈亮
實例4:用單片機控制一個燈閃爍:認識單片機的工作頻率
實例5:將 P1口狀態分別送入P0、P2、P3口:認識I/O口的引腳功能
實例6:使用P3口流水點亮8位LED
實例7:通過對P3口地址的操作流水點亮8位LED
實例8:用不同數據類型控制燈閃爍時間
實例9:用P0口、P1 口分別顯示加法和減法運算結果
實例10:用P0、P1口顯示乘法運算結果
實例11:用P1、P0口顯示除法運算結果
實例12:用自增運算控制P0口8位LED流水花樣
實例13:用P0口顯示邏輯”與”運算結果
實例14:用P0口顯示條件運算結果
實例15:用P0口顯示按位”異或”運算結果
實例16:用P0顯示左移運算結果
實例17:”萬能邏輯電路”實驗
實例18:用右移運算流水點亮P1口8位LED
實例19:用if語句控制P0口8位LED的流水方向
實例20:用swtich語句的控制P0口8位LED的點亮狀態
實例21:用for語句控制蜂鳴器鳴笛次數
實例22:用while語句控制LED
實例23:用do-while語句控制P0口8位LED流水點亮
實例24:用字符型數組控制P0口8位LED流水點亮
實例25: 用P0口顯示字符串常量
實例26:用P0 口顯示指針運算結果
實例27:用指針數組控制P0口8位LED流水點亮
實例28:用數組的指針控制P0 口8 位LED流水點亮
實例29:用P0 、P1口顯示整型函數返回值
實例30:用有參函數控制P0口8位LED流水速度
實例31:用數組作函數參數控制流水花樣
實例32:用指針作函數參數控制P0口8位LED流水點亮
實例33:用函數型指針控制P1口燈花樣
實例34:用指針數組作為函數的參數顯示多個字符串
單片機c語言編程100個實例目錄2
實例35:字符函數ctype.h應用舉例
實例36:內部函數intrins.h應用舉例
實例37:標準函數stdlib.h應用舉例
實例38:字符串函數string.h應用舉例
實例39:宏定義應用舉例2
實例40:宏定義應用舉例2
實例41:宏定義應用舉例3
* 中斷、定時器中斷、定時器 *中斷、定時器*中斷、定時器 /
實例42:用定時器T0查詢方式P2口8位控制LED閃爍
實例43:用定時器T1查詢方式控制單片機發出1KHz音頻
實例44:將計數器T0計數的結果送P1口8位LED顯示
實例45:用定時器T0的中斷控制1位LED閃爍
實例46:用定時器T0的中斷實現長時間定時
實例47:用定時器T1中斷控制兩個LED以不同周期閃爍
實例48:用計數器T1的中斷控制蜂鳴器發出1KHz音頻
實例49:用定時器T0的中斷實現”渴望”主題曲的播放
實例50-1:輸出50個矩形脈衝
實例50-2:計數器T0統計外部脈衝數
實例51-2:定時器T0的模式2測量正脈衝寬度
實例52:用定時器T0控制輸出高低寬度不同的矩形波
實例53:用外中斷0的中斷方式進行數據採集
實例54-1:輸出負脈寬為200微秒的方波
實例54-2:測量負脈衝寬度
實例55:方式0控制流水燈循環點亮
實例56-1:數據發送程序
實例56-2:數據接收程序
實例57-1:數據發送程序
實例57-2:數據接收程序
實例58:單片機向PC發送數據
實例59:單片機接收PC發出的數據
*數碼管顯示*數碼管顯示 數碼管顯示數碼管顯示*/
實例60:用LED數碼顯示數字5
實例61:用LED數碼顯示器循環顯示數字0~9
實例62:用數碼管慢速動態掃描顯示數字”1234″
實例63:用LED數碼顯示器偽靜態顯示數字1234
實例64:用數碼管顯示動態檢測結果
實例65:數碼秒錶設計
實例66:數碼時鐘設計
實例67:用LED數碼管顯示計數器T0的計數值
實例68:靜態顯示數字“59”
單片機c語言編程100個實例目錄3
鍵盤控制*鍵盤控制* *鍵盤控制 *鍵盤控制 */
實例69:無軟件消抖的獨立式鍵盤輸入實驗
實例70:軟件消抖的獨立式鍵盤輸入實驗
實例71:CPU控制的獨立式鍵盤掃描實驗
實例72:定時器中斷控制的獨立式鍵盤掃描實驗
實例73:獨立式鍵盤控制的4級變速流水燈
實例74:獨立式鍵盤的按鍵功能擴展:”以一當四”
實例75:獨立式鍵盤調時的數碼時鐘實驗
實例76:獨立式鍵盤控制步進電機實驗
實例77:矩陣式鍵盤按鍵值的數碼管顯示實驗
//實例78:矩陣式鍵盤按鍵音
實例79:簡易電子琴
實例80:矩陣式鍵盤實現的電子密碼鎖
液晶顯示LCD*液晶顯示LCD *液晶顯示LCD * *液晶顯示LCD*液晶顯示LCD *液晶顯示LCD */
實例81:用LCD顯示字符’A’
實例82:用LCD循環右移顯示”Welcome to China”
實例83:用LCD顯示適時檢測結果
實例84:液晶時鐘設計
*一些芯片的使用*24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 紅外遙控/
實例85:將數據”0x0f”寫入AT24C02再讀出送P1口顯示
實例86:將按鍵次數寫入AT24C02,再讀出並用1602LCD顯示
實例87:對I2C總線上掛接多個AT24C02的讀寫操作
實例88:基於AT24C02的多機通信 讀取程序
實例89:基於AT24C02的多機通信 寫入程序
實例90:DS18B20溫度檢測及其液晶顯示
實例91:將數據”0xaa”寫入X5045再讀出送P1口顯示
實例92:將流水燈控制碼寫入X5045並讀出送P1口顯示
實例93:對SPI總線上掛接多個X5045的讀寫操作
實例94:基於ADC0832的數字電壓表
實例95:用DAC0832產生鋸齒波電壓
實例96:用P1口顯示紅外遙控器的按鍵值
實例97:用紅外遙控器控制繼電器
實例98:基於DS1302的日曆時鐘
實例99:單片機數據發送程序
實例100:電機轉速表設計
模擬霍爾脈衝
單片機c語言一百例子
c語言圖書館圖書基本信息管理軟件設計。求修改下代碼要求如下
維克圖書管理軟件是一款適用於中小企業、事業機關單位和學校社區等部門的圖書館借閱室使用的數據庫信息管理系統,功能包括圖書期刊資料管理、圖書期刊借閱、歸還、續借和註銷等業務流程,同時支持讀者押金充值及借閱超期罰款管理功能;軟件提供免費下載。
●軟件主要功能模塊:
支持圖書期刊借閱、歸還、續借等管理功能
支持圖書期刊添加、註銷管理
支持讀者押金充值、借閱超期罰款管理
支持圖書期刊和讀者資料管理,包括中圖分類、讀者類別功能
支持操作員及權限設置管理
支持以日為單位的數據備份和恢復管理功能
支持使用條形碼掃描槍(器)、磁卡刷卡器進行業務操作管理
支持今日盤點、借閱查詢、借閱統計等報表查詢和打印功能
支持各類表格和資料導出到EXCEL文件中
維克圖書管理軟件強大的查詢功能,可以方便地查詢到所有圖書(期刊)資料、所有讀者資料、所有借閱圖書期刊資料、所有註銷圖書期刊資料、所有讀者押金充值記錄、所以借閱超期罰款記錄以及今日盤點等相關資料,並可將其導出到“Excel”文件,方便日後查詢或編輯。
linux下如何用c語言讀取條碼掃描槍數據
一般是USB接口的,所以你用C寫的話,還是用 USB轉成串口吧,安裝個驅動就行。
然後程序就是普通的串口讀寫就可以了,注意:注意清空串口數據 設置串口為被動讀模式
求大神做一個c語言打氣球程序,所有積分都在這了
#include dos.h
#include conio.h
#include stdio.h
#include stdlib.h
#include graphics.h
#includemath.h
#includetime.h
#define ESC 0x011B
#define LEFT 0x4B00
#define RIGHT 0x4D00
#define SPACE 0x3920
#define huiche 0x1CDD
#define up 0x4800
#define down 0x5000
#define PI 3.1415926
#define R1 5/*小球半徑*/
#define R2 4/*炮彈半徑*/
/*下為全局變量*/
float x=320,y=300;/*炮管口坐標*/
float alf=3*PI/2;/*炮管角度*/
int c,s=0;/*c記鍵盤掃描碼,s為得分*/
int stf,stc,btf,lifeTime=50;/*stf為遊戲開始時間,stc為當前時間,btf為紅球開始時間,記鍵盤掃描碼,lifeTime為遊戲生命時間*/
int x1=100,y1=100;/*隨機紅球球心*/
/*聲明函數*/
void score();/*遊戲結束時輸入玩家名和分數至文件*/
void highscore();/*高分排序*/
void begin();/*開始遊戲*/
void fire();/*開炮*/
void movegun();/*移動槍管*/
void init();/*初始化界面*/
void sMimueTime();/*生命條變化*/
void drawTimeBar();/*初始化生命條*/
void drawbarbette();/*畫炮台*/
void createBubble();/*產生紅球*/
void quit();/*遊戲停止*/
void main()
{
int n,choice=1;
char str;
int GraphDriver;
int GraphMode,i;
GraphDriver = DETECT;
initgraph( GraphDriver, GraphMode,”c:\\tc”);
setbkcolor(0);
settextstyle(3,0,3);
setcolor(GREEN);
outtextxy(140,100,”1.start @_@”);
outtextxy(140,150,”2.highscore”);
outtextxy(140,200,”3.exit”);
setcolor(5);
outtextxy(320,400,”made by lujiajun”);
outtextxy(320,430,”QQ:635333024″);
setcolor(4);
outtextxy(180,20,”shot game”);
setcolor(GREEN);
setlinestyle(0,0,3);
setlinestyle(0,0,3);
rectangle(100,95,400,125);
for(n=1;n=100;n++)
{
str=getch();
if(str==72)
{
–choice;
if(choice==0)choice=3;
}
if(str==80)
{
++choice;
if(choice==4)choice=1;
}
if(str==13)
{
break;
} /*按回車鍵確認*/
/*畫圖做菜單*/
cleardevice();
switch(choice)
{
case 1: setcolor(4);
outtextxy(180,20,”shot game”);
setcolor(GREEN);
setlinestyle(0,0,3);
rectangle(100,95,400,125);
settextstyle(3,0,3);
outtextxy(140,100,”1.start @_@”);
settextstyle(3,0,3);
outtextxy(140,150,”2.highscore”);
outtextxy(140,200,”3.exit”);
setcolor(5);
outtextxy(320,400,”made by lujiajun”);
outtextxy(320,430,”QQ:635333024″);
break;
case 2: setcolor(4);
outtextxy(180,20,”shot game”);
setcolor(GREEN);
settextstyle(3,0,3);
outtextxy(140,100,”1.start”);
settextstyle(3,0,3);
outtextxy(140,150,”2.highscore @_@”);
setlinestyle(0,0,3);
rectangle(100,145,400,175);
settextstyle(3,0,3);
outtextxy(140,200,”3.exit”);
setcolor(5);
outtextxy(320,400,”made by lujiajun”);
outtextxy(320,430,”QQ:635333024″);
break;
case 3: setcolor(4);
outtextxy(180,20,”shot game”);
setcolor(GREEN);
settextstyle(3,0,3);
outtextxy(140,100,”1.start”);
outtextxy(140,150,”2.highscore”);
settextstyle(3,0,3);
outtextxy(140,200,”3.exit @_@”);
setlinestyle(0,0,3);
rectangle(100,195,400,225);
setcolor(5);
outtextxy(320,400,”made by lujiajun”);
outtextxy(320,430,”QQ:635333024″);
break;
}
}
if(n=100)exit(0);
switch(choice)/*這裡引用函數,實現所要的功能*/
{
case 1:begin();
case 2:highscore();
case 3: exit(0);
}
}
void begin()
{
init();
do
{
if(bioskey(1)!=0)
{
c=bioskey(0);
if(c==ESC) {quit();break;}
if(c==LEFT||c==RIGHT)movegun();
else if(c==SPACE) fire();
}
sMimueTime();
}while(1);
closegraph();
}
void fire()
{
float temp;
int i=1,j=0,x,y=100;
char b[10];
while(y50)
{
setcolor(0);
circle(x,y,4);
setfillstyle(1,0);
floodfill(x,y,0);
sound(5000-500*i);/*聲音,i++*/
delay(250);
i++;
j+=5;
x=320+(int)((100+j)*cos(alf)); /*畫炮彈,j++*/
y=400+(int)((100+j)*sin(alf));
setcolor(4);
circle(x,y,4);
setfillstyle(1,4);
floodfill(x,y,4);
delay(3000);
setcolor(0);
circle(x,y,4);
setfillstyle(1,0);
floodfill(x,y,0);
temp=1.0*(x-x1)*(x-x1)+1.0*(y-y1)*(y-y1);/*計算炮彈與紅球距離*/
if(temp81)
{
setcolor(0);
settextstyle(1,0,1);
settextjustify(0,0);
sprintf(b,”%d”,s);
outtextxy(550,20,b);
s=s+20;
sprintf(b,”%d”,s);
if(lifeTime50)
lifeTime+=1;
else
lifeTime=50;
createBubble();
setcolor(15);
outtextxy(550,20,b);
}
}
nosound();
}
void movegun()
{
setlinestyle(0,0,1);
if(c==RIGHT alf3.1415936*(3/2.0+1/3.0))/*0x4d00為-doskey碼*/
{
setcolor(0);
line(x,y,320,400);
y=400+100*sin(alf);
x=320+100*cos(alf);
setcolor(15);
line(x,y,320,400);
setlinestyle(0,0,3);
arc(320,400,0,180,50);
alf+=PI/180;
}
if(c==LEFT alf3.1415936*(3/2.0-1/3.0))/*0x4b00為-doskey碼*/
{
setcolor(0);
line(x,y,320,400);
y=400+100*sin(alf);
x=320+100*cos(alf);
setcolor(15);
line(x,y,320,400);
setlinestyle(0,0,3);
arc(320,400,0,180,50);
alf-=PI/180;
}
}
void init()
{
int GraphDriver,GraphMode,i;
GraphDriver = DETECT;
initgraph( GraphDriver, GraphMode,”c:\\tc”);
drawTimeBar();
drawbarbette();
createBubble();
}
void drawbarbette()/*畫炮台*/
{
setcolor(15);
rectangle(250,400,390,430);
arc(320,400,0,180,50);
line(320,400,320,300);
setcolor(2);
settextstyle(1,0,1);
settextjustify(0,0);
outtextxy(255,425,”made in cslg”);
setcolor(5);
outtextxy(50,460,”help:\”esc\”quit \”space\”fire \”-\”and\”-\”move gun”);
outtextxy(320,20,”made by lujiajun”);
}
void createBubble()
{
setcolor(0);
circle(x1,y1,5);
setfillstyle(1,0);
floodfill(x1,y1,0);
srand (time(NULL)); /*隨機生成球心坐標*/
x1=rand()%620+10;
y1=rand()%150+50;
setcolor(4);
circle(x1,y1,R1);
setfillstyle(1,4);
floodfill(x1,y1,4);
}
void drawTimeBar()
{
time_t t1;
struct tm *t2;
t1=time(t1);/*取系統時間(長整型)*/
t2=localtime(t1);/*將系統時間變為結構體型*/
stc=t2-tm_sec;
stf=stc;
rectangle(80,10,300,30);
setcolor(2);
setlinestyle(0,0,3);
line(90,20,290,20);
setcolor(15);
settextstyle(1,0,1);
settextjustify(0,0);
outtextxy(5,20,”life bar”);
setcolor(14);
outtextxy(500,20,”score:”);
setcolor(15);
outtextxy(550,20,”0″);
}
void sMimueTime()
{
time_t t1;
struct tm *t2;
t1=time(t1);/*取系統時間(長整型)*/
t2=localtime(t1);/*將系統時間變為結構體型*/
stc=t2-tm_sec;
setcolor(0);
setlinestyle(0,0,3);
if((stc-stf)==1||(stc-stf+60)==1)
line(90,20,lifeTime*4+90,20);
lifeTime=lifeTime-(stc-stf=0?stc-stf:stc-stf+60);/*計算生命線*/
if(lifeTime0){
stf=stc;
setcolor(2);
setlinestyle(0,0,3);
line(90,20,lifeTime*4+90,20);}
else
quit();
if((stc-btf)4){
createBubble();
btf=t2-tm_sec;}
}
void highscore()
{
int i=0,j,n=10;
struct play{
char name[10];
int score;
}p[10]={{“hanbo”,100},{“hanbo”,500},{“hanbo”,90},{“hanbo”,0},{“hanbo”,0},{“hanbo”,450},{“ljj”,1000},{“hanbo”,0},{“hanbo”,0},{“hanbo”,0},},temp;
FILE *fp;
textmode(0);
if((fp=fopen(“g:\\chengji.txt”,”rb”))==NULL)
{
printf(“error\n”);
exit(0);
}
do
{
fread(p[i++],sizeof(p[i++]),1,fp);
}while(!feof(fp));
printf(” highscore:\n\n”);
for(i=0;in-1;i++)
for(j=0;jn-i-1;j++)
if(p[j].scorep[j+1].score){
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;}
for(i=0;in;i++)
printf(“%d:%s %d\n”,(i+1),p[i].name,p[i].score);
getch();
if(fclose(fp))
{
printf(“close error!\n”);
exit(0);
}
}
void score()
{
struct play{
char name[10];
int score;
}p;
FILE *fp;
if((fp=fopen(“g:\\chengji.txt”,”a”))==NULL)
{
printf(“open error\n”);
exit(0);}
printf(“Input your name:”);
gets(p.name);
p.score=s;
fwrite(p,sizeof(p),1,fp);
if(fclose(fp))
{
printf(“error!\n”);
exit(0);
}
}
void quit()/*退出遊戲*/
{
char a[80];
setviewport(100, 100, 540, 380, 1); /*定義一個圖形窗口*/
rectangle(0, 50, 440, 150);
setcolor(YELLOW);
settextstyle(2, 0, 8);
sprintf(a, “Game over!Your score is %d”, s); /*將數字轉化為字符串*/
outtextxy(30, 90, a); /*指定位置輸出字符串*/
do
{
c=bioskey(0);
if(c==ESC) {
textmode(0);
score();
exit(0);}
}while(1);
}
怎麼才能編出用於處理外界信息的程序呢?就比如說超市收銀系統,刷的條形碼的信息能到計算機中。
第一個問題,條形碼掃描槍,掃碼後,會傳遞一個數字串,每個條碼槍都會對應不同開發語言提供接口函數,供調用,比如函數getferbet(),你直接調用就可以了
第二個問題,管理的時候有個數據庫,時間獲取有推送和拉兩種方式,不斷更新數據庫內容,或者是進入記一個開始時間,退出記一個退出時間,網吧客戶機都裝着後台程序呢,由這個程序來提供信息
最後,其實很多編程軟件實例之類的書都是實際程序,只不過為了學習方便,每一個例子側重點不同,稍微簡化了。多看看,好好思考,對你會有幫助的
原創文章,作者:TURQX,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/128334.html