单片机实现并行输入转串行输出 用51单片机实现8位并行数据转为串行数据的C程序

\u5982\u4f55\u7528\u5355\u7247\u673a\u5c06\u5e76\u884c\u4fe1\u53f7\u8f6c\u4e3a\u4e32\u884c\u4fe1\u53f7\uff1f

\u8fd9\u4e2a\u597d\u529e\uff0c\u4f60\u7528P0\u6216P1\uff0cP2\u7aef\u53e3\u63a5\u6536\u5e76\u884c\u6570\u636e\uff0c\u7136\u540e\u518d\u7528P3^0\u548cP3^1\u53d1\u9001\u5373\u53ef

\u5e76\u884c\u901a\u4fe1\u91c7\u75288\u7ebf\u5236\u901a\u4fe1\uff0c\u5373\u4e8c\u8fdb\u5236\u4f20\u8f93\u6a21\u5f0f\uff0c\u6bcf\u4e00\u4e2a\u6570\u636e\u4f4d\u90fd\u5360\u7528\u4e00\u4e2aIO\u53e3

\u4f46\u56e0\u5176\u901f\u5ea6\u5feb\u800c\u88ab\u5927\u5bb6\u7ecf\u5e38\u4f7f\u7528\uff0c\u4e32\u53e3\u4e3a\u4e09\u7ebf\u5236\uff0c\u53d1\u9001\u4e0e\u63a5\u6536\u548c\u4fe1\u53f7\u5730\u4e09\u6839

\u5355\u7247\u673a\u5185\u90e8\u5df2\u7ecf\u96c6\u6210\u4e86\u4e32\u53e3\u901a\u4fe1\u6a21\u5757 \uff0c\u53ef\u4ee5\u4f7f\u7528 SBUF \u8fdb\u884c\u6570\u636e\u7684\u53d1\u9001\u4e0e\u63a5\u6536

\u8f6c\u6362\u7684\u65b9\u6cd5\u5176\u5b9e\u5f88\u7b80\u5355\uff0c\u5229\u7528\u4efb\u4f55\u4e00\u4e2aP\u53e3\uff0cP3\u7aef\u53e3\u9664\u5916

\u628aP\u53e3\u76848\u4e2a\u5b50\u7aef\u53e3\u5206\u522b\u5bf9\u5e94\u5e76\u884c\u76848\u4e2a\u7aef\u53e3\u5373\u53ef\uff0c\u7136\u540e\u7528P\u53e3\u7684\u603b\u79f0\u4f5c\u4e3a\u53d8\u91cf\u4f7f\u7528

SBUF=P1 \u5047\u8bbe\u4f60\u4f7f\u7528P1\u53e3\uff0c\u5c31\u8fd9\u4e48\u7b80\u5355

\u4e00\u4f4d\u4e00\u4f4d\u7684\u8f93\u51fa\u4e48\uff1f

sbit BIT_OUTPUT = P1^0;void BitsOutput(unsigned char temp)//\u4ece\u6700\u9ad8\u4f4d\u79fb\u51fa{ char count = 8; while(count--) { if((temp & 0x80) == 0x80) BIT_OUTPUT = 1; else BIT_OUTPUT = 0; temp >= 1; }}

从PO口采集到并行数据:
MOV A,P0
通过一个I/0接口,P1.0,串行输出:
(协议:P1.0低3ms为通信开始,3ms后定时每1ms送出1位,共8位,没有校验位.11ms后检测到P1.0为高就结束了)
自已写程序吧!

74hc595是具有8位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是分别的时钟。数据在sck的上升沿输入,在rck的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(si),和一个串行输出(q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能
oe时(为低电平),存储寄存器的数据输出到总线。
qb--|1
16|--vcc
qc--|2
15|--qa
qd--|3
14|--si
qe--|4
13|--/g
qf--|5
12|--rck
qg--|6
11|--sck
qh--|7
10|--/sclr
gnd-|8
9|--qh'
74595的数据端:
qa--qh:
八位并行输出端,可以直接控制数码管的8个段。
qh':
级联输出端。我将它接下一个595的si端。
si:
串行数据输入端。
74595的控制端说明:
/sclr(10脚):
低点平时将移位寄存器的数据清零。通常我将它接vcc。
sck(11脚):上升沿时数据寄存器的数据移位。qa-->qb-->qc-->...-->qh;下降沿移位寄存器数据不变。(脉冲宽度:5v时,大于几十纳秒就行了。我通常都选微秒级)
rck(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将rck置为低电平,当移位结束后,在rck端产生一个正脉冲(5v时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。
/g(13脚):
高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。
74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。
应用如下:
以下是用c语言编写的,采用动态扫描方式显示0123这四个数字,此程序是经过模拟仿真的。
//#################################################################
//程序名称:8位数码管显示程序
//程序功能:让8位数码管显示display_7leds[8]中的内容
//程序说明:使用时改变display_7leds[8]中的内容,调用wr7leds()函数即可
//#################################################################
#include
<reg51.h>
#include
<intrins.h>
#define
uchar
unsigned
char
#define
uint
unsigned
int
//#############管脚定义#######################
#define
port_led
p0
//led位选信号输入管脚
sbit
sclk=p2^0;
//595移位时钟信号输入端
sbit
st=p2^1;
//595锁存信号输入端
sbit
da=p2^2;
//595数据信号输入端
//#############################################
//共阴极数码管显示代码:7
6
5
4
3
2
1
0
//
a
b
c
d
e
f
uchar
code
led_7seg[16]={0xfc,0x60,0xda,0xf2,//0,1,2,3,
0x66,0xb6,0xbe,0xe0,
//4,5,6,7,
0xfe,0xe6,0xee,0x3e,
//8,9,a,b,
0x9c,0x7a,0x9e,0x8e};//c,d,e,f
//#####################################################
//名称:wr595()向595发送一个字节的数据
//功能:向595发送一个字节的数据(先发低位)
//#####################################################
void
wr595(uchar
wrdat)
{
uchar
i;
sclk=0;
st=0;
for(i=8;i>0;i--)//循环八次,写一个字节
{
da=wrdat&0x01;
//发送bit0

wrdat>>=1;
//要发送的数据右移,准备发送下一位
sclk=0;
//移位时钟上升沿
_nop_();
_nop_();
sclk=1;
_nop_();
_nop_();
sclk=0;
}
st=0;
//上升沿将数据送到输出锁存器
_nop_();
_nop_();
st=1;
_nop_();
_nop_();
st=0;
}
//##########################################################
//
延时函数
//##########################################################
void
delay(uint
del)
{
while(del--)
{
;
}
}
//##########################################################
//名称:wr7leds()8个led显示数字函数
//功能:向595发送一个字节的数据,然后发送位选信号
//##########################################################
void
wr7leds(void)
{
uchar
i,wx;
wx=0x01;
//位选信号初始化
for(i=0;i<4;i++)
//循环4次写4个数据
{
wr595(led_7seg[i]);
//传送显示数据
port_led=~wx;
//送位选信号
wx<<=1;
//位选信号左移,准备显示下一个数字
delay(50);
//延时,(决定亮度,和闪烁)
}
}
//##########################################################
//主函数
//##########################################################
main(void)
{
while(1)
{
wr7leds();
//向74hc595发送数据并显示
}
}

“当然有必要,楼上的朋友你要尊重别人的原创!
不要尽是让别人用595啊,138啊这些东西,这样搞来搞去那电子就都一样了!


我说你最好连铬铁也不要用。

有必要么?这样数据很难处理的,你加个595可以很容易实现。。

当然有必要,楼上的朋友你要尊重别人的原创!
不要尽是让别人用595啊,138啊这些东西,这样搞来搞去那电子就都一样了!

  • 鍗曠墖鏈哄疄鐜板苟琛岃緭鍏ヨ浆涓茶杈撳嚭
    绛旓細閫氳繃涓涓狪/0鎺ュ彛,P1.0锛涓茶杈撳嚭:(鍗忚:P1.0浣3ms涓洪氫俊寮濮,3ms鍚庡畾鏃舵瘡1ms閫佸嚭1浣,鍏8浣,娌℃湁鏍¢獙浣.11ms鍚庢娴嬪埌P1.0涓洪珮灏辩粨鏉熶簡)鑷凡鍐欑▼搴忓惂!
  • 濡備綍鐢鍗曠墖鏈灏骞惰淇″彿杞负涓茶淇″彿?
    绛旓細鍗曠墖鏈哄唴閮ㄥ凡缁忛泦鎴愪簡涓插彛閫氫俊妯″潡 锛屽彲浠ヤ娇鐢 SBUF 杩涜鏁版嵁鐨勫彂閫佷笌鎺ユ敹 杞崲鐨勬柟娉曞叾瀹炲緢绠鍗锛屽埄鐢ㄤ换浣曚竴涓狿鍙o紝P3绔彛闄ゅ 鎶奝鍙g殑8涓瓙绔彛鍒嗗埆瀵瑰簲骞惰鐨8涓鍙e嵆鍙紝鐒跺悗鐢≒鍙g殑鎬荤О浣滀负鍙橀噺浣跨敤 SBUF=P1 鍋囪浣犱娇鐢≒1鍙o紝灏辫繖涔堢畝鍗 ...
  • 鐢51鍗曠墖鏈哄疄鐜8浣骞惰鏁版嵁杞负涓茶鏁版嵁鐨凜绋嬪簭
    绛旓細sbit BIT_OUTPUT = P1^0;void BitsOutput(unsigned char temp)//浠庢渶楂樹綅绉诲嚭{ char count = 8; while(count--) { if((temp & 0x80) == 0x80) BIT_OUTPUT = 1; else BIT_OUTPUT = 0; temp <<= 1; }}void BitsOutput(unsigned char temp)//浠庢渶浣庝綅...
  • AT89S52鍗曠墖鏈哄苟琛岃浆涓茶c璇█绋嬪簭
    绛旓細鍦ㄥ仛鍗曠墖鏈鐨勭▼搴忥紝鐢变簬涓插彛涓嶅锛岄渶瑕佺敤IO鍙f潵妯℃嫙鍑轰竴涓覆鍙c傜粡杩囪嫢骞叉洸鎶樺苟鍙傝冧簡涓浜涚幇鏈夌殑璧勬枡锛屽熀鏈笂瀹屾垚浜嗐傜幇鍦ㄥ皢瀹屾暣鐨勬祴璇曠▼搴忥紝浠ュ強鍏朵腑涓浜涢渶瑕佹荤粨鐨勯儴鍒嗚创鍑烘潵銆傜▼搴忕‖浠跺钩鍙帮細11.0592M鏅舵尟锛/ 鍦ㄥ崟鐗囨満涓婃ā鎷熶簡涓涓覆鍙o紝浣跨敤P2.1浣滀负鍙戦佺 鎶婂崟鐗囨満涓瓨鏀剧殑鏁版嵁閫氳繃P2.1浣滀负涓插彛TXD...
  • 鍗曠墖鏈哄苟琛鏁版嵁杞崲鎴愪覆琛鏁版嵁
    绛旓細宸笉澶氬氨鏄繖鏍风殑銆
  • 74hc165浣滅敤鏄粈涔?
    绛旓細74hc165鏄骞惰杈撳叆杞覆琛岃緭鍑鐨勪覆琛8浣嶅瘎瀛樺櫒銆傚彲鐢ㄦ潵涓鍗曠墖鏈鎵╁睍8浣嶅苟琛岃緭鍏ユ帴鍙c傚綋鍗曠墖鏈篒O寮曡剼涓嶅鐢ㄦ椂锛屽亣濡傚彧鍓╀笅3涓狪O鑴氫簡锛屼絾鏄繕闇瑕佷竴涓8浣嶇殑杈撳叆鍙o紝灏卞彲浠ョ敤涓鐗74HC165鏉ユ墿灞曪紝瀹冩湁8涓緭鍏ョ锛3涓覆琛屾暟鎹紩鑴氭帴鍒板崟鐗囨満锛屽氨鍙互涓茶璇诲叆8浣嶈緭鍏ユ暟鎹垨寮鍏抽噺銆備笌74HC164鍒氬ソ鐩稿弽銆備笅鍥惧氨鏄...
  • ...鎬庝箞鐢–51缂栫▼瀹炵幇骞跺彛杈撳叆杞涓插彛杈撳嚭鑷鍗曠墖鏈鍛? 璋㈣阿
    绛旓細1锛夐渶瑕佸皢瀵勫瓨鍣ㄧ殑8浣嶆暟鎹嚎涓鍗曠墖鏈鐨勬煇涓绔彛鐨8浣岻/O绾垮搴旇繛鎺ヨ捣鏉ワ紱2锛夎繕闇瑕佺敤鍒扮浜屼釜绔彛鐨3浣岻/O绾匡紝涓浣嶇敤浜庢帶鍒74HC165D瀵勫瓨鍣ㄧ殑缃叆鍔熻兘锛涗竴浣嶇敤浣滅Щ浣嶆椂閽熻剦鍐蹭俊鍙凤紱涓浣嶄綔浜庢帴鏀74HC165D涓茶杈撳嚭鐨勬暟鎹紱杩欎釜鏄仛瀹為獙鐨勬柟妗堬紝鑰屽疄闄呭簲鐢ㄤ腑锛屼竴鑸兘鍔犱釜涓夋佺殑鏁版嵁椹卞姩鐢佃矾锛屼互渚夸娇8浣...
  • 鐢2涓51鍗曠墖鏈鸿繘琛屼覆琛閫氫俊(12浣骞惰鏁版嵁璇ユ垚涓茶鍚庡啀鏀瑰苟琛)
    绛旓細1銆佽12浣嶇殑鏁版嵁涓篋_12bit 2銆佸湪A鏈轰腑鍏堟妸D_12bit鍒嗚鍒颁袱涓8浣嶇殑鏃犵鍙峰彉閲忕粡X鍜孻閲岋紝鍗砐=D_12bit%256锛堜綆8浣嶏級Y=D_12bit/256锛堥珮8浣嶏級锛岀劧鍚庢妸涓や釜瀛楄妭寰涓插彛閫佸嵆鍙紙SBUF=X锛汼BUF=Y锛3銆佸湪B鏈轰腑鎶婁粠涓插彛鎺ユ敹鏉ョ殑涓ゅ瓧鑺傛暟鎹祴缁欎釜16浣嶇殑int鍨嬪彉閲忥紝寰堢畝鍗曪紝鍋囪鎺ユ敹鏉ョ殑浣8浣嶄负...
  • 鎬庝箞鏍风敤鍗曠墖鏈鐨勪覆鍙i┍鍔74LS165
    绛旓細74LS165鏄骞惰杈撳叆锛涓茶杈撳嚭鐨勶紝鍗冲苟杞覆鐨勮姱鐗囥傝繖鏍凤紝鍙互鎵╁睍涓涓苟琛岃緭鍏ュ彛锛岀敤涓插彛UART鐨勬柟寮0璇诲叆銆傜數璺涓嬪浘鎵绀猴紝杩欐槸浠跨湡鍥撅紝鏁扮爜绠℃樉绀虹殑鏄杩涙潵鐨勬嫧鐩樼殑鏁板笺
  • 鍗曠墖鏈鍙互瀹炵幇灏嗕竴涓狪O鍙g殑杈撳叆淇″彿閫氳繃鍙︿竴涓狪O 鍙杈撳嚭浠庤屽疄鐜板紑鍏冲姛 ...
    绛旓細浣犲ソ鏄殑鍗曠墖鏈瀹屽叏鍙互瀹炵幇灏嗕竴涓狪O鍙g殑杈撳叆淇″彿閫氳繃鍙︿竴涓狪O 鍙杈撳嚭浠庤屽疄鐜板紑鍏冲姛鑳界殑锛岃缃竴涓嬪氨琛屼簡
  • 扩展阅读:单片机系统的并行扩展 ... 串行数据怎么改成并行 ... 485是串行还是并行 ... 寄存器串行和并行输入 ... 并行加载串行输出 ... 单片机并行io口有几个 ... 51单片机的并行口 ... 串行和并行传输哪个快 ... 并行输入输出主要是哪三种 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网